Commit | Line | Data |
---|---|---|
c153d43e | 1 | /* |
99315dca KB |
2 | * Copyright (c) 1992, 1993 |
3 | * The Regents of the University of California. All rights reserved. | |
c153d43e JSP |
4 | * |
5 | * This code is derived from software donated to Berkeley by | |
6 | * Jan-Simon Pendry. | |
7 | * | |
8 | * %sccs.include.redist.c% | |
9 | * | |
1611db1e | 10 | * @(#)lofs_vnops.c 8.4 (Berkeley) %G% |
c153d43e JSP |
11 | * |
12 | * $Id: lofs_vnops.c,v 1.11 1992/05/30 10:05:43 jsp Exp jsp $ | |
13 | */ | |
14 | ||
15 | /* | |
16 | * Loopback Filesystem | |
17 | */ | |
18 | ||
19 | #include <sys/param.h> | |
20 | #include <sys/systm.h> | |
21 | #include <sys/proc.h> | |
22 | #include <sys/time.h> | |
23 | #include <sys/types.h> | |
24 | #include <sys/vnode.h> | |
25 | #include <sys/mount.h> | |
26 | #include <sys/namei.h> | |
27 | #include <sys/malloc.h> | |
28 | #include <sys/buf.h> | |
6681df29 | 29 | #include <miscfs/lofs/lofs.h> |
c153d43e JSP |
30 | |
31 | /* | |
32 | * Basic strategy: as usual, do as little work as possible. | |
33 | * Nothing is ever locked in the lofs'ed filesystem, all | |
34 | * locks are held in the underlying filesystems. | |
35 | */ | |
36 | ||
37 | /* | |
38 | * Save a vnode and replace with | |
39 | * the lofs'ed one | |
40 | */ | |
41 | #define PUSHREF(v, nd) \ | |
42 | { \ | |
43 | struct { struct vnode *vnp; } v; \ | |
44 | v.vnp = (nd); \ | |
45 | (nd) = LOFSVP(v.vnp) | |
46 | ||
47 | /* | |
48 | * Undo the PUSHREF | |
49 | */ | |
50 | #define POP(v, nd) \ | |
51 | \ | |
52 | (nd) = v.vnp; \ | |
53 | } | |
54 | ||
c153d43e JSP |
55 | /* |
56 | * vp is the current namei directory | |
57 | * ndp is the name to locate in that directory... | |
58 | */ | |
05c39890 | 59 | int |
6681df29 KM |
60 | lofs_lookup(ap) |
61 | struct vop_lookup_args /* { | |
62 | struct vnode * a_dvp; | |
63 | struct vnode ** a_vpp; | |
64 | struct componentname * a_cnp; | |
65 | } */ *ap; | |
c153d43e | 66 | { |
50e716ac | 67 | struct vnode *dvp = ap->a_dvp; |
c153d43e JSP |
68 | struct vnode *newvp; |
69 | struct vnode *targetdvp; | |
70 | int error; | |
71 | int flag = ap->a_cnp->cn_nameiop /*& OPMASK*/; | |
72 | ||
c153d43e JSP |
73 | /* |
74 | * (ap->a_dvp) was locked when passed in, and it will be replaced | |
75 | * with the target vnode, BUT that will already have been | |
76 | * locked when (ap->a_dvp) was locked [see lofs_lock]. all that | |
77 | * must be done here is to keep track of reference counts. | |
78 | */ | |
50e716ac JSP |
79 | targetdvp = LOFSVP(dvp); |
80 | /*VREF(targetdvp);*/ | |
c153d43e JSP |
81 | |
82 | /* | |
83 | * Call lookup on the looped vnode | |
84 | */ | |
50e716ac JSP |
85 | error = VOP_LOOKUP(targetdvp, &newvp, ap->a_cnp); |
86 | /*vrele(targetdvp);*/ | |
c153d43e JSP |
87 | |
88 | if (error) { | |
89 | *ap->a_vpp = NULLVP; | |
c153d43e JSP |
90 | return (error); |
91 | } | |
c153d43e | 92 | |
50e716ac | 93 | *ap->a_vpp = newvp; |
c153d43e JSP |
94 | |
95 | /* | |
96 | * If we just found a directory then make | |
97 | * a loopback node for it and return the loopback | |
98 | * instead of the real vnode. Otherwise simply | |
99 | * return the aliased directory and vnode. | |
100 | */ | |
101 | if (newvp && newvp->v_type == VDIR && flag == LOOKUP) { | |
c153d43e JSP |
102 | /* |
103 | * At this point, newvp is the vnode to be looped. | |
104 | * Activate a loopback and return the looped vnode. | |
105 | */ | |
50e716ac | 106 | return (make_lofs(dvp->v_mount, ap->a_vpp)); |
c153d43e JSP |
107 | } |
108 | ||
c153d43e JSP |
109 | return (0); |
110 | } | |
111 | ||
112 | /* | |
113 | * this = ni_dvp | |
114 | * ni_dvp references the locked directory. | |
115 | * ni_vp is NULL. | |
116 | */ | |
05c39890 | 117 | int |
6681df29 KM |
118 | lofs_mknod(ap) |
119 | struct vop_mknod_args /* { | |
120 | struct vnode *a_dvp; | |
121 | struct vnode **a_vpp; | |
122 | struct componentname *a_cnp; | |
123 | struct vattr *a_vap; | |
124 | } */ *ap; | |
c153d43e | 125 | { |
c153d43e JSP |
126 | int error; |
127 | ||
c153d43e JSP |
128 | PUSHREF(xdvp, ap->a_dvp); |
129 | VREF(ap->a_dvp); | |
130 | ||
131 | error = VOP_MKNOD(ap->a_dvp, ap->a_vpp, ap->a_cnp, ap->a_vap); | |
132 | ||
133 | POP(xdvp, ap->a_dvp); | |
134 | vrele(ap->a_dvp); | |
135 | ||
136 | return (error); | |
137 | } | |
138 | ||
139 | /* | |
140 | * this = ni_dvp; | |
141 | * ni_dvp references the locked directory | |
142 | * ni_vp is NULL. | |
143 | */ | |
05c39890 | 144 | int |
6681df29 KM |
145 | lofs_create(ap) |
146 | struct vop_create_args /* { | |
147 | struct vnode *a_dvp; | |
148 | struct vnode **a_vpp; | |
149 | struct componentname *a_cnp; | |
150 | struct vattr *a_vap; | |
151 | } */ *ap; | |
c153d43e | 152 | { |
c153d43e JSP |
153 | int error; |
154 | ||
c153d43e JSP |
155 | PUSHREF(xdvp, ap->a_dvp); |
156 | VREF(ap->a_dvp); | |
157 | ||
158 | error = VOP_CREATE(ap->a_dvp, ap->a_vpp, ap->a_cnp, ap->a_vap); | |
159 | ||
160 | POP(xdvp, ap->a_dvp); | |
161 | vrele(ap->a_dvp); | |
162 | ||
c153d43e JSP |
163 | return (error); |
164 | } | |
165 | ||
05c39890 | 166 | int |
6681df29 KM |
167 | lofs_open(ap) |
168 | struct vop_open_args /* { | |
169 | struct vnode *a_vp; | |
170 | int a_mode; | |
171 | struct ucred *a_cred; | |
172 | struct proc *a_p; | |
173 | } */ *ap; | |
c153d43e | 174 | { |
6681df29 | 175 | |
05c39890 | 176 | return (VOP_OPEN(LOFSVP(ap->a_vp), ap->a_mode, ap->a_cred, ap->a_p)); |
c153d43e JSP |
177 | } |
178 | ||
05c39890 | 179 | int |
6681df29 KM |
180 | lofs_close(ap) |
181 | struct vop_close_args /* { | |
182 | struct vnode *a_vp; | |
183 | int a_fflag; | |
184 | struct ucred *a_cred; | |
185 | struct proc *a_p; | |
186 | } */ *ap; | |
c153d43e | 187 | { |
6681df29 | 188 | |
05c39890 | 189 | return (VOP_CLOSE(LOFSVP(ap->a_vp), ap->a_fflag, ap->a_cred, ap->a_p)); |
c153d43e JSP |
190 | } |
191 | ||
05c39890 | 192 | int |
6681df29 KM |
193 | lofs_access(ap) |
194 | struct vop_access_args /* { | |
195 | struct vnode *a_vp; | |
196 | int a_mode; | |
197 | struct ucred *a_cred; | |
198 | struct proc *a_p; | |
199 | } */ *ap; | |
c153d43e | 200 | { |
6681df29 | 201 | |
05c39890 | 202 | return (VOP_ACCESS(LOFSVP(ap->a_vp), ap->a_mode, ap->a_cred, ap->a_p)); |
c153d43e JSP |
203 | } |
204 | ||
05c39890 | 205 | int |
6681df29 KM |
206 | lofs_getattr(ap) |
207 | struct vop_getattr_args /* { | |
208 | struct vnode *a_vp; | |
209 | struct vattr *a_vap; | |
210 | struct ucred *a_cred; | |
211 | struct proc *a_p; | |
212 | } */ *ap; | |
c153d43e | 213 | { |
c153d43e JSP |
214 | int error; |
215 | ||
c153d43e JSP |
216 | /* |
217 | * Get the stats from the underlying filesystem | |
218 | */ | |
219 | error = VOP_GETATTR(LOFSVP(ap->a_vp), ap->a_vap, ap->a_cred, ap->a_p); | |
220 | if (error) | |
221 | return (error); | |
222 | /* | |
223 | * and replace the fsid field with the loopback number | |
224 | * to preserve the namespace. | |
225 | */ | |
226 | ap->a_vap->va_fsid = ap->a_vp->v_mount->mnt_stat.f_fsid.val[0]; | |
227 | return (0); | |
228 | } | |
229 | ||
05c39890 | 230 | int |
6681df29 KM |
231 | lofs_setattr(ap) |
232 | struct vop_setattr_args /* { | |
233 | struct vnode *a_vp; | |
234 | struct vattr *a_vap; | |
235 | struct ucred *a_cred; | |
236 | struct proc *a_p; | |
237 | } */ *ap; | |
c153d43e | 238 | { |
6681df29 | 239 | |
05c39890 | 240 | return (VOP_SETATTR(LOFSVP(ap->a_vp), ap->a_vap, ap->a_cred, ap->a_p)); |
c153d43e JSP |
241 | } |
242 | ||
05c39890 | 243 | int |
6681df29 KM |
244 | lofs_read(ap) |
245 | struct vop_read_args /* { | |
246 | struct vnode *a_vp; | |
247 | struct uio *a_uio; | |
248 | int a_ioflag; | |
249 | struct ucred *a_cred; | |
250 | } */ *ap; | |
c153d43e | 251 | { |
6681df29 | 252 | |
05c39890 | 253 | return (VOP_READ(LOFSVP(ap->a_vp), ap->a_uio, ap->a_ioflag, ap->a_cred)); |
c153d43e JSP |
254 | } |
255 | ||
05c39890 | 256 | int |
6681df29 KM |
257 | lofs_write(ap) |
258 | struct vop_write_args /* { | |
259 | struct vnode *a_vp; | |
260 | struct uio *a_uio; | |
261 | int a_ioflag; | |
262 | struct ucred *a_cred; | |
263 | } */ *ap; | |
c153d43e | 264 | { |
6681df29 | 265 | |
05c39890 | 266 | return (VOP_WRITE(LOFSVP(ap->a_vp), ap->a_uio, ap->a_ioflag, ap->a_cred)); |
c153d43e JSP |
267 | } |
268 | ||
05c39890 | 269 | int |
6681df29 KM |
270 | lofs_ioctl(ap) |
271 | struct vop_ioctl_args /* { | |
272 | struct vnode *a_vp; | |
273 | int a_command; | |
274 | caddr_t a_data; | |
275 | int a_fflag; | |
276 | struct ucred *a_cred; | |
277 | struct proc *a_p; | |
278 | } */ *ap; | |
c153d43e | 279 | { |
6681df29 | 280 | |
05c39890 | 281 | return (VOP_IOCTL(LOFSVP(ap->a_vp), ap->a_command, ap->a_data, ap->a_fflag, ap->a_cred, ap->a_p)); |
c153d43e JSP |
282 | } |
283 | ||
05c39890 | 284 | int |
6681df29 KM |
285 | lofs_select(ap) |
286 | struct vop_select_args /* { | |
287 | struct vnode *a_vp; | |
288 | int a_which; | |
289 | int a_fflags; | |
290 | struct ucred *a_cred; | |
291 | struct proc *a_p; | |
292 | } */ *ap; | |
c153d43e | 293 | { |
6681df29 | 294 | |
05c39890 | 295 | return (VOP_SELECT(LOFSVP(ap->a_vp), ap->a_which, ap->a_fflags, ap->a_cred, ap->a_p)); |
c153d43e JSP |
296 | } |
297 | ||
05c39890 | 298 | int |
6681df29 KM |
299 | lofs_mmap(ap) |
300 | struct vop_mmap_args /* { | |
301 | struct vnode *a_vp; | |
302 | int a_fflags; | |
303 | struct ucred *a_cred; | |
304 | struct proc *a_p; | |
305 | } */ *ap; | |
c153d43e | 306 | { |
6681df29 | 307 | |
05c39890 | 308 | return (VOP_MMAP(LOFSVP(ap->a_vp), ap->a_fflags, ap->a_cred, ap->a_p)); |
c153d43e JSP |
309 | } |
310 | ||
05c39890 | 311 | int |
6681df29 KM |
312 | lofs_fsync(ap) |
313 | struct vop_fsync_args /* { | |
314 | struct vnode *a_vp; | |
315 | struct ucred *a_cred; | |
316 | int a_waitfor; | |
317 | struct proc *a_p; | |
318 | } */ *ap; | |
c153d43e | 319 | { |
37cd2672 | 320 | struct vnode *targetvp = LOFSVP(ap->a_vp); |
6681df29 | 321 | |
37cd2672 | 322 | if (targetvp) |
05c39890 | 323 | return (VOP_FSYNC(targetvp, ap->a_cred, ap->a_waitfor, ap->a_p)); |
37cd2672 | 324 | return (0); |
c153d43e JSP |
325 | } |
326 | ||
05c39890 | 327 | int |
6681df29 KM |
328 | lofs_seek(ap) |
329 | struct vop_seek_args /* { | |
330 | struct vnode *a_vp; | |
331 | off_t a_oldoff; | |
332 | off_t a_newoff; | |
333 | struct ucred *a_cred; | |
334 | } */ *ap; | |
c153d43e | 335 | { |
6681df29 | 336 | |
05c39890 | 337 | return (VOP_SEEK(LOFSVP(ap->a_vp), ap->a_oldoff, ap->a_newoff, ap->a_cred)); |
c153d43e JSP |
338 | } |
339 | ||
05c39890 | 340 | int |
6681df29 KM |
341 | lofs_remove(ap) |
342 | struct vop_remove_args /* { | |
343 | struct vnode *a_dvp; | |
344 | struct vnode *a_vp; | |
345 | struct componentname *a_cnp; | |
346 | } */ *ap; | |
c153d43e | 347 | { |
c153d43e JSP |
348 | int error; |
349 | ||
c153d43e JSP |
350 | PUSHREF(xdvp, ap->a_dvp); |
351 | VREF(ap->a_dvp); | |
352 | PUSHREF(xvp, ap->a_vp); | |
353 | VREF(ap->a_vp); | |
354 | ||
355 | error = VOP_REMOVE(ap->a_dvp, ap->a_vp, ap->a_cnp); | |
356 | ||
357 | POP(xvp, ap->a_vp); | |
358 | vrele(ap->a_vp); | |
359 | POP(xdvp, ap->a_dvp); | |
360 | vrele(ap->a_dvp); | |
361 | ||
362 | return (error); | |
363 | } | |
364 | ||
365 | /* | |
366 | * vp is this. | |
367 | * ni_dvp is the locked parent of the target. | |
368 | * ni_vp is NULL. | |
369 | */ | |
05c39890 | 370 | int |
6681df29 KM |
371 | lofs_link(ap) |
372 | struct vop_link_args /* { | |
373 | struct vnode *a_vp; | |
374 | struct vnode *a_tdvp; | |
375 | struct componentname *a_cnp; | |
376 | } */ *ap; | |
c153d43e | 377 | { |
c153d43e JSP |
378 | int error; |
379 | ||
c153d43e JSP |
380 | PUSHREF(xdvp, ap->a_vp); |
381 | VREF(ap->a_vp); | |
382 | ||
383 | error = VOP_LINK(ap->a_vp, LOFSVP(ap->a_tdvp), ap->a_cnp); | |
384 | ||
385 | POP(xdvp, ap->a_vp); | |
386 | vrele(ap->a_vp); | |
387 | ||
388 | return (error); | |
389 | } | |
390 | ||
05c39890 | 391 | int |
6681df29 KM |
392 | lofs_rename(ap) |
393 | struct vop_rename_args /* { | |
394 | struct vnode *a_fdvp; | |
395 | struct vnode *a_fvp; | |
396 | struct componentname *a_fcnp; | |
397 | struct vnode *a_tdvp; | |
398 | struct vnode *a_tvp; | |
399 | struct componentname *a_tcnp; | |
400 | } */ *ap; | |
c153d43e | 401 | { |
c153d43e JSP |
402 | struct vnode *fvp, *tvp; |
403 | struct vnode *tdvp; | |
6681df29 | 404 | #ifdef notdef |
c153d43e JSP |
405 | struct vnode *fsvp, *tsvp; |
406 | #endif | |
407 | int error; | |
408 | ||
c153d43e JSP |
409 | /* |
410 | * Switch source directory to point to lofsed vnode | |
411 | */ | |
412 | PUSHREF(fdvp, ap->a_fdvp); | |
413 | VREF(ap->a_fdvp); | |
414 | ||
c153d43e JSP |
415 | /* |
416 | * And source object if it is lofsed... | |
417 | */ | |
418 | fvp = ap->a_fvp; | |
419 | if (fvp && fvp->v_op == lofs_vnodeop_p) { | |
420 | ap->a_fvp = LOFSVP(fvp); | |
421 | VREF(ap->a_fvp); | |
422 | } else { | |
423 | fvp = 0; | |
424 | } | |
425 | ||
6681df29 | 426 | #ifdef notdef |
c153d43e JSP |
427 | /* |
428 | * And source startdir object if it is lofsed... | |
429 | */ | |
430 | fsvp = fndp->ni_startdir; | |
431 | if (fsvp && fsvp->v_op == lofs_vnodeop_p) { | |
432 | fndp->ni_startdir = LOFSVP(fsvp); | |
433 | VREF(fndp->ni_startdir); | |
434 | } else { | |
435 | fsvp = 0; | |
436 | } | |
437 | #endif | |
438 | ||
c153d43e JSP |
439 | /* |
440 | * Switch target directory to point to lofsed vnode | |
441 | */ | |
442 | tdvp = ap->a_tdvp; | |
443 | if (tdvp && tdvp->v_op == lofs_vnodeop_p) { | |
444 | ap->a_tdvp = LOFSVP(tdvp); | |
445 | VREF(ap->a_tdvp); | |
446 | } else { | |
447 | tdvp = 0; | |
448 | } | |
449 | ||
c153d43e JSP |
450 | /* |
451 | * And target object if it is lofsed... | |
452 | */ | |
453 | tvp = ap->a_tvp; | |
454 | if (tvp && tvp->v_op == lofs_vnodeop_p) { | |
455 | ap->a_tvp = LOFSVP(tvp); | |
456 | VREF(ap->a_tvp); | |
457 | } else { | |
458 | tvp = 0; | |
459 | } | |
460 | ||
6681df29 | 461 | #ifdef notdef |
c153d43e JSP |
462 | /* |
463 | * And target startdir object if it is lofsed... | |
464 | */ | |
465 | tsvp = tndp->ni_startdir; | |
466 | if (tsvp && tsvp->v_op == lofs_vnodeop_p) { | |
467 | tndp->ni_startdir = LOFSVP(fsvp); | |
468 | VREF(tndp->ni_startdir); | |
469 | } else { | |
470 | tsvp = 0; | |
471 | } | |
472 | #endif | |
473 | ||
c153d43e JSP |
474 | error = VOP_RENAME(ap->a_fdvp, ap->a_fvp, ap->a_fcnp, ap->a_tdvp, ap->a_tvp, ap->a_tcnp); |
475 | ||
476 | /* | |
477 | * Put everything back... | |
478 | */ | |
479 | ||
6681df29 | 480 | #ifdef notdef |
c153d43e JSP |
481 | |
482 | if (tsvp) { | |
483 | if (tndp->ni_startdir) | |
484 | vrele(tndp->ni_startdir); | |
485 | tndp->ni_startdir = tsvp; | |
486 | } | |
487 | #endif | |
488 | ||
c153d43e JSP |
489 | if (tvp) { |
490 | ap->a_tvp = tvp; | |
491 | vrele(ap->a_tvp); | |
492 | } | |
493 | ||
c153d43e JSP |
494 | if (tdvp) { |
495 | ap->a_tdvp = tdvp; | |
496 | vrele(ap->a_tdvp); | |
497 | } | |
498 | ||
6681df29 | 499 | #ifdef notdef |
c153d43e JSP |
500 | |
501 | if (fsvp) { | |
502 | if (fndp->ni_startdir) | |
503 | vrele(fndp->ni_startdir); | |
504 | fndp->ni_startdir = fsvp; | |
505 | } | |
506 | #endif | |
507 | ||
c153d43e JSP |
508 | if (fvp) { |
509 | ap->a_fvp = fvp; | |
510 | vrele(ap->a_fvp); | |
511 | } | |
512 | ||
c153d43e JSP |
513 | POP(fdvp, ap->a_fdvp); |
514 | vrele(ap->a_fdvp); | |
515 | ||
516 | return (error); | |
517 | } | |
518 | ||
519 | /* | |
520 | * ni_dvp is the locked (alias) parent. | |
521 | * ni_vp is NULL. | |
522 | */ | |
05c39890 | 523 | int |
6681df29 KM |
524 | lofs_mkdir(ap) |
525 | struct vop_mkdir_args /* { | |
526 | struct vnode *a_dvp; | |
527 | struct vnode **a_vpp; | |
528 | struct componentname *a_cnp; | |
529 | struct vattr *a_vap; | |
530 | } */ *ap; | |
c153d43e | 531 | { |
c153d43e | 532 | int error; |
50e716ac | 533 | struct vnode *dvp = ap->a_dvp; |
c153d43e | 534 | struct vnode *xdvp; |
50e716ac | 535 | struct vnode *newvp; |
c153d43e | 536 | |
50e716ac JSP |
537 | xdvp = dvp; |
538 | dvp = LOFSVP(xdvp); | |
d41d1395 | 539 | VREF(dvp); |
c153d43e | 540 | |
50e716ac | 541 | error = VOP_MKDIR(dvp, &newvp, ap->a_cnp, ap->a_vap); |
c153d43e JSP |
542 | |
543 | if (error) { | |
50e716ac | 544 | *ap->a_vpp = NULLVP; |
d41d1395 | 545 | vrele(xdvp); |
c153d43e JSP |
546 | return (error); |
547 | } | |
548 | ||
549 | /* | |
550 | * Make a new lofs node | |
551 | */ | |
50e716ac | 552 | /*VREF(dvp);*/ |
c153d43e | 553 | |
50e716ac | 554 | error = make_lofs(dvp->v_mount, &newvp); |
c153d43e | 555 | |
50e716ac | 556 | *ap->a_vpp = newvp; |
c153d43e JSP |
557 | |
558 | return (error); | |
559 | } | |
560 | ||
561 | /* | |
562 | * ni_dvp is the locked parent. | |
563 | * ni_vp is the entry to be removed. | |
564 | */ | |
05c39890 | 565 | int |
6681df29 KM |
566 | lofs_rmdir(ap) |
567 | struct vop_rmdir_args /* { | |
568 | struct vnode *a_dvp; | |
569 | struct vnode *a_vp; | |
570 | struct componentname *a_cnp; | |
571 | } */ *ap; | |
c153d43e | 572 | { |
50e716ac JSP |
573 | struct vnode *vp = ap->a_vp; |
574 | struct vnode *dvp = ap->a_dvp; | |
c153d43e JSP |
575 | int error; |
576 | ||
50e716ac JSP |
577 | PUSHREF(xdvp, dvp); |
578 | VREF(dvp); | |
579 | PUSHREF(xvp, vp); | |
580 | VREF(vp); | |
c153d43e | 581 | |
50e716ac | 582 | error = VOP_RMDIR(dvp, vp, ap->a_cnp); |
c153d43e | 583 | |
50e716ac JSP |
584 | POP(xvp, vp); |
585 | vrele(vp); | |
586 | POP(xdvp, dvp); | |
587 | vrele(dvp); | |
c153d43e JSP |
588 | |
589 | return (error); | |
590 | } | |
591 | ||
592 | /* | |
593 | * ni_dvp is the locked parent. | |
594 | * ni_vp is NULL. | |
595 | */ | |
05c39890 | 596 | int |
6681df29 KM |
597 | lofs_symlink(ap) |
598 | struct vop_symlink_args /* { | |
599 | struct vnode *a_dvp; | |
600 | struct vnode **a_vpp; | |
601 | struct componentname *a_cnp; | |
602 | struct vattr *a_vap; | |
603 | char *a_target; | |
604 | } */ *ap; | |
c153d43e | 605 | { |
c153d43e JSP |
606 | int error; |
607 | ||
c153d43e JSP |
608 | PUSHREF(xdvp, ap->a_dvp); |
609 | VREF(ap->a_dvp); | |
610 | ||
611 | error = VOP_SYMLINK(ap->a_dvp, ap->a_vpp, ap->a_cnp, ap->a_vap, ap->a_target); | |
612 | ||
613 | POP(xdvp, ap->a_dvp); | |
614 | vrele(ap->a_dvp); | |
615 | ||
616 | return (error); | |
617 | } | |
618 | ||
05c39890 | 619 | int |
6681df29 KM |
620 | lofs_readdir(ap) |
621 | struct vop_readdir_args /* { | |
622 | struct vnode *a_vp; | |
623 | struct uio *a_uio; | |
624 | struct ucred *a_cred; | |
625 | } */ *ap; | |
c153d43e | 626 | { |
6681df29 | 627 | |
05c39890 | 628 | return (VOP_READDIR(LOFSVP(ap->a_vp), ap->a_uio, ap->a_cred)); |
c153d43e JSP |
629 | } |
630 | ||
05c39890 | 631 | int |
6681df29 KM |
632 | lofs_readlink(ap) |
633 | struct vop_readlink_args /* { | |
634 | struct vnode *a_vp; | |
635 | struct uio *a_uio; | |
636 | struct ucred *a_cred; | |
637 | } */ *ap; | |
c153d43e | 638 | { |
6681df29 | 639 | |
05c39890 | 640 | return (VOP_READLINK(LOFSVP(ap->a_vp), ap->a_uio, ap->a_cred)); |
c153d43e JSP |
641 | } |
642 | ||
643 | /* | |
644 | * Anyone's guess... | |
645 | */ | |
05c39890 | 646 | int |
6681df29 KM |
647 | lofs_abortop(ap) |
648 | struct vop_abortop_args /* { | |
649 | struct vnode *a_dvp; | |
650 | struct componentname *a_cnp; | |
651 | } */ *ap; | |
c153d43e | 652 | { |
c153d43e JSP |
653 | int error; |
654 | ||
655 | PUSHREF(xdvp, ap->a_dvp); | |
656 | ||
657 | error = VOP_ABORTOP(ap->a_dvp, ap->a_cnp); | |
658 | ||
659 | POP(xdvp, ap->a_dvp); | |
660 | ||
661 | return (error); | |
662 | } | |
663 | ||
05c39890 | 664 | int |
6681df29 KM |
665 | lofs_inactive(ap) |
666 | struct vop_inactive_args /* { | |
667 | struct vnode *a_vp; | |
668 | } */ *ap; | |
c153d43e | 669 | { |
c153d43e | 670 | struct vnode *targetvp = LOFSVP(ap->a_vp); |
6681df29 | 671 | |
c153d43e JSP |
672 | #ifdef DIAGNOSTIC |
673 | { extern int prtactive; | |
674 | if (prtactive && ap->a_vp->v_usecount != 0) | |
675 | vprint("lofs_inactive: pushing active", ap->a_vp); | |
676 | } | |
677 | #endif | |
678 | ||
679 | if (targetvp) { | |
680 | vrele(targetvp); | |
681 | LOFSP(ap->a_vp)->a_lofsvp = 0; | |
682 | } | |
683 | } | |
684 | ||
05c39890 | 685 | int |
6681df29 KM |
686 | lofs_reclaim(ap) |
687 | struct vop_reclaim_args /* { | |
688 | struct vnode *a_vp; | |
689 | } */ *ap; | |
c153d43e | 690 | { |
c153d43e | 691 | struct vnode *targetvp; |
6681df29 | 692 | |
c153d43e JSP |
693 | remque(LOFSP(ap->a_vp)); |
694 | targetvp = LOFSVP(ap->a_vp); | |
695 | if (targetvp) { | |
696 | printf("lofs: delayed vrele of %x\n", targetvp); | |
697 | vrele(targetvp); /* XXX should never happen */ | |
698 | } | |
699 | FREE(ap->a_vp->v_data, M_TEMP); | |
700 | ap->a_vp->v_data = 0; | |
701 | return (0); | |
702 | } | |
703 | ||
05c39890 | 704 | int |
6681df29 KM |
705 | lofs_lock(ap) |
706 | struct vop_lock_args /* { | |
707 | struct vnode *a_vp; | |
708 | } */ *ap; | |
c153d43e | 709 | { |
c153d43e | 710 | int error; |
12155578 KM |
711 | register struct vnode *vp = ap->a_vp; |
712 | struct vnode *targetvp; | |
713 | ||
714 | while (vp->v_flag & VXLOCK) { | |
715 | vp->v_flag |= VXWANT; | |
716 | sleep((caddr_t)vp, PINOD); | |
717 | } | |
718 | if (vp->v_tag == VT_NON) | |
719 | return (ENOENT); | |
720 | targetvp = LOFSVP(ap->a_vp); | |
c153d43e | 721 | |
12155578 KM |
722 | if (targetvp && (error = VOP_LOCK(targetvp))) |
723 | return (error); | |
c153d43e JSP |
724 | return (0); |
725 | } | |
726 | ||
05c39890 | 727 | int |
6681df29 KM |
728 | lofs_unlock(ap) |
729 | struct vop_unlock_args /* { | |
730 | struct vnode *a_vp; | |
731 | } */ *ap; | |
c153d43e | 732 | { |
c153d43e JSP |
733 | struct vnode *targetvp = LOFSVP(ap->a_vp); |
734 | ||
c153d43e JSP |
735 | if (targetvp) |
736 | return (VOP_UNLOCK(targetvp)); | |
737 | return (0); | |
738 | } | |
739 | ||
05c39890 | 740 | int |
6681df29 KM |
741 | lofs_bmap(ap) |
742 | struct vop_bmap_args /* { | |
743 | struct vnode *a_vp; | |
744 | daddr_t a_bn; | |
745 | struct vnode **a_vpp; | |
746 | daddr_t *a_bnp; | |
45ee8885 | 747 | int *a_runp; |
6681df29 | 748 | } */ *ap; |
c153d43e | 749 | { |
6681df29 | 750 | |
05c39890 | 751 | return (VOP_BMAP(LOFSVP(ap->a_vp), ap->a_bn, ap->a_vpp, ap->a_bnp, ap->a_runp)); |
c153d43e JSP |
752 | } |
753 | ||
05c39890 | 754 | int |
6681df29 KM |
755 | lofs_strategy(ap) |
756 | struct vop_strategy_args /* { | |
757 | struct buf *a_bp; | |
758 | } */ *ap; | |
c153d43e | 759 | { |
c153d43e JSP |
760 | int error; |
761 | ||
c153d43e JSP |
762 | PUSHREF(vp, ap->a_bp->b_vp); |
763 | ||
764 | error = VOP_STRATEGY(ap->a_bp); | |
765 | ||
766 | POP(vp, ap->a_bp->b_vp); | |
767 | ||
768 | return (error); | |
769 | } | |
770 | ||
05c39890 | 771 | int |
6681df29 KM |
772 | lofs_print(ap) |
773 | struct vop_print_args /* { | |
774 | struct vnode *a_vp; | |
775 | } */ *ap; | |
c153d43e | 776 | { |
6681df29 | 777 | |
c153d43e JSP |
778 | struct vnode *targetvp = LOFSVP(ap->a_vp); |
779 | printf("tag VT_LOFS ref "); | |
780 | if (targetvp) | |
781 | return (VOP_PRINT(targetvp)); | |
782 | printf("NULLVP\n"); | |
783 | return (0); | |
784 | } | |
785 | ||
05c39890 | 786 | int |
6681df29 KM |
787 | lofs_islocked(ap) |
788 | struct vop_islocked_args /* { | |
789 | struct vnode *a_vp; | |
790 | } */ *ap; | |
c153d43e | 791 | { |
6681df29 | 792 | |
c153d43e JSP |
793 | struct vnode *targetvp = LOFSVP(ap->a_vp); |
794 | if (targetvp) | |
795 | return (VOP_ISLOCKED(targetvp)); | |
796 | return (0); | |
797 | } | |
798 | ||
0020ca6e JSP |
799 | int |
800 | lofs_pathconf(ap) | |
801 | struct vop_pathconf_args *ap; | |
802 | { | |
803 | ||
804 | return (VOP_PATHCONF(LOFSVP(ap->a_vp), ap->a_name, ap->a_retval)); | |
805 | } | |
806 | ||
05c39890 | 807 | int |
6681df29 KM |
808 | lofs_advlock(ap) |
809 | struct vop_advlock_args /* { | |
810 | struct vnode *a_vp; | |
811 | caddr_t a_id; | |
812 | int a_op; | |
813 | struct flock *a_fl; | |
814 | int a_flags; | |
815 | } */ *ap; | |
c153d43e | 816 | { |
6681df29 | 817 | |
05c39890 | 818 | return (VOP_ADVLOCK(LOFSVP(ap->a_vp), ap->a_id, ap->a_op, ap->a_fl, ap->a_flags)); |
c153d43e JSP |
819 | } |
820 | ||
821 | /* | |
822 | * LOFS directory offset lookup. | |
823 | * Currently unsupported. | |
824 | */ | |
05c39890 | 825 | int |
6681df29 KM |
826 | lofs_blkatoff(ap) |
827 | struct vop_blkatoff_args /* { | |
828 | struct vnode *a_vp; | |
829 | off_t a_offset; | |
830 | char **a_res; | |
831 | struct buf **a_bpp; | |
832 | } */ *ap; | |
c153d43e JSP |
833 | { |
834 | ||
835 | return (EOPNOTSUPP); | |
836 | } | |
837 | ||
c153d43e JSP |
838 | /* |
839 | * LOFS flat namespace allocation. | |
840 | * Currently unsupported. | |
841 | */ | |
05c39890 | 842 | int |
6681df29 KM |
843 | lofs_valloc(ap) |
844 | struct vop_valloc_args /* { | |
845 | struct vnode *a_pvp; | |
846 | int a_mode; | |
847 | struct ucred *a_cred; | |
848 | struct vnode **a_vpp; | |
849 | } */ *ap; | |
c153d43e JSP |
850 | { |
851 | ||
852 | return (EOPNOTSUPP); | |
853 | } | |
854 | ||
855 | /* | |
856 | * LOFS flat namespace free. | |
857 | * Currently unsupported. | |
858 | */ | |
859 | /*void*/ | |
05c39890 | 860 | int |
6681df29 KM |
861 | lofs_vfree(ap) |
862 | struct vop_vfree_args /* { | |
863 | struct vnode *a_pvp; | |
864 | ino_t a_ino; | |
865 | int a_mode; | |
866 | } */ *ap; | |
c153d43e JSP |
867 | { |
868 | ||
6681df29 | 869 | return (0); |
c153d43e JSP |
870 | } |
871 | ||
872 | /* | |
873 | * LOFS file truncation. | |
874 | */ | |
05c39890 | 875 | int |
6681df29 KM |
876 | lofs_truncate(ap) |
877 | struct vop_truncate_args /* { | |
878 | struct vnode *a_vp; | |
879 | off_t a_length; | |
880 | int a_flags; | |
881 | struct ucred *a_cred; | |
882 | struct proc *a_p; | |
883 | } */ *ap; | |
c153d43e JSP |
884 | { |
885 | ||
886 | /* Use lofs_setattr */ | |
887 | printf("lofs_truncate: need to implement!!"); | |
888 | return (EOPNOTSUPP); | |
889 | } | |
890 | ||
891 | /* | |
892 | * LOFS update. | |
893 | */ | |
05c39890 | 894 | int |
6681df29 KM |
895 | lofs_update(ap) |
896 | struct vop_update_args /* { | |
897 | struct vnode *a_vp; | |
898 | struct timeval *a_ta; | |
899 | struct timeval *a_tm; | |
900 | int a_waitfor; | |
901 | } */ *ap; | |
c153d43e JSP |
902 | { |
903 | ||
904 | /* Use lofs_setattr */ | |
905 | printf("lofs_update: need to implement!!"); | |
906 | return (EOPNOTSUPP); | |
907 | } | |
908 | ||
909 | /* | |
910 | * LOFS bwrite | |
911 | */ | |
05c39890 | 912 | int |
6681df29 KM |
913 | lofs_bwrite(ap) |
914 | struct vop_bwrite_args /* { | |
915 | struct buf *a_bp; | |
916 | } */ *ap; | |
c153d43e | 917 | { |
6681df29 | 918 | |
c153d43e JSP |
919 | return (EOPNOTSUPP); |
920 | } | |
921 | ||
922 | /* | |
923 | * Global vfs data structures for ufs | |
924 | */ | |
925 | int (**lofs_vnodeop_p)(); | |
926 | struct vnodeopv_entry_desc lofs_vnodeop_entries[] = { | |
927 | { &vop_default_desc, vn_default_error }, | |
928 | { &vop_lookup_desc, lofs_lookup }, /* lookup */ | |
929 | { &vop_create_desc, lofs_create }, /* create */ | |
930 | { &vop_mknod_desc, lofs_mknod }, /* mknod */ | |
0020ca6e | 931 | { &vop_open_desc, lofs_open }, /* open */ |
c153d43e JSP |
932 | { &vop_close_desc, lofs_close }, /* close */ |
933 | { &vop_access_desc, lofs_access }, /* access */ | |
934 | { &vop_getattr_desc, lofs_getattr }, /* getattr */ | |
935 | { &vop_setattr_desc, lofs_setattr }, /* setattr */ | |
0020ca6e | 936 | { &vop_read_desc, lofs_read }, /* read */ |
c153d43e JSP |
937 | { &vop_write_desc, lofs_write }, /* write */ |
938 | { &vop_ioctl_desc, lofs_ioctl }, /* ioctl */ | |
939 | { &vop_select_desc, lofs_select }, /* select */ | |
0020ca6e | 940 | { &vop_mmap_desc, lofs_mmap }, /* mmap */ |
c153d43e | 941 | { &vop_fsync_desc, lofs_fsync }, /* fsync */ |
0020ca6e | 942 | { &vop_seek_desc, lofs_seek }, /* seek */ |
c153d43e | 943 | { &vop_remove_desc, lofs_remove }, /* remove */ |
0020ca6e | 944 | { &vop_link_desc, lofs_link }, /* link */ |
c153d43e JSP |
945 | { &vop_rename_desc, lofs_rename }, /* rename */ |
946 | { &vop_mkdir_desc, lofs_mkdir }, /* mkdir */ | |
947 | { &vop_rmdir_desc, lofs_rmdir }, /* rmdir */ | |
948 | { &vop_symlink_desc, lofs_symlink }, /* symlink */ | |
949 | { &vop_readdir_desc, lofs_readdir }, /* readdir */ | |
950 | { &vop_readlink_desc, lofs_readlink }, /* readlink */ | |
951 | { &vop_abortop_desc, lofs_abortop }, /* abortop */ | |
952 | { &vop_inactive_desc, lofs_inactive }, /* inactive */ | |
953 | { &vop_reclaim_desc, lofs_reclaim }, /* reclaim */ | |
0020ca6e | 954 | { &vop_lock_desc, lofs_lock }, /* lock */ |
c153d43e | 955 | { &vop_unlock_desc, lofs_unlock }, /* unlock */ |
0020ca6e | 956 | { &vop_bmap_desc, lofs_bmap }, /* bmap */ |
c153d43e JSP |
957 | { &vop_strategy_desc, lofs_strategy }, /* strategy */ |
958 | { &vop_print_desc, lofs_print }, /* print */ | |
959 | { &vop_islocked_desc, lofs_islocked }, /* islocked */ | |
0020ca6e | 960 | { &vop_pathconf_desc, lofs_pathconf }, /* pathconf */ |
c153d43e JSP |
961 | { &vop_advlock_desc, lofs_advlock }, /* advlock */ |
962 | { &vop_blkatoff_desc, lofs_blkatoff }, /* blkatoff */ | |
c153d43e JSP |
963 | { &vop_valloc_desc, lofs_valloc }, /* valloc */ |
964 | { &vop_vfree_desc, lofs_vfree }, /* vfree */ | |
965 | { &vop_truncate_desc, lofs_truncate }, /* truncate */ | |
966 | { &vop_update_desc, lofs_update }, /* update */ | |
967 | { &vop_bwrite_desc, lofs_bwrite }, /* bwrite */ | |
968 | { (struct vnodeop_desc*)NULL, (int(*)())NULL } | |
969 | }; | |
970 | struct vnodeopv_desc lofs_vnodeop_opv_desc = | |
971 | { &lofs_vnodeop_p, lofs_vnodeop_entries }; |