version 1.30.4.1, 2006/11/18 21:39:18 |
version 1.30.4.2, 2007/01/12 01:04:05 |
Line 390 msdosfs_setattr(v) |
|
Line 390 msdosfs_setattr(v) |
|
return (EROFS); |
return (EROFS); |
if (kauth_cred_geteuid(cred) != pmp->pm_uid && |
if (kauth_cred_geteuid(cred) != pmp->pm_uid && |
(error = kauth_authorize_generic(cred, KAUTH_GENERIC_ISSUSER, |
(error = kauth_authorize_generic(cred, KAUTH_GENERIC_ISSUSER, |
&ap->a_l->l_acflag)) && |
NULL)) && |
((vap->va_vaflags & VA_UTIMES_NULL) == 0 || |
((vap->va_vaflags & VA_UTIMES_NULL) == 0 || |
(error = VOP_ACCESS(ap->a_vp, VWRITE, cred, ap->a_l)))) |
(error = VOP_ACCESS(ap->a_vp, VWRITE, cred, ap->a_l)))) |
return (error); |
return (error); |
Line 413 msdosfs_setattr(v) |
|
Line 413 msdosfs_setattr(v) |
|
return (EROFS); |
return (EROFS); |
if (kauth_cred_geteuid(cred) != pmp->pm_uid && |
if (kauth_cred_geteuid(cred) != pmp->pm_uid && |
(error = kauth_authorize_generic(cred, KAUTH_GENERIC_ISSUSER, |
(error = kauth_authorize_generic(cred, KAUTH_GENERIC_ISSUSER, |
&ap->a_l->l_acflag))) |
NULL))) |
return (error); |
return (error); |
/* We ignore the read and execute bits. */ |
/* We ignore the read and execute bits. */ |
if (vap->va_mode & S_IWUSR) |
if (vap->va_mode & S_IWUSR) |
Line 431 msdosfs_setattr(v) |
|
Line 431 msdosfs_setattr(v) |
|
return (EROFS); |
return (EROFS); |
if (kauth_cred_geteuid(cred) != pmp->pm_uid && |
if (kauth_cred_geteuid(cred) != pmp->pm_uid && |
(error = kauth_authorize_generic(cred, KAUTH_GENERIC_ISSUSER, |
(error = kauth_authorize_generic(cred, KAUTH_GENERIC_ISSUSER, |
&ap->a_l->l_acflag))) |
NULL))) |
return (error); |
return (error); |
if (vap->va_flags & SF_ARCHIVED) |
if (vap->va_flags & SF_ARCHIVED) |
dep->de_Attributes &= ~ATTR_ARCHIVE; |
dep->de_Attributes &= ~ATTR_ARCHIVE; |
|
|
if (diff < n) |
if (diff < n) |
n = (long) diff; |
n = (long) diff; |
|
|
/* convert cluster # to block # */ |
/* convert cluster # to sector # */ |
error = pcbmap(dep, lbn, &lbn, 0, &blsize); |
error = pcbmap(dep, lbn, &lbn, 0, &blsize); |
if (error) |
if (error) |
return (error); |
return (error); |
|
|
* do i/o with the vnode for the filesystem instead of the |
* do i/o with the vnode for the filesystem instead of the |
* vnode for the directory. |
* vnode for the directory. |
*/ |
*/ |
error = bread(pmp->pm_devvp, lbn, blsize, NOCRED, &bp); |
error = bread(pmp->pm_devvp, de_bn2kb(pmp, lbn), blsize, |
|
NOCRED, &bp); |
n = MIN(n, pmp->pm_bpcluster - bp->b_resid); |
n = MIN(n, pmp->pm_bpcluster - bp->b_resid); |
if (error) { |
if (error) { |
brelse(bp); |
brelse(bp); |
Line 651 msdosfs_write(v) |
|
Line 652 msdosfs_write(v) |
|
error = uiomove(win, bytelen, uio); |
error = uiomove(win, bytelen, uio); |
flags = UBC_WANT_UNMAP(vp) ? UBC_UNMAP : 0; |
flags = UBC_WANT_UNMAP(vp) ? UBC_UNMAP : 0; |
ubc_release(win, flags); |
ubc_release(win, flags); |
if (error) { |
if (error) |
break; |
break; |
} |
|
|
|
/* |
/* |
* flush what we just wrote if necessary. |
* flush what we just wrote if necessary. |
|
|
panic("msdosfs_rename: lost from startdir"); |
panic("msdosfs_rename: lost from startdir"); |
if (!newparent) |
if (!newparent) |
VOP_UNLOCK(tdvp, 0); |
VOP_UNLOCK(tdvp, 0); |
(void) relookup(fdvp, &fvp, fcnp); |
vn_lock(fdvp, LK_EXCLUSIVE | LK_RETRY); |
|
if ((error = relookup(fdvp, &fvp, fcnp))) { |
|
vput(fdvp); |
|
vrele(ap->a_fvp); |
|
vrele(tdvp); |
|
return (error); |
|
} |
if (fvp == NULL) { |
if (fvp == NULL) { |
/* |
/* |
* From name has disappeared. |
* From name has disappeared. |
*/ |
*/ |
if (doingdirectory) |
if (doingdirectory) |
panic("rename: lost dir entry"); |
panic("rename: lost dir entry"); |
|
vput(fdvp); |
vrele(ap->a_fvp); |
vrele(ap->a_fvp); |
if (newparent) |
|
VOP_UNLOCK(tdvp, 0); |
|
vrele(tdvp); |
vrele(tdvp); |
return 0; |
return 0; |
} |
} |
|
|
panic("msdosfs_rename: updating .. in root directory?"); |
panic("msdosfs_rename: updating .. in root directory?"); |
} else |
} else |
bn = cntobn(pmp, cn); |
bn = cntobn(pmp, cn); |
error = bread(pmp->pm_devvp, bn, pmp->pm_bpcluster, |
error = bread(pmp->pm_devvp, de_bn2kb(pmp, bn), |
NOCRED, &bp); |
pmp->pm_bpcluster, NOCRED, &bp); |
if (error) { |
if (error) { |
/* XXX should really panic here, fs is corrupt */ |
/* XXX should really panic here, fs is corrupt */ |
brelse(bp); |
brelse(bp); |
Line 1236 msdosfs_mkdir(v) |
|
Line 1241 msdosfs_mkdir(v) |
|
*/ |
*/ |
bn = cntobn(pmp, newcluster); |
bn = cntobn(pmp, newcluster); |
/* always succeeds */ |
/* always succeeds */ |
bp = getblk(pmp->pm_devvp, bn, pmp->pm_bpcluster, 0, 0); |
bp = getblk(pmp->pm_devvp, de_bn2kb(pmp, bn), pmp->pm_bpcluster, 0, 0); |
memset(bp->b_data, 0, pmp->pm_bpcluster); |
memset(bp->b_data, 0, pmp->pm_bpcluster); |
memcpy(bp->b_data, &dosdirtemplate, sizeof dosdirtemplate); |
memcpy(bp->b_data, &dosdirtemplate, sizeof dosdirtemplate); |
denp = (struct direntry *)bp->b_data; |
denp = (struct direntry *)bp->b_data; |
Line 1479 msdosfs_readdir(v) |
|
Line 1484 msdosfs_readdir(v) |
|
if (dep->de_StartCluster == MSDOSFSROOT |
if (dep->de_StartCluster == MSDOSFSROOT |
|| (FAT32(pmp) && dep->de_StartCluster == pmp->pm_rootdirblk)) { |
|| (FAT32(pmp) && dep->de_StartCluster == pmp->pm_rootdirblk)) { |
#if 0 |
#if 0 |
printf("msdosfs_readdir(): going after . or .. in root dir, offset %d\n", |
printf("msdosfs_readdir(): going after . or .. in root dir, " |
offset); |
"offset %" PRIu64 "\n", offset); |
#endif |
#endif |
bias = 2 * sizeof(struct direntry); |
bias = 2 * sizeof(struct direntry); |
if (offset < bias) { |
if (offset < bias) { |
Line 1534 msdosfs_readdir(v) |
|
Line 1539 msdosfs_readdir(v) |
|
n = MIN(n, diff); |
n = MIN(n, diff); |
if ((error = pcbmap(dep, lbn, &bn, &cn, &blsize)) != 0) |
if ((error = pcbmap(dep, lbn, &bn, &cn, &blsize)) != 0) |
break; |
break; |
error = bread(pmp->pm_devvp, bn, blsize, NOCRED, &bp); |
error = bread(pmp->pm_devvp, de_bn2kb(pmp, bn), blsize, |
|
NOCRED, &bp); |
if (error) { |
if (error) { |
brelse(bp); |
brelse(bp); |
return (error); |
return (error); |
Line 1696 msdosfs_bmap(v) |
|
Line 1702 msdosfs_bmap(v) |
|
int *a_runp; |
int *a_runp; |
} */ *ap = v; |
} */ *ap = v; |
struct denode *dep = VTODE(ap->a_vp); |
struct denode *dep = VTODE(ap->a_vp); |
|
int status; |
|
|
if (ap->a_vpp != NULL) |
if (ap->a_vpp != NULL) |
*ap->a_vpp = dep->de_devvp; |
*ap->a_vpp = dep->de_devvp; |
Line 1707 msdosfs_bmap(v) |
|
Line 1714 msdosfs_bmap(v) |
|
*/ |
*/ |
*ap->a_runp = 0; |
*ap->a_runp = 0; |
} |
} |
return (pcbmap(dep, ap->a_bn, ap->a_bnp, 0, 0)); |
status = pcbmap(dep, ap->a_bn, ap->a_bnp, 0, 0); |
|
/* |
|
* We need to scale *ap->a_bnp by sector_size/DEV_BSIZE |
|
*/ |
|
*ap->a_bnp = de_bn2kb(dep->de_pmp, *ap->a_bnp); |
|
return status; |
} |
} |
|
|
int |
int |
Line 1738 msdosfs_strategy(v) |
|
Line 1750 msdosfs_strategy(v) |
|
bp->b_blkno = -1; |
bp->b_blkno = -1; |
if (bp->b_blkno == -1) |
if (bp->b_blkno == -1) |
clrbuf(bp); |
clrbuf(bp); |
|
else |
|
bp->b_blkno = de_bn2kb(dep->de_pmp, bp->b_blkno); |
} |
} |
if (bp->b_blkno == -1) { |
if (bp->b_blkno == -1) { |
biodone(bp); |
biodone(bp); |