Deleted Added
full compact
ffs_snapshot.c (109623) ffs_snapshot.c (111119)
1/*
2 * Copyright 2000 Marshall Kirk McKusick. All Rights Reserved.
3 *
4 * Further information about snapshots can be obtained from:
5 *
6 * Marshall Kirk McKusick http://www.mckusick.com/softdep/
7 * 1614 Oxford Street mckusick@mckusick.com
8 * Berkeley, CA 94709-1608 +1-510-843-9542

--- 17 unchanged lines hidden (view full) ---

26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * SUCH DAMAGE.
32 *
33 * @(#)ffs_snapshot.c 8.11 (McKusick) 7/23/00
1/*
2 * Copyright 2000 Marshall Kirk McKusick. All Rights Reserved.
3 *
4 * Further information about snapshots can be obtained from:
5 *
6 * Marshall Kirk McKusick http://www.mckusick.com/softdep/
7 * 1614 Oxford Street mckusick@mckusick.com
8 * Berkeley, CA 94709-1608 +1-510-843-9542

--- 17 unchanged lines hidden (view full) ---

26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * SUCH DAMAGE.
32 *
33 * @(#)ffs_snapshot.c 8.11 (McKusick) 7/23/00
34 * $FreeBSD: head/sys/ufs/ffs/ffs_snapshot.c 109623 2003-01-21 08:56:16Z alfred $
34 * $FreeBSD: head/sys/ufs/ffs/ffs_snapshot.c 111119 2003-02-19 05:47:46Z imp $
35 */
36
37#include <sys/param.h>
38#include <sys/stdint.h>
39#include <sys/kernel.h>
40#include <sys/systm.h>
41#include <sys/conf.h>
42#include <sys/bio.h>

--- 221 unchanged lines hidden (view full) ---

264 * Copy all the cylinder group maps. Although the
265 * filesystem is still active, we hope that only a few
266 * cylinder groups will change between now and when we
267 * suspend operations. Thus, we will be able to quickly
268 * touch up the few cylinder groups that changed during
269 * the suspension period.
270 */
271 len = howmany(fs->fs_ncg, NBBY);
35 */
36
37#include <sys/param.h>
38#include <sys/stdint.h>
39#include <sys/kernel.h>
40#include <sys/systm.h>
41#include <sys/conf.h>
42#include <sys/bio.h>

--- 221 unchanged lines hidden (view full) ---

