Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 14 Nov 2011 18:00:15 +0000 (UTC)
From:      John Baldwin <jhb@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r227502 - in head/sys: compat/freebsd32 kern sys
Message-ID:  <201111141800.pAEI0FPY060019@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201111141800.pAEI0FPY060019>