Annotation of sys/xfs/xfs_vnodeops-bsd.c, Revision 1.1.1.1
1.1 nbrk 1: /*
2: * Copyright (c) 1995 - 2002 Kungliga Tekniska Högskolan
3: * (Royal Institute of Technology, Stockholm, Sweden).
4: * All rights reserved.
5: *
6: * Redistribution and use in source and binary forms, with or without
7: * modification, are permitted provided that the following conditions
8: * are met:
9: *
10: * 1. Redistributions of source code must retain the above copyright
11: * notice, this list of conditions and the following disclaimer.
12: *
13: * 2. Redistributions in binary form must reproduce the above copyright
14: * notice, this list of conditions and the following disclaimer in the
15: * documentation and/or other materials provided with the distribution.
16: *
17: * 3. Neither the name of the Institute nor the names of its contributors
18: * may be used to endorse or promote products derived from this software
19: * without specific prior written permission.
20: *
21: * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
22: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24: * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
25: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31: * SUCH DAMAGE.
32: */
33:
34: /*
35: * NNPFS operations.
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: * vnode functions
60: */
61:
62: #ifdef HAVE_VOP_OPEN
63: int
64: xfs_open(struct vop_open_args * ap)
65: /*
66: struct vop_open {
67: struct vnode *vp;
68: int mode;
69: struct ucred *cred;
70: struct proc *p;
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 /* HAVE_VOP_OPEN */
80:
81: #ifdef HAVE_VOP_FSYNC
82: int
83: xfs_fsync(struct vop_fsync_args * ap)
84: /*
85: vop_fsync {
86: struct vnode *vp;
87: struct ucred *cred;
88: int waitfor;
89: struct proc *p;
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 /* HAVE_VOP_FSYNC */
103:
104: #ifdef HAVE_VOP_CLOSE
105: int
106: xfs_close(struct vop_close_args * ap)
107: /* vop_close {
108: IN struct vnode *vp;
109: IN int fflag;
110: IN struct ucred *cred;
111: IN struct proc *p;
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 /* HAVE_VOP_CLOSE */
121:
122: #ifdef HAVE_VOP_READ
123: int
124: xfs_read(struct vop_read_args * ap)
125: /* vop_read {
126: IN struct vnode *vp;
127: INOUT struct uio *uio;
128: IN int ioflag;
129: IN struct ucred *cred;
130: }; */
131: {
132: return xfs_read_common(ap->a_vp, ap->a_uio, ap->a_ioflag, ap->a_cred);
133: }
134: #endif /* HAVE_VOP_READ */
135:
136: #ifdef HAVE_VOP_WRITE
137: int
138: xfs_write(struct vop_write_args * ap)
139: /* vop_write {
140: IN struct vnode *vp;
141: INOUT struct uio *uio;
142: IN int ioflag;
143: IN struct ucred *cred;
144: }; */
145: {
146: return xfs_write_common(ap->a_vp, ap->a_uio, ap->a_ioflag, ap->a_cred);
147: }
148: #endif /* HAVE_VOP_WRITE */
149:
150: #ifdef HAVE_VOP_IOCTL
151: int
152: xfs_ioctl(struct vop_ioctl_args * ap)
153: /* struct vnode *vp,
154: int com,
155: caddr_t data,
156: int flag,
157: struct ucred *cred) */
158: {
159: NNPFSDEB(XDEBVNOPS, ("xfs_ioctl\n"));
160:
161: return EOPNOTSUPP;
162: }
163: #endif /* HAVE_VOP_IOCTL */
164:
165: #ifdef HAVE_VOP_SELECT
166: int
167: xfs_select(struct vop_select_args * ap)
168: /* struct vnode *vp,
169: int which,
170: struct ucred *cred ) */
171: {
172: NNPFSDEB(XDEBVNOPS, ("xfs_select\n"));
173:
174: return EOPNOTSUPP;
175: }
176: #endif /* HAVE_VOP_SELECT */
177:
178: #ifdef HAVE_VOP_SEEK
179: int
180: xfs_seek(struct vop_seek_args * ap)
181: /*
182: struct vop_seek_args {
183: struct vnodeop_desc *a_desc;
184: struct vnode *a_vp;
185: off_t a_oldoff;
186: off_t a_newoff;
187: struct ucred *a_cred;
188: };
189: */
190: {
191: NNPFSDEB(XDEBVNOPS, ("xfs_seek\n"));
192: return 0;
193: }
194: #endif /* HAVE_VOP_SEEK */
195:
196: #ifdef HAVE_VOP_POLL
197: int
198: xfs_poll(struct vop_poll_args * ap)
199: /* vop_poll {
200: IN struct vnode *vp;
201: IN int events;
202: IN struct proc *p;
203: }; */
204: {
205: NNPFSDEB(XDEBVNOPS, ("xfs_poll\n"));
206: return EOPNOTSUPP;
207: }
208: #endif /* HAVE_VOP_POLL */
209:
210: #ifdef HAVE_VOP_GETATTR
211: int
212: xfs_getattr(struct vop_getattr_args * ap)
213: /* struct vnode *vp,
214: struct vattr *vap,
215: struct ucred *cred,
216: struct proc *p) */
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 /* HAVE_VOP_GETATTR */
225:
226: #ifdef HAVE_VOP_SETATTR
227: int
228: xfs_setattr(struct vop_setattr_args * ap)
229: /* struct vnode *vp,
230: struct vattr *vap,
231: struct ucred *cred,
232: struct proc *p)
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 /* HAVE_VOP_SETATTR */
242:
243: #ifdef HAVE_VOP_ACCESS
244: int
245: xfs_access(struct vop_access_args * ap)
246: /*
247: struct vnode *vp,
248: int mode,
249: struct ucred *cred,
250: struct proc *p)
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 /* HAVE_VOP_ACCESS */
260:
261: #ifdef HAVE_VOP_LOOKUP
262: int
263: xfs_lookup(struct vop_lookup_args * ap)
264: /* struct vop_lookup_args {
265: struct vnodeop_desc *a_desc;
266: struct vnode *a_dvp;
267: struct vnode **a_vpp;
268: struct componentname *a_cnp;
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: /* if we looked up ourself, do nothing */
300: } else if (!(cnp->cn_flags & ISLASTCN) || !lockparent) {
301: /* if we isn't last component and is isn't requested,
302: * return parent unlocked */
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: /* in case of a error do nothing */
314: }
315:
316: NNPFSDEB(XDEBVNOPS, ("xfs_lookup: error = %d\n", error));
317:
318: return error;
319: }
320: #endif /* HAVE_VOP_LOOKUP */
321:
322: #ifdef HAVE_VOP_CACHEDLOOKUP
323: int
324: xfs_cachedlookup(struct vop_cachedlookup_args * ap)
325: /* struct vop_cachedlookup_args {
326: struct vnodeop_desc *a_desc;
327: struct vnode *a_dvp;
328: struct vnode **a_vpp;
329: struct componentname *a_cnp;
330: }; */
331: {
332: return xfs_lookup((struct vop_lookup_args *)ap);
333: }
334: #endif /* HAVE_VOP_CACHEDLOOKUP */
335:
336: /*
337: * whatever clean-ups are needed for a componentname.
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 /* HAVE_VOP_CREATE */
395:
396: #ifdef HAVE_VOP_REMOVE
397: int
398: xfs_remove(struct vop_remove_args * ap)
399: /* struct vnode *dvp,
400: struct vnode *vp,
401: struct componentname *cnp */
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 /* HAVE_VOP_REMOVE */
438:
439: #ifdef HAVE_VOP_RENAME
440: int
441: xfs_rename(struct vop_rename_args * ap)
442: /* vop_rename {
443: IN WILLRELE struct vnode *fdvp;
444: IN WILLRELE struct vnode *fvp;
445: IN struct componentname *fcnp;
446: IN WILLRELE struct vnode *tdvp;
447: IN WILLRELE struct vnode *tvp;
448: IN struct componentname *tcnp;
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 /* HAVE_VOP_RENAME */
479:
480: #ifdef HAVE_VOP_MKDIR
481: int
482: xfs_mkdir(struct vop_mkdir_args * ap)
483: /* struct vnode *dvp,
484: char *nm,
485: struct vattr *va,
486: struct vnode **vpp,
487: struct ucred *cred) */
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 /* HAVE_VOP_MKDIR */
516:
517: #ifdef HAVE_VOP_RMDIR
518: int
519: xfs_rmdir(struct vop_rmdir_args * ap)
520: /* struct vnode *dvp,
521: struct vnode *vp,
522: struct componentname *cnp */
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 /* HAVE_VOP_RMDIR */
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: /* struct vnode *vp,
562: struct uio *uiop,
563: struct ucred *cred) */
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 /* HAVE_VOP_READDIR */
614:
615: #ifdef HAVE_VOP_LINK
616: int
617: xfs_link(struct vop_link_args * ap)
618: /*
619: WILLRELE struct vnode *tdvp;
620: struct vnode *vp;
621: struct componentname *cnp;
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: /* FreeBSD 5.0 doesn't need to lock the vnode in VOP_LINK */
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 /* defined(__FreeBSD_version) || __FreeBSD_version < 500043 */
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 /* HAVE_VOP_LINK */
691:
692: #ifdef HAVE_VOP_SYMLINK
693: int
694: xfs_symlink(struct vop_symlink_args * ap)
695: /*
696: IN WILLRELE struct vnode *dvp;
697: OUT WILLRELE struct vnode **vpp;
698: IN struct componentname *cnp;
699: IN struct vattr *vap;
700: IN char *target;
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 /* HAVE_VOP_SYMLINK */
725:
726:
727: #ifdef HAVE_VOP_READLINK
728: int
729: xfs_readlink(struct vop_readlink_args * ap)
730: /* struct vnode *vp,
731: struct uio *uiop,
732: struct ucred *cred) */
733: {
734: return xfs_readlink_common(ap->a_vp, ap->a_uio, ap->a_cred);
735: }
736: #endif /* HAVE_VOP_READLINK */
737:
738: #ifdef HAVE_VOP_INACTIVE
739: int
740: xfs_inactive(struct vop_inactive_args * ap)
741: /*struct vnode *vp,
742: struct ucred *cred)*/
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 /* HAVE_VOP_INACTICE */
751:
752: #ifdef HAVE_VOP_RECLAIM
753: int
754: xfs_reclaim(struct vop_reclaim_args * ap)
755: /*struct vop_reclaim_args {
756: struct vnodeop_desc *a_desc;
757: struct vnode *a_vp;
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 /* HAVE_VOP_RECLAIM */
768:
769: /*
770: * Do lock, unlock, and islocked with lockmgr if we have it.
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 /* HAVE_VOP_LOCK */
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 /* HAVE_VOP_UNLOCK */
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 /* HAVE_VOP_ISLOCKED */
900:
901: #else /* !HAVE_KERNEL_LOCKMGR && !HAVE_KERNEL_DEBUGLOCKMGR */
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 /* HAVE_VOP_LOCK */
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 /* HAVE_VOP_UNLOCK */
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 /* HAVE_VOP_ISLOCKED */
957: #endif /* !HAVE_KERNEL_LOCKMGR */
958:
959: #ifdef HAVE_VOP_ABORTOP
960: int
961: xfs_abortop (struct vop_abortop_args *ap)
962: /* struct vnode *dvp;
963: struct componentname *cnp; */
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 /* HAVE_VOP_ABORTOP */
987:
988: #ifdef HAVE_VOP_MMAP
989: int
990: xfs_mmap(struct vop_mmap_args *ap)
991: /*
992: IN struct vnode *vp;
993: IN int fflags;
994: IN struct ucred *cred;
995: IN struct proc *p;
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 /* HAVE_VOP_MMAP */
1006:
1007: #ifdef HAVE_VOP_BMAP
1008: int
1009: xfs_bmap(struct vop_bmap_args *ap)
1010: /* IN struct vnode *vp;
1011: IN daddr64_t bn;
1012: OUT struct vnode **vpp;
1013: IN daddr64_t *bnp;
1014: OUT int *runp;
1015: OUT int *runb;
1016: */
1017: {
1018: NNPFSDEB(XDEBVNOPS, ("xfs_bmap\n"));
1019: return EOPNOTSUPP;
1020: }
1021: #endif /* HAVE_VOP_BMAP */
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: /* NetBSD ubc */
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: /* Old BSD
1039: IN struct vnode *vp;
1040: IN vm_page_t *m;
1041: IN int count;
1042: IN int reqpage;
1043: IN vm_ooffset_t offset;
1044: */
1045: /* NetBSD UBC
1046: IN struct vnode *vp;
1047: IN voff_t offset;
1048: IN vm_page_t *m;
1049: IN int *count;
1050: IN int centeridx;
1051: IN vm_prot_t access_type;
1052: IN int advice;
1053: IN int flags;
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 /* HAVE_VOP_GETPAGES */
1077:
1078: #ifdef HAVE_VOP_PUTPAGES
1079: int
1080: xfs_putpages (struct vop_putpages_args *ap)
1081: /* Old BSD
1082: IN struct vnode *vp;
1083: IN vm_page_t *m;
1084: IN int count;
1085: IN int sync;
1086: IN int *rtvals;
1087: IN vm_ooffset_t offset;
1088: */
1089: /* NetBSD UBC (>= 1.5Y)
1090: IN struct vnode *vp;
1091: IN voff_t offlo;
1092: IN voff_t offhi;
1093: IN int flags;
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 /* FreeBSD-style */
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 /* NetBSD-style */
1112: #if defined(__NetBSD__) && __NetBSD_Version__ >= 105250000
1113: /* XXX should only walk over those pages that is requested */
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 /* HAVE_STRUCT_VOP_PUTPAGES_ARGS_A_SYNC */
1136: }
1137: #endif /* HAVE_VOP_PUTPAGES */
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 /* HAVE_VOP_CMP */
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 /* HAVE_VOP_REALVP */
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 /* HAVE_VOP_CNTL */
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 /* HAVE_VOP_ADVOCK */
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 /* HAVE_VOP_REVOKE */
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; /* XXX what is it? */
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: /* Zero out rest of last page if there wasn't enough data in the file */
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; /* XXX what is it? */
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: struct vop_createvobject_args {
1304: struct vnode *vp;
1305: struct ucred *cred;
1306: struct proc *p;
1307: };
1308: */
1309: {
1310: NNPFSDEB(XDEBVNOPS, ("xfs_createvobject\n"));
1311:
1312: return vop_stdcreatevobject (ap);
1313: }
1314: #endif /* HAVE_VOP_CREATEVOBJECT */
1315:
1316: #ifdef HAVE_VOP_DESTROYVOBJECT
1317: int
1318: xfs_destroyvobject(struct vop_destroyvobject_args *ap)
1319: /*
1320: struct vop_destroyvobject_args {
1321: struct vnode *vp;
1322: };
1323: */
1324: {
1325: NNPFSDEB(XDEBVNOPS, ("xfs_destroyvobject\n"));
1326:
1327: return vop_stddestroyvobject (ap);
1328: }
1329: #endif /* HAVE_VOP_DESTROYVOBJECT */
1330:
1331: #ifdef HAVE_VOP_GETVOBJECT
1332: int
1333: xfs_getvobject(struct vop_getvobject_args *ap)
1334: /*
1335: struct vop_getvobject_args {
1336: struct vnode *vp;
1337: struct vm_object **objpp;
1338: };
1339: */
1340: {
1341: NNPFSDEB(XDEBVNOPS, ("xfs_getvobject\n"));
1342:
1343: return vop_stdgetvobject (ap);
1344: }
1345: #endif /* HAVE_VOP_GETVOBJECT */
1346:
1347: #ifdef HAVE_VOP_PATHCONF
1348: int
1349: xfs_pathconf(struct vop_pathconf_args *ap)
1350: /*
1351: struct vop_pathconf_args {
1352: struct vnodeop_desc *a_desc;
1353: struct vnode *a_vp;
1354: int a_name;
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
CVSweb