From owner-svn-src-all@FreeBSD.ORG Mon Nov 14 18:00:21 2011 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 03B5F1065689; Mon, 14 Nov 2011 18:00:21 +0000 (UTC) (envelope-from jhb@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 8C4E78FC1C; Mon, 14 Nov 2011 18:00:15 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id pAEI0FE0060023; Mon, 14 Nov 2011 18:00:15 GMT (envelope-from jhb@svn.freebsd.org) Received: (from jhb@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id pAEI0FPY060019; Mon, 14 Nov 2011 18:00:15 GMT (envelope-from jhb@svn.freebsd.org) Message-Id: <201111141800.pAEI0FPY060019@svn.freebsd.org> From: John Baldwin Date: Mon, 14 Nov 2011 18:00:15 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r227502 - in head/sys: compat/freebsd32 kern sys X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 14 Nov 2011 18:00:21 -0000 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);