From 39275d892cc0291136bb750a2f1191137371de42 Mon Sep 17 00:00:00 2001 From: mckusick Date: Wed, 21 Mar 2001 04:05:20 +0000 Subject: Clear the fs_clean flag only when the FS_UNCLEAN flag is not set (as is done in unmount). Remove a snapshot inode from the superblock list when its last name goes away rather than when its last reference goes away. That way it will be properly reclaimed by fsck after a crash rather than reenabled when the filesystem is mounted. --- sys/ufs/ffs/ffs_snapshot.c | 36 ++++++++++++++++++++---------------- 1 file changed, 20 insertions(+), 16 deletions(-) (limited to 'sys/ufs') diff --git a/sys/ufs/ffs/ffs_snapshot.c b/sys/ufs/ffs/ffs_snapshot.c index c8a808f..f128d04 100644 --- a/sys/ufs/ffs/ffs_snapshot.c +++ b/sys/ufs/ffs/ffs_snapshot.c @@ -339,7 +339,8 @@ restart: goto out1; copy_fs = (struct fs *)(nbp->b_data + blkoff(fs, SBOFF)); bcopy(fs, copy_fs, fs->fs_sbsize); - copy_fs->fs_clean = 1; + if ((fs->fs_flags & FS_UNCLEAN) == 0) + copy_fs->fs_clean = 1; if (fs->fs_sbsize < SBSIZE) bzero(&nbp->b_data[blkoff(fs, SBOFF) + fs->fs_sbsize], SBSIZE - fs->fs_sbsize); @@ -601,6 +602,8 @@ ffs_snapgone(ip) struct inode *ip; { struct inode *xp; + struct fs *fs; + int snaploc; /* * Find snapshot in incore list. @@ -613,6 +616,21 @@ ffs_snapgone(ip) ip->i_number); else vrele(ITOV(ip)); + /* + * Delete snapshot inode from superblock. Keep list dense. + */ + fs = ip->i_fs; + for (snaploc = 0; snaploc < FSMAXSNAP; snaploc++) + if (fs->fs_snapinum[snaploc] == ip->i_number) + break; + if (snaploc < FSMAXSNAP) { + for (snaploc++; snaploc < FSMAXSNAP; snaploc++) { + if (fs->fs_snapinum[snaploc] == 0) + break; + fs->fs_snapinum[snaploc - 1] = fs->fs_snapinum[snaploc]; + } + fs->fs_snapinum[snaploc - 1] = 0; + } } /* @@ -627,25 +645,11 @@ ffs_snapremove(vp) struct buf *ibp; struct fs *fs; ufs_daddr_t blkno, dblk; - int error, snaploc, loc, last; + int error, loc, last; ip = VTOI(vp); fs = ip->i_fs; /* - * Delete snapshot inode from superblock. Keep list dense. - */ - for (snaploc = 0; snaploc < FSMAXSNAP; snaploc++) - if (fs->fs_snapinum[snaploc] == ip->i_number) - break; - if (snaploc < FSMAXSNAP) { - for (snaploc++; snaploc < FSMAXSNAP; snaploc++) { - if (fs->fs_snapinum[snaploc] == 0) - break; - fs->fs_snapinum[snaploc - 1] = fs->fs_snapinum[snaploc]; - } - fs->fs_snapinum[snaploc - 1] = 0; - } - /* * Delete from incore list. * Clear copy-on-write flag if last snapshot. */ -- cgit v1.1