Annotation of sys/xfs/xfs_vnodeops-bsd.c, Revision 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