git: d3d779f64754 - stable/13 - Delete snapshot after opening it when running fsck_ffs(9) in background.

From: Kirk McKusick <mckusick_at_FreeBSD.org>
Date: Sun, 12 Nov 2023 06:51:32 UTC
The branch stable/13 has been updated by mckusick:

URL: https://cgit.FreeBSD.org/src/commit/?id=d3d779f6475474bd7fc80d1f9cce91c7b42fc958

commit d3d779f6475474bd7fc80d1f9cce91c7b42fc958
Author:     Kirk McKusick <mckusick@FreeBSD.org>
AuthorDate: 2023-10-25 22:36:45 +0000
Commit:     Kirk McKusick <mckusick@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);
 		}
 	}