From 7fe5e2882f4a98ffd534f1290b4d40512b024d1f Mon Sep 17 00:00:00 2001 From: tegge Date: Sat, 13 May 2006 20:41:37 +0000 Subject: Expunge traces of unlinked snapshot files when making a new snapshot. --- sys/ufs/ffs/ffs_snapshot.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) (limited to 'sys/ufs/ffs') diff --git a/sys/ufs/ffs/ffs_snapshot.c b/sys/ufs/ffs/ffs_snapshot.c index 78862b5..c8dcdcd 100644 --- a/sys/ufs/ffs/ffs_snapshot.c +++ b/sys/ufs/ffs/ffs_snapshot.c @@ -701,6 +701,13 @@ out1: else error = expunge_ufs2(vp, xp, fs, snapacct_ufs2, BLK_SNAP); + if (error == 0 && xp->i_effnlink == 0) { + error = ffs_freefile(ump, + copy_fs, + vp, + xp->i_number, + xp->i_mode); + } if (error) { fs->fs_snapinum[snaploc] = 0; goto done; @@ -989,11 +996,11 @@ expunge_ufs1(snapvp, cancelip, fs, acctfunc, expungetype) } /* * Set a snapshot inode to be a zero length file, regular files - * to be completely unallocated. + * or unlinked snapshots to be completely unallocated. */ dip = (struct ufs1_dinode *)bp->b_data + ino_to_fsbo(fs, cancelip->i_number); - if (expungetype == BLK_NOCOPY) + if (expungetype == BLK_NOCOPY || cancelip->i_effnlink == 0) dip->di_mode = 0; dip->di_size = 0; dip->di_blocks = 0; -- cgit v1.1