Changeset View
Changeset View
Standalone View
Standalone View
sys/kern/vfs_syscalls.c
Show First 20 Lines • Show All 1,322 Lines • ▼ Show 20 Lines | if (dev == 0) | ||||
return (kern_mkfifoat(td, fd, path, pathseg, mode)); | return (kern_mkfifoat(td, fd, path, pathseg, mode)); | ||||
/* FALLTHROUGH */ | /* FALLTHROUGH */ | ||||
default: | default: | ||||
error = EINVAL; | error = EINVAL; | ||||
break; | break; | ||||
} | } | ||||
if (error != 0) | if (error != 0) | ||||
return (error); | return (error); | ||||
NDPREINIT(&nd); | |||||
restart: | restart: | ||||
bwillwrite(); | bwillwrite(); | ||||
NDINIT_ATRIGHTS(&nd, CREATE, LOCKPARENT | SAVENAME | AUDITVNODE1 | | NDINIT_ATRIGHTS(&nd, CREATE, LOCKPARENT | SAVENAME | AUDITVNODE1 | | ||||
NOCACHE, pathseg, path, fd, &cap_mknodat_rights, | NOCACHE, pathseg, path, fd, &cap_mknodat_rights, | ||||
td); | td); | ||||
if ((error = namei(&nd)) != 0) | if ((error = namei(&nd)) != 0) | ||||
return (error); | return (error); | ||||
vp = nd.ni_vp; | vp = nd.ni_vp; | ||||
▲ Show 20 Lines • Show All 92 Lines • ▼ Show 20 Lines | kern_mkfifoat(struct thread *td, int fd, const char *path, | ||||
enum uio_seg pathseg, int mode) | enum uio_seg pathseg, int mode) | ||||
{ | { | ||||
struct mount *mp; | struct mount *mp; | ||||
struct vattr vattr; | struct vattr vattr; | ||||
struct nameidata nd; | struct nameidata nd; | ||||
int error; | int error; | ||||
AUDIT_ARG_MODE(mode); | AUDIT_ARG_MODE(mode); | ||||
NDPREINIT(&nd); | |||||
restart: | restart: | ||||
bwillwrite(); | bwillwrite(); | ||||
NDINIT_ATRIGHTS(&nd, CREATE, LOCKPARENT | SAVENAME | AUDITVNODE1 | | NDINIT_ATRIGHTS(&nd, CREATE, LOCKPARENT | SAVENAME | AUDITVNODE1 | | ||||
NOCACHE, pathseg, path, fd, &cap_mkfifoat_rights, | NOCACHE, pathseg, path, fd, &cap_mkfifoat_rights, | ||||
td); | td); | ||||
if ((error = namei(&nd)) != 0) | if ((error = namei(&nd)) != 0) | ||||
return (error); | return (error); | ||||
if (nd.ni_vp != NULL) { | if (nd.ni_vp != NULL) { | ||||
▲ Show 20 Lines • Show All 114 Lines • ▼ Show 20 Lines | |||||
int | int | ||||
kern_linkat(struct thread *td, int fd1, int fd2, const char *path1, | kern_linkat(struct thread *td, int fd1, int fd2, const char *path1, | ||||
const char *path2, enum uio_seg segflag, int flag) | const char *path2, enum uio_seg segflag, int flag) | ||||
{ | { | ||||
struct nameidata nd; | struct nameidata nd; | ||||
int error; | int error; | ||||
NDPREINIT(&nd); | |||||
do { | do { | ||||
bwillwrite(); | bwillwrite(); | ||||
NDINIT_ATRIGHTS(&nd, LOOKUP, AUDITVNODE1 | at2cnpflags(flag, | NDINIT_ATRIGHTS(&nd, LOOKUP, AUDITVNODE1 | at2cnpflags(flag, | ||||
AT_SYMLINK_FOLLOW | AT_RESOLVE_BENEATH | AT_EMPTY_PATH), | AT_SYMLINK_FOLLOW | AT_RESOLVE_BENEATH | AT_EMPTY_PATH), | ||||
segflag, path1, fd1, &cap_linkat_source_rights, td); | segflag, path1, fd1, &cap_linkat_source_rights, td); | ||||
if ((error = namei(&nd)) != 0) | if ((error = namei(&nd)) != 0) | ||||
return (error); | return (error); | ||||
NDFREE(&nd, NDF_ONLY_PNBUF); | NDFREE(&nd, NDF_ONLY_PNBUF); | ||||
▲ Show 20 Lines • Show All 132 Lines • ▼ Show 20 Lines | if (segflg == UIO_SYSSPACE) { | ||||
syspath = path1; | syspath = path1; | ||||
} else { | } else { | ||||
tmppath = uma_zalloc(namei_zone, M_WAITOK); | tmppath = uma_zalloc(namei_zone, M_WAITOK); | ||||
if ((error = copyinstr(path1, tmppath, MAXPATHLEN, NULL)) != 0) | if ((error = copyinstr(path1, tmppath, MAXPATHLEN, NULL)) != 0) | ||||
goto out; | goto out; | ||||
syspath = tmppath; | syspath = tmppath; | ||||
} | } | ||||
AUDIT_ARG_TEXT(syspath); | AUDIT_ARG_TEXT(syspath); | ||||
NDPREINIT(&nd); | |||||
restart: | restart: | ||||
bwillwrite(); | bwillwrite(); | ||||
NDINIT_ATRIGHTS(&nd, CREATE, LOCKPARENT | SAVENAME | AUDITVNODE1 | | NDINIT_ATRIGHTS(&nd, CREATE, LOCKPARENT | SAVENAME | AUDITVNODE1 | | ||||
NOCACHE, segflg, path2, fd, &cap_symlinkat_rights, | NOCACHE, segflg, path2, fd, &cap_symlinkat_rights, | ||||
td); | td); | ||||
if ((error = namei(&nd)) != 0) | if ((error = namei(&nd)) != 0) | ||||
goto out; | goto out; | ||||
if (nd.ni_vp) { | if (nd.ni_vp) { | ||||
▲ Show 20 Lines • Show All 48 Lines • ▼ Show 20 Lines | |||||
#endif | #endif | ||||
int | int | ||||
sys_undelete(struct thread *td, struct undelete_args *uap) | sys_undelete(struct thread *td, struct undelete_args *uap) | ||||
{ | { | ||||
struct mount *mp; | struct mount *mp; | ||||
struct nameidata nd; | struct nameidata nd; | ||||
int error; | int error; | ||||
NDPREINIT(&nd); | |||||
restart: | restart: | ||||
bwillwrite(); | bwillwrite(); | ||||
NDINIT(&nd, DELETE, LOCKPARENT | DOWHITEOUT | AUDITVNODE1, | NDINIT(&nd, DELETE, LOCKPARENT | DOWHITEOUT | AUDITVNODE1, | ||||
UIO_USERSPACE, uap->path, td); | UIO_USERSPACE, uap->path, td); | ||||
error = namei(&nd); | error = namei(&nd); | ||||
if (error != 0) | if (error != 0) | ||||
return (error); | return (error); | ||||
▲ Show 20 Lines • Show All 97 Lines • ▼ Show 20 Lines | kern_funlinkat(struct thread *td, int dfd, const char *path, int fd, | ||||
fp = NULL; | fp = NULL; | ||||
if (fd != FD_NONE) { | if (fd != FD_NONE) { | ||||
error = getvnode_path(td, fd, &cap_no_rights, &fp); | error = getvnode_path(td, fd, &cap_no_rights, &fp); | ||||
if (error != 0) | if (error != 0) | ||||
return (error); | return (error); | ||||
} | } | ||||
NDPREINIT(&nd); | |||||
restart: | restart: | ||||
bwillwrite(); | bwillwrite(); | ||||
NDINIT_ATRIGHTS(&nd, DELETE, LOCKPARENT | LOCKLEAF | AUDITVNODE1 | | NDINIT_ATRIGHTS(&nd, DELETE, LOCKPARENT | LOCKLEAF | AUDITVNODE1 | | ||||
at2cnpflags(flag, AT_RESOLVE_BENEATH), | at2cnpflags(flag, AT_RESOLVE_BENEATH), | ||||
pathseg, path, dfd, &cap_unlinkat_rights, td); | pathseg, path, dfd, &cap_unlinkat_rights, td); | ||||
if ((error = namei(&nd)) != 0) { | if ((error = namei(&nd)) != 0) { | ||||
if (error == EINVAL) | if (error == EINVAL) | ||||
error = EPERM; | error = EPERM; | ||||
▲ Show 20 Lines • Show All 1,515 Lines • ▼ Show 20 Lines | kern_truncate(struct thread *td, const char *path, enum uio_seg pathseg, | ||||
struct vnode *vp; | struct vnode *vp; | ||||
void *rl_cookie; | void *rl_cookie; | ||||
struct vattr vattr; | struct vattr vattr; | ||||
struct nameidata nd; | struct nameidata nd; | ||||
int error; | int error; | ||||
if (length < 0) | if (length < 0) | ||||
return (EINVAL); | return (EINVAL); | ||||
NDPREINIT(&nd); | |||||
retry: | retry: | ||||
NDINIT(&nd, LOOKUP, FOLLOW | AUDITVNODE1, pathseg, path, td); | NDINIT(&nd, LOOKUP, FOLLOW | AUDITVNODE1, pathseg, path, td); | ||||
if ((error = namei(&nd)) != 0) | if ((error = namei(&nd)) != 0) | ||||
return (error); | return (error); | ||||
vp = nd.ni_vp; | vp = nd.ni_vp; | ||||
rl_cookie = vn_rangelock_wlock(vp, 0, OFF_MAX); | rl_cookie = vn_rangelock_wlock(vp, 0, OFF_MAX); | ||||
if ((error = vn_start_write(vp, &mp, V_WAIT | PCATCH)) != 0) { | if ((error = vn_start_write(vp, &mp, V_WAIT | PCATCH)) != 0) { | ||||
vn_rangelock_unlock(vp, rl_cookie); | vn_rangelock_unlock(vp, rl_cookie); | ||||
▲ Show 20 Lines • Show All 351 Lines • ▼ Show 20 Lines | kern_mkdirat(struct thread *td, int fd, const char *path, enum uio_seg segflg, | ||||
int mode) | int mode) | ||||
{ | { | ||||
struct mount *mp; | struct mount *mp; | ||||
struct vattr vattr; | struct vattr vattr; | ||||
struct nameidata nd; | struct nameidata nd; | ||||
int error; | int error; | ||||
AUDIT_ARG_MODE(mode); | AUDIT_ARG_MODE(mode); | ||||
NDPREINIT(&nd); | |||||
restart: | restart: | ||||
bwillwrite(); | bwillwrite(); | ||||
NDINIT_ATRIGHTS(&nd, CREATE, LOCKPARENT | SAVENAME | AUDITVNODE1 | | NDINIT_ATRIGHTS(&nd, CREATE, LOCKPARENT | SAVENAME | AUDITVNODE1 | | ||||
NC_NOMAKEENTRY | NC_KEEPPOSENTRY | FAILIFEXISTS | WILLBEDIR, | NC_NOMAKEENTRY | NC_KEEPPOSENTRY | FAILIFEXISTS | WILLBEDIR, | ||||
segflg, path, fd, &cap_mkdirat_rights, td); | segflg, path, fd, &cap_mkdirat_rights, td); | ||||
if ((error = namei(&nd)) != 0) | if ((error = namei(&nd)) != 0) | ||||
return (error); | return (error); | ||||
if (vn_start_write(nd.ni_dvp, &mp, V_NOWAIT) != 0) { | if (vn_start_write(nd.ni_dvp, &mp, V_NOWAIT) != 0) { | ||||
▲ Show 20 Lines • Show All 54 Lines • ▼ Show 20 Lines | kern_frmdirat(struct thread *td, int dfd, const char *path, int fd, | ||||
fp = NULL; | fp = NULL; | ||||
if (fd != FD_NONE) { | if (fd != FD_NONE) { | ||||
error = getvnode(td, fd, cap_rights_init_one(&rights, | error = getvnode(td, fd, cap_rights_init_one(&rights, | ||||
CAP_LOOKUP), &fp); | CAP_LOOKUP), &fp); | ||||
if (error != 0) | if (error != 0) | ||||
return (error); | return (error); | ||||
} | } | ||||
NDPREINIT(&nd); | |||||
restart: | restart: | ||||
bwillwrite(); | bwillwrite(); | ||||
NDINIT_ATRIGHTS(&nd, DELETE, LOCKPARENT | LOCKLEAF | AUDITVNODE1 | | NDINIT_ATRIGHTS(&nd, DELETE, LOCKPARENT | LOCKLEAF | AUDITVNODE1 | | ||||
at2cnpflags(flag, AT_RESOLVE_BENEATH), | at2cnpflags(flag, AT_RESOLVE_BENEATH), | ||||
pathseg, path, dfd, &cap_unlinkat_rights, td); | pathseg, path, dfd, &cap_unlinkat_rights, td); | ||||
if ((error = namei(&nd)) != 0) | if ((error = namei(&nd)) != 0) | ||||
goto fdout; | goto fdout; | ||||
vp = nd.ni_vp; | vp = nd.ni_vp; | ||||
▲ Show 20 Lines • Show All 1,117 Lines • Show Last 20 Lines |