Changeset View
Changeset View
Standalone View
Standalone View
sys/kern/vfs_syscalls.c
Show First 20 Lines • Show All 901 Lines • ▼ Show 20 Lines | sys_fchdir(struct thread *td, struct fchdir_args *uap) | ||||
int error; | int error; | ||||
AUDIT_ARG_FD(uap->fd); | AUDIT_ARG_FD(uap->fd); | ||||
error = getvnode_path(td, uap->fd, &cap_fchdir_rights, | error = getvnode_path(td, uap->fd, &cap_fchdir_rights, | ||||
&fp); | &fp); | ||||
if (error != 0) | if (error != 0) | ||||
return (error); | return (error); | ||||
vp = fp->f_vnode; | vp = fp->f_vnode; | ||||
vref(vp); | vrefact(vp); | ||||
fdrop(fp, td); | fdrop(fp, td); | ||||
vn_lock(vp, LK_SHARED | LK_RETRY); | vn_lock(vp, LK_SHARED | LK_RETRY); | ||||
AUDIT_ARG_VNODE1(vp); | AUDIT_ARG_VNODE1(vp); | ||||
error = change_dir(vp, td); | error = change_dir(vp, td); | ||||
while (!error && (mp = vp->v_mountedhere) != NULL) { | while (!error && (mp = vp->v_mountedhere) != NULL) { | ||||
if (vfs_busy(mp, 0)) | if (vfs_busy(mp, 0)) | ||||
continue; | continue; | ||||
error = VFS_ROOT(mp, LK_SHARED, &tdp); | error = VFS_ROOT(mp, LK_SHARED, &tdp); | ||||
▲ Show 20 Lines • Show All 4,117 Lines • Show Last 20 Lines |