diff options
Diffstat (limited to 'sys/ufs/ffs/ffs_snapshot.c')
-rw-r--r-- | sys/ufs/ffs/ffs_snapshot.c | 36 |
1 files changed, 20 insertions, 16 deletions
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. */ |