264 * Copy all the cylinder group maps. Although the
265 * filesystem is still active, we hope that only a few
266 * cylinder groups will change between now and when we
267 * suspend operations. Thus, we will be able to quickly
268 * touch up the few cylinder groups that changed during
269 * the suspension period.
270 */
271 len = howmany(fs->fs_ncg, NBBY);
272 MALLOC(fs->fs_active, int *, len, M_DEVBUF, 0);
272 MALLOC(fs->fs_active, int *, len, M_DEVBUF, M_WAITOK);
273 bzero(fs->fs_active, len);
274 for (cg = 0; cg < fs->fs_ncg; cg++) {
275 error = UFS_BALLOC(vp, (off_t)(cgtod(fs, cg)) << fs->fs_fshift,
276 fs->fs_bsize, KERNCRED, 0, &nbp);
277 if (error)
278 goto out;
279 error = cgaccount(cg, vp, nbp, 1);
280 bawrite(nbp);

--- 73 unchanged lines hidden (view full) ---

354 if ((fs->fs_flags & (FS_UNCLEAN | FS_NEEDSFSCK)) == 0)
355 copy_fs->fs_clean = 1;
356 if (fs->fs_sbsize < SBLOCKSIZE)
357 bzero(&sbp->b_data[loc + fs->fs_sbsize],
358 SBLOCKSIZE - fs->fs_sbsize);
359 size = blkroundup(fs, fs->fs_cssize);
360 if (fs->fs_contigsumsize > 0)
361 size += fs->fs_ncg * sizeof(int32_t);
273 bzero(fs->fs_active, len);
274 for (cg = 0; cg < fs->fs_ncg; cg++) {
275 error = UFS_BALLOC(vp, (off_t)(cgtod(fs, cg)) << fs->fs_fshift,
276 fs->fs_bsize, KERNCRED, 0, &nbp);
277 if (error)
278 goto out;
279 error = cgaccount(cg, vp, nbp, 1);
280 bawrite(nbp);

--- 73 unchanged lines hidden (view full) ---

354 if ((fs->fs_flags & (FS_UNCLEAN | FS_NEEDSFSCK)) == 0)
355 copy_fs->fs_clean = 1;
356 if (fs->fs_sbsize < SBLOCKSIZE)
357 bzero(&sbp->b_data[loc + fs->fs_sbsize],
358 SBLOCKSIZE - fs->fs_sbsize);
359 size = blkroundup(fs, fs->fs_cssize);
360 if (fs->fs_contigsumsize > 0)
361 size += fs->fs_ncg * sizeof(int32_t);
362 space = malloc((u_long)size, M_UFSMNT, 0);
362 space = malloc((u_long)size, M_UFSMNT, M_WAITOK);
363 copy_fs->fs_csp = space;
364 bcopy(fs->fs_csp, copy_fs->fs_csp, fs->fs_cssize);
365 (char *)space += fs->fs_cssize;
366 loc = howmany(fs->fs_cssize, fs->fs_fsize);
367 i = fs->fs_frag - loc % fs->fs_frag;
368 len = (i == fs->fs_frag) ? 0 : i * fs->fs_fsize;
369 if (len > 0) {
370 if ((error = bread(devvp, fsbtodb(fs, fs->fs_csaddr + loc),

--- 97 unchanged lines hidden (view full) ---

468 VI_LOCK(vp);
469 vp->v_vnlock = ITOV(xp)->v_vnlock;
470 VI_UNLOCK(devvp);
471 } else {
472 struct lock *lkp;
473
474 VI_UNLOCK(devvp);
475 MALLOC(lkp, struct lock *, sizeof(struct lock), M_UFSMNT,
363 copy_fs->fs_csp = space;
364 bcopy(fs->fs_csp, copy_fs->fs_csp, fs->fs_cssize);
365 (char *)space += fs->fs_cssize;
366 loc = howmany(fs->fs_cssize, fs->fs_fsize);
367 i = fs->fs_frag - loc % fs->fs_frag;
368 len = (i == fs->fs_frag) ? 0 : i * fs->fs_fsize;
369 if (len > 0) {
370 if ((error = bread(devvp, fsbtodb(fs, fs->fs_csaddr + loc),

--- 97 unchanged lines hidden (view full) ---

468 VI_LOCK(vp);
469 vp->v_vnlock = ITOV(xp)->v_vnlock;
470 VI_UNLOCK(devvp);
471 } else {
472 struct lock *lkp;
473
474 VI_UNLOCK(devvp);
475 MALLOC(lkp, struct lock *, sizeof(struct lock), M_UFSMNT,
476 0);
476 M_WAITOK);
477 lockinit(lkp, PVFS, "snaplk", VLKTIMEOUT,
478 LK_CANRECURSE | LK_NOPAUSE);
479 VI_LOCK(vp);
480 vp->v_vnlock = lkp;
481 }
482 vn_lock(vp, LK_INTERLOCK | LK_EXCLUSIVE | LK_RETRY, td);
483 transferlockers(&vp->v_lock, vp->v_vnlock);
484 lockmgr(&vp->v_lock, LK_RELEASE, NULL, td);

--- 46 unchanged lines hidden (view full) ---

531 }
532 }
533 /*
534 * Allocate the space for the list of preallocated snapshot blocks.
535 */
536 snaplistsize = fs->fs_ncg + howmany(fs->fs_cssize, fs->fs_bsize) +
537 FSMAXSNAP + 1 /* superblock */ + 1 /* last block */ + 1 /* size */;
538 MALLOC(snapblklist, daddr_t *, snaplistsize * sizeof(daddr_t),
477 lockinit(lkp, PVFS, "snaplk", VLKTIMEOUT,
478 LK_CANRECURSE | LK_NOPAUSE);
479 VI_LOCK(vp);
480 vp->v_vnlock = lkp;
481 }
482 vn_lock(vp, LK_INTERLOCK | LK_EXCLUSIVE | LK_RETRY, td);
483 transferlockers(&vp->v_lock, vp->v_vnlock);
484 lockmgr(&vp->v_lock, LK_RELEASE, NULL, td);

--- 46 unchanged lines hidden (view full) ---

531 }
532 }
533 /*
534 * Allocate the space for the list of preallocated snapshot blocks.
535 */
536 snaplistsize = fs->fs_ncg + howmany(fs->fs_cssize, fs->fs_bsize) +
537 FSMAXSNAP + 1 /* superblock */ + 1 /* last block */ + 1 /* size */;
538 MALLOC(snapblklist, daddr_t *, snaplistsize * sizeof(daddr_t),
539 M_UFSMNT, 0);
539 M_UFSMNT, M_WAITOK);
540 ip->i_snapblklist = &snapblklist[1];
541 /*
542 * Expunge the blocks used by the snapshots from the set of
543 * blocks marked as used in the snapshot bitmaps. Also, collect
544 * the list of allocated blocks in i_snapblklist.
545 */
546 if (ip->i_ump->um_fstype == UFS1)
547 error = expunge_ufs1(vp, ip, copy_fs, mapacct_ufs1, BLK_SNAP);

--- 319 unchanged lines hidden (view full) ---

867 return (error);
868 }
869 /*
870 * Account for the block pointers in this indirect block.
871 */
872 last = howmany(remblks, blksperindir);
873 if (last > NINDIR(fs))
874 last = NINDIR(fs);
540 ip->i_snapblklist = &snapblklist[1];
541 /*
542 * Expunge the blocks used by the snapshots from the set of
543 * blocks marked as used in the snapshot bitmaps. Also, collect
544 * the list of allocated blocks in i_snapblklist.
545 */
546 if (ip->i_ump->um_fstype == UFS1)
547 error = expunge_ufs1(vp, ip, copy_fs, mapacct_ufs1, BLK_SNAP);

--- 319 unchanged lines hidden (view full) ---

867 return (error);
868 }
869 /*
870 * Account for the block pointers in this indirect block.
871 */
872 last = howmany(remblks, blksperindir);
873 if (last > NINDIR(fs))
874 last = NINDIR(fs);
875 MALLOC(bap, ufs1_daddr_t *, fs->fs_bsize, M_DEVBUF, 0);
875 MALLOC(bap, ufs1_daddr_t *, fs->fs_bsize, M_DEVBUF, M_WAITOK);
876 bcopy(bp->b_data, (caddr_t)bap, fs->fs_bsize);
877 bqrelse(bp);
878 error = (*acctfunc)(snapvp, &bap[0], &bap[last], fs,
879 level == 0 ? rlbn : -1, expungetype);
880 if (error || level == 0)
881 goto out;
882 /*
883 * Account for the block pointers in each of the indirect blocks

--- 258 unchanged lines hidden (view full) ---

1142 return (error);
1143 }
1144 /*
1145 * Account for the block pointers in this indirect block.
1146 */
1147 last = howmany(remblks, blksperindir);
1148 if (last > NINDIR(fs))
1149 last = NINDIR(fs);
876 bcopy(bp->b_data, (caddr_t)bap, fs->fs_bsize);
877 bqrelse(bp);
878 error = (*acctfunc)(snapvp, &bap[0], &bap[last], fs,
879 level == 0 ? rlbn : -1, expungetype);
880 if (error || level == 0)
881 goto out;
882 /*
883 * Account for the block pointers in each of the indirect blocks

--- 258 unchanged lines hidden (view full) ---

1142 return (error);
1143 }
1144 /*
1145 * Account for the block pointers in this indirect block.
1146 */
1147 last = howmany(remblks, blksperindir);
1148 if (last > NINDIR(fs))
1149 last = NINDIR(fs);
1150 MALLOC(bap, ufs2_daddr_t *, fs->fs_bsize, M_DEVBUF, 0);
1150 MALLOC(bap, ufs2_daddr_t *, fs->fs_bsize, M_DEVBUF, M_WAITOK);
1151 bcopy(bp->b_data, (caddr_t)bap, fs->fs_bsize);
1152 bqrelse(bp);
1153 error = (*acctfunc)(snapvp, &bap[0], &bap[last], fs,
1154 level == 0 ? rlbn : -1, expungetype);
1155 if (error || level == 0)
1156 goto out;
1157 /*
1158 * Account for the block pointers in each of the indirect blocks

--- 567 unchanged lines hidden (view full) ---

1726 VI_LOCK(vp);
1727 vp->v_vnlock = ITOV(xp)->v_vnlock;
1728 VI_UNLOCK(devvp);
1729 } else {
1730 struct lock *lkp;
1731
1732 VI_UNLOCK(devvp);
1733 MALLOC(lkp, struct lock *, sizeof(struct lock),
1151 bcopy(bp->b_data, (caddr_t)bap, fs->fs_bsize);
1152 bqrelse(bp);
1153 error = (*acctfunc)(snapvp, &bap[0], &bap[last], fs,
1154 level == 0 ? rlbn : -1, expungetype);
1155 if (error || level == 0)
1156 goto out;
1157 /*
1158 * Account for the block pointers in each of the indirect blocks

--- 567 unchanged lines hidden (view full) ---

1726 VI_LOCK(vp);
1727 vp->v_vnlock = ITOV(xp)->v_vnlock;
1728 VI_UNLOCK(devvp);
1729 } else {
1730 struct lock *lkp;
1731
1732 VI_UNLOCK(devvp);
1733 MALLOC(lkp, struct lock *, sizeof(struct lock),
1734 M_UFSMNT, 0);
1734 M_UFSMNT, M_WAITOK);
1735 lockinit(lkp, PVFS, "snaplk", VLKTIMEOUT,
1736 LK_CANRECURSE | LK_NOPAUSE);
1737 VI_LOCK(vp);
1738 vp->v_vnlock = lkp;
1739 }
1740 vn_lock(vp, LK_INTERLOCK | LK_EXCLUSIVE | LK_RETRY, td);
1741 transferlockers(&vp->v_lock, vp->v_vnlock);
1742 lockmgr(&vp->v_lock, LK_RELEASE, NULL, td);

--- 31 unchanged lines hidden (view full) ---

1774 auio.uio_td = td;
1775 vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, td);
1776 if ((error = VOP_READ(vp, &auio, IO_UNIT, td->td_ucred)) != 0) {
1777 printf("ffs_snapshot_mount: read_1 failed %d\n", error);
1778 VOP_UNLOCK(vp, 0, td);
1779 return;
1780 }
1781 MALLOC(snapblklist, void *, snaplistsize * sizeof(daddr_t),
1735 lockinit(lkp, PVFS, "snaplk", VLKTIMEOUT,
1736 LK_CANRECURSE | LK_NOPAUSE);
1737 VI_LOCK(vp);
1738 vp->v_vnlock = lkp;
1739 }
1740 vn_lock(vp, LK_INTERLOCK | LK_EXCLUSIVE | LK_RETRY, td);
1741 transferlockers(&vp->v_lock, vp->v_vnlock);
1742 lockmgr(&vp->v_lock, LK_RELEASE, NULL, td);

--- 31 unchanged lines hidden (view full) ---

1774 auio.uio_td = td;
1775 vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, td);
1776 if ((error = VOP_READ(vp, &auio, IO_UNIT, td->td_ucred)) != 0) {
1777 printf("ffs_snapshot_mount: read_1 failed %d\n", error);
1778 VOP_UNLOCK(vp, 0, td);
1779 return;
1780 }
1781 MALLOC(snapblklist, void *, snaplistsize * sizeof(daddr_t),
1782 M_UFSMNT, 0);
1782 M_UFSMNT, M_WAITOK);
1783 auio.uio_iovcnt = 1;
1784 aiov.iov_base = snapblklist;
1785 aiov.iov_len = snaplistsize * sizeof (daddr_t);
1786 auio.uio_resid = aiov.iov_len;
1787 auio.uio_offset -= sizeof(snaplistsize);
1788 if ((error = VOP_READ(vp, &auio, IO_UNIT, td->td_ucred)) != 0) {
1789 printf("ffs_snapshot_mount: read_2 failed %d\n", error);
1790 VOP_UNLOCK(vp, 0, td);

--- 254 unchanged lines hidden ---
1783 auio.uio_iovcnt = 1;
1784 aiov.iov_base = snapblklist;
1785 aiov.iov_len = snaplistsize * sizeof (daddr_t);
1786 auio.uio_resid = aiov.iov_len;
1787 auio.uio_offset -= sizeof(snaplistsize);
1788 if ((error = VOP_READ(vp, &auio, IO_UNIT, td->td_ucred)) != 0) {
1789 printf("ffs_snapshot_mount: read_2 failed %d\n", error);
1790 VOP_UNLOCK(vp, 0, td);

--- 254 unchanged lines hidden ---