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@diff -r1.154 -r1.154.10.1 src/sys/miscfs/kernfs/kernfs_vnops.c
(martin)
--- 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 | |
164 | int kernfs_inactive(void *); | 164 | int kernfs_inactive(void *); | |
165 | int kernfs_reclaim(void *); | 165 | int 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 | |
170 | int kernfs_print(void *); | 170 | int kernfs_print(void *); | |
171 | #define kernfs_islocked genfs_islocked | 171 | #define kernfs_islocked genfs_islocked | |
172 | int kernfs_pathconf(void *); | 172 | int 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 | |
175 | int kernfs_getpages(void *); | |||
175 | #define kernfs_putpages genfs_putpages | 176 | #define kernfs_putpages genfs_putpages | |
176 | 177 | |||
177 | static int kernfs_xread(struct kernfs_node *, int, char **, | 178 | static int kernfs_xread(struct kernfs_node *, int, char **, | |
178 | size_t, size_t *); | 179 | size_t, size_t *); | |
179 | static int kernfs_xwrite(const struct kernfs_node *, char *, size_t); | 180 | static int kernfs_xwrite(const struct kernfs_node *, char *, size_t); | |
180 | 181 | |||
181 | int (**kernfs_vnodeop_p)(void *); | 182 | int (**kernfs_vnodeop_p)(void *); | |
182 | const struct vnodeopv_entry_desc kernfs_vnodeop_entries[] = { | 183 | const 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 | }; | |
225 | const struct vnodeopv_desc kernfs_vnodeop_opv_desc = | 227 | const struct vnodeopv_desc kernfs_vnodeop_opv_desc = | |
226 | { &kernfs_vnodeop_p, kernfs_vnodeop_entries }; | 228 | { &kernfs_vnodeop_p, kernfs_vnodeop_entries }; | |
227 | 229 | |||
228 | static inline int | 230 | static inline int | |
229 | kernfs_fileop_compare(struct kernfs_fileop *a, struct kernfs_fileop *b) | 231 | kernfs_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 | |||
1161 | kernfs_symlink(void *v) | 1163 | kernfs_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 | ||||
1177 | int | |||
1178 | kernfs_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 | } |
--- 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 *); | |||
229 | int procfs_readlink(void *); | 229 | int procfs_readlink(void *); | |
230 | #define procfs_abortop genfs_abortop | 230 | #define procfs_abortop genfs_abortop | |
231 | int procfs_inactive(void *); | 231 | int procfs_inactive(void *); | |
232 | int procfs_reclaim(void *); | 232 | int 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 | |
237 | int procfs_print(void *); | 237 | int procfs_print(void *); | |
238 | int procfs_pathconf(void *); | 238 | int 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 | |
242 | int procfs_getpages(void *); | |||
242 | #define procfs_putpages genfs_null_putpages | 243 | #define procfs_putpages genfs_null_putpages | |
243 | 244 | |||
244 | static int atoi(const char *, size_t); | 245 | static int atoi(const char *, size_t); | |
245 | 246 | |||
246 | /* | 247 | /* | |
247 | * procfs vnode operations. | 248 | * procfs vnode operations. | |
248 | */ | 249 | */ | |
249 | int (**procfs_vnodeop_p)(void *); | 250 | int (**procfs_vnodeop_p)(void *); | |
250 | const struct vnodeopv_entry_desc procfs_vnodeop_entries[] = { | 251 | const 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 | }; | |
292 | const struct vnodeopv_desc procfs_vnodeop_opv_desc = | 294 | const 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 | |||
1714 | int | |||
1715 | procfs_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 | */ | |
1715 | static int | 1737 | static int | |
1716 | atoi(const char *b, size_t len) | 1738 | atoi(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'); |