Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. =================================================================== RCS file: /ftp/cvs/cvsroot/src/sys/ufs/ffs/ffs_snapshot.c,v rcsdiff: /ftp/cvs/cvsroot/src/sys/ufs/ffs/ffs_snapshot.c,v: warning: Unknown phrases like `commitid ...;' are present. retrieving revision 1.24.2.1 retrieving revision 1.25 diff -u -p -r1.24.2.1 -r1.25 --- src/sys/ufs/ffs/ffs_snapshot.c 2006/09/09 03:00:00 1.24.2.1 +++ src/sys/ufs/ffs/ffs_snapshot.c 2006/03/17 23:29:12 1.25 @@ -1,4 +1,4 @@ -/* $NetBSD: ffs_snapshot.c,v 1.24.2.1 2006/09/09 03:00:00 rpaulo Exp $ */ +/* $NetBSD: ffs_snapshot.c,v 1.25 2006/03/17 23:29:12 christos Exp $ */ /* * Copyright 2000 Marshall Kirk McKusick. All Rights Reserved. @@ -38,7 +38,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: ffs_snapshot.c,v 1.24.2.1 2006/09/09 03:00:00 rpaulo Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ffs_snapshot.c,v 1.25 2006/03/17 23:29:12 christos Exp $"); #if defined(_KERNEL_OPT) #include "opt_ffs.h" @@ -58,7 +58,6 @@ __KERNEL_RCSID(0, "$NetBSD: ffs_snapshot #include #include #include -#include #include @@ -72,7 +71,7 @@ __KERNEL_RCSID(0, "$NetBSD: ffs_snapshot #include /* FreeBSD -> NetBSD conversion */ -#define KERNCRED lwp0.l_cred +#define KERNCRED proc0.p_ucred #define ufs1_daddr_t int32_t #define ufs2_daddr_t int64_t #define ufs_lbn_t daddr_t @@ -180,9 +179,8 @@ ffs_snapshot(struct mount *mp, struct vn return EXDEV; if (vp->v_usecount != 1 || vp->v_writecount != 0) return EBUSY; - if (kauth_authorize_generic(l->l_cred, KAUTH_GENERIC_ISSUSER, - &l->l_acflag) != 0 && - VTOI(vp)->i_uid != kauth_cred_geteuid(l->l_cred)) + if (suser(l->l_proc->p_ucred, &l->l_proc->p_acflag) != 0 && + VTOI(vp)->i_uid != l->l_proc->p_ucred->cr_uid) return EACCES; if (vp->v_size != 0) { @@ -209,7 +207,7 @@ ffs_snapshot(struct mount *mp, struct vn blkno = ufs_rw64(blkno, ns); error = vn_rdwr(UIO_WRITE, vp, (caddr_t)&blkno, sizeof(blkno), lblktosize(fs, (off_t)numblks), - UIO_SYSSPACE, IO_NODELOCKED|IO_UNIT, l->l_cred, NULL, NULL); + UIO_SYSSPACE, IO_NODELOCKED|IO_UNIT, l->l_proc->p_ucred, NULL, NULL); if (error) goto out; /* @@ -225,7 +223,7 @@ ffs_snapshot(struct mount *mp, struct vn */ for (blkno = NDADDR; blkno < numblks; blkno += NINDIR(fs)) { error = ffs_balloc(vp, lblktosize(fs, (off_t)blkno), - fs->fs_bsize, l->l_cred, B_METAONLY, &ibp); + fs->fs_bsize, l->l_proc->p_ucred, B_METAONLY, &ibp); if (error) goto out; bawrite(ibp); @@ -290,7 +288,7 @@ ffs_snapshot(struct mount *mp, struct vn goto out; } vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); - getmicrotime(&starttime); + microtime(&starttime); /* * First, copy all the cylinder group maps that have changed. */ @@ -387,7 +385,7 @@ loop: if (snapdebug) vprint("ffs_snapshot: busy vnode", xvp); #endif - if (VOP_GETATTR(xvp, &vat, l->l_cred, l) == 0 && + if (VOP_GETATTR(xvp, &vat, l->l_proc->p_ucred, l) == 0 && vat.va_nlink > 0) { VOP_UNLOCK(xvp, 0); MNT_ILOCK(mp); @@ -521,7 +519,7 @@ out1: #ifdef DEBUG if (starttime.tv_sec > 0) { - getmicrotime(&endtime); + microtime(&endtime); timersub(&endtime, &starttime, &endtime); printf("%s: suspended %ld.%03ld sec, redo %ld of %d\n", vp->v_mount->mnt_stat.f_mntonname, (long)endtime.tv_sec, @@ -580,7 +578,7 @@ out1: snapblklist[i] = ufs_rw64(snapblklist[i], ns); error = vn_rdwr(UIO_WRITE, vp, (caddr_t)snapblklist, snaplistsize*sizeof(ufs2_daddr_t), lblktosize(fs, (off_t)numblks), - UIO_SYSSPACE, IO_NODELOCKED|IO_UNIT, l->l_cred, NULL, NULL); + UIO_SYSSPACE, IO_NODELOCKED|IO_UNIT, l->l_proc->p_ucred, NULL, NULL); for (i = 0; i < snaplistsize; i++) snapblklist[i] = ufs_rw64(snapblklist[i], ns); if (error) { @@ -1556,6 +1554,8 @@ retry: lockmgr(vp->v_vnlock, LK_INTERLOCK | LK_EXCLUSIVE | LK_NOWAIT, VI_MTX(devvp)) != 0) { + if (lbn >= NDADDR) + brelse(ibp); vn_lock(vp, LK_EXCLUSIVE | LK_SLEEPFAIL); goto retry; } @@ -1644,7 +1644,7 @@ ffs_snapshot_mount(struct mount *mp) struct ufsmount *ump = VFSTOUFS(mp); struct vnode *devvp = ump->um_devvp; struct fs *fs = ump->um_fs; - struct lwp *l = curlwp; + struct proc *p = curproc; struct vnode *vp; struct inode *ip, *xp; ufs2_daddr_t snaplistsize, *snapblklist; @@ -1692,7 +1692,7 @@ ffs_snapshot_mount(struct mount *mp) (caddr_t)&snaplistsize, sizeof(snaplistsize), lblktosize(fs, howmany(fs->fs_size, fs->fs_frag)), UIO_SYSSPACE, IO_NODELOCKED|IO_UNIT, - l->l_cred, NULL, NULL); + p->p_ucred, NULL, NULL); if (error) { printf("ffs_snapshot_mount: read_1 failed %d\n", error); snaplistsize = 1; @@ -1707,7 +1707,7 @@ ffs_snapshot_mount(struct mount *mp) snaplistsize * sizeof(ufs2_daddr_t), lblktosize(fs, howmany(fs->fs_size, fs->fs_frag)), UIO_SYSSPACE, IO_NODELOCKED|IO_UNIT, - l->l_cred, NULL, NULL); + p->p_ucred, NULL, NULL); for (i = 0; i < snaplistsize; i++) snapblklist[i] = ufs_rw64(snapblklist[i], ns); if (error) {