This source file includes following definitions.
- xfs_open
- xfs_fsync
- xfs_close
- xfs_read
- xfs_write
- xfs_ioctl
- xfs_select
- xfs_seek
- xfs_poll
- xfs_getattr
- xfs_setattr
- xfs_access
- xfs_lookup
- xfs_cachedlookup
- cleanup_cnp
- xfs_create
- xfs_remove
- xfs_rename
- xfs_mkdir
- xfs_rmdir
- xfs_readdir
- xfs_link
- xfs_symlink
- xfs_readlink
- xfs_inactive
- xfs_reclaim
- xfs_lock
- xfs_unlock
- xfs_islocked
- xfs_lock
- xfs_unlock
- xfs_islocked
- xfs_abortop
- xfs_mmap
- xfs_bmap
- get_pages_endlength
- xfs_getpages
- xfs_putpages
- xfs_cmp
- xfs_realvp
- xfs_cntl
- xfs_print
- xfs_advlock
- xfs_revoke
- xfs_pagein
- xfs_pageout
- xfs_createvobject
- xfs_destroyvobject
- xfs_getvobject
- xfs_pathconf
- xfs_eopnotsupp
- xfs_returnzero
- xfs_pushdirty
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38 #ifdef __APPLE__
39 #define MACH_KERNEL 1
40 #endif
41
42 #include <xfs/xfs_locl.h>
43 #include <xfs/xfs_message.h>
44 #include <xfs/xfs_common.h>
45 #include <xfs/xfs_fs.h>
46 #include <xfs/xfs_dev.h>
47 #include <xfs/xfs_deb.h>
48 #include <xfs/xfs_syscalls.h>
49 #include <xfs/xfs_vnodeops.h>
50 #ifdef HAVE_VM_VNODE_PAGER_H
51 #include <vm/vnode_pager.h>
52 #endif
53
54 #include <sys/pool.h>
55
56 RCSID("$arla: xfs_vnodeops-bsd.c,v 1.123 2003/02/15 16:40:36 lha Exp $");
57
58
59
60
61
62 #ifdef HAVE_VOP_OPEN
63 int
64 xfs_open(struct vop_open_args * ap)
65
66
67
68
69
70
71
72 {
73 #ifdef HAVE_FREEBSD_THREAD
74 return xfs_open_common (ap->a_vp, ap->a_mode, ap->a_cred, ap->a_td);
75 #else
76 return xfs_open_common (ap->a_vp, ap->a_mode, ap->a_cred, ap->a_p);
77 #endif
78 }
79 #endif
80
81 #ifdef HAVE_VOP_FSYNC
82 int
83 xfs_fsync(struct vop_fsync_args * ap)
84
85
86
87
88
89
90
91 {
92 #ifdef HAVE_STRUCT_VOP_FSYNC_ARGS_A_FLAGS
93 return xfs_fsync_common(ap->a_vp, ap->a_cred, ap->a_flags, ap->a_p);
94 #else
95 #ifdef HAVE_FREEBSD_THREAD
96 return xfs_fsync_common(ap->a_vp, ap->a_cred, ap->a_waitfor, ap->a_td);
97 #else
98 return xfs_fsync_common(ap->a_vp, ap->a_cred, ap->a_waitfor, ap->a_p);
99 #endif
100 #endif
101 }
102 #endif
103
104 #ifdef HAVE_VOP_CLOSE
105 int
106 xfs_close(struct vop_close_args * ap)
107
108
109
110
111
112
113 {
114 #ifdef HAVE_FREEBSD_THREAD
115 return xfs_close_common(ap->a_vp, ap->a_fflag, ap->a_td, ap->a_cred);
116 #else
117 return xfs_close_common(ap->a_vp, ap->a_fflag, ap->a_p, ap->a_cred);
118 #endif
119 }
120 #endif
121
122 #ifdef HAVE_VOP_READ
123 int
124 xfs_read(struct vop_read_args * ap)
125
126
127
128
129
130
131 {
132 return xfs_read_common(ap->a_vp, ap->a_uio, ap->a_ioflag, ap->a_cred);
133 }
134 #endif
135
136 #ifdef HAVE_VOP_WRITE
137 int
138 xfs_write(struct vop_write_args * ap)
139
140
141
142
143
144
145 {
146 return xfs_write_common(ap->a_vp, ap->a_uio, ap->a_ioflag, ap->a_cred);
147 }
148 #endif
149
150 #ifdef HAVE_VOP_IOCTL
151 int
152 xfs_ioctl(struct vop_ioctl_args * ap)
153
154
155
156
157
158 {
159 NNPFSDEB(XDEBVNOPS, ("xfs_ioctl\n"));
160
161 return EOPNOTSUPP;
162 }
163 #endif
164
165 #ifdef HAVE_VOP_SELECT
166 int
167 xfs_select(struct vop_select_args * ap)
168
169
170
171 {
172 NNPFSDEB(XDEBVNOPS, ("xfs_select\n"));
173
174 return EOPNOTSUPP;
175 }
176 #endif
177
178 #ifdef HAVE_VOP_SEEK
179 int
180 xfs_seek(struct vop_seek_args * ap)
181
182
183
184
185
186
187
188
189
190 {
191 NNPFSDEB(XDEBVNOPS, ("xfs_seek\n"));
192 return 0;
193 }
194 #endif
195
196 #ifdef HAVE_VOP_POLL
197 int
198 xfs_poll(struct vop_poll_args * ap)
199
200
201
202
203
204 {
205 NNPFSDEB(XDEBVNOPS, ("xfs_poll\n"));
206 return EOPNOTSUPP;
207 }
208 #endif
209
210 #ifdef HAVE_VOP_GETATTR
211 int
212 xfs_getattr(struct vop_getattr_args * ap)
213
214
215
216
217 {
218 #ifdef HAVE_FREEBSD_THREAD
219 return xfs_getattr_common(ap->a_vp, ap->a_vap, ap->a_cred, ap->a_td);
220 #else
221 return xfs_getattr_common(ap->a_vp, ap->a_vap, ap->a_cred, ap->a_p);
222 #endif
223 }
224 #endif
225
226 #ifdef HAVE_VOP_SETATTR
227 int
228 xfs_setattr(struct vop_setattr_args * ap)
229
230
231
232
233
234 {
235 #ifdef HAVE_FREEBSD_THREAD
236 return xfs_setattr_common(ap->a_vp, ap->a_vap, ap->a_cred, ap->a_td);
237 #else
238 return xfs_setattr_common(ap->a_vp, ap->a_vap, ap->a_cred, ap->a_p);
239 #endif
240 }
241 #endif
242
243 #ifdef HAVE_VOP_ACCESS
244 int
245 xfs_access(struct vop_access_args * ap)
246
247
248
249
250
251
252 {
253 #ifdef HAVE_FREEBSD_THREAD
254 return xfs_access_common(ap->a_vp, ap->a_mode, ap->a_cred, ap->a_td);
255 #else
256 return xfs_access_common(ap->a_vp, ap->a_mode, ap->a_cred, ap->a_p);
257 #endif
258 }
259 #endif
260
261 #ifdef HAVE_VOP_LOOKUP
262 int
263 xfs_lookup(struct vop_lookup_args * ap)
264
265
266
267
268
269
270 {
271 struct componentname *cnp = ap->a_cnp;
272 int error;
273 int lockparent = (cnp->cn_flags & (LOCKPARENT | ISLASTCN))
274 == (LOCKPARENT | ISLASTCN);
275
276 NNPFSDEB(XDEBVNOPS, ("xfs_lookup: (%s, %ld), nameiop = %lu, flags = %lu\n",
277 cnp->cn_nameptr,
278 cnp->cn_namelen,
279 cnp->cn_nameiop,
280 cnp->cn_flags));
281
282 #ifdef PDIRUNLOCK
283 cnp->cn_flags &= ~PDIRUNLOCK;
284 #endif
285
286 error = xfs_lookup_common(ap->a_dvp, cnp, ap->a_vpp);
287
288 if (error == ENOENT
289 && (cnp->cn_nameiop == CREATE || cnp->cn_nameiop == RENAME)
290 && (cnp->cn_flags & ISLASTCN)) {
291 error = EJUSTRETURN;
292 }
293
294 if (cnp->cn_nameiop != LOOKUP && cnp->cn_flags & ISLASTCN)
295 cnp->cn_flags |= SAVENAME;
296
297 if (error == 0 || error == EJUSTRETURN) {
298 if (ap->a_dvp == *(ap->a_vpp)) {
299
300 } else if (!(cnp->cn_flags & ISLASTCN) || !lockparent) {
301
302
303 #ifdef HAVE_FREEBSD_THREAD
304 xfs_vfs_unlock (ap->a_dvp, xfs_cnp_to_thread(cnp));
305 #else
306 xfs_vfs_unlock (ap->a_dvp, xfs_cnp_to_proc(cnp));
307 #endif
308 #ifdef PDIRUNLOCK
309 cnp->cn_flags |= PDIRUNLOCK;
310 #endif
311 }
312 } else {
313
314 }
315
316 NNPFSDEB(XDEBVNOPS, ("xfs_lookup: error = %d\n", error));
317
318 return error;
319 }
320 #endif
321
322 #ifdef HAVE_VOP_CACHEDLOOKUP
323 int
324 xfs_cachedlookup(struct vop_cachedlookup_args * ap)
325
326
327
328
329
330
331 {
332 return xfs_lookup((struct vop_lookup_args *)ap);
333 }
334 #endif
335
336
337
338
339
340 static void
341 cleanup_cnp (struct componentname *cnp, int error)
342 {
343 if (error != 0 || (cnp->cn_flags & SAVESTART) == 0) {
344 #if defined(HAVE_KERNEL_ZFREEI)
345 zfreei(namei_zone, cnp->cn_pnbuf);
346 cnp->cn_flags &= ~HASBUF;
347 #elif defined(HAVE_KERNEL_UMA_ZFREE_ARG)
348 uma_zfree_arg(namei_zone, cnp->cn_pnbuf, NULL);
349 cnp->cn_flags &= ~HASBUF;
350 #elif defined(FREE_ZONE)
351 FREE_ZONE(cnp->cn_pnbuf, cnp->cn_pnlen, M_NAMEI);
352 #elif defined(HAVE_KERNEL_ZFREE)
353 zfree(namei_zone, cnp->cn_pnbuf);
354 cnp->cn_flags &= ~HASBUF;
355 #elif defined(PNBUF_PUT)
356 PNBUF_PUT(cnp->cn_pnbuf);
357 #else
358 pool_put(&namei_pool, cnp->cn_pnbuf);
359 #endif
360 }
361 }
362
363 #ifdef HAVE_VOP_CREATE
364 int
365 xfs_create(struct vop_create_args *ap)
366 {
367 struct vnode *dvp = ap->a_dvp;
368 struct componentname *cnp = ap->a_cnp;
369 const char *name = cnp->cn_nameptr;
370 struct ucred *cred = cnp->cn_cred;
371 #ifdef HAVE_FREEBSD_THREAD
372 d_thread_t *p = xfs_cnp_to_thread(cnp);
373 #else
374 d_thread_t *p = xfs_cnp_to_proc(cnp);
375 #endif
376 int error;
377
378 error = xfs_create_common(dvp, name, ap->a_vap, cred, p);
379
380 if (error == 0) {
381 error = xfs_lookup_common(dvp, cnp, ap->a_vpp);
382 }
383
384 cleanup_cnp (cnp, error);
385
386 #if defined(__NetBSD__) || defined(__OpenBSD__) || defined(__APPLE__)
387 vput (dvp);
388 #endif
389
390 NNPFSDEB(XDEBVNOPS, ("xfs_create: error = %d\n", error));
391
392 return error;
393 }
394 #endif
395
396 #ifdef HAVE_VOP_REMOVE
397 int
398 xfs_remove(struct vop_remove_args * ap)
399
400
401
402 {
403 struct componentname *cnp = ap->a_cnp;
404 struct vnode *dvp = ap->a_dvp;
405 struct vnode *vp = ap->a_vp;
406
407 #ifdef HAVE_FREEBSD_THREAD
408 int error = xfs_remove_common(dvp, vp, cnp->cn_nameptr,
409 cnp->cn_cred, xfs_cnp_to_thread(cnp));
410 #else
411 int error = xfs_remove_common(dvp, vp, cnp->cn_nameptr,
412 cnp->cn_cred, xfs_cnp_to_proc(cnp));
413 #endif
414
415 cleanup_cnp (cnp, error);
416
417 #if !defined(__FreeBSD__) || __FreeBSD_version < 300000
418 if (dvp == vp)
419 vrele(vp);
420 else
421 vput(vp);
422 vput(dvp);
423 #endif
424
425 #ifdef __APPLE__
426 if (error == 0) {
427 if (UBCINFOEXISTS(vp)) {
428 ubc_setsize(vp, 0);
429 ubc_release(vp);
430 ubc_uncache(vp);
431 }
432 }
433 #endif
434
435 return error;
436 }
437 #endif
438
439 #ifdef HAVE_VOP_RENAME
440 int
441 xfs_rename(struct vop_rename_args * ap)
442
443
444
445
446
447
448
449
450 {
451 struct vnode *tdvp = ap->a_tdvp;
452 struct vnode *tvp = ap->a_tvp;
453 struct vnode *fdvp = ap->a_fdvp;
454 struct vnode *fvp = ap->a_fvp;
455
456 int error = xfs_rename_common(fdvp,
457 fvp,
458 ap->a_fcnp->cn_nameptr,
459 tdvp,
460 tvp,
461 ap->a_tcnp->cn_nameptr,
462 ap->a_tcnp->cn_cred,
463 #ifdef HAVE_FREEBSD_THREAD
464 xfs_cnp_to_thread (ap->a_fcnp));
465 #else
466 xfs_cnp_to_proc (ap->a_fcnp));
467 #endif
468 if(tdvp == tvp)
469 vrele(tdvp);
470 else
471 vput(tdvp);
472 if(tvp)
473 vput(tvp);
474 vrele(fdvp);
475 vrele(fvp);
476 return error;
477 }
478 #endif
479
480 #ifdef HAVE_VOP_MKDIR
481 int
482 xfs_mkdir(struct vop_mkdir_args * ap)
483
484
485
486
487
488 {
489 struct vnode *dvp = ap->a_dvp;
490 struct componentname *cnp = ap->a_cnp;
491 const char *name = cnp->cn_nameptr;
492 struct ucred *cred = cnp->cn_cred;
493 #ifdef HAVE_FREEBSD_THREAD
494 d_thread_t *p = xfs_cnp_to_thread(cnp);
495 #else
496 d_thread_t *p = xfs_cnp_to_proc(cnp);
497 #endif
498 int error;
499
500 error = xfs_mkdir_common(dvp, name, ap->a_vap, cred, p);
501
502 if (error == 0)
503 error = xfs_lookup_common(dvp, cnp, ap->a_vpp);
504
505 cleanup_cnp (cnp, error);
506
507 #if defined(__OpenBSD__) || defined(__NetBSD__) || defined(__APPLE__)
508 vput(dvp);
509 #endif
510
511 NNPFSDEB(XDEBVNOPS, ("xfs_mkdir: error = %d\n", error));
512
513 return error;
514 }
515 #endif
516
517 #ifdef HAVE_VOP_RMDIR
518 int
519 xfs_rmdir(struct vop_rmdir_args * ap)
520
521
522
523 {
524 struct componentname *cnp = ap->a_cnp;
525 struct vnode *dvp = ap->a_dvp;
526 struct vnode *vp = ap->a_vp;
527 int error = xfs_rmdir_common(ap->a_dvp, ap->a_vp,
528 cnp->cn_nameptr,
529 cnp->cn_cred,
530 #ifdef HAVE_FREEBSD_THREAD
531 xfs_cnp_to_thread(cnp));
532 #else
533 xfs_cnp_to_proc(cnp));
534 #endif
535
536 cleanup_cnp (cnp, error);
537 #if !defined(__FreeBSD__) || __FreeBSD_version < 300000
538 if (dvp == vp)
539 vrele(vp);
540 else
541 vput(vp);
542 vput(dvp);
543 #endif
544
545 return error;
546 }
547 #endif
548
549 #ifdef HAVE_VOP_READDIR
550
551 #if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__APPLE__)
552 typedef u_long xfs_cookie_t;
553 #elif defined(__NetBSD__)
554 typedef off_t xfs_cookie_t;
555 #else
556 #error dunno want kind of cookies you have
557 #endif
558
559 int
560 xfs_readdir(struct vop_readdir_args * ap)
561
562
563
564 {
565 int error;
566 off_t off;
567
568 off = ap->a_uio->uio_offset;
569
570 error = xfs_readdir_common(ap->a_vp, ap->a_uio, ap->a_cred,
571 #ifdef HAVE_FREEBSD_THREAD
572 xfs_uio_to_thread (ap->a_uio),
573 #else
574 xfs_uio_to_proc (ap->a_uio),
575 #endif
576 ap->a_eofflag);
577
578 if (!error && ap->a_ncookies != NULL) {
579 struct uio *uio = ap->a_uio;
580 const struct dirent *dp, *dp_start, *dp_end;
581 int ncookies;
582 xfs_cookie_t *cookies, *cookiep;
583
584 if (uio->uio_segflg != UIO_SYSSPACE || uio->uio_iovcnt != 1)
585 panic("xfs_readdir: mail arla-drinkers and tell them to bake burned cookies");
586 dp = (const struct dirent *)
587 ((const char *)uio->uio_iov->iov_base - (uio->uio_offset - off));
588
589 dp_end = (const struct dirent *) uio->uio_iov->iov_base;
590 for (dp_start = dp, ncookies = 0;
591 dp < dp_end;
592 dp = (const struct dirent *)((const char *) dp + dp->d_reclen)) {
593 if (dp->d_reclen <= 0)
594 break;
595 ncookies++;
596 }
597
598 MALLOC(cookies, xfs_cookie_t *, ncookies * sizeof(xfs_cookie_t),
599 M_TEMP, M_WAITOK);
600 for (dp = dp_start, cookiep = cookies;
601 dp < dp_end;
602 dp = (const struct dirent *)((const char *) dp + dp->d_reclen)) {
603 if (dp->d_reclen <= 0)
604 break;
605 off += dp->d_reclen;
606 *cookiep++ = off;
607 }
608 *ap->a_cookies = cookies;
609 *ap->a_ncookies = ncookies;
610 }
611 return error;
612 }
613 #endif
614
615 #ifdef HAVE_VOP_LINK
616 int
617 xfs_link(struct vop_link_args * ap)
618
619
620
621
622
623 {
624 struct componentname *cnp = ap->a_cnp;
625 struct vnode *vp = ap->a_vp;
626 struct vnode *dvp;
627 #ifdef HAVE_FREEBSD_THREAD
628 d_thread_t *p = cnp->cn_thread;
629 #else
630 d_thread_t *p = cnp->cn_proc;
631 #endif
632 int error;
633
634 #if defined (__OpenBSD__) || defined(__NetBSD__)
635 dvp = ap->a_dvp;
636 #elif defined(__FreeBSD__) || defined(__APPLE__)
637 dvp = ap->a_tdvp;
638 #else
639 #error what kind of BSD is this?
640 #endif
641
642 if (vp->v_type == VDIR) {
643 #ifdef HAVE_VOP_ABORTOP
644 VOP_ABORTOP(dvp, cnp);
645 #endif
646 error = EPERM;
647 goto out;
648 }
649 if (dvp->v_mount != vp->v_mount) {
650 #ifdef HAVE_VOP_ABORTOP
651 VOP_ABORTOP(dvp, cnp);
652 #endif
653 error = EXDEV;
654 goto out;
655 }
656
657 #if !defined(__FreeBSD_version) || __FreeBSD_version < 500043
658
659 if (dvp != vp && (error = xfs_vfs_writelock(vp, p))) {
660 #ifdef HAVE_VOP_ABORTOP
661 VOP_ABORTOP(dvp, cnp);
662 #endif
663 goto out;
664 }
665 #endif
666
667 error = xfs_link_common(
668 dvp,
669 vp,
670 cnp->cn_nameptr,
671 cnp->cn_cred,
672 #ifdef HAVE_FREEBSD_THREAD
673 xfs_cnp_to_thread (cnp));
674 #else
675 xfs_cnp_to_proc (cnp));
676 #endif
677
678 cleanup_cnp (cnp, error);
679
680 if (dvp != vp)
681 xfs_vfs_unlock(vp, p);
682
683 out:
684 #if defined(__OpenBSD__) || defined(__NetBSD__) || defined(__APPLE__)
685 vput(dvp);
686 #endif
687
688 return error;
689 }
690 #endif
691
692 #ifdef HAVE_VOP_SYMLINK
693 int
694 xfs_symlink(struct vop_symlink_args * ap)
695
696
697
698
699
700
701
702 {
703 struct componentname *cnp = ap->a_cnp;
704 struct vnode *dvp = ap->a_dvp;
705 struct vnode **vpp = ap->a_vpp;
706
707 int error = xfs_symlink_common(dvp,
708 vpp,
709 cnp,
710 ap->a_vap,
711 ap->a_target);
712
713 if (error == 0) {
714 error = xfs_lookup_common(dvp, cnp, vpp);
715 if (error == 0)
716 vput (*vpp);
717 }
718 cleanup_cnp (cnp, error);
719 #if !defined(__FreeBSD__)
720 vput(dvp);
721 #endif
722 return error;
723 }
724 #endif
725
726
727 #ifdef HAVE_VOP_READLINK
728 int
729 xfs_readlink(struct vop_readlink_args * ap)
730
731
732
733 {
734 return xfs_readlink_common(ap->a_vp, ap->a_uio, ap->a_cred);
735 }
736 #endif
737
738 #ifdef HAVE_VOP_INACTIVE
739 int
740 xfs_inactive(struct vop_inactive_args * ap)
741
742
743 {
744 #ifdef HAVE_FREEBSD_THREAD
745 return xfs_inactive_common(ap->a_vp, xfs_curthread());
746 #else
747 return xfs_inactive_common(ap->a_vp, xfs_curproc());
748 #endif
749 }
750 #endif
751
752 #ifdef HAVE_VOP_RECLAIM
753 int
754 xfs_reclaim(struct vop_reclaim_args * ap)
755
756
757
758
759 {
760 struct vnode *vp = ap->a_vp;
761 int ret;
762
763 ret = xfs_reclaim_common(vp);
764 vp->v_data = NULL;
765 return ret;
766 }
767 #endif
768
769
770
771
772
773 #if defined(HAVE_KERNEL_LOCKMGR) || defined(HAVE_KERNEL_DEBUGLOCKMGR)
774
775 #ifdef HAVE_VOP_LOCK
776 int
777 xfs_lock(struct vop_lock_args * ap)
778 {
779 struct vnode *vp = ap->a_vp;
780 struct xfs_node *xn = VNODE_TO_XNODE(vp);
781 xfs_vnode_lock *l = &xn->lock;
782 int flags = ap->a_flags;
783 int ret;
784
785 NNPFSDEB(XDEBVNOPS, ("xfs_lock: %lx, flags 0x%x\n",
786 (unsigned long)vp, flags));
787
788 if (l == NULL)
789 panic("xfs_lock: lock NULL");
790
791 NNPFSDEB(XDEBVNOPS, ("xfs_lock before: lk flags: %d share: %d "
792 "wait: %d excl: %d holder: 0x%llx\n",
793 l->lk_flags, l->lk_sharecount, l->lk_waitcount,
794 l->lk_exclusivecount,
795 (unsigned long long)
796 (xfs_uintptr_t)l->lk_lockholder));
797
798 #ifndef DEBUG_LOCKS
799 #ifdef HAVE_FOUR_ARGUMENT_LOCKMGR
800 #ifdef HAVE_FREEBSD_THREAD
801 ret = lockmgr(l, flags, &vp->v_interlock, ap->a_td);
802 #else
803 ret = lockmgr(l, flags, &vp->v_interlock, ap->a_p);
804 #endif
805 #else
806 ret = lockmgr(l, flags, NULL);
807 #endif
808 #else
809 #ifdef HAVE_FREEBSD_THREAD
810 ret = debuglockmgr(l, flags, &vp->v_interlock, ap->a_td,
811 "xfs_lock", ap->a_vp->filename, ap->a_vp->line);
812 #else
813 ret = debuglockmgr(l, flags, &vp->v_interlock, ap->a_p,
814 "xfs_lock", ap->a_vp->filename, ap->a_vp->line);
815 #endif
816 #endif
817 NNPFSDEB(XDEBVNOPS, ("xfs_lock: lk flags: %d share: %d "
818 "wait: %d excl: %d holder: 0x%llx\n",
819 l->lk_flags, l->lk_sharecount, l->lk_waitcount,
820 l->lk_exclusivecount,
821 (unsigned long long)
822 (xfs_uintptr_t)l->lk_lockholder));
823 return ret;
824 }
825 #endif
826
827 #ifdef HAVE_VOP_UNLOCK
828 int
829 xfs_unlock(struct vop_unlock_args * ap)
830 {
831 struct vnode *vp = ap->a_vp;
832 struct xfs_node *xn = VNODE_TO_XNODE(vp);
833 xfs_vnode_lock *l = &xn->lock;
834 int flags = ap->a_flags;
835 int ret;
836
837 if (l == NULL)
838 panic("xfs_unlock: lock NULL");
839
840 NNPFSDEB(XDEBVNOPS,
841 ("xfs_unlock: %lx, flags 0x%x, l %lx, ap %lx\n",
842 (unsigned long)vp, flags,
843 (unsigned long)l,
844 (unsigned long)ap));
845
846 NNPFSDEB(XDEBVNOPS, ("xfs_unlock: lk flags: %d share: %d "
847 "wait: %d excl: %d holder: 0x%lld\n",
848 l->lk_flags, l->lk_sharecount, l->lk_waitcount,
849 l->lk_exclusivecount,
850 (unsigned long long)
851 (xfs_uintptr_t)l->lk_lockholder));
852 #ifndef DEBUG_LOCKS
853 #ifdef HAVE_FOUR_ARGUMENT_LOCKMGR
854 #ifdef HAVE_FREEBSD_THREAD
855 ret = lockmgr (l, flags | LK_RELEASE, &vp->v_interlock, ap->a_td);
856 #else
857 ret = lockmgr (l, flags | LK_RELEASE, &vp->v_interlock, ap->a_p);
858 #endif
859 #else
860 ret = lockmgr (l, flags | LK_RELEASE, NULL);
861 #endif
862 #else
863 #ifdef HAVE_FREEBSD_THREAD
864 ret = debuglockmgr (l, flags | LK_RELEASE, &vp->v_interlock, ap->a_td,
865 "xfs_lock", ap->a_vp->filename, ap->a_vp->line);
866 #else
867 ret = debuglockmgr (l, flags | LK_RELEASE, &vp->v_interlock, ap->a_p,
868 "xfs_lock", ap->a_vp->filename, ap->a_vp->line);
869 #endif
870 #endif
871 NNPFSDEB(XDEBVNOPS, ("xfs_unlock: return %d\n", ret));
872 return ret;
873 }
874 #endif
875
876 #ifdef HAVE_VOP_ISLOCKED
877 int
878 xfs_islocked (struct vop_islocked_args *ap)
879 {
880 struct vnode *vp = ap->a_vp;
881 struct xfs_node *xn = VNODE_TO_XNODE(vp);
882 xfs_vnode_lock *l = &xn->lock;
883
884 NNPFSDEB(XDEBVNOPS, ("xfs_islocked: %lx\n",
885 (unsigned long)vp));
886
887 #if defined(HAVE_TWO_ARGUMENT_LOCKSTATUS)
888 #ifdef HAVE_FREEBSD_THREAD
889 return lockstatus (l, ap->a_td);
890 #else
891 return lockstatus (l, ap->a_p);
892 #endif
893 #elif defined(HAVE_ONE_ARGUMENT_LOCKSTATUS)
894 return lockstatus (l);
895 #else
896 #error what lockstatus?
897 #endif
898 }
899 #endif
900
901 #else
902
903 #ifdef HAVE_VOP_LOCK
904 int
905 xfs_lock(struct vop_lock_args * ap)
906 {
907 struct vnode *vp = ap->a_vp;
908 struct xfs_node *xn = VNODE_TO_XNODE(vp);
909
910 NNPFSDEB(XDEBVNOPS, ("xfs_lock: %lx, %d\n",
911 (unsigned long)vp, xn->vnlocks));
912
913 while (vp->v_flag & VXLOCK) {
914 vp->v_flag |= VXWANT;
915 (void) tsleep((caddr_t)vp, PINOD, "xfs_vnlock", 0);
916 }
917 if (vp->v_tag == VT_NON)
918 return (ENOENT);
919 ++xn->vnlocks;
920 return 0;
921 }
922 #endif
923
924 #ifdef HAVE_VOP_UNLOCK
925 int
926 xfs_unlock(struct vop_unlock_args * ap)
927 {
928 struct vnode *vp = ap->a_vp;
929 struct xfs_node *xn = VNODE_TO_XNODE(vp);
930 NNPFSDEB(XDEBVNOPS, ("xfs_unlock: %lx, %d\n",
931 (unsigned long)vp, xn->vnlocks));
932
933 --xn->vnlocks;
934 if (xn->vnlocks < 0) {
935 printf ("PANIC: xfs_unlock: unlocking unlocked\n");
936 xn->vnlocks = 0;
937 }
938 NNPFSDEB(XDEBVNOPS, ("xfs_unlock: return\n"));
939
940 return 0;
941 }
942 #endif
943
944 #ifdef HAVE_VOP_ISLOCKED
945 int
946 xfs_islocked (struct vop_islocked_args *ap)
947 {
948 struct vnode *vp = ap->a_vp;
949 struct xfs_node *xn = VNODE_TO_XNODE(vp);
950
951 NNPFSDEB(XDEBVNOPS, ("xfs_islocked: %lx, %d\n",
952 (unsigned long)vp, xn->vnlocks));
953
954 return xn->vnlocks;
955 }
956 #endif
957 #endif
958
959 #ifdef HAVE_VOP_ABORTOP
960 int
961 xfs_abortop (struct vop_abortop_args *ap)
962
963
964 {
965 struct componentname *cnp = ap->a_cnp;
966
967 if ((cnp->cn_flags & (HASBUF | SAVESTART)) == HASBUF)
968 #if defined(HAVE_KERNEL_ZFREEI)
969 zfreei(namei_zone, cnp->cn_pnbuf);
970 ap->a_cnp->cn_flags &= ~HASBUF;
971 #elif defined(HAVE_KERNEL_UMA_ZFREE_ARG)
972 uma_zfree_arg(namei_zone, cnp->cn_pnbuf, NULL);
973 cnp->cn_flags &= ~HASBUF;
974 #elif defined(FREE_ZONE)
975 FREE_ZONE(cnp->cn_pnbuf, cnp->cn_pnlen, M_NAMEI);
976 #elif defined(HAVE_KERNEL_ZFREE)
977 zfree(namei_zone, cnp->cn_pnbuf);
978 ap->a_cnp->cn_flags &= ~HASBUF;
979 #elif defined(PNBUF_PUT)
980 PNBUF_PUT(cnp->cn_pnbuf);
981 #else
982 pool_put(&namei_pool, cnp->cn_pnbuf);
983 #endif
984 return 0;
985 }
986 #endif
987
988 #ifdef HAVE_VOP_MMAP
989 int
990 xfs_mmap(struct vop_mmap_args *ap)
991
992
993
994
995
996
997 {
998 NNPFSDEB(XDEBVNOPS, ("xfs_mmap\n"));
999 #ifdef HAVE_KERNEL_GENFS_MMAP
1000 return genfs_mmap(ap);
1001 #else
1002 return EOPNOTSUPP;
1003 #endif
1004 }
1005 #endif
1006
1007 #ifdef HAVE_VOP_BMAP
1008 int
1009 xfs_bmap(struct vop_bmap_args *ap)
1010
1011
1012
1013
1014
1015
1016
1017 {
1018 NNPFSDEB(XDEBVNOPS, ("xfs_bmap\n"));
1019 return EOPNOTSUPP;
1020 }
1021 #endif
1022
1023 #ifdef HAVE_VOP_GETPAGES
1024
1025 static size_t
1026 get_pages_endlength (struct vop_getpages_args *ap)
1027 {
1028 #ifdef HAVE_STRUCT_VOP_GETPAGES_ARGS_A_OFFSET
1029
1030 return (ap->a_offset << PAGE_SHIFT) + *ap->a_count * PAGE_SIZE;
1031 #else
1032 return (ap->a_reqpage << PAGE_SHIFT) + ap->a_count * PAGE_SIZE;
1033 #endif
1034 }
1035
1036 int
1037 xfs_getpages (struct vop_getpages_args *ap)
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055 {
1056 int error;
1057
1058 NNPFSDEB(XDEBVNOPS, ("xfs_getpages\n"));
1059
1060 #if HAVE_KERNEL_VNODE_PAGER_GENERIC_GETPAGES
1061 error = vnode_pager_generic_getpages (ap->a_vp, ap->a_m,
1062 ap->a_count, ap->a_reqpage);
1063 #else
1064 error = xfs_data_valid (ap->a_vp, VNODE_TO_XNODE(ap->a_vp)->rd_cred,
1065 xfs_curproc(), NNPFS_DATA_R,
1066 get_pages_endlength(ap));
1067 if (error == 0)
1068 error = VOP_GETPAGES(DATA_FROM_VNODE(ap->a_vp),
1069 ap->a_offset, ap->a_m,
1070 ap->a_count, ap->a_centeridx, ap->a_access_type,
1071 ap->a_advice, ap->a_flags);
1072 #endif
1073 NNPFSDEB(XDEBVNOPS, ("xfs_getpages = %d\n", error));
1074 return error;
1075 }
1076 #endif
1077
1078 #ifdef HAVE_VOP_PUTPAGES
1079 int
1080 xfs_putpages (struct vop_putpages_args *ap)
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095 {
1096 struct vnode *vp = ap->a_vp;
1097 struct xfs_node *xn = VNODE_TO_XNODE(vp);
1098 struct vnode *t = DATA_FROM_XNODE(xn);
1099 int error;
1100
1101 NNPFSDEB(XDEBVNOPS, ("xfs_putpages\n"));
1102
1103 if (t == NULL)
1104 return 0;
1105
1106 #ifdef HAVE_STRUCT_VOP_PUTPAGES_ARGS_A_SYNC
1107 xn->flags |= NNPFS_DATA_DIRTY;
1108
1109 return VOP_PUTPAGES(t, ap->a_m, ap->a_count, ap->a_sync, ap->a_rtvals,
1110 ap->a_offset);
1111 #else
1112 #if defined(__NetBSD__) && __NetBSD_Version__ >= 105250000
1113
1114 if (vp->v_type == VREG && ap->a_flags & PGO_CLEANIT) {
1115 struct uvm_object *uobj = &t->v_uobj;
1116 struct vm_page *pg;
1117 int dirty = 0;
1118
1119 pg = TAILQ_FIRST(&uobj->memq);
1120
1121 while (pg && !dirty) {
1122 dirty = pmap_is_modified(pg) || (pg->flags & PG_CLEAN) == 0;
1123 pg = TAILQ_NEXT(pg, listq);
1124 }
1125
1126 if (dirty)
1127 xn->flags |= NNPFS_DATA_DIRTY;
1128 }
1129
1130 return VOP_PUTPAGES(t, ap->a_offlo, ap->a_offhi, ap->a_flags);
1131 #else
1132 xn->flags |= NNPFS_DATA_DIRTY;
1133 return VOP_PUTPAGES(t, ap->a_m, ap->a_count, ap->a_flags, ap->a_rtvals);
1134 #endif
1135 #endif
1136 }
1137 #endif
1138
1139 #ifdef HAVE_VOP_CMP
1140 int
1141 xfs_cmp(struct vnode * vp1, struct vnode * vp2)
1142 {
1143 NNPFSDEB(XDEBVNOPS, ("xfs_cmp\n"));
1144 return EOPNOTSUPP;
1145 }
1146 #endif
1147
1148 #ifdef HAVE_VOP_REALVP
1149 int
1150 xfs_realvp(struct vnode * vp,
1151 struct vnode ** vpp)
1152 {
1153 NNPFSDEB(XDEBVNOPS, ("xfs_realvp\n"));
1154 return EOPNOTSUPP;
1155 }
1156 #endif
1157
1158 #ifdef HAVE_VOP_CNTL
1159 int
1160 xfs_cntl(struct vnode * vp,
1161 int cmd,
1162 caddr_t idata,
1163 caddr_t odata,
1164 int iflag,
1165 int oflag)
1166 {
1167 NNPFSDEB(XDEBVNOPS, ("xfs_cntl\n"));
1168 return EOPNOTSUPP;
1169 }
1170 #endif
1171
1172 #ifdef HAVE_VOP_PRINT
1173 int
1174 xfs_print (struct vop_print_args *v)
1175 {
1176 struct vop_print_args *ap = v;
1177 xfs_printnode_common (ap->a_vp);
1178 return 0;
1179 }
1180 #endif
1181
1182 #ifdef HAVE_VOP_ADVLOCK
1183 int
1184 xfs_advlock(struct vop_advlock_args *v)
1185 {
1186 struct vop_advlock_args *ap = v;
1187 #if defined(HAVE_KERNEL_LF_ADVLOCK) && !defined(__APPLE__)
1188 struct xfs_node *xn = VNODE_TO_XNODE(ap->a_vp);
1189
1190 return (lf_advlock(&xn->lockf, xn->attr.va_size, ap->a_id, ap->a_op,
1191 ap->a_fl, ap->a_flags));
1192 #else
1193 return EOPNOTSUPP;
1194 #endif
1195 }
1196 #endif
1197
1198 #ifdef HAVE_VOP_REVOKE
1199 int
1200 xfs_revoke(struct vop_revoke_args *v)
1201 {
1202 #if defined(HAVE_KERNEL_GENFS_REVOKE)
1203 return genfs_revoke (v);
1204 #elif defined(HAVE_KERNEL_VOP_REVOKE)
1205 return vop_revoke (v);
1206 #else
1207 return EOPNOTSUPP;
1208 #endif
1209 }
1210 #endif
1211
1212 #ifdef HAVE_VOP_PAGEIN
1213 int
1214 xfs_pagein(struct vop_pagein_args *ap)
1215 {
1216 #ifdef __APPLE__
1217 struct uio uio;
1218 struct iovec iov;
1219 int ret;
1220
1221 kernel_upl_map(kernel_map, ap->a_pl, &iov.iov_base);
1222 iov.iov_base+=ap->a_pl_offset;
1223 iov.iov_len=ap->a_size;
1224
1225 uio.uio_iov=&iov;
1226 uio.uio_iovcnt=1;
1227 uio.uio_offset=ap->a_f_offset;
1228 uio.uio_resid=ap->a_size;
1229 uio.uio_segflg=UIO_SYSSPACE;
1230 uio.uio_rw=UIO_READ;
1231 uio.uio_procp=xfs_curproc();
1232
1233 ret = VOP_READ(ap->a_vp, &uio, 0, ap->a_cred);
1234
1235
1236 if (ret == 0 && uio.uio_resid > 0)
1237 bzero(iov.iov_base, uio.uio_resid);
1238
1239 kernel_upl_unmap(kernel_map, ap->a_pl);
1240
1241 if (ret) {
1242 kernel_upl_abort_range(ap->a_pl, ap->a_pl_offset, ap->a_size,
1243 UPL_ABORT_ERROR | UPL_ABORT_FREE_ON_EMPTY);
1244 } else {
1245 kernel_upl_commit_range(ap->a_pl, ap->a_pl_offset, ap->a_size,
1246 UPL_COMMIT_CLEAR_DIRTY | UPL_COMMIT_FREE_ON_EMPTY,
1247 UPL_GET_INTERNAL_PAGE_LIST(ap->a_pl));
1248 }
1249
1250 return ret;
1251 #else
1252 #error pagein on non apple ?
1253 #endif
1254 }
1255
1256 #endif
1257
1258 #ifdef HAVE_VOP_PAGEOUT
1259 int
1260 xfs_pageout(struct vop_pageout_args *ap)
1261 {
1262 #ifdef __APPLE__
1263 struct uio uio;
1264 struct iovec iov;
1265 int ret;
1266
1267 kernel_upl_map(kernel_map, ap->a_pl, &iov.iov_base);
1268 iov.iov_base+=ap->a_pl_offset;
1269 iov.iov_len=ap->a_size;
1270
1271 uio.uio_iov=&iov;
1272 uio.uio_iovcnt=1;
1273 uio.uio_offset=ap->a_f_offset;
1274 uio.uio_resid=ap->a_size;
1275 uio.uio_segflg=UIO_SYSSPACE;
1276 uio.uio_rw=UIO_WRITE;
1277 uio.uio_procp=xfs_curproc();
1278
1279 ret = VOP_WRITE(ap->a_vp, &uio, 0, ap->a_cred);
1280
1281 kernel_upl_unmap(kernel_map, ap->a_pl);
1282
1283 if (ret) {
1284 kernel_upl_abort_range(ap->a_pl, ap->a_pl_offset, ap->a_size,
1285 UPL_ABORT_FREE_ON_EMPTY);
1286 } else {
1287 kernel_upl_commit_range(ap->a_pl, ap->a_pl_offset, ap->a_size,
1288 UPL_COMMIT_CLEAR_DIRTY | UPL_COMMIT_FREE_ON_EMPTY,
1289 UPL_GET_INTERNAL_PAGE_LIST(ap->a_pl));
1290 }
1291
1292 return ret;
1293 #else
1294 #error pageout on non apple ?
1295 #endif
1296 }
1297 #endif
1298
1299 #ifdef HAVE_VOP_CREATEVOBJECT
1300 int
1301 xfs_createvobject(struct vop_createvobject_args *ap)
1302
1303
1304
1305
1306
1307
1308
1309 {
1310 NNPFSDEB(XDEBVNOPS, ("xfs_createvobject\n"));
1311
1312 return vop_stdcreatevobject (ap);
1313 }
1314 #endif
1315
1316 #ifdef HAVE_VOP_DESTROYVOBJECT
1317 int
1318 xfs_destroyvobject(struct vop_destroyvobject_args *ap)
1319
1320
1321
1322
1323
1324 {
1325 NNPFSDEB(XDEBVNOPS, ("xfs_destroyvobject\n"));
1326
1327 return vop_stddestroyvobject (ap);
1328 }
1329 #endif
1330
1331 #ifdef HAVE_VOP_GETVOBJECT
1332 int
1333 xfs_getvobject(struct vop_getvobject_args *ap)
1334
1335
1336
1337
1338
1339
1340 {
1341 NNPFSDEB(XDEBVNOPS, ("xfs_getvobject\n"));
1342
1343 return vop_stdgetvobject (ap);
1344 }
1345 #endif
1346
1347 #ifdef HAVE_VOP_PATHCONF
1348 int
1349 xfs_pathconf(struct vop_pathconf_args *ap)
1350
1351
1352
1353
1354
1355
1356
1357 {
1358 NNPFSDEB(XDEBVNOPS, ("xfs_pathconf\n"));
1359
1360 #ifdef HAVE_KERNEL_VOP_STDPATHCONF
1361 return vop_stdpathconf(ap);
1362 #else
1363 return EOPNOTSUPP;
1364 #endif
1365 }
1366 #endif
1367
1368
1369
1370 vop_t **xfs_vnodeop_p;
1371
1372 int
1373 xfs_eopnotsupp (struct vop_generic_args *ap)
1374 {
1375 NNPFSDEB(XDEBVNOPS, ("xfs_eopnotsupp %s\n", ap->a_desc->vdesc_name));
1376 return EOPNOTSUPP;
1377 }
1378
1379 int
1380 xfs_returnzero (struct vop_generic_args *ap)
1381 {
1382 NNPFSDEB(XDEBVNOPS, ("xfs_returnzero %s\n", ap->a_desc->vdesc_name));
1383 return 0;
1384 }
1385
1386 void
1387 xfs_pushdirty(struct vnode *vp, struct ucred *cred, d_thread_t *p)
1388 {
1389 #if defined(__NetBSD_Version__) && __NetBSD_Version__ >= 105280000
1390 VOP_PUTPAGES(vp, 0, 0, PGO_ALLPAGES|PGO_SYNCIO|PGO_CLEANIT);
1391 #elif defined(__APPLE__)
1392 ubc_pushdirty(vp);
1393 #endif
1394 }
1395
1396
1397
1398 static struct vnodeopv_entry_desc xfs_vnodeop_entries[] = {
1399 {&vop_default_desc, (vop_t *) xfs_eopnotsupp},
1400 #ifdef HAVE_VOP_LOOKUP
1401 #ifdef HAVE_KERNEL_VFS_CACHE_LOOKUP
1402 {&vop_lookup_desc, (vop_t *) vfs_cache_lookup },
1403 #else
1404 {&vop_lookup_desc, (vop_t *) xfs_lookup },
1405 #endif
1406 #endif
1407 #ifdef HAVE_VOP_CACHEDLOOKUP
1408 {&vop_cachedlookup_desc, (vop_t *) xfs_cachedlookup },
1409 #endif
1410 #ifdef HAVE_VOP_OPEN
1411 {&vop_open_desc, (vop_t *) xfs_open },
1412 #endif
1413 #ifdef HAVE_VOP_FSYNC
1414 {&vop_fsync_desc, (vop_t *) xfs_fsync },
1415 #endif
1416 #ifdef HAVE_VOP_CLOSE
1417 {&vop_close_desc, (vop_t *) xfs_close },
1418 #endif
1419 #ifdef HAVE_VOP_READ
1420 {&vop_read_desc, (vop_t *) xfs_read },
1421 #endif
1422 #ifdef HAVE_VOP_WRITE
1423 {&vop_write_desc, (vop_t *) xfs_write },
1424 #endif
1425 #ifdef HAVE_VOP_MMAP
1426 {&vop_mmap_desc, (vop_t *) xfs_mmap },
1427 #endif
1428 #ifdef HAVE_VOP_BMAP
1429 {&vop_bmap_desc, (vop_t *) xfs_bmap },
1430 #endif
1431 #ifdef HAVE_VOP_IOCTL
1432 {&vop_ioctl_desc, (vop_t *) xfs_ioctl },
1433 #endif
1434 #ifdef HAVE_VOP_SELECT
1435 {&vop_select_desc, (vop_t *) xfs_select },
1436 #endif
1437 #ifdef HAVE_VOP_SEEK
1438 {&vop_seek_desc, (vop_t *) xfs_seek },
1439 #endif
1440 #ifdef HAVE_VOP_POLL
1441 {&vop_poll_desc, (vop_t *) xfs_poll },
1442 #endif
1443 #ifdef HAVE_VOP_GETATTR
1444 {&vop_getattr_desc, (vop_t *) xfs_getattr },
1445 #endif
1446 #ifdef HAVE_VOP_SETATTR
1447 {&vop_setattr_desc, (vop_t *) xfs_setattr },
1448 #endif
1449 #ifdef HAVE_VOP_ACCESS
1450 {&vop_access_desc, (vop_t *) xfs_access },
1451 #endif
1452 #ifdef HAVE_VOP_CREATE
1453 {&vop_create_desc, (vop_t *) xfs_create },
1454 #endif
1455 #ifdef HAVE_VOP_REMOVE
1456 {&vop_remove_desc, (vop_t *) xfs_remove },
1457 #endif
1458 #ifdef HAVE_VOP_LINK
1459 {&vop_link_desc, (vop_t *) xfs_link },
1460 #endif
1461 #ifdef HAVE_VOP_RENAME
1462 {&vop_rename_desc, (vop_t *) xfs_rename },
1463 #endif
1464 #ifdef HAVE_VOP_MKDIR
1465 {&vop_mkdir_desc, (vop_t *) xfs_mkdir },
1466 #endif
1467 #ifdef HAVE_VOP_RMDIR
1468 {&vop_rmdir_desc, (vop_t *) xfs_rmdir },
1469 #endif
1470 #ifdef HAVE_VOP_READDIR
1471 {&vop_readdir_desc, (vop_t *) xfs_readdir },
1472 #endif
1473 #ifdef HAVE_VOP_SYMLINK
1474 {&vop_symlink_desc, (vop_t *) xfs_symlink },
1475 #endif
1476 #ifdef HAVE_VOP_READLINK
1477 {&vop_readlink_desc, (vop_t *) xfs_readlink },
1478 #endif
1479 #ifdef HAVE_VOP_INACTIVE
1480 {&vop_inactive_desc, (vop_t *) xfs_inactive },
1481 #endif
1482 #ifdef HAVE_VOP_RECLAIM
1483 {&vop_reclaim_desc, (vop_t *) xfs_reclaim },
1484 #endif
1485 #ifdef HAVE_VOP_LOCK
1486 {&vop_lock_desc, (vop_t *) xfs_lock },
1487 #endif
1488 #ifdef HAVE_VOP_UNLOCK
1489 {&vop_unlock_desc, (vop_t *) xfs_unlock },
1490 #endif
1491 #ifdef HAVE_VOP_ISLOCKED
1492 {&vop_islocked_desc, (vop_t *) xfs_islocked },
1493 #endif
1494 #ifdef HAVE_VOP_ABORTOP
1495 {&vop_abortop_desc, (vop_t *) xfs_abortop },
1496 #endif
1497 #ifdef HAVE_VOP_GETPAGES
1498 {&vop_getpages_desc, (vop_t *) xfs_getpages },
1499 #endif
1500 #ifdef HAVE_VOP_PUTPAGES
1501 {&vop_putpages_desc, (vop_t *) xfs_putpages },
1502 #endif
1503 #ifdef HAVE_VOP_REVOKE
1504 {&vop_revoke_desc, (vop_t *) xfs_revoke },
1505 #endif
1506 #ifdef HAVE_VOP_PRINT
1507 {&vop_print_desc, (vop_t *) xfs_print},
1508 #endif
1509 #ifdef HAVE_VOP_ADVLOCK
1510 {&vop_advlock_desc, (vop_t *) xfs_advlock },
1511 #endif
1512 #ifdef HAVE_VOP_PAGEIN
1513 {&vop_pagein_desc, (vop_t *) xfs_pagein },
1514 #endif
1515 #ifdef HAVE_VOP_PAGEOUT
1516 {&vop_pageout_desc, (vop_t *) xfs_pageout },
1517 #endif
1518 #ifdef HAVE_VOP_CREATEVOBJECT
1519 {&vop_createvobject_desc, (vop_t *) xfs_createvobject },
1520 #endif
1521 #ifdef HAVE_VOP_DESTROYVOBJECT
1522 {&vop_destroyvobject_desc, (vop_t *) xfs_destroyvobject },
1523 #endif
1524 #ifdef HAVE_VOP_GETVOBJECT
1525 {&vop_getvobject_desc, (vop_t *) xfs_getvobject },
1526 #endif
1527 #ifdef HAVE_VOP_PATHCONF
1528 {&vop_pathconf_desc, (vop_t *) xfs_pathconf },
1529 #endif
1530 {(struct vnodeop_desc *) NULL, (int (*) (void *)) NULL}
1531 };
1532
1533 struct vnodeopv_desc xfs_vnodeop_opv_desc =
1534 {&xfs_vnodeop_p, xfs_vnodeop_entries};
1535
1536 #ifdef VNODEOP_SET
1537 VNODEOP_SET(xfs_vnodeop_opv_desc);
1538 #endif