Author: jhb
Date: Mon Nov 14 18:00:15 2011
New Revision: 227502
URL: http://svn.freebsd.org/changeset/base/227502

Log:
  - 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.

Modified:
  head/sys/compat/freebsd32/freebsd32_misc.c
  head/sys/kern/vfs_syscalls.c
  head/sys/sys/syscallsubr.h

Modified: head/sys/compat/freebsd32/freebsd32_misc.c
==============================================================================
--- head/sys/compat/freebsd32/freebsd32_misc.c  Mon Nov 14 15:57:03 2011        
(r227501)
+++ head/sys/compat/freebsd32/freebsd32_misc.c  Mon Nov 14 18:00:15 2011        
(r227502)
@@ -2828,23 +2828,16 @@ int
 freebsd32_posix_fallocate(struct thread *td,
     struct freebsd32_posix_fallocate_args *uap)
 {
-       struct posix_fallocate_args ap;
 
-       ap.fd = uap->fd;
-       ap.offset = PAIR32TO64(off_t, uap->offset);
-       ap.len = PAIR32TO64(off_t, uap->len);
-       return (sys_posix_fallocate(td, &ap));
+       return (kern_posix_fallocate(td, uap->fd,
+           PAIR32TO64(off_t, uap->offset), PAIR32TO64(off_t, uap->len)));
 }
 
 int
 freebsd32_posix_fadvise(struct thread *td,
     struct freebsd32_posix_fadvise_args *uap)
 {
-       struct posix_fadvise_args ap;
 
-       ap.fd = uap->fd;
-       ap.offset = PAIR32TO64(off_t, uap->offset);
-       ap.len = PAIR32TO64(off_t, uap->len);
-       ap.advice = uap->advice;
-       return (sys_posix_fadvise(td, &ap));
+       return (kern_posix_fadvise(td, uap->fd, PAIR32TO64(off_t, uap->offset),
+           PAIR32TO64(off_t, uap->len), uap->advice));
 }

Modified: head/sys/kern/vfs_syscalls.c
==============================================================================
--- head/sys/kern/vfs_syscalls.c        Mon Nov 14 15:57:03 2011        
(r227501)
+++ head/sys/kern/vfs_syscalls.c        Mon Nov 14 18:00:15 2011        
(r227502)
@@ -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, s
  * 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, str
        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, str
                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, str
                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, str
                 */
                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, str
                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, str
                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));
+}

Modified: head/sys/sys/syscallsubr.h
==============================================================================
--- head/sys/sys/syscallsubr.h  Mon Nov 14 15:57:03 2011        (r227501)
+++ head/sys/sys/syscallsubr.h  Mon Nov 14 18:00:15 2011        (r227502)
@@ -153,6 +153,10 @@ int        kern_openat(struct thread *td, int f
 int    kern_pathconf(struct thread *td, char *path, enum uio_seg pathseg,
            int name, u_long flags);
 int    kern_pipe(struct thread *td, int fildes[2]);
+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,
+           off_t len);
 int    kern_preadv(struct thread *td, int fd, struct uio *auio, off_t offset);
 int    kern_pselect(struct thread *td, int nd, fd_set *in, fd_set *ou,
            fd_set *ex, struct timeval *tvp, sigset_t *uset, int abi_nfdbits);
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to