Changeset View
Changeset View
Standalone View
Standalone View
head/sys/kern/vfs_extattr.c
Show First 20 Lines • Show All 627 Lines • ▼ Show 20 Lines | extattr_list_vp(struct vnode *vp, int attrnamespace, void *data, | ||||
size_t size, *sizep; | size_t size, *sizep; | ||||
struct iovec aiov; | struct iovec aiov; | ||||
ssize_t cnt; | ssize_t cnt; | ||||
int error; | int error; | ||||
if (nbytes > IOSIZE_MAX) | if (nbytes > IOSIZE_MAX) | ||||
return (EINVAL); | return (EINVAL); | ||||
vn_lock(vp, LK_SHARED | LK_RETRY); | |||||
auiop = NULL; | auiop = NULL; | ||||
sizep = NULL; | sizep = NULL; | ||||
cnt = 0; | cnt = 0; | ||||
if (data != NULL) { | if (data != NULL) { | ||||
aiov.iov_base = data; | aiov.iov_base = data; | ||||
aiov.iov_len = nbytes; | aiov.iov_len = nbytes; | ||||
auio.uio_iov = &aiov; | auio.uio_iov = &aiov; | ||||
auio.uio_iovcnt = 1; | auio.uio_iovcnt = 1; | ||||
auio.uio_offset = 0; | auio.uio_offset = 0; | ||||
auio.uio_resid = nbytes; | auio.uio_resid = nbytes; | ||||
auio.uio_rw = UIO_READ; | auio.uio_rw = UIO_READ; | ||||
auio.uio_segflg = UIO_USERSPACE; | auio.uio_segflg = UIO_USERSPACE; | ||||
auio.uio_td = td; | auio.uio_td = td; | ||||
auiop = &auio; | auiop = &auio; | ||||
cnt = nbytes; | cnt = nbytes; | ||||
} else | } else | ||||
sizep = &size; | sizep = &size; | ||||
vn_lock(vp, LK_SHARED | LK_RETRY); | |||||
#ifdef MAC | #ifdef MAC | ||||
error = mac_vnode_check_listextattr(td->td_ucred, vp, attrnamespace); | error = mac_vnode_check_listextattr(td->td_ucred, vp, attrnamespace); | ||||
if (error) | if (error) { | ||||
goto done; | VOP_UNLOCK(vp, 0); | ||||
return (error); | |||||
} | |||||
#endif | #endif | ||||
error = VOP_LISTEXTATTR(vp, attrnamespace, auiop, sizep, | error = VOP_LISTEXTATTR(vp, attrnamespace, auiop, sizep, | ||||
td->td_ucred, td); | td->td_ucred, td); | ||||
VOP_UNLOCK(vp, 0); | |||||
if (auiop != NULL) { | if (auiop != NULL) { | ||||
cnt -= auio.uio_resid; | cnt -= auio.uio_resid; | ||||
td->td_retval[0] = cnt; | td->td_retval[0] = cnt; | ||||
} else | } else | ||||
td->td_retval[0] = size; | td->td_retval[0] = size; | ||||
#ifdef MAC | |||||
done: | |||||
#endif | |||||
VOP_UNLOCK(vp, 0); | |||||
return (error); | return (error); | ||||
} | } | ||||
#ifndef _SYS_SYSPROTO_H_ | #ifndef _SYS_SYSPROTO_H_ | ||||
struct extattr_list_fd_args { | struct extattr_list_fd_args { | ||||
int fd; | int fd; | ||||
int attrnamespace; | int attrnamespace; | ||||
▲ Show 20 Lines • Show All 76 Lines • Show Last 20 Lines |