The branch stable/13 has been updated by mckusick:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=d3d779f6475474bd7fc80d1f9cce91c7b42fc958
commit d3d779f6475474bd7fc80d1f9cce91c7b42fc958
Author:     Kirk McKusick <mckus...@freebsd.org>
AuthorDate: 2023-10-25 22:36:45 +0000
Commit:     Kirk McKusick <mckus...@freebsd.org>
CommitDate: 2023-11-12 06:51:14 +0000

    Delete snapshot after opening it when running fsck_ffs(9) in background.
    
    PR:           106107
    
    (cherry picked from commit d3a36e4b7459b2d62c4cd50de7a8e3195d7241c7)
---
 sbin/fsck_ffs/fsck.h   | 1 -
 sbin/fsck_ffs/fsutil.c | 1 -
 sbin/fsck_ffs/globs.c  | 2 --
 sbin/fsck_ffs/main.c   | 8 +++++---
 sbin/fsck_ffs/setup.c  | 8 ++++----
 5 files changed, 9 insertions(+), 11 deletions(-)

diff --git a/sbin/fsck_ffs/fsck.h b/sbin/fsck_ffs/fsck.h
index 13a4a048fbe8..1a4cc24e63db 100644
--- a/sbin/fsck_ffs/fsck.h
+++ b/sbin/fsck_ffs/fsck.h
@@ -377,7 +377,6 @@ extern long secsize;                /* actual disk sector 
size */
 extern char skipclean;         /* skip clean file systems if preening */
 extern int snapcnt;            /* number of active snapshots */
 extern struct inode snaplist[FSMAXSNAP + 1]; /* list of active snapshots */
-extern char snapname[BUFSIZ];  /* when doing snapshots, the name of the file */
 extern int sujrecovery;                /* 1 => doing check using the journal */
 extern int surrender;          /* Give up if reads fail */
 extern char usedsoftdep;       /* just fix soft dependency inconsistencies */
diff --git a/sbin/fsck_ffs/fsutil.c b/sbin/fsck_ffs/fsutil.c
index 528986a7bfd7..14196fa8356a 100644
--- a/sbin/fsck_ffs/fsutil.c
+++ b/sbin/fsck_ffs/fsutil.c
@@ -615,7 +615,6 @@ ckfini(int markclean)
        int ofsmodified, cnt, cg;
 
        if (bkgrdflag) {
-               unlink(snapname);
                if ((!(sblock.fs_flags & FS_UNCLEAN)) != markclean) {
                        cmd.value = FS_UNCLEAN;
                        cmd.size = markclean ? -1 : 1;
diff --git a/sbin/fsck_ffs/globs.c b/sbin/fsck_ffs/globs.c
index da09781a06ba..5170f078166a 100644
--- a/sbin/fsck_ffs/globs.c
+++ b/sbin/fsck_ffs/globs.c
@@ -71,7 +71,6 @@ int   freefiles[MIBSIZE];     /* MIB cmd to free a set of 
files */
 int    freedirs[MIBSIZE];      /* MIB cmd to free a set of directories */
 int    freeblks[MIBSIZE];      /* MIB cmd to free a set of data blocks */
 struct fsck_cmd cmd;           /* sysctl file system update commands */
-char   snapname[BUFSIZ];       /* when doing snapshots, the name of the file */
 char   *cdevname;              /* name of device being checked */
 long   dev_bsize;              /* computed value of DEV_BSIZE */
 long   secsize;                /* actual disk sector size */
@@ -145,7 +144,6 @@ fsckinit(void)
        bzero(freedirs, sizeof(int) * MIBSIZE);
        bzero(freeblks, sizeof(int) * MIBSIZE);
        bzero(&cmd, sizeof(struct fsck_cmd));
-       bzero(snapname, sizeof(char) * BUFSIZ);
        cdevname = NULL;
        dev_bsize = 0;
        secsize = 0;
diff --git a/sbin/fsck_ffs/main.c b/sbin/fsck_ffs/main.c
index c0f7d39897ea..3e42bde1ea5d 100644
--- a/sbin/fsck_ffs/main.c
+++ b/sbin/fsck_ffs/main.c
@@ -68,7 +68,8 @@ static char sccsid[] = "@(#)main.c    8.6 (Berkeley) 5/14/95";
 
 #include "fsck.h"
 
-static int     restarts;
+static int  restarts;
+static char snapname[BUFSIZ];  /* when doing snapshots, the name of the file */
 
 static void usage(void) __dead2;
 static intmax_t argtoimax(int flag, const char *req, const char *str, int 
base);
@@ -664,8 +665,7 @@ setup_bkgrdchk(struct statfs *mntp, int sbreadfailed, char 
**filesys)
                    "SUPPORT\n");
        }
        /* Find or create the snapshot directory */
-       snprintf(snapname, sizeof snapname, "%s/.snap",
-           mntp->f_mntonname);
+       snprintf(snapname, sizeof snapname, "%s/.snap", mntp->f_mntonname);
        if (stat(snapname, &snapdir) < 0) {
                if (errno != ENOENT) {
                        pwarn("CANNOT FIND SNAPSHOT DIRECTORY %s: %s, CANNOT "
@@ -713,6 +713,8 @@ setup_bkgrdchk(struct statfs *mntp, int sbreadfailed, char 
**filesys)
                    "BACKGROUND\n", snapname, strerror(errno));
                return (0);
        }
+       /* Immediately unlink snapshot so that it will be deleted when closed */
+       unlink(snapname);
        free(sblock.fs_csp);
        free(sblock.fs_si);
        havesb = 0;
diff --git a/sbin/fsck_ffs/setup.c b/sbin/fsck_ffs/setup.c
index 4584456d8a64..f34ce282b7ee 100644
--- a/sbin/fsck_ffs/setup.c
+++ b/sbin/fsck_ffs/setup.c
@@ -399,14 +399,14 @@ openfilesys(char *dev)
        if ((statb.st_mode & S_IFMT) != S_IFCHR &&
            (statb.st_mode & S_IFMT) != S_IFBLK) {
                if (bkgrdflag != 0 && (statb.st_flags & SF_SNAPSHOT) == 0) {
-                       pfatal("BACKGROUND FSCK LACKS A SNAPSHOT\n");
-                       exit(EEXIT);
+                       pwarn("BACKGROUND FSCK LACKS A SNAPSHOT\n");
+                       return (0);
                }
                if (bkgrdflag != 0) {
                        cursnapshot = statb.st_ino;
                } else {
-                       pfatal("%s IS NOT A DISK DEVICE\n", dev);
-                       if (reply("CONTINUE") == 0)
+                       pwarn("%s IS NOT A DISK DEVICE\n", dev);
+                       if (preen || reply("CONTINUE") == 0)
                                return (0);
                }
        }

Reply via email to