Changeset View
Changeset View
Standalone View
Standalone View
sys/ufs/ufs/ufs_vnops.c
Show First 20 Lines • Show All 1,149 Lines • ▼ Show 20 Lines | if (error != 0) { | ||||
MPASS(error == ERELOOKUP); | MPASS(error == ERELOOKUP); | ||||
return (error); | return (error); | ||||
} | } | ||||
} | } | ||||
switch (ap->a_flags) { | switch (ap->a_flags) { | ||||
case LOOKUP: | case LOOKUP: | ||||
/* 4.4 format directories support whiteout operations */ | /* 4.4 format directories support whiteout operations */ | ||||
if (dvp->v_mount->mnt_maxsymlinklen > 0) | if (!OFSFMT(dvp)) | ||||
return (0); | return (0); | ||||
return (EOPNOTSUPP); | return (EOPNOTSUPP); | ||||
case CREATE: | case CREATE: | ||||
/* create a new directory whiteout */ | /* create a new directory whiteout */ | ||||
#ifdef INVARIANTS | #ifdef INVARIANTS | ||||
if ((cnp->cn_flags & SAVENAME) == 0) | if ((cnp->cn_flags & SAVENAME) == 0) | ||||
panic("ufs_whiteout: missing name"); | panic("ufs_whiteout: missing name"); | ||||
if (dvp->v_mount->mnt_maxsymlinklen <= 0) | if (OFSFMT(dvp)) | ||||
panic("ufs_whiteout: old format filesystem"); | panic("ufs_whiteout: old format filesystem"); | ||||
#endif | #endif | ||||
newdir.d_ino = UFS_WINO; | newdir.d_ino = UFS_WINO; | ||||
newdir.d_namlen = cnp->cn_namelen; | newdir.d_namlen = cnp->cn_namelen; | ||||
bcopy(cnp->cn_nameptr, newdir.d_name, (unsigned)cnp->cn_namelen + 1); | bcopy(cnp->cn_nameptr, newdir.d_name, (unsigned)cnp->cn_namelen + 1); | ||||
newdir.d_type = DT_WHT; | newdir.d_type = DT_WHT; | ||||
error = ufs_direnter(dvp, NULL, &newdir, cnp, NULL); | error = ufs_direnter(dvp, NULL, &newdir, cnp, NULL); | ||||
break; | break; | ||||
case DELETE: | case DELETE: | ||||
/* remove an existing directory whiteout */ | /* remove an existing directory whiteout */ | ||||
#ifdef INVARIANTS | #ifdef INVARIANTS | ||||
if (dvp->v_mount->mnt_maxsymlinklen <= 0) | if (OFSFMT(dvp)) | ||||
panic("ufs_whiteout: old format filesystem"); | panic("ufs_whiteout: old format filesystem"); | ||||
#endif | #endif | ||||
cnp->cn_flags &= ~DOWHITEOUT; | cnp->cn_flags &= ~DOWHITEOUT; | ||||
error = ufs_dirremove(dvp, NULL, cnp->cn_flags, 0); | error = ufs_dirremove(dvp, NULL, cnp->cn_flags, 0); | ||||
break; | break; | ||||
default: | default: | ||||
panic("ufs_whiteout: unknown op"); | panic("ufs_whiteout: unknown op"); | ||||
▲ Show 20 Lines • Show All 888 Lines • ▼ Show 20 Lines | if (dvp->v_mount->mnt_flag & MNT_ACLS) { | ||||
if (error) | if (error) | ||||
goto bad; | goto bad; | ||||
} | } | ||||
#endif /* !UFS_ACL */ | #endif /* !UFS_ACL */ | ||||
/* | /* | ||||
* Initialize directory with "." and ".." from static template. | * Initialize directory with "." and ".." from static template. | ||||
*/ | */ | ||||
if (dvp->v_mount->mnt_maxsymlinklen > 0) | if (!OFSFMT(dvp)) | ||||
dtp = &mastertemplate; | dtp = &mastertemplate; | ||||
else | else | ||||
dtp = (struct dirtemplate *)&omastertemplate; | dtp = (struct dirtemplate *)&omastertemplate; | ||||
dirtemplate = *dtp; | dirtemplate = *dtp; | ||||
dirtemplate.dot_ino = ip->i_number; | dirtemplate.dot_ino = ip->i_number; | ||||
dirtemplate.dotdot_ino = dp->i_number; | dirtemplate.dotdot_ino = dp->i_number; | ||||
vnode_pager_setsize(tvp, DIRBLKSIZ); | vnode_pager_setsize(tvp, DIRBLKSIZ); | ||||
if ((error = UFS_BALLOC(tvp, (off_t)0, DIRBLKSIZ, cnp->cn_cred, | if ((error = UFS_BALLOC(tvp, (off_t)0, DIRBLKSIZ, cnp->cn_cred, | ||||
▲ Show 20 Lines • Show All 187 Lines • ▼ Show 20 Lines | ufs_symlink(ap) | ||||
int len, error; | int len, error; | ||||
error = ufs_makeinode(IFLNK | ap->a_vap->va_mode, ap->a_dvp, | error = ufs_makeinode(IFLNK | ap->a_vap->va_mode, ap->a_dvp, | ||||
vpp, ap->a_cnp, "ufs_symlink"); | vpp, ap->a_cnp, "ufs_symlink"); | ||||
if (error) | if (error) | ||||
return (error); | return (error); | ||||
vp = *vpp; | vp = *vpp; | ||||
len = strlen(ap->a_target); | len = strlen(ap->a_target); | ||||
if (len < vp->v_mount->mnt_maxsymlinklen) { | if (len < VFSTOUFS(vp->v_mount)->um_maxsymlinklen) { | ||||
ip = VTOI(vp); | ip = VTOI(vp); | ||||
bcopy(ap->a_target, SHORTLINK(ip), len); | bcopy(ap->a_target, SHORTLINK(ip), len); | ||||
ip->i_size = len; | ip->i_size = len; | ||||
DIP_SET(ip, i_size, len); | DIP_SET(ip, i_size, len); | ||||
UFS_INODE_SET_FLAG(ip, IN_SIZEMOD | IN_CHANGE | IN_UPDATE); | UFS_INODE_SET_FLAG(ip, IN_SIZEMOD | IN_CHANGE | IN_UPDATE); | ||||
error = UFS_UPDATE(vp, 0); | error = UFS_UPDATE(vp, 0); | ||||
} else | } else | ||||
error = vn_rdwr(UIO_WRITE, vp, __DECONST(void *, ap->a_target), | error = vn_rdwr(UIO_WRITE, vp, __DECONST(void *, ap->a_target), | ||||
▲ Show 20 Lines • Show All 73 Lines • ▼ Show 20 Lines | while (error == 0 && uio->uio_resid > 0 && | ||||
while (error == 0 && uio->uio_resid > 0 && dp < edp) { | while (error == 0 && uio->uio_resid > 0 && dp < edp) { | ||||
if (dp->d_reclen <= offsetof(struct direct, d_name) || | if (dp->d_reclen <= offsetof(struct direct, d_name) || | ||||
(caddr_t)dp + dp->d_reclen > (caddr_t)edp) { | (caddr_t)dp + dp->d_reclen > (caddr_t)edp) { | ||||
error = EIO; | error = EIO; | ||||
break; | break; | ||||
} | } | ||||
#if BYTE_ORDER == LITTLE_ENDIAN | #if BYTE_ORDER == LITTLE_ENDIAN | ||||
/* Old filesystem format. */ | /* Old filesystem format. */ | ||||
if (vp->v_mount->mnt_maxsymlinklen <= 0) { | if (OFSFMT(vp)) { | ||||
dstdp.d_namlen = dp->d_type; | dstdp.d_namlen = dp->d_type; | ||||
dstdp.d_type = dp->d_namlen; | dstdp.d_type = dp->d_namlen; | ||||
} else | } else | ||||
#endif | #endif | ||||
{ | { | ||||
dstdp.d_namlen = dp->d_namlen; | dstdp.d_namlen = dp->d_namlen; | ||||
dstdp.d_type = dp->d_type; | dstdp.d_type = dp->d_type; | ||||
} | } | ||||
▲ Show 20 Lines • Show All 64 Lines • ▼ Show 20 Lines | struct vop_readlink_args /* { | ||||
struct ucred *a_cred; | struct ucred *a_cred; | ||||
} */ *ap; | } */ *ap; | ||||
{ | { | ||||
struct vnode *vp = ap->a_vp; | struct vnode *vp = ap->a_vp; | ||||
struct inode *ip = VTOI(vp); | struct inode *ip = VTOI(vp); | ||||
doff_t isize; | doff_t isize; | ||||
isize = ip->i_size; | isize = ip->i_size; | ||||
if (isize < vp->v_mount->mnt_maxsymlinklen) | if (isize < VFSTOUFS(vp->v_mount)->um_maxsymlinklen) | ||||
return (uiomove(SHORTLINK(ip), isize, ap->a_uio)); | return (uiomove(SHORTLINK(ip), isize, ap->a_uio)); | ||||
return (VOP_READ(vp, ap->a_uio, 0, ap->a_cred)); | return (VOP_READ(vp, ap->a_uio, 0, ap->a_cred)); | ||||
} | } | ||||
/* | /* | ||||
* Calculate the logical to physical mapping if not done already, | * Calculate the logical to physical mapping if not done already, | ||||
* then call the device strategy routine. | * then call the device strategy routine. | ||||
* | * | ||||
▲ Show 20 Lines • Show All 545 Lines • Show Last 20 Lines |