Module Name: src Committed By: martin Date: Thu Aug 29 16:28:47 UTC 2019
Modified Files: src/sys/miscfs/kernfs [netbsd-8]: kernfs_vnops.c src/sys/miscfs/procfs [netbsd-8]: procfs_vnops.c Log Message: Pull up following revision(s) (requested by hannken in ticket #1346): sys/miscfs/kernfs/kernfs_vnops.c: revision 1.161 sys/miscfs/procfs/procfs_vnops.c: revision 1.207 Add missing operation VOP_GETPAGES() returning EFAULT. Without this operation posix_fadvise(..., POSIX_FADV_WILLNEED) would leave the v_interlock held. Observed by maxv@ To generate a diff of this commit: cvs rdiff -u -r1.158 -r1.158.2.1 src/sys/miscfs/kernfs/kernfs_vnops.c cvs rdiff -u -r1.197.2.2 -r1.197.2.3 src/sys/miscfs/procfs/procfs_vnops.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/miscfs/kernfs/kernfs_vnops.c diff -u src/sys/miscfs/kernfs/kernfs_vnops.c:1.158 src/sys/miscfs/kernfs/kernfs_vnops.c:1.158.2.1 --- src/sys/miscfs/kernfs/kernfs_vnops.c:1.158 Fri May 26 14:21:01 2017 +++ src/sys/miscfs/kernfs/kernfs_vnops.c Thu Aug 29 16:28:47 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: kernfs_vnops.c,v 1.158 2017/05/26 14:21:01 riastradh Exp $ */ +/* $NetBSD: kernfs_vnops.c,v 1.158.2.1 2019/08/29 16:28:47 martin Exp $ */ /* * Copyright (c) 1992, 1993 @@ -39,7 +39,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: kernfs_vnops.c,v 1.158 2017/05/26 14:21:01 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: kernfs_vnops.c,v 1.158.2.1 2019/08/29 16:28:47 martin Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -172,6 +172,7 @@ int kernfs_print(void *); int kernfs_pathconf(void *); #define kernfs_advlock genfs_einval #define kernfs_bwrite genfs_eopnotsupp +int kernfs_getpages(void *); #define kernfs_putpages genfs_putpages static int kernfs_xread(struct kernfs_node *, int, char **, @@ -219,6 +220,7 @@ const struct vnodeopv_entry_desc kernfs_ { &vop_pathconf_desc, kernfs_pathconf }, /* pathconf */ { &vop_advlock_desc, kernfs_advlock }, /* advlock */ { &vop_bwrite_desc, kernfs_bwrite }, /* bwrite */ + { &vop_getpages_desc, kernfs_getpages }, /* getpages */ { &vop_putpages_desc, kernfs_putpages }, /* putpages */ { NULL, NULL } }; @@ -1170,3 +1172,23 @@ kernfs_symlink(void *v) VOP_ABORTOP(ap->a_dvp, ap->a_cnp); return (EROFS); } + +int +kernfs_getpages(void *v) +{ + struct vop_getpages_args /* { + struct vnode *a_vp; + voff_t a_offset; + struct vm_page **a_m; + int *a_count; + int a_centeridx; + vm_prot_t a_access_type; + int a_advice; + int a_flags; + } */ *ap = v; + + if ((ap->a_flags & PGO_LOCKED) == 0) + mutex_exit(ap->a_vp->v_interlock); + + return (EFAULT); +} Index: src/sys/miscfs/procfs/procfs_vnops.c diff -u src/sys/miscfs/procfs/procfs_vnops.c:1.197.2.2 src/sys/miscfs/procfs/procfs_vnops.c:1.197.2.3 --- src/sys/miscfs/procfs/procfs_vnops.c:1.197.2.2 Thu Apr 12 13:42:48 2018 +++ src/sys/miscfs/procfs/procfs_vnops.c Thu Aug 29 16:28:47 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: procfs_vnops.c,v 1.197.2.2 2018/04/12 13:42:48 martin Exp $ */ +/* $NetBSD: procfs_vnops.c,v 1.197.2.3 2019/08/29 16:28:47 martin Exp $ */ /*- * Copyright (c) 2006, 2007, 2008 The NetBSD Foundation, Inc. @@ -105,7 +105,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: procfs_vnops.c,v 1.197.2.2 2018/04/12 13:42:48 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: procfs_vnops.c,v 1.197.2.3 2019/08/29 16:28:47 martin Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -240,6 +240,7 @@ int procfs_pathconf(void *); #define procfs_islocked genfs_islocked #define procfs_advlock genfs_einval #define procfs_bwrite genfs_eopnotsupp +int procfs_getpages(void *); #define procfs_putpages genfs_null_putpages static int atoi(const char *, size_t); @@ -287,6 +288,7 @@ const struct vnodeopv_entry_desc procfs_ { &vop_islocked_desc, procfs_islocked }, /* islocked */ { &vop_pathconf_desc, procfs_pathconf }, /* pathconf */ { &vop_advlock_desc, procfs_advlock }, /* advlock */ + { &vop_getpages_desc, procfs_getpages }, /* getpages */ { &vop_putpages_desc, procfs_putpages }, /* putpages */ { NULL, NULL } }; @@ -1733,6 +1735,26 @@ procfs_readlink(void *v) return error; } +int +procfs_getpages(void *v) +{ + struct vop_getpages_args /* { + struct vnode *a_vp; + voff_t a_offset; + struct vm_page **a_m; + int *a_count; + int a_centeridx; + vm_prot_t a_access_type; + int a_advice; + int a_flags; + } */ *ap = v; + + if ((ap->a_flags & PGO_LOCKED) == 0) + mutex_exit(ap->a_vp->v_interlock); + + return (EFAULT); +} + /* * convert decimal ascii to int */