Changeset View
Changeset View
Standalone View
Standalone View
sys/fs/ext2fs/ext2_vnops.c
Show First 20 Lines • Show All 1,527 Lines • ▼ Show 20 Lines | ext2_symlink(struct vop_symlink_args *ap) | ||||
int len, error; | int len, error; | ||||
error = ext2_makeinode(IFLNK | ap->a_vap->va_mode, ap->a_dvp, | error = ext2_makeinode(IFLNK | ap->a_vap->va_mode, ap->a_dvp, | ||||
vpp, ap->a_cnp); | vpp, ap->a_cnp); | ||||
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 < VFSTOEXT2(vp->v_mount)->um_e2fs->e2fs_maxsymlinklen) { | ||||
ip = VTOI(vp); | ip = VTOI(vp); | ||||
bcopy(ap->a_target, (char *)ip->i_shortlink, len); | bcopy(ap->a_target, (char *)ip->i_shortlink, len); | ||||
ip->i_size = len; | ip->i_size = len; | ||||
ip->i_flag |= IN_CHANGE | IN_UPDATE; | ip->i_flag |= IN_CHANGE | IN_UPDATE; | ||||
} else | } else | ||||
error = vn_rdwr(UIO_WRITE, vp, __DECONST(void *, ap->a_target), | error = vn_rdwr(UIO_WRITE, vp, __DECONST(void *, ap->a_target), | ||||
len, (off_t)0, UIO_SYSSPACE, IO_NODELOCKED | IO_NOMACCHECK, | len, (off_t)0, UIO_SYSSPACE, IO_NODELOCKED | IO_NOMACCHECK, | ||||
ap->a_cnp->cn_cred, NOCRED, NULL, NULL); | ap->a_cnp->cn_cred, NOCRED, NULL, NULL); | ||||
if (error) | if (error) | ||||
vput(vp); | vput(vp); | ||||
return (error); | return (error); | ||||
} | } | ||||
/* | /* | ||||
* Return target name of a symbolic link | * Return target name of a symbolic link | ||||
*/ | */ | ||||
static int | static int | ||||
ext2_readlink(struct vop_readlink_args *ap) | ext2_readlink(struct vop_readlink_args *ap) | ||||
{ | { | ||||
struct vnode *vp = ap->a_vp; | struct vnode *vp = ap->a_vp; | ||||
struct inode *ip = VTOI(vp); | struct inode *ip = VTOI(vp); | ||||
int isize; | int isize; | ||||
isize = ip->i_size; | isize = ip->i_size; | ||||
if (isize < vp->v_mount->mnt_maxsymlinklen) { | if (isize < VFSTOEXT2(vp->v_mount)->um_e2fs->e2fs_maxsymlinklen) { | ||||
uiomove((char *)ip->i_shortlink, isize, ap->a_uio); | uiomove((char *)ip->i_shortlink, isize, ap->a_uio); | ||||
return (0); | return (0); | ||||
} | } | ||||
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, | ||||
▲ Show 20 Lines • Show All 500 Lines • ▼ Show 20 Lines | ext2_read(struct vop_read_args *ap) | ||||
seqcount = ap->a_ioflag >> IO_SEQSHIFT; | seqcount = ap->a_ioflag >> IO_SEQSHIFT; | ||||
ip = VTOI(vp); | ip = VTOI(vp); | ||||
#ifdef INVARIANTS | #ifdef INVARIANTS | ||||
if (uio->uio_rw != UIO_READ) | if (uio->uio_rw != UIO_READ) | ||||
panic("%s: mode", "ext2_read"); | panic("%s: mode", "ext2_read"); | ||||
if (vp->v_type == VLNK) { | if (vp->v_type == VLNK) { | ||||
if ((int)ip->i_size < vp->v_mount->mnt_maxsymlinklen) | if ((int)ip->i_size < | ||||
VFSTOEXT2(vp->v_mount)->um_e2fs->e2fs_maxsymlinklen) | |||||
panic("%s: short symlink", "ext2_read"); | panic("%s: short symlink", "ext2_read"); | ||||
} else if (vp->v_type != VREG && vp->v_type != VDIR) | } else if (vp->v_type != VREG && vp->v_type != VDIR) | ||||
panic("%s: type %d", "ext2_read", vp->v_type); | panic("%s: type %d", "ext2_read", vp->v_type); | ||||
#endif | #endif | ||||
orig_resid = uio->uio_resid; | orig_resid = uio->uio_resid; | ||||
KASSERT(orig_resid >= 0, ("ext2_read: uio->uio_resid < 0")); | KASSERT(orig_resid >= 0, ("ext2_read: uio->uio_resid < 0")); | ||||
if (orig_resid == 0) | if (orig_resid == 0) | ||||
return (0); | return (0); | ||||
▲ Show 20 Lines • Show All 281 Lines • Show Last 20 Lines |