summaryrefslogtreecommitdiffstats
path: root/sys/kern/vfs_syscalls.c
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2011-11-14 18:00:15 +0000
committerjhb <jhb@FreeBSD.org>2011-11-14 18:00:15 +0000
commit9315d9d42cc5f041dacb6e324a9c1b58aafb2dd7 (patch)
treec65b53bda22ffe4d632d919b80c5e3f6cb529bd6 /sys/kern/vfs_syscalls.c
parent6521dad4b689c989139dc6ee11871319ae830cd6 (diff)
downloadFreeBSD-src-9315d9d42cc5f041dacb6e324a9c1b58aafb2dd7.zip
FreeBSD-src-9315d9d42cc5f041dacb6e324a9c1b58aafb2dd7.tar.gz
- Split out a kern_posix_fadvise() from the posix_fadvise() system call so
it can be used by in-kernel consumers. - Make kern_posix_fallocate() public. - Use kern_posix_fadvise() and kern_posix_fallocate() to implement the freebsd32 wrappers for the two system calls.
Diffstat (limited to 'sys/kern/vfs_syscalls.c')
-rw-r--r--sys/kern/vfs_syscalls.c57
1 files changed, 31 insertions, 26 deletions
diff --git a/sys/kern/vfs_syscalls.c b/sys/kern/vfs_syscalls.c
index e886079..3356666 100644
--- a/sys/kern/vfs_syscalls.c
+++ b/sys/kern/vfs_syscalls.c
@@ -4753,7 +4753,7 @@ out:
return (error);
}
-static int
+int
kern_posix_fallocate(struct thread *td, int fd, off_t offset, off_t len)
{
struct file *fp;
@@ -4855,7 +4855,8 @@ sys_posix_fallocate(struct thread *td, struct posix_fallocate_args *uap)
* region of any current setting.
*/
int
-sys_posix_fadvise(struct thread *td, struct posix_fadvise_args *uap)
+kern_posix_fadvise(struct thread *td, int fd, off_t offset, off_t len,
+ int advice)
{
struct fadvise_info *fa, *new;
struct file *fp;
@@ -4863,10 +4864,9 @@ sys_posix_fadvise(struct thread *td, struct posix_fadvise_args *uap)
off_t end;
int error;
- if (uap->offset < 0 || uap->len < 0 ||
- uap->offset > OFF_MAX - uap->len)
+ if (offset < 0 || len < 0 || offset > OFF_MAX - len)
return (EINVAL);
- switch (uap->advice) {
+ switch (advice) {
case POSIX_FADV_SEQUENTIAL:
case POSIX_FADV_RANDOM:
case POSIX_FADV_NOREUSE:
@@ -4881,7 +4881,7 @@ sys_posix_fadvise(struct thread *td, struct posix_fadvise_args *uap)
return (EINVAL);
}
/* XXX: CAP_POSIX_FADVISE? */
- error = fget(td, uap->fd, 0, &fp);
+ error = fget(td, fd, 0, &fp);
if (error != 0)
goto out;
@@ -4901,11 +4901,11 @@ sys_posix_fadvise(struct thread *td, struct posix_fadvise_args *uap)
error = ENODEV;
goto out;
}
- if (uap->len == 0)
+ if (len == 0)
end = OFF_MAX;
else
- end = uap->offset + uap->len - 1;
- switch (uap->advice) {
+ end = offset + len - 1;
+ switch (advice) {
case POSIX_FADV_SEQUENTIAL:
case POSIX_FADV_RANDOM:
case POSIX_FADV_NOREUSE:
@@ -4916,17 +4916,17 @@ sys_posix_fadvise(struct thread *td, struct posix_fadvise_args *uap)
*/
mtx_pool_lock(mtxpool_sleep, fp);
fa = fp->f_advice;
- if (fa != NULL && fa->fa_advice == uap->advice &&
- ((fa->fa_start <= end && fa->fa_end >= uap->offset) ||
+ if (fa != NULL && fa->fa_advice == advice &&
+ ((fa->fa_start <= end && fa->fa_end >= offset) ||
(end != OFF_MAX && fa->fa_start == end + 1) ||
- (fa->fa_end != OFF_MAX && fa->fa_end + 1 == uap->offset))) {
- if (uap->offset < fa->fa_start)
- fa->fa_start = uap->offset;
+ (fa->fa_end != OFF_MAX && fa->fa_end + 1 == offset))) {
+ if (offset < fa->fa_start)
+ fa->fa_start = offset;
if (end > fa->fa_end)
fa->fa_end = end;
} else {
- new->fa_advice = uap->advice;
- new->fa_start = uap->offset;
+ new->fa_advice = advice;
+ new->fa_start = offset;
new->fa_end = end;
fp->f_advice = new;
new = fa;
@@ -4942,18 +4942,15 @@ sys_posix_fadvise(struct thread *td, struct posix_fadvise_args *uap)
mtx_pool_lock(mtxpool_sleep, fp);
fa = fp->f_advice;
if (fa != NULL) {
- if (uap->offset <= fa->fa_start &&
- end >= fa->fa_end) {
+ if (offset <= fa->fa_start && end >= fa->fa_end) {
new = fa;
fp->f_advice = NULL;
- } else if (uap->offset <= fa->fa_start &&
- end >= fa->fa_start)
+ } else if (offset <= fa->fa_start &&
+ end >= fa->fa_start)
fa->fa_start = end + 1;
- else if (uap->offset <= fa->fa_end &&
- end >= fa->fa_end)
- fa->fa_end = uap->offset - 1;
- else if (uap->offset >= fa->fa_start &&
- end <= fa->fa_end) {
+ else if (offset <= fa->fa_end && end >= fa->fa_end)
+ fa->fa_end = offset - 1;
+ else if (offset >= fa->fa_start && end <= fa->fa_end) {
/*
* If the "normal" region is a middle
* portion of the existing
@@ -4970,7 +4967,7 @@ sys_posix_fadvise(struct thread *td, struct posix_fadvise_args *uap)
break;
case POSIX_FADV_WILLNEED:
case POSIX_FADV_DONTNEED:
- error = VOP_ADVISE(vp, uap->offset, end, uap->advice);
+ error = VOP_ADVISE(vp, offset, end, advice);
break;
}
out:
@@ -4979,3 +4976,11 @@ out:
free(new, M_FADVISE);
return (error);
}
+
+int
+sys_posix_fadvise(struct thread *td, struct posix_fadvise_args *uap)
+{
+
+ return (kern_posix_fadvise(td, uap->fd, uap->offset, uap->len,
+ uap->advice));
+}
OpenPOWER on IntegriCloud