Improve error handling for posix_fallocate(2) and posix_fadvise(2).
- Set td_errno so that ktrace and dtrace can obtain the syscall error number in the usual way. - Pass negative error numbers directly to the syscall layer, as they're not intended to be returned to userland. Reviewed by: kib Sponsored by: EMC / Isilon Storage Division Differential Revision: https://reviews.freebsd.org/D5425
This commit is contained in:
parent
d173587f9a
commit
0acf5d0bfd
@ -2965,21 +2965,22 @@ int
|
||||
freebsd32_posix_fallocate(struct thread *td,
|
||||
struct freebsd32_posix_fallocate_args *uap)
|
||||
{
|
||||
int error;
|
||||
|
||||
td->td_retval[0] = kern_posix_fallocate(td, uap->fd,
|
||||
error = kern_posix_fallocate(td, uap->fd,
|
||||
PAIR32TO64(off_t, uap->offset), PAIR32TO64(off_t, uap->len));
|
||||
return (0);
|
||||
return (kern_posix_error(td, error));
|
||||
}
|
||||
|
||||
int
|
||||
freebsd32_posix_fadvise(struct thread *td,
|
||||
struct freebsd32_posix_fadvise_args *uap)
|
||||
{
|
||||
int error;
|
||||
|
||||
td->td_retval[0] = kern_posix_fadvise(td, uap->fd,
|
||||
PAIR32TO64(off_t, uap->offset), PAIR32TO64(off_t, uap->len),
|
||||
uap->advice);
|
||||
return (0);
|
||||
error = kern_posix_fadvise(td, uap->fd, PAIR32TO64(off_t, uap->offset),
|
||||
PAIR32TO64(off_t, uap->len), uap->advice);
|
||||
return (kern_posix_error(td, error));
|
||||
}
|
||||
|
||||
int
|
||||
|
@ -1910,3 +1910,19 @@ selectinit(void *dummy __unused)
|
||||
NULL, NULL, UMA_ALIGN_PTR, 0);
|
||||
mtxpool_select = mtx_pool_create("select mtxpool", 128, MTX_DEF);
|
||||
}
|
||||
|
||||
/*
|
||||
* Set up a syscall return value that follows the convention specified for
|
||||
* posix_* functions.
|
||||
*/
|
||||
int
|
||||
kern_posix_error(struct thread *td, int error)
|
||||
{
|
||||
|
||||
if (error <= 0)
|
||||
return (error);
|
||||
td->td_errno = error;
|
||||
td->td_pflags |= TDP_NERRNO;
|
||||
td->td_retval[0] = error;
|
||||
return (0);
|
||||
}
|
||||
|
@ -4533,10 +4533,10 @@ kern_posix_fallocate(struct thread *td, int fd, off_t offset, off_t len)
|
||||
int
|
||||
sys_posix_fallocate(struct thread *td, struct posix_fallocate_args *uap)
|
||||
{
|
||||
int error;
|
||||
|
||||
td->td_retval[0] = kern_posix_fallocate(td, uap->fd, uap->offset,
|
||||
uap->len);
|
||||
return (0);
|
||||
error = kern_posix_fallocate(td, uap->fd, uap->offset, uap->len);
|
||||
return (kern_posix_error(td, error));
|
||||
}
|
||||
|
||||
/*
|
||||
@ -4668,8 +4668,9 @@ kern_posix_fadvise(struct thread *td, int fd, off_t offset, off_t len,
|
||||
int
|
||||
sys_posix_fadvise(struct thread *td, struct posix_fadvise_args *uap)
|
||||
{
|
||||
int error;
|
||||
|
||||
td->td_retval[0] = kern_posix_fadvise(td, uap->fd, uap->offset,
|
||||
uap->len, uap->advice);
|
||||
return (0);
|
||||
error = kern_posix_fadvise(td, uap->fd, uap->offset, uap->len,
|
||||
uap->advice);
|
||||
return (kern_posix_error(td, error));
|
||||
}
|
||||
|
@ -158,6 +158,7 @@ int kern_pipe(struct thread *td, int fildes[2], int flags,
|
||||
struct filecaps *fcaps1, struct filecaps *fcaps2);
|
||||
int kern_poll(struct thread *td, struct pollfd *fds, u_int nfds,
|
||||
struct timespec *tsp, sigset_t *uset);
|
||||
int kern_posix_error(struct thread *td, int error);
|
||||
int kern_posix_fadvise(struct thread *td, int fd, off_t offset, off_t len,
|
||||
int advice);
|
||||
int kern_posix_fallocate(struct thread *td, int fd, off_t offset,
|
||||
|
Loading…
Reference in New Issue
Block a user