Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 20 Aug 2023 04:28:28 GMT
From:      Kirk McKusick <mckusick@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org
Subject:   git: 47048a611dd2 - stable/13 - Set UFS/FFS file type to snapshot before changing its block pointers.
Message-ID:  <202308200428.37K4SSRW033804@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch stable/13 has been updated by mckusick:

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

commit 47048a611dd2606fe93dd59ca9e3f7ec5d756390
Author:     Kirk McKusick <mckusick@FreeBSD.org>
AuthorDate: 2023-08-12 18:20:08 +0000
Commit:     Kirk McKusick <mckusick@FreeBSD.org>
CommitDate: 2023-08-20 04:27:38 +0000

    Set UFS/FFS file type to snapshot before changing its block pointers.
    
    Reported-by:  Peter Holm
    Tested-by:    Peter Holm
    Sponsored-by: The FreeBSD Foundation
    
    (cherry picked from commit 220427da0e9b2c1d8e964120becc17eb7524e46f)
---
 sys/ufs/ffs/ffs_alloc.c    |  1 +
 sys/ufs/ffs/ffs_snapshot.c | 15 +++++++++------
 2 files changed, 10 insertions(+), 6 deletions(-)

diff --git a/sys/ufs/ffs/ffs_alloc.c b/sys/ufs/ffs/ffs_alloc.c
index a84202eccc05..933745885755 100644
--- a/sys/ufs/ffs/ffs_alloc.c
+++ b/sys/ufs/ffs/ffs_alloc.c
@@ -3130,6 +3130,7 @@ ffs_checkcgintegrity(struct fs *fs,
 	fs->fs_cstotal.cs_nifree -= fs->fs_cs(fs, cg).cs_nifree;
 	fs->fs_cs(fs, cg).cs_nifree = 0;
 	fs->fs_maxcluster[cg] = 0;
+	fs->fs_flags |= FS_NEEDSFSCK;
 	fs->fs_fmod = 1;
 }
 
diff --git a/sys/ufs/ffs/ffs_snapshot.c b/sys/ufs/ffs/ffs_snapshot.c
index 5ceca72fd44f..b7844e0564d0 100644
--- a/sys/ufs/ffs/ffs_snapshot.c
+++ b/sys/ufs/ffs/ffs_snapshot.c
@@ -368,6 +368,15 @@ restart:
 				goto out;
 		}
 	}
+	/*
+	 * Change inode to snapshot type file. Before setting its block
+	 * pointers to BLK_SNAP and BLK_NOCOPY in cgaccount, we have to
+	 * set its type to SF_SNAPSHOT so that VOP_REMOVE will know that
+	 * they need to be rolled back before attempting deletion.
+	 */
+	ip->i_flags |= SF_SNAPSHOT;
+	DIP_SET(ip, i_flags, ip->i_flags);
+	UFS_INODE_SET_FLAG(ip, IN_CHANGE | IN_UPDATE);
 	/*
 	 * Copy all the cylinder group maps. Although the
 	 * filesystem is still active, we hope that only a few
@@ -393,12 +402,6 @@ restart:
 		if (error)
 			goto out;
 	}
-	/*
-	 * Change inode to snapshot type file.
-	 */
-	ip->i_flags |= SF_SNAPSHOT;
-	DIP_SET(ip, i_flags, ip->i_flags);
-	UFS_INODE_SET_FLAG(ip, IN_CHANGE | IN_UPDATE);
 	/*
 	 * Ensure that the snapshot is completely on disk.
 	 * Since we have marked it as a snapshot it is safe to



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202308200428.37K4SSRW033804>