version 1.24, 2006/01/04 10:13:06 |
version 1.24.8.1, 2006/03/08 01:39:12 |
Line 71 __KERNEL_RCSID(0, "$NetBSD$"); |
|
Line 71 __KERNEL_RCSID(0, "$NetBSD$"); |
|
#include <ufs/ffs/ffs_extern.h> |
#include <ufs/ffs/ffs_extern.h> |
|
|
/* FreeBSD -> NetBSD conversion */ |
/* FreeBSD -> NetBSD conversion */ |
#define KERNCRED proc0.p_ucred |
#define KERNCRED proc0.p_cred |
#define ufs1_daddr_t int32_t |
#define ufs1_daddr_t int32_t |
#define ufs2_daddr_t int64_t |
#define ufs2_daddr_t int64_t |
#define ufs_lbn_t daddr_t |
#define ufs_lbn_t daddr_t |
Line 179 ffs_snapshot(struct mount *mp, struct vn |
|
Line 179 ffs_snapshot(struct mount *mp, struct vn |
|
return EXDEV; |
return EXDEV; |
if (vp->v_usecount != 1 || vp->v_writecount != 0) |
if (vp->v_usecount != 1 || vp->v_writecount != 0) |
return EBUSY; |
return EBUSY; |
if (suser(l->l_proc->p_ucred, &l->l_proc->p_acflag) != 0 && |
if (generic_authorize(l->l_proc->p_cred, KAUTH_GENERIC_ISSUSER, |
VTOI(vp)->i_uid != l->l_proc->p_ucred->cr_uid) |
&l->l_proc->p_acflag) != 0 && |
|
VTOI(vp)->i_uid != kauth_cred_geteuid(l->l_proc->p_cred)) |
return EACCES; |
return EACCES; |
|
|
if (vp->v_size != 0) { |
if (vp->v_size != 0) { |
Line 207 ffs_snapshot(struct mount *mp, struct vn |
|
Line 208 ffs_snapshot(struct mount *mp, struct vn |
|
blkno = ufs_rw64(blkno, ns); |
blkno = ufs_rw64(blkno, ns); |
error = vn_rdwr(UIO_WRITE, vp, |
error = vn_rdwr(UIO_WRITE, vp, |
(caddr_t)&blkno, sizeof(blkno), lblktosize(fs, (off_t)numblks), |
(caddr_t)&blkno, sizeof(blkno), lblktosize(fs, (off_t)numblks), |
UIO_SYSSPACE, IO_NODELOCKED|IO_UNIT, l->l_proc->p_ucred, NULL, NULL); |
UIO_SYSSPACE, IO_NODELOCKED|IO_UNIT, l->l_proc->p_cred, NULL, NULL); |
if (error) |
if (error) |
goto out; |
goto out; |
/* |
/* |
Line 223 ffs_snapshot(struct mount *mp, struct vn |
|
Line 224 ffs_snapshot(struct mount *mp, struct vn |
|
*/ |
*/ |
for (blkno = NDADDR; blkno < numblks; blkno += NINDIR(fs)) { |
for (blkno = NDADDR; blkno < numblks; blkno += NINDIR(fs)) { |
error = ffs_balloc(vp, lblktosize(fs, (off_t)blkno), |
error = ffs_balloc(vp, lblktosize(fs, (off_t)blkno), |
fs->fs_bsize, l->l_proc->p_ucred, B_METAONLY, &ibp); |
fs->fs_bsize, l->l_proc->p_cred, B_METAONLY, &ibp); |
if (error) |
if (error) |
goto out; |
goto out; |
bawrite(ibp); |
bawrite(ibp); |
|
|
if (snapdebug) |
if (snapdebug) |
vprint("ffs_snapshot: busy vnode", xvp); |
vprint("ffs_snapshot: busy vnode", xvp); |
#endif |
#endif |
if (VOP_GETATTR(xvp, &vat, l->l_proc->p_ucred, l) == 0 && |
if (VOP_GETATTR(xvp, &vat, l->l_proc->p_cred, l) == 0 && |
vat.va_nlink > 0) { |
vat.va_nlink > 0) { |
VOP_UNLOCK(xvp, 0); |
VOP_UNLOCK(xvp, 0); |
MNT_ILOCK(mp); |
MNT_ILOCK(mp); |
|
|
snapblklist[i] = ufs_rw64(snapblklist[i], ns); |
snapblklist[i] = ufs_rw64(snapblklist[i], ns); |
error = vn_rdwr(UIO_WRITE, vp, (caddr_t)snapblklist, |
error = vn_rdwr(UIO_WRITE, vp, (caddr_t)snapblklist, |
snaplistsize*sizeof(ufs2_daddr_t), lblktosize(fs, (off_t)numblks), |
snaplistsize*sizeof(ufs2_daddr_t), lblktosize(fs, (off_t)numblks), |
UIO_SYSSPACE, IO_NODELOCKED|IO_UNIT, l->l_proc->p_ucred, NULL, NULL); |
UIO_SYSSPACE, IO_NODELOCKED|IO_UNIT, l->l_proc->p_cred, NULL, NULL); |
for (i = 0; i < snaplistsize; i++) |
for (i = 0; i < snaplistsize; i++) |
snapblklist[i] = ufs_rw64(snapblklist[i], ns); |
snapblklist[i] = ufs_rw64(snapblklist[i], ns); |
if (error) { |
if (error) { |
Line 1692 ffs_snapshot_mount(struct mount *mp) |
|
Line 1693 ffs_snapshot_mount(struct mount *mp) |
|
(caddr_t)&snaplistsize, sizeof(snaplistsize), |
(caddr_t)&snaplistsize, sizeof(snaplistsize), |
lblktosize(fs, howmany(fs->fs_size, fs->fs_frag)), |
lblktosize(fs, howmany(fs->fs_size, fs->fs_frag)), |
UIO_SYSSPACE, IO_NODELOCKED|IO_UNIT, |
UIO_SYSSPACE, IO_NODELOCKED|IO_UNIT, |
p->p_ucred, NULL, NULL); |
p->p_cred, NULL, NULL); |
if (error) { |
if (error) { |
printf("ffs_snapshot_mount: read_1 failed %d\n", error); |
printf("ffs_snapshot_mount: read_1 failed %d\n", error); |
snaplistsize = 1; |
snaplistsize = 1; |
Line 1707 ffs_snapshot_mount(struct mount *mp) |
|
Line 1708 ffs_snapshot_mount(struct mount *mp) |
|
snaplistsize * sizeof(ufs2_daddr_t), |
snaplistsize * sizeof(ufs2_daddr_t), |
lblktosize(fs, howmany(fs->fs_size, fs->fs_frag)), |
lblktosize(fs, howmany(fs->fs_size, fs->fs_frag)), |
UIO_SYSSPACE, IO_NODELOCKED|IO_UNIT, |
UIO_SYSSPACE, IO_NODELOCKED|IO_UNIT, |
p->p_ucred, NULL, NULL); |
p->p_cred, NULL, NULL); |
for (i = 0; i < snaplistsize; i++) |
for (i = 0; i < snaplistsize; i++) |
snapblklist[i] = ufs_rw64(snapblklist[i], ns); |
snapblklist[i] = ufs_rw64(snapblklist[i], ns); |
if (error) { |
if (error) { |