Module Name:    src
Committed By:   yamt
Date:           Wed Jun 10 23:48:10 UTC 2009

Modified Files:
        src/sys/kern: sys_descrip.c

Log Message:
do_posix_fadvise:
        - deactivate pages on POSIX_FADV_DONTNEED.
        - more sanity checks.  fix a panic in genfs_getpages
          introduced by the previous (rev.1.15).


To generate a diff of this commit:
cvs rdiff -u -r1.15 -r1.16 src/sys/kern/sys_descrip.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/kern/sys_descrip.c
diff -u src/sys/kern/sys_descrip.c:1.15 src/sys/kern/sys_descrip.c:1.16
--- src/sys/kern/sys_descrip.c:1.15	Wed Jun 10 01:56:34 2009
+++ src/sys/kern/sys_descrip.c	Wed Jun 10 23:48:10 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: sys_descrip.c,v 1.15 2009/06/10 01:56:34 yamt Exp $	*/
+/*	$NetBSD: sys_descrip.c,v 1.16 2009/06/10 23:48:10 yamt Exp $	*/
 
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -67,7 +67,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sys_descrip.c,v 1.15 2009/06/10 01:56:34 yamt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sys_descrip.c,v 1.16 2009/06/10 23:48:10 yamt Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -616,11 +616,19 @@
 {
 	file_t *fp;
 	vnode_t *vp;
+	off_t endoffset;
 	int error;
 	CTASSERT(POSIX_FADV_NORMAL == UVM_ADV_NORMAL);
 	CTASSERT(POSIX_FADV_RANDOM == UVM_ADV_RANDOM);
 	CTASSERT(POSIX_FADV_SEQUENTIAL == UVM_ADV_SEQUENTIAL);
 
+	if (len == 0) {
+		endoffset = INT64_MAX;
+	} else if (INT64_MAX - offset >= len) {
+		endoffset = offset + len;
+	} else {
+		return EINVAL;
+	}
 	if ((fp = fd_getfile(fd)) == NULL) {
 		return EBADF;
 	}
@@ -635,6 +643,17 @@
 	}
 
 	switch (advice) {
+	case POSIX_FADV_WILLNEED:
+	case POSIX_FADV_DONTNEED:
+		vp = fp->f_data;
+		if (vp->v_type != VREG && vp->v_type != VBLK) {
+			fd_putfile(fd);
+			return 0;
+		}
+		break;
+	}
+
+	switch (advice) {
 	case POSIX_FADV_NORMAL:
 	case POSIX_FADV_RANDOM:
 	case POSIX_FADV_SEQUENTIAL:
@@ -651,11 +670,16 @@
 
 	case POSIX_FADV_WILLNEED:
 		vp = fp->f_data;
-		error = uvm_readahead(&vp->v_uobj, offset,
-		    len != 0 ? len : INT64_MAX - offset);
+		error = uvm_readahead(&vp->v_uobj, offset, endoffset - offset);
 		break;
 
 	case POSIX_FADV_DONTNEED:
+		vp = fp->f_data;
+		mutex_enter(&vp->v_interlock);
+		error = VOP_PUTPAGES(vp, round_page(offset),
+		    trunc_page(endoffset), PGO_DEACTIVATE | PGO_CLEANIT);
+		break;
+
 	case POSIX_FADV_NOREUSE:
 		/* Not implemented yet. */
 		error = 0;

Reply via email to