The branch stable/13 has been updated by mckusick:

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

commit 47048a611dd2606fe93dd59ca9e3f7ec5d756390
Author:     Kirk McKusick <[email protected]>
AuthorDate: 2023-08-12 18:20:08 +0000
Commit:     Kirk McKusick <[email protected]>
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

Reply via email to