Changeset View
Changeset View
Standalone View
Standalone View
sys/kern/vfs_syscalls.c
Show First 20 Lines • Show All 334 Lines • ▼ Show 20 Lines | kern_statfs(struct thread *td, const char *path, enum uio_seg pathseg, | ||||
NDINIT(&nd, LOOKUP, FOLLOW | LOCKSHARED | LOCKLEAF | AUDITVNODE1, | NDINIT(&nd, LOOKUP, FOLLOW | LOCKSHARED | LOCKLEAF | AUDITVNODE1, | ||||
pathseg, path, td); | pathseg, path, td); | ||||
error = namei(&nd); | error = namei(&nd); | ||||
if (error != 0) | if (error != 0) | ||||
return (error); | return (error); | ||||
mp = nd.ni_vp->v_mount; | mp = nd.ni_vp->v_mount; | ||||
vfs_ref(mp); | vfs_ref(mp); | ||||
NDFREE(&nd, NDF_ONLY_PNBUF); | NDFREE_NOTHING(&nd); | ||||
vput(nd.ni_vp); | vput(nd.ni_vp); | ||||
return (kern_do_statfs(td, mp, buf)); | return (kern_do_statfs(td, mp, buf)); | ||||
} | } | ||||
/* | /* | ||||
* Get filesystem statistics. | * Get filesystem statistics. | ||||
*/ | */ | ||||
#ifndef _SYS_SYSPROTO_H_ | #ifndef _SYS_SYSPROTO_H_ | ||||
▲ Show 20 Lines • Show All 592 Lines • ▼ Show 20 Lines | kern_chdir(struct thread *td, const char *path, enum uio_seg pathseg) | ||||
int error; | int error; | ||||
NDINIT(&nd, LOOKUP, FOLLOW | LOCKSHARED | LOCKLEAF | AUDITVNODE1, | NDINIT(&nd, LOOKUP, FOLLOW | LOCKSHARED | LOCKLEAF | AUDITVNODE1, | ||||
pathseg, path, td); | pathseg, path, td); | ||||
if ((error = namei(&nd)) != 0) | if ((error = namei(&nd)) != 0) | ||||
return (error); | return (error); | ||||
if ((error = change_dir(nd.ni_vp, td)) != 0) { | if ((error = change_dir(nd.ni_vp, td)) != 0) { | ||||
vput(nd.ni_vp); | vput(nd.ni_vp); | ||||
NDFREE(&nd, NDF_ONLY_PNBUF); | NDFREE_NOTHING(&nd); | ||||
return (error); | return (error); | ||||
} | } | ||||
VOP_UNLOCK(nd.ni_vp); | VOP_UNLOCK(nd.ni_vp); | ||||
NDFREE(&nd, NDF_ONLY_PNBUF); | NDFREE_NOTHING(&nd); | ||||
pwd_chdir(td, nd.ni_vp); | pwd_chdir(td, nd.ni_vp); | ||||
return (0); | return (0); | ||||
} | } | ||||
/* | /* | ||||
* Change notion of root (``/'') directory. | * Change notion of root (``/'') directory. | ||||
*/ | */ | ||||
#ifndef _SYS_SYSPROTO_H_ | #ifndef _SYS_SYSPROTO_H_ | ||||
Show All 21 Lines | |||||
#ifdef MAC | #ifdef MAC | ||||
error = mac_vnode_check_chroot(td->td_ucred, nd.ni_vp); | error = mac_vnode_check_chroot(td->td_ucred, nd.ni_vp); | ||||
if (error != 0) | if (error != 0) | ||||
goto e_vunlock; | goto e_vunlock; | ||||
#endif | #endif | ||||
VOP_UNLOCK(nd.ni_vp); | VOP_UNLOCK(nd.ni_vp); | ||||
error = pwd_chroot(td, nd.ni_vp); | error = pwd_chroot(td, nd.ni_vp); | ||||
vrele(nd.ni_vp); | vrele(nd.ni_vp); | ||||
NDFREE(&nd, NDF_ONLY_PNBUF); | NDFREE_NOTHING(&nd); | ||||
return (error); | return (error); | ||||
e_vunlock: | e_vunlock: | ||||
vput(nd.ni_vp); | vput(nd.ni_vp); | ||||
error: | error: | ||||
NDFREE(&nd, NDF_ONLY_PNBUF); | NDFREE_NOTHING(&nd); | ||||
return (error); | return (error); | ||||
} | } | ||||
/* | /* | ||||
* Common routine for chroot and chdir. Callers must provide a locked vnode | * Common routine for chroot and chdir. Callers must provide a locked vnode | ||||
* instance. | * instance. | ||||
*/ | */ | ||||
int | int | ||||
▲ Show 20 Lines • Show All 116 Lines • ▼ Show 20 Lines | kern_openat(struct thread *td, int fd, const char *path, enum uio_seg pathseg, | ||||
} else if ((flags & O_ACCMODE) == O_ACCMODE) { | } else if ((flags & O_ACCMODE) == O_ACCMODE) { | ||||
return (EINVAL); | return (EINVAL); | ||||
} else { | } else { | ||||
flags = FFLAGS(flags); | flags = FFLAGS(flags); | ||||
} | } | ||||
/* | /* | ||||
* Allocate a file structure. The descriptor to reference it | * Allocate a file structure. The descriptor to reference it | ||||
* is allocated and set by finstall() below. | * is allocated and used by finstall_refed() below. | ||||
*/ | */ | ||||
error = falloc_noinstall(td, &fp); | error = falloc_noinstall(td, &fp); | ||||
if (error != 0) | if (error != 0) | ||||
return (error); | return (error); | ||||
/* | |||||
* An extra reference on `fp' has been held for us by | |||||
* falloc_noinstall(). | |||||
*/ | |||||
/* Set the flags early so the finit in devfs can pick them up. */ | /* Set the flags early so the finit in devfs can pick them up. */ | ||||
fp->f_flag = flags & FMASK; | fp->f_flag = flags & FMASK; | ||||
cmode = ((mode & ~pdp->pd_cmask) & ALLPERMS) & ~S_ISTXT; | cmode = ((mode & ~pdp->pd_cmask) & ALLPERMS) & ~S_ISTXT; | ||||
NDINIT_ATRIGHTS(&nd, LOOKUP, FOLLOW | AUDITVNODE1, pathseg, path, fd, | NDINIT_ATRIGHTS(&nd, LOOKUP, FOLLOW | AUDITVNODE1, pathseg, path, fd, | ||||
&rights, td); | &rights, td); | ||||
td->td_dupfd = -1; /* XXX check for fdopen */ | td->td_dupfd = -1; /* XXX check for fdopen */ | ||||
error = vn_open(&nd, &flags, cmode, fp); | error = vn_open(&nd, &flags, cmode, fp); | ||||
if (error != 0) { | if (error != 0) { | ||||
▲ Show 20 Lines • Show All 56 Lines • ▼ Show 20 Lines | if (indx == -1) { | ||||
struct filecaps *fcaps; | struct filecaps *fcaps; | ||||
#ifdef CAPABILITIES | #ifdef CAPABILITIES | ||||
if ((nd.ni_resflags & NIRES_STRICTREL) != 0) | if ((nd.ni_resflags & NIRES_STRICTREL) != 0) | ||||
fcaps = &nd.ni_filecaps; | fcaps = &nd.ni_filecaps; | ||||
else | else | ||||
#endif | #endif | ||||
fcaps = NULL; | fcaps = NULL; | ||||
error = finstall(td, fp, &indx, flags, fcaps); | error = finstall_refed(td, fp, &indx, flags, fcaps); | ||||
/* On success finstall() consumes fcaps. */ | /* On success finstall_refed() consumes fcaps. */ | ||||
if (error != 0) { | if (error != 0) { | ||||
filecaps_free(&nd.ni_filecaps); | filecaps_free(&nd.ni_filecaps); | ||||
goto bad; | goto bad; | ||||
} | } | ||||
} else { | } else { | ||||
filecaps_free(&nd.ni_filecaps); | filecaps_free(&nd.ni_filecaps); | ||||
falloc_abort(td, fp); | |||||
} | } | ||||
/* | |||||
* Release our private reference, leaving the one associated with | |||||
* the descriptor table intact. | |||||
*/ | |||||
fdrop(fp, td); | |||||
td->td_retval[0] = indx; | td->td_retval[0] = indx; | ||||
return (0); | return (0); | ||||
bad: | bad: | ||||
KASSERT(indx == -1, ("indx=%d, should be -1", indx)); | KASSERT(indx == -1, ("indx=%d, should be -1", indx)); | ||||
fdrop_close(fp, td); | falloc_abort(td, fp); | ||||
return (error); | return (error); | ||||
} | } | ||||
#ifdef COMPAT_43 | #ifdef COMPAT_43 | ||||
/* | /* | ||||
* Create a file. | * Create a file. | ||||
*/ | */ | ||||
#ifndef _SYS_SYSPROTO_H_ | #ifndef _SYS_SYSPROTO_H_ | ||||
▲ Show 20 Lines • Show All 872 Lines • ▼ Show 20 Lines | kern_accessat(struct thread *td, int fd, const char *path, | ||||
NDINIT_ATRIGHTS(&nd, LOOKUP, FOLLOW | LOCKSHARED | LOCKLEAF | | NDINIT_ATRIGHTS(&nd, LOOKUP, FOLLOW | LOCKSHARED | LOCKLEAF | | ||||
AUDITVNODE1 | at2cnpflags(flag, AT_BENEATH | AT_RESOLVE_BENEATH), | AUDITVNODE1 | at2cnpflags(flag, AT_BENEATH | AT_RESOLVE_BENEATH), | ||||
pathseg, path, fd, &cap_fstat_rights, td); | pathseg, path, fd, &cap_fstat_rights, td); | ||||
if ((error = namei(&nd)) != 0) | if ((error = namei(&nd)) != 0) | ||||
goto out; | goto out; | ||||
vp = nd.ni_vp; | vp = nd.ni_vp; | ||||
error = vn_access(vp, amode, usecred, td); | error = vn_access(vp, amode, usecred, td); | ||||
NDFREE(&nd, NDF_ONLY_PNBUF); | NDFREE_NOTHING(&nd); | ||||
vput(vp); | vput(vp); | ||||
out: | out: | ||||
if (usecred != cred) { | if (usecred != cred) { | ||||
td->td_ucred = cred; | td->td_ucred = cred; | ||||
crfree(usecred); | crfree(usecred); | ||||
} | } | ||||
return (error); | return (error); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 282 Lines • ▼ Show 20 Lines | kern_statat(struct thread *td, int flag, int fd, const char *path, | ||||
if ((error = namei(&nd)) != 0) | if ((error = namei(&nd)) != 0) | ||||
return (error); | return (error); | ||||
error = VOP_STAT(nd.ni_vp, sbp, td->td_ucred, NOCRED, td); | error = VOP_STAT(nd.ni_vp, sbp, td->td_ucred, NOCRED, td); | ||||
if (error == 0) { | if (error == 0) { | ||||
if (__predict_false(hook != NULL)) | if (__predict_false(hook != NULL)) | ||||
hook(nd.ni_vp, sbp); | hook(nd.ni_vp, sbp); | ||||
} | } | ||||
NDFREE(&nd, NDF_ONLY_PNBUF); | NDFREE_NOTHING(&nd); | ||||
vput(nd.ni_vp); | vput(nd.ni_vp); | ||||
#ifdef __STAT_TIME_T_EXT | #ifdef __STAT_TIME_T_EXT | ||||
sbp->st_atim_ext = 0; | sbp->st_atim_ext = 0; | ||||
sbp->st_mtim_ext = 0; | sbp->st_mtim_ext = 0; | ||||
sbp->st_ctim_ext = 0; | sbp->st_ctim_ext = 0; | ||||
sbp->st_btim_ext = 0; | sbp->st_btim_ext = 0; | ||||
#endif | #endif | ||||
#ifdef KTRACE | #ifdef KTRACE | ||||
▲ Show 20 Lines • Show All 123 Lines • ▼ Show 20 Lines | |||||
{ | { | ||||
struct nameidata nd; | struct nameidata nd; | ||||
int error; | int error; | ||||
NDINIT(&nd, LOOKUP, LOCKSHARED | LOCKLEAF | AUDITVNODE1 | flags, | NDINIT(&nd, LOOKUP, LOCKSHARED | LOCKLEAF | AUDITVNODE1 | flags, | ||||
pathseg, path, td); | pathseg, path, td); | ||||
if ((error = namei(&nd)) != 0) | if ((error = namei(&nd)) != 0) | ||||
return (error); | return (error); | ||||
NDFREE(&nd, NDF_ONLY_PNBUF); | NDFREE_NOTHING(&nd); | ||||
error = VOP_PATHCONF(nd.ni_vp, name, valuep); | error = VOP_PATHCONF(nd.ni_vp, name, valuep); | ||||
vput(nd.ni_vp); | vput(nd.ni_vp); | ||||
return (error); | return (error); | ||||
} | } | ||||
/* | /* | ||||
* Return target name of a symbolic link. | * Return target name of a symbolic link. | ||||
Show All 39 Lines | kern_readlinkat(struct thread *td, int fd, const char *path, | ||||
if (count > IOSIZE_MAX) | if (count > IOSIZE_MAX) | ||||
return (EINVAL); | return (EINVAL); | ||||
NDINIT_AT(&nd, LOOKUP, NOFOLLOW | LOCKSHARED | LOCKLEAF | AUDITVNODE1, | NDINIT_AT(&nd, LOOKUP, NOFOLLOW | LOCKSHARED | LOCKLEAF | AUDITVNODE1, | ||||
pathseg, path, fd, td); | pathseg, path, fd, td); | ||||
if ((error = namei(&nd)) != 0) | if ((error = namei(&nd)) != 0) | ||||
return (error); | return (error); | ||||
NDFREE(&nd, NDF_ONLY_PNBUF); | NDFREE_NOTHING(&nd); | ||||
vp = nd.ni_vp; | vp = nd.ni_vp; | ||||
error = kern_readlink_vp(vp, buf, bufseg, count, td); | error = kern_readlink_vp(vp, buf, bufseg, count, td); | ||||
vput(vp); | vput(vp); | ||||
return (error); | return (error); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 134 Lines • ▼ Show 20 Lines | kern_chflagsat(struct thread *td, int fd, const char *path, | ||||
int error; | int error; | ||||
AUDIT_ARG_FFLAGS(flags); | AUDIT_ARG_FFLAGS(flags); | ||||
NDINIT_ATRIGHTS(&nd, LOOKUP, at2cnpflags(atflag, AT_SYMLINK_NOFOLLOW | | NDINIT_ATRIGHTS(&nd, LOOKUP, at2cnpflags(atflag, AT_SYMLINK_NOFOLLOW | | ||||
AT_BENEATH | AT_RESOLVE_BENEATH) | AUDITVNODE1, pathseg, path, fd, | AT_BENEATH | AT_RESOLVE_BENEATH) | AUDITVNODE1, pathseg, path, fd, | ||||
&cap_fchflags_rights, td); | &cap_fchflags_rights, td); | ||||
if ((error = namei(&nd)) != 0) | if ((error = namei(&nd)) != 0) | ||||
return (error); | return (error); | ||||
NDFREE(&nd, NDF_ONLY_PNBUF); | NDFREE_NOTHING(&nd); | ||||
error = setfflags(td, nd.ni_vp, flags); | error = setfflags(td, nd.ni_vp, flags); | ||||
vrele(nd.ni_vp); | vrele(nd.ni_vp); | ||||
return (error); | return (error); | ||||
} | } | ||||
/* | /* | ||||
* Change flags of a file given a file descriptor. | * Change flags of a file given a file descriptor. | ||||
*/ | */ | ||||
▲ Show 20 Lines • Show All 112 Lines • ▼ Show 20 Lines | kern_fchmodat(struct thread *td, int fd, const char *path, | ||||
int error; | int error; | ||||
AUDIT_ARG_MODE(mode); | AUDIT_ARG_MODE(mode); | ||||
NDINIT_ATRIGHTS(&nd, LOOKUP, at2cnpflags(flag, AT_SYMLINK_NOFOLLOW | | NDINIT_ATRIGHTS(&nd, LOOKUP, at2cnpflags(flag, AT_SYMLINK_NOFOLLOW | | ||||
AT_BENEATH | AT_RESOLVE_BENEATH) | AUDITVNODE1, pathseg, path, fd, | AT_BENEATH | AT_RESOLVE_BENEATH) | AUDITVNODE1, pathseg, path, fd, | ||||
&cap_fchmod_rights, td); | &cap_fchmod_rights, td); | ||||
if ((error = namei(&nd)) != 0) | if ((error = namei(&nd)) != 0) | ||||
return (error); | return (error); | ||||
NDFREE(&nd, NDF_ONLY_PNBUF); | NDFREE_NOTHING(&nd); | ||||
error = setfmode(td, td->td_ucred, nd.ni_vp, mode); | error = setfmode(td, td->td_ucred, nd.ni_vp, mode); | ||||
vrele(nd.ni_vp); | vrele(nd.ni_vp); | ||||
return (error); | return (error); | ||||
} | } | ||||
/* | /* | ||||
* Change mode of a file given a file descriptor. | * Change mode of a file given a file descriptor. | ||||
*/ | */ | ||||
▲ Show 20 Lines • Show All 96 Lines • ▼ Show 20 Lines | kern_fchownat(struct thread *td, int fd, const char *path, | ||||
AUDIT_ARG_OWNER(uid, gid); | AUDIT_ARG_OWNER(uid, gid); | ||||
NDINIT_ATRIGHTS(&nd, LOOKUP, at2cnpflags(flag, AT_SYMLINK_NOFOLLOW | | NDINIT_ATRIGHTS(&nd, LOOKUP, at2cnpflags(flag, AT_SYMLINK_NOFOLLOW | | ||||
AT_BENEATH | AT_RESOLVE_BENEATH) | AUDITVNODE1, pathseg, path, fd, | AT_BENEATH | AT_RESOLVE_BENEATH) | AUDITVNODE1, pathseg, path, fd, | ||||
&cap_fchown_rights, td); | &cap_fchown_rights, td); | ||||
if ((error = namei(&nd)) != 0) | if ((error = namei(&nd)) != 0) | ||||
return (error); | return (error); | ||||
NDFREE(&nd, NDF_ONLY_PNBUF); | NDFREE_NOTHING(&nd); | ||||
error = setfown(td, td->td_ucred, nd.ni_vp, uid, gid); | error = setfown(td, td->td_ucred, nd.ni_vp, uid, gid); | ||||
vrele(nd.ni_vp); | vrele(nd.ni_vp); | ||||
return (error); | return (error); | ||||
} | } | ||||
/* | /* | ||||
* Set ownership given a path name, do not cross symlinks. | * Set ownership given a path name, do not cross symlinks. | ||||
*/ | */ | ||||
▲ Show 20 Lines • Show All 196 Lines • ▼ Show 20 Lines | kern_utimesat(struct thread *td, int fd, const char *path, | ||||
if ((error = getutimes(tptr, tptrseg, ts)) != 0) | if ((error = getutimes(tptr, tptrseg, ts)) != 0) | ||||
return (error); | return (error); | ||||
NDINIT_ATRIGHTS(&nd, LOOKUP, FOLLOW | AUDITVNODE1, pathseg, path, fd, | NDINIT_ATRIGHTS(&nd, LOOKUP, FOLLOW | AUDITVNODE1, pathseg, path, fd, | ||||
&cap_futimes_rights, td); | &cap_futimes_rights, td); | ||||
if ((error = namei(&nd)) != 0) | if ((error = namei(&nd)) != 0) | ||||
return (error); | return (error); | ||||
NDFREE(&nd, NDF_ONLY_PNBUF); | NDFREE_NOTHING(&nd); | ||||
error = setutimes(td, nd.ni_vp, ts, 2, tptr == NULL); | error = setutimes(td, nd.ni_vp, ts, 2, tptr == NULL); | ||||
vrele(nd.ni_vp); | vrele(nd.ni_vp); | ||||
return (error); | return (error); | ||||
} | } | ||||
/* | /* | ||||
* Set the access and modification times of a file. | * Set the access and modification times of a file. | ||||
*/ | */ | ||||
Show All 19 Lines | kern_lutimes(struct thread *td, const char *path, enum uio_seg pathseg, | ||||
struct nameidata nd; | struct nameidata nd; | ||||
int error; | int error; | ||||
if ((error = getutimes(tptr, tptrseg, ts)) != 0) | if ((error = getutimes(tptr, tptrseg, ts)) != 0) | ||||
return (error); | return (error); | ||||
NDINIT(&nd, LOOKUP, NOFOLLOW | AUDITVNODE1, pathseg, path, td); | NDINIT(&nd, LOOKUP, NOFOLLOW | AUDITVNODE1, pathseg, path, td); | ||||
if ((error = namei(&nd)) != 0) | if ((error = namei(&nd)) != 0) | ||||
return (error); | return (error); | ||||
NDFREE(&nd, NDF_ONLY_PNBUF); | NDFREE_NOTHING(&nd); | ||||
error = setutimes(td, nd.ni_vp, ts, 2, tptr == NULL); | error = setutimes(td, nd.ni_vp, ts, 2, tptr == NULL); | ||||
vrele(nd.ni_vp); | vrele(nd.ni_vp); | ||||
return (error); | return (error); | ||||
} | } | ||||
/* | /* | ||||
* Set the access and modification times of a file. | * Set the access and modification times of a file. | ||||
*/ | */ | ||||
▲ Show 20 Lines • Show All 98 Lines • ▼ Show 20 Lines | kern_utimensat(struct thread *td, int fd, const char *path, | ||||
if ((error = namei(&nd)) != 0) | if ((error = namei(&nd)) != 0) | ||||
return (error); | return (error); | ||||
/* | /* | ||||
* We are allowed to call namei() regardless of 2xUTIME_OMIT. | * We are allowed to call namei() regardless of 2xUTIME_OMIT. | ||||
* POSIX states: | * POSIX states: | ||||
* "If both tv_nsec fields are UTIME_OMIT... EACCESS may be detected." | * "If both tv_nsec fields are UTIME_OMIT... EACCESS may be detected." | ||||
* "Search permission is denied by a component of the path prefix." | * "Search permission is denied by a component of the path prefix." | ||||
*/ | */ | ||||
NDFREE(&nd, NDF_ONLY_PNBUF); | NDFREE_NOTHING(&nd); | ||||
if ((flags & UTIMENS_EXIT) == 0) | if ((flags & UTIMENS_EXIT) == 0) | ||||
error = setutimes(td, nd.ni_vp, ts, 2, flags & UTIMENS_NULL); | error = setutimes(td, nd.ni_vp, ts, 2, flags & UTIMENS_NULL); | ||||
vrele(nd.ni_vp); | vrele(nd.ni_vp); | ||||
return (error); | return (error); | ||||
} | } | ||||
/* | /* | ||||
* Truncate a file given its path name. | * Truncate a file given its path name. | ||||
▲ Show 20 Lines • Show All 839 Lines • ▼ Show 20 Lines | sys_revoke(struct thread *td, struct revoke_args *uap) | ||||
struct nameidata nd; | struct nameidata nd; | ||||
int error; | int error; | ||||
NDINIT(&nd, LOOKUP, FOLLOW | LOCKLEAF | AUDITVNODE1, UIO_USERSPACE, | NDINIT(&nd, LOOKUP, FOLLOW | LOCKLEAF | AUDITVNODE1, UIO_USERSPACE, | ||||
uap->path, td); | uap->path, td); | ||||
if ((error = namei(&nd)) != 0) | if ((error = namei(&nd)) != 0) | ||||
return (error); | return (error); | ||||
vp = nd.ni_vp; | vp = nd.ni_vp; | ||||
NDFREE(&nd, NDF_ONLY_PNBUF); | NDFREE_NOTHING(&nd); | ||||
if (vp->v_type != VCHR || vp->v_rdev == NULL) { | if (vp->v_type != VCHR || vp->v_rdev == NULL) { | ||||
error = EINVAL; | error = EINVAL; | ||||
goto out; | goto out; | ||||
} | } | ||||
#ifdef MAC | #ifdef MAC | ||||
error = mac_vnode_check_revoke(td->td_ucred, vp); | error = mac_vnode_check_revoke(td->td_ucred, vp); | ||||
if (error != 0) | if (error != 0) | ||||
goto out; | goto out; | ||||
▲ Show 20 Lines • Show All 118 Lines • ▼ Show 20 Lines | kern_getfhat(struct thread *td, int flags, int fd, const char *path, | ||||
if (error != 0) | if (error != 0) | ||||
return (error); | return (error); | ||||
NDINIT_AT(&nd, LOOKUP, at2cnpflags(flags, AT_SYMLINK_NOFOLLOW | | NDINIT_AT(&nd, LOOKUP, at2cnpflags(flags, AT_SYMLINK_NOFOLLOW | | ||||
AT_BENEATH | AT_RESOLVE_BENEATH) | LOCKLEAF | AUDITVNODE1, | AT_BENEATH | AT_RESOLVE_BENEATH) | LOCKLEAF | AUDITVNODE1, | ||||
pathseg, path, fd, td); | pathseg, path, fd, td); | ||||
error = namei(&nd); | error = namei(&nd); | ||||
if (error != 0) | if (error != 0) | ||||
return (error); | return (error); | ||||
NDFREE(&nd, NDF_ONLY_PNBUF); | NDFREE_NOTHING(&nd); | ||||
vp = nd.ni_vp; | vp = nd.ni_vp; | ||||
bzero(&fh, sizeof(fh)); | bzero(&fh, sizeof(fh)); | ||||
fh.fh_fsid = vp->v_mount->mnt_stat.f_fsid; | fh.fh_fsid = vp->v_mount->mnt_stat.f_fsid; | ||||
error = VOP_VPTOFH(vp, &fh.fh_fid); | error = VOP_VPTOFH(vp, &fh.fh_fid); | ||||
vput(vp); | vput(vp); | ||||
if (error == 0) { | if (error == 0) { | ||||
if (fhseg == UIO_USERSPACE) | if (fhseg == UIO_USERSPACE) | ||||
error = copyout(&fh, fhp, sizeof (fh)); | error = copyout(&fh, fhp, sizeof (fh)); | ||||
▲ Show 20 Lines • Show All 576 Lines • Show Last 20 Lines |