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;