Thu Aug 29 16:14:37 2019 UTC ()
Pull up following revision(s) (requested by hannken in ticket #1703):

	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@


(martin)
diff -r1.154 -r1.154.10.1 src/sys/miscfs/kernfs/kernfs_vnops.c
diff -r1.191 -r1.191.8.1 src/sys/miscfs/procfs/procfs_vnops.c

cvs diff -r1.154 -r1.154.10.1 src/sys/miscfs/kernfs/kernfs_vnops.c (expand / switch to unified diff)

--- src/sys/miscfs/kernfs/kernfs_vnops.c 2014/07/25 08:20:52 1.154
+++ src/sys/miscfs/kernfs/kernfs_vnops.c 2019/08/29 16:14:37 1.154.10.1
@@ -1,14 +1,14 @@ @@ -1,14 +1,14 @@
1/* $NetBSD: kernfs_vnops.c,v 1.154 2014/07/25 08:20:52 dholland Exp $ */ 1/* $NetBSD: kernfs_vnops.c,v 1.154.10.1 2019/08/29 16:14:37 martin Exp $ */
2 2
3/* 3/*
4 * Copyright (c) 1992, 1993 4 * Copyright (c) 1992, 1993
5 * The Regents of the University of California. All rights reserved. 5 * The Regents of the University of California. All rights reserved.
6 * 6 *
7 * This code is derived from software donated to Berkeley by 7 * This code is derived from software donated to Berkeley by
8 * Jan-Simon Pendry. 8 * Jan-Simon Pendry.
9 * 9 *
10 * Redistribution and use in source and binary forms, with or without 10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions 11 * modification, are permitted provided that the following conditions
12 * are met: 12 * are met:
13 * 1. Redistributions of source code must retain the above copyright 13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer. 14 * notice, this list of conditions and the following disclaimer.
@@ -29,27 +29,27 @@ @@ -29,27 +29,27 @@
29 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32 * SUCH DAMAGE. 32 * SUCH DAMAGE.
33 * 33 *
34 * @(#)kernfs_vnops.c 8.15 (Berkeley) 5/21/95 34 * @(#)kernfs_vnops.c 8.15 (Berkeley) 5/21/95
35 */ 35 */
36 36
37/* 37/*
38 * Kernel parameter filesystem (/kern) 38 * Kernel parameter filesystem (/kern)
39 */ 39 */
40 40
41#include <sys/cdefs.h> 41#include <sys/cdefs.h>
42__KERNEL_RCSID(0, "$NetBSD: kernfs_vnops.c,v 1.154 2014/07/25 08:20:52 dholland Exp $"); 42__KERNEL_RCSID(0, "$NetBSD: kernfs_vnops.c,v 1.154.10.1 2019/08/29 16:14:37 martin Exp $");
43 43
44#include <sys/param.h> 44#include <sys/param.h>
45#include <sys/systm.h> 45#include <sys/systm.h>
46#include <sys/kernel.h> 46#include <sys/kernel.h>
47#include <sys/vmmeter.h> 47#include <sys/vmmeter.h>
48#include <sys/time.h> 48#include <sys/time.h>
49#include <sys/proc.h> 49#include <sys/proc.h>
50#include <sys/vnode.h> 50#include <sys/vnode.h>
51#include <sys/malloc.h> 51#include <sys/malloc.h>
52#include <sys/file.h> 52#include <sys/file.h>
53#include <sys/stat.h> 53#include <sys/stat.h>
54#include <sys/mount.h> 54#include <sys/mount.h>
55#include <sys/namei.h> 55#include <sys/namei.h>
@@ -162,26 +162,27 @@ int kernfs_readdir(void *); @@ -162,26 +162,27 @@ int kernfs_readdir(void *);
162#define kernfs_readlink genfs_eopnotsupp 162#define kernfs_readlink genfs_eopnotsupp
163#define kernfs_abortop genfs_abortop 163#define kernfs_abortop genfs_abortop
164int kernfs_inactive(void *); 164int kernfs_inactive(void *);
165int kernfs_reclaim(void *); 165int kernfs_reclaim(void *);
166#define kernfs_lock genfs_lock 166#define kernfs_lock genfs_lock
167#define kernfs_unlock genfs_unlock 167#define kernfs_unlock genfs_unlock
168#define kernfs_bmap genfs_badop 168#define kernfs_bmap genfs_badop
169#define kernfs_strategy genfs_badop 169#define kernfs_strategy genfs_badop
170int kernfs_print(void *); 170int kernfs_print(void *);
171#define kernfs_islocked genfs_islocked 171#define kernfs_islocked genfs_islocked
172int kernfs_pathconf(void *); 172int kernfs_pathconf(void *);
173#define kernfs_advlock genfs_einval 173#define kernfs_advlock genfs_einval
174#define kernfs_bwrite genfs_eopnotsupp 174#define kernfs_bwrite genfs_eopnotsupp
 175int kernfs_getpages(void *);
175#define kernfs_putpages genfs_putpages 176#define kernfs_putpages genfs_putpages
176 177
177static int kernfs_xread(struct kernfs_node *, int, char **, 178static int kernfs_xread(struct kernfs_node *, int, char **,
178 size_t, size_t *); 179 size_t, size_t *);
179static int kernfs_xwrite(const struct kernfs_node *, char *, size_t); 180static int kernfs_xwrite(const struct kernfs_node *, char *, size_t);
180 181
181int (**kernfs_vnodeop_p)(void *); 182int (**kernfs_vnodeop_p)(void *);
182const struct vnodeopv_entry_desc kernfs_vnodeop_entries[] = { 183const struct vnodeopv_entry_desc kernfs_vnodeop_entries[] = {
183 { &vop_default_desc, vn_default_error }, 184 { &vop_default_desc, vn_default_error },
184 { &vop_lookup_desc, kernfs_lookup }, /* lookup */ 185 { &vop_lookup_desc, kernfs_lookup }, /* lookup */
185 { &vop_create_desc, kernfs_create }, /* create */ 186 { &vop_create_desc, kernfs_create }, /* create */
186 { &vop_mknod_desc, kernfs_mknod }, /* mknod */ 187 { &vop_mknod_desc, kernfs_mknod }, /* mknod */
187 { &vop_open_desc, kernfs_open }, /* open */ 188 { &vop_open_desc, kernfs_open }, /* open */
@@ -209,26 +210,27 @@ const struct vnodeopv_entry_desc kernfs_ @@ -209,26 +210,27 @@ const struct vnodeopv_entry_desc kernfs_
209 { &vop_readlink_desc, kernfs_readlink }, /* readlink */ 210 { &vop_readlink_desc, kernfs_readlink }, /* readlink */
210 { &vop_abortop_desc, kernfs_abortop }, /* abortop */ 211 { &vop_abortop_desc, kernfs_abortop }, /* abortop */
211 { &vop_inactive_desc, kernfs_inactive }, /* inactive */ 212 { &vop_inactive_desc, kernfs_inactive }, /* inactive */
212 { &vop_reclaim_desc, kernfs_reclaim }, /* reclaim */ 213 { &vop_reclaim_desc, kernfs_reclaim }, /* reclaim */
213 { &vop_lock_desc, kernfs_lock }, /* lock */ 214 { &vop_lock_desc, kernfs_lock }, /* lock */
214 { &vop_unlock_desc, kernfs_unlock }, /* unlock */ 215 { &vop_unlock_desc, kernfs_unlock }, /* unlock */
215 { &vop_bmap_desc, kernfs_bmap }, /* bmap */ 216 { &vop_bmap_desc, kernfs_bmap }, /* bmap */
216 { &vop_strategy_desc, kernfs_strategy }, /* strategy */ 217 { &vop_strategy_desc, kernfs_strategy }, /* strategy */
217 { &vop_print_desc, kernfs_print }, /* print */ 218 { &vop_print_desc, kernfs_print }, /* print */
218 { &vop_islocked_desc, kernfs_islocked }, /* islocked */ 219 { &vop_islocked_desc, kernfs_islocked }, /* islocked */
219 { &vop_pathconf_desc, kernfs_pathconf }, /* pathconf */ 220 { &vop_pathconf_desc, kernfs_pathconf }, /* pathconf */
220 { &vop_advlock_desc, kernfs_advlock }, /* advlock */ 221 { &vop_advlock_desc, kernfs_advlock }, /* advlock */
221 { &vop_bwrite_desc, kernfs_bwrite }, /* bwrite */ 222 { &vop_bwrite_desc, kernfs_bwrite }, /* bwrite */
 223 { &vop_getpages_desc, kernfs_getpages }, /* getpages */
222 { &vop_putpages_desc, kernfs_putpages }, /* putpages */ 224 { &vop_putpages_desc, kernfs_putpages }, /* putpages */
223 { NULL, NULL } 225 { NULL, NULL }
224}; 226};
225const struct vnodeopv_desc kernfs_vnodeop_opv_desc = 227const struct vnodeopv_desc kernfs_vnodeop_opv_desc =
226 { &kernfs_vnodeop_p, kernfs_vnodeop_entries }; 228 { &kernfs_vnodeop_p, kernfs_vnodeop_entries };
227 229
228static inline int 230static inline int
229kernfs_fileop_compare(struct kernfs_fileop *a, struct kernfs_fileop *b) 231kernfs_fileop_compare(struct kernfs_fileop *a, struct kernfs_fileop *b)
230{ 232{
231 if (a->kf_type < b->kf_type) 233 if (a->kf_type < b->kf_type)
232 return -1; 234 return -1;
233 if (a->kf_type > b->kf_type) 235 if (a->kf_type > b->kf_type)
234 return 1; 236 return 1;
@@ -1161,13 +1163,33 @@ int @@ -1161,13 +1163,33 @@ int
1161kernfs_symlink(void *v) 1163kernfs_symlink(void *v)
1162{ 1164{
1163 struct vop_symlink_v3_args /* { 1165 struct vop_symlink_v3_args /* {
1164 struct vnode *a_dvp; 1166 struct vnode *a_dvp;
1165 struct vnode **a_vpp; 1167 struct vnode **a_vpp;
1166 struct componentname *a_cnp; 1168 struct componentname *a_cnp;
1167 struct vattr *a_vap; 1169 struct vattr *a_vap;
1168 char *a_target; 1170 char *a_target;
1169 } */ *ap = v; 1171 } */ *ap = v;
1170 1172
1171 VOP_ABORTOP(ap->a_dvp, ap->a_cnp); 1173 VOP_ABORTOP(ap->a_dvp, ap->a_cnp);
1172 return (EROFS); 1174 return (EROFS);
1173} 1175}
 1176
 1177int
 1178kernfs_getpages(void *v)
 1179{
 1180 struct vop_getpages_args /* {
 1181 struct vnode *a_vp;
 1182 voff_t a_offset;
 1183 struct vm_page **a_m;
 1184 int *a_count;
 1185 int a_centeridx;
 1186 vm_prot_t a_access_type;
 1187 int a_advice;
 1188 int a_flags;
 1189 } */ *ap = v;
 1190
 1191 if ((ap->a_flags & PGO_LOCKED) == 0)
 1192 mutex_exit(ap->a_vp->v_interlock);
 1193
 1194 return (EFAULT);
 1195}

cvs diff -r1.191 -r1.191.8.1 src/sys/miscfs/procfs/procfs_vnops.c (expand / switch to unified diff)

--- src/sys/miscfs/procfs/procfs_vnops.c 2014/07/27 16:47:26 1.191
+++ src/sys/miscfs/procfs/procfs_vnops.c 2019/08/29 16:14:37 1.191.8.1
@@ -1,14 +1,14 @@ @@ -1,14 +1,14 @@
1/* $NetBSD: procfs_vnops.c,v 1.191 2014/07/27 16:47:26 hannken Exp $ */ 1/* $NetBSD: procfs_vnops.c,v 1.191.8.1 2019/08/29 16:14:37 martin Exp $ */
2 2
3/*- 3/*-
4 * Copyright (c) 2006, 2007, 2008 The NetBSD Foundation, Inc. 4 * Copyright (c) 2006, 2007, 2008 The NetBSD Foundation, Inc.
5 * All rights reserved. 5 * All rights reserved.
6 * 6 *
7 * This code is derived from software contributed to The NetBSD Foundation 7 * This code is derived from software contributed to The NetBSD Foundation
8 * by Andrew Doran. 8 * by Andrew Doran.
9 * 9 *
10 * Redistribution and use in source and binary forms, with or without 10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions 11 * modification, are permitted provided that the following conditions
12 * are met: 12 * are met:
13 * 1. Redistributions of source code must retain the above copyright 13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer. 14 * notice, this list of conditions and the following disclaimer.
@@ -95,27 +95,27 @@ @@ -95,27 +95,27 @@
95 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 95 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
96 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 96 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
97 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 97 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
98 * SUCH DAMAGE. 98 * SUCH DAMAGE.
99 * 99 *
100 * @(#)procfs_vnops.c 8.18 (Berkeley) 5/21/95 100 * @(#)procfs_vnops.c 8.18 (Berkeley) 5/21/95
101 */ 101 */
102 102
103/* 103/*
104 * procfs vnode interface 104 * procfs vnode interface
105 */ 105 */
106 106
107#include <sys/cdefs.h> 107#include <sys/cdefs.h>
108__KERNEL_RCSID(0, "$NetBSD: procfs_vnops.c,v 1.191 2014/07/27 16:47:26 hannken Exp $"); 108__KERNEL_RCSID(0, "$NetBSD: procfs_vnops.c,v 1.191.8.1 2019/08/29 16:14:37 martin Exp $");
109 109
110#include <sys/param.h> 110#include <sys/param.h>
111#include <sys/systm.h> 111#include <sys/systm.h>
112#include <sys/time.h> 112#include <sys/time.h>
113#include <sys/kernel.h> 113#include <sys/kernel.h>
114#include <sys/file.h> 114#include <sys/file.h>
115#include <sys/filedesc.h> 115#include <sys/filedesc.h>
116#include <sys/proc.h> 116#include <sys/proc.h>
117#include <sys/vnode.h> 117#include <sys/vnode.h>
118#include <sys/namei.h> 118#include <sys/namei.h>
119#include <sys/malloc.h> 119#include <sys/malloc.h>
120#include <sys/mount.h> 120#include <sys/mount.h>
121#include <sys/dirent.h> 121#include <sys/dirent.h>
@@ -229,26 +229,27 @@ int procfs_readdir(void *); @@ -229,26 +229,27 @@ int procfs_readdir(void *);
229int procfs_readlink(void *); 229int procfs_readlink(void *);
230#define procfs_abortop genfs_abortop 230#define procfs_abortop genfs_abortop
231int procfs_inactive(void *); 231int procfs_inactive(void *);
232int procfs_reclaim(void *); 232int procfs_reclaim(void *);
233#define procfs_lock genfs_lock 233#define procfs_lock genfs_lock
234#define procfs_unlock genfs_unlock 234#define procfs_unlock genfs_unlock
235#define procfs_bmap genfs_badop 235#define procfs_bmap genfs_badop
236#define procfs_strategy genfs_badop 236#define procfs_strategy genfs_badop
237int procfs_print(void *); 237int procfs_print(void *);
238int procfs_pathconf(void *); 238int procfs_pathconf(void *);
239#define procfs_islocked genfs_islocked 239#define procfs_islocked genfs_islocked
240#define procfs_advlock genfs_einval 240#define procfs_advlock genfs_einval
241#define procfs_bwrite genfs_eopnotsupp 241#define procfs_bwrite genfs_eopnotsupp
 242int procfs_getpages(void *);
242#define procfs_putpages genfs_null_putpages 243#define procfs_putpages genfs_null_putpages
243 244
244static int atoi(const char *, size_t); 245static int atoi(const char *, size_t);
245 246
246/* 247/*
247 * procfs vnode operations. 248 * procfs vnode operations.
248 */ 249 */
249int (**procfs_vnodeop_p)(void *); 250int (**procfs_vnodeop_p)(void *);
250const struct vnodeopv_entry_desc procfs_vnodeop_entries[] = { 251const struct vnodeopv_entry_desc procfs_vnodeop_entries[] = {
251 { &vop_default_desc, vn_default_error }, 252 { &vop_default_desc, vn_default_error },
252 { &vop_lookup_desc, procfs_lookup }, /* lookup */ 253 { &vop_lookup_desc, procfs_lookup }, /* lookup */
253 { &vop_create_desc, procfs_create }, /* create */ 254 { &vop_create_desc, procfs_create }, /* create */
254 { &vop_mknod_desc, procfs_mknod }, /* mknod */ 255 { &vop_mknod_desc, procfs_mknod }, /* mknod */
@@ -276,26 +277,27 @@ const struct vnodeopv_entry_desc procfs_ @@ -276,26 +277,27 @@ const struct vnodeopv_entry_desc procfs_
276 { &vop_readdir_desc, procfs_readdir }, /* readdir */ 277 { &vop_readdir_desc, procfs_readdir }, /* readdir */
277 { &vop_readlink_desc, procfs_readlink }, /* readlink */ 278 { &vop_readlink_desc, procfs_readlink }, /* readlink */
278 { &vop_abortop_desc, procfs_abortop }, /* abortop */ 279 { &vop_abortop_desc, procfs_abortop }, /* abortop */
279 { &vop_inactive_desc, procfs_inactive }, /* inactive */ 280 { &vop_inactive_desc, procfs_inactive }, /* inactive */
280 { &vop_reclaim_desc, procfs_reclaim }, /* reclaim */ 281 { &vop_reclaim_desc, procfs_reclaim }, /* reclaim */
281 { &vop_lock_desc, procfs_lock }, /* lock */ 282 { &vop_lock_desc, procfs_lock }, /* lock */
282 { &vop_unlock_desc, procfs_unlock }, /* unlock */ 283 { &vop_unlock_desc, procfs_unlock }, /* unlock */
283 { &vop_bmap_desc, procfs_bmap }, /* bmap */ 284 { &vop_bmap_desc, procfs_bmap }, /* bmap */
284 { &vop_strategy_desc, procfs_strategy }, /* strategy */ 285 { &vop_strategy_desc, procfs_strategy }, /* strategy */
285 { &vop_print_desc, procfs_print }, /* print */ 286 { &vop_print_desc, procfs_print }, /* print */
286 { &vop_islocked_desc, procfs_islocked }, /* islocked */ 287 { &vop_islocked_desc, procfs_islocked }, /* islocked */
287 { &vop_pathconf_desc, procfs_pathconf }, /* pathconf */ 288 { &vop_pathconf_desc, procfs_pathconf }, /* pathconf */
288 { &vop_advlock_desc, procfs_advlock }, /* advlock */ 289 { &vop_advlock_desc, procfs_advlock }, /* advlock */
 290 { &vop_getpages_desc, procfs_getpages }, /* getpages */
289 { &vop_putpages_desc, procfs_putpages }, /* putpages */ 291 { &vop_putpages_desc, procfs_putpages }, /* putpages */
290 { NULL, NULL } 292 { NULL, NULL }
291}; 293};
292const struct vnodeopv_desc procfs_vnodeop_opv_desc = 294const struct vnodeopv_desc procfs_vnodeop_opv_desc =
293 { &procfs_vnodeop_p, procfs_vnodeop_entries }; 295 { &procfs_vnodeop_p, procfs_vnodeop_entries };
294/* 296/*
295 * set things up for doing i/o on 297 * set things up for doing i/o on
296 * the pfsnode (vp). (vp) is locked 298 * the pfsnode (vp). (vp) is locked
297 * on entry, and should be left locked 299 * on entry, and should be left locked
298 * on exit. 300 * on exit.
299 * 301 *
300 * for procfs we don't need to do anything 302 * for procfs we don't need to do anything
301 * in particular for i/o. all that is done 303 * in particular for i/o. all that is done
@@ -1699,26 +1701,46 @@ procfs_readlink(void *v) @@ -1699,26 +1701,46 @@ procfs_readlink(void *v)
1699 break; 1701 break;
1700 }  1702 }
1701 closef(fp); 1703 closef(fp);
1702 procfs_proc_unlock(pown); 1704 procfs_proc_unlock(pown);
1703 } 1705 }
1704 1706
1705 if (error == 0) 1707 if (error == 0)
1706 error = uiomove(bp, len, ap->a_uio); 1708 error = uiomove(bp, len, ap->a_uio);
1707 if (path) 1709 if (path)
1708 free(path, M_TEMP); 1710 free(path, M_TEMP);
1709 return error; 1711 return error;
1710} 1712}
1711 1713
 1714int
 1715procfs_getpages(void *v)
 1716{
 1717 struct vop_getpages_args /* {
 1718 struct vnode *a_vp;
 1719 voff_t a_offset;
 1720 struct vm_page **a_m;
 1721 int *a_count;
 1722 int a_centeridx;
 1723 vm_prot_t a_access_type;
 1724 int a_advice;
 1725 int a_flags;
 1726 } */ *ap = v;
 1727
 1728 if ((ap->a_flags & PGO_LOCKED) == 0)
 1729 mutex_exit(ap->a_vp->v_interlock);
 1730
 1731 return (EFAULT);
 1732}
 1733
1712/* 1734/*
1713 * convert decimal ascii to int 1735 * convert decimal ascii to int
1714 */ 1736 */
1715static int 1737static int
1716atoi(const char *b, size_t len) 1738atoi(const char *b, size_t len)
1717{ 1739{
1718 int p = 0; 1740 int p = 0;
1719 1741
1720 while (len--) { 1742 while (len--) {
1721 char c = *b++; 1743 char c = *b++;
1722 if (c < '0' || c > '9') 1744 if (c < '0' || c > '9')
1723 return -1; 1745 return -1;
1724 p = 10 * p + (c - '0'); 1746 p = 10 * p + (c - '0');