summaryrefslogtreecommitdiffstats
path: root/sys/ufs/ffs
diff options
context:
space:
mode:
authortegge <tegge@FreeBSD.org>2006-05-13 20:41:37 +0000
committertegge <tegge@FreeBSD.org>2006-05-13 20:41:37 +0000
commit7fe5e2882f4a98ffd534f1290b4d40512b024d1f (patch)
tree06a714f1dc2625dd841b793d1bcc7c2a32c6cad0 /sys/ufs/ffs
parent8059d90140c4a9ce79ab855086c8ed7747e24812 (diff)
downloadFreeBSD-src-7fe5e2882f4a98ffd534f1290b4d40512b024d1f.zip
FreeBSD-src-7fe5e2882f4a98ffd534f1290b4d40512b024d1f.tar.gz
Expunge traces of unlinked snapshot files when making a new snapshot.
Diffstat (limited to 'sys/ufs/ffs')
-rw-r--r--sys/ufs/ffs/ffs_snapshot.c11
1 files changed, 9 insertions, 2 deletions
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;
OpenPOWER on IntegriCloud