1 /* $NetBSD: vnode_if.c,v 1.107 2017/07/12 09:31:59 hannken Exp $ */ 2 3 /* 4 * Warning: DO NOT EDIT! This file is automatically generated! 5 * (Modifications made here may easily be lost!) 6 * 7 * Created from the file: 8 * NetBSD: vnode_if.src,v 1.77 2017/07/12 09:31:07 hannken Exp 9 * by the script: 10 * NetBSD: vnode_if.sh,v 1.66 2017/06/04 08:03:26 hannken Exp 11 */ 12 13 /* 14 * Copyright (c) 1992, 1993, 1994, 1995 15 * The Regents of the University of California. All rights reserved. 16 * 17 * Redistribution and use in source and binary forms, with or without 18 * modification, are permitted provided that the following conditions 19 * are met: 20 * 1. Redistributions of source code must retain the above copyright 21 * notice, this list of conditions and the following disclaimer. 22 * 2. Redistributions in binary form must reproduce the above copyright 23 * notice, this list of conditions and the following disclaimer in the 24 * documentation and/or other materials provided with the distribution. 25 * 3. Neither the name of the University nor the names of its contributors 26 * may be used to endorse or promote products derived from this software 27 * without specific prior written permission. 28 * 29 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 30 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 31 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 32 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 33 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 34 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 35 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 36 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 37 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 38 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 39 * SUCH DAMAGE. 40 */ 41 42 #include <sys/cdefs.h> 43 __KERNEL_RCSID(0, "$NetBSD: vnode_if.c,v 1.107 2017/07/12 09:31:59 hannken Exp $"); 44 45 #include <sys/param.h> 46 #include <sys/mount.h> 47 #include <sys/buf.h> 48 #include <sys/vnode.h> 49 #include <sys/lock.h> 50 #include <sys/fstrans.h> 51 52 enum fst_op { FST_NO, FST_YES, FST_TRY }; 53 54 static inline int 55 vop_pre(vnode_t *vp, struct mount **mp, bool *mpsafe, enum fst_op op) 56 { 57 int error; 58 59 *mpsafe = (vp->v_vflag & VV_MPSAFE); 60 61 if (!*mpsafe) { 62 KERNEL_LOCK(1, curlwp); 63 } 64 65 if (op == FST_YES || op == FST_TRY) { 66 for (;;) { 67 *mp = vp->v_mount; 68 if (op == FST_TRY) { 69 error = fstrans_start_nowait(*mp); 70 if (error) { 71 if (!*mpsafe) { 72 KERNEL_UNLOCK_ONE(curlwp); 73 } 74 return error; 75 } 76 } else { 77 fstrans_start(*mp); 78 } 79 if (__predict_true(*mp == vp->v_mount)) 80 break; 81 fstrans_done(*mp); 82 } 83 } else { 84 *mp = vp->v_mount; 85 } 86 87 return 0; 88 } 89 90 static inline void 91 vop_post(vnode_t *vp, struct mount *mp, bool mpsafe, enum fst_op op) 92 { 93 94 if (op == FST_YES) { 95 fstrans_done(mp); 96 } 97 98 if (!mpsafe) { 99 KERNEL_UNLOCK_ONE(curlwp); 100 } 101 } 102 103 const struct vnodeop_desc vop_default_desc = { 104 0, 105 "default", 106 0, 107 NULL, 108 VDESC_NO_OFFSET, 109 VDESC_NO_OFFSET, 110 VDESC_NO_OFFSET, 111 }; 112 113 114 const int vop_bwrite_vp_offsets[] = { 115 VOPARG_OFFSETOF(struct vop_bwrite_args,a_vp), 116 VDESC_NO_OFFSET 117 }; 118 const struct vnodeop_desc vop_bwrite_desc = { 119 VOP_BWRITE_DESCOFFSET, 120 "vop_bwrite", 121 0, 122 vop_bwrite_vp_offsets, 123 VDESC_NO_OFFSET, 124 VDESC_NO_OFFSET, 125 VDESC_NO_OFFSET, 126 }; 127 int 128 VOP_BWRITE(struct vnode *vp, 129 struct buf *bp) 130 { 131 int error; 132 bool mpsafe; 133 struct vop_bwrite_args a; 134 struct mount *mp; 135 a.a_desc = VDESC(vop_bwrite); 136 a.a_vp = vp; 137 a.a_bp = bp; 138 error = vop_pre(vp, &mp, &mpsafe, FST_YES); 139 if (error) 140 return error; 141 error = (VCALL(vp, VOFFSET(vop_bwrite), &a)); 142 vop_post(vp, mp, mpsafe, FST_YES); 143 return error; 144 } 145 146 const int vop_lookup_vp_offsets[] = { 147 VOPARG_OFFSETOF(struct vop_lookup_v2_args,a_dvp), 148 VDESC_NO_OFFSET 149 }; 150 const struct vnodeop_desc vop_lookup_desc = { 151 VOP_LOOKUP_DESCOFFSET, 152 "vop_lookup", 153 0, 154 vop_lookup_vp_offsets, 155 VOPARG_OFFSETOF(struct vop_lookup_v2_args, a_vpp), 156 VDESC_NO_OFFSET, 157 VOPARG_OFFSETOF(struct vop_lookup_v2_args, a_cnp), 158 }; 159 int 160 VOP_LOOKUP(struct vnode *dvp, 161 struct vnode **vpp, 162 struct componentname *cnp) 163 { 164 int error; 165 bool mpsafe; 166 struct vop_lookup_v2_args a; 167 struct mount *mp; 168 a.a_desc = VDESC(vop_lookup); 169 a.a_dvp = dvp; 170 a.a_vpp = vpp; 171 a.a_cnp = cnp; 172 error = vop_pre(dvp, &mp, &mpsafe, FST_NO); 173 if (error) 174 return error; 175 error = (VCALL(dvp, VOFFSET(vop_lookup), &a)); 176 vop_post(dvp, mp, mpsafe, FST_NO); 177 #ifdef DIAGNOSTIC 178 if (error == 0) 179 KASSERT((*vpp)->v_size != VSIZENOTSET 180 && (*vpp)->v_writesize != VSIZENOTSET); 181 #endif /* DIAGNOSTIC */ 182 return error; 183 } 184 185 const int vop_create_vp_offsets[] = { 186 VOPARG_OFFSETOF(struct vop_create_v3_args,a_dvp), 187 VDESC_NO_OFFSET 188 }; 189 const struct vnodeop_desc vop_create_desc = { 190 VOP_CREATE_DESCOFFSET, 191 "vop_create", 192 0, 193 vop_create_vp_offsets, 194 VOPARG_OFFSETOF(struct vop_create_v3_args, a_vpp), 195 VDESC_NO_OFFSET, 196 VOPARG_OFFSETOF(struct vop_create_v3_args, a_cnp), 197 }; 198 int 199 VOP_CREATE(struct vnode *dvp, 200 struct vnode **vpp, 201 struct componentname *cnp, 202 struct vattr *vap) 203 { 204 int error; 205 bool mpsafe; 206 struct vop_create_v3_args a; 207 struct mount *mp; 208 a.a_desc = VDESC(vop_create); 209 a.a_dvp = dvp; 210 a.a_vpp = vpp; 211 a.a_cnp = cnp; 212 a.a_vap = vap; 213 error = vop_pre(dvp, &mp, &mpsafe, FST_NO); 214 if (error) 215 return error; 216 error = (VCALL(dvp, VOFFSET(vop_create), &a)); 217 vop_post(dvp, mp, mpsafe, FST_NO); 218 #ifdef DIAGNOSTIC 219 if (error == 0) 220 KASSERT((*vpp)->v_size != VSIZENOTSET 221 && (*vpp)->v_writesize != VSIZENOTSET); 222 #endif /* DIAGNOSTIC */ 223 return error; 224 } 225 226 const int vop_mknod_vp_offsets[] = { 227 VOPARG_OFFSETOF(struct vop_mknod_v3_args,a_dvp), 228 VDESC_NO_OFFSET 229 }; 230 const struct vnodeop_desc vop_mknod_desc = { 231 VOP_MKNOD_DESCOFFSET, 232 "vop_mknod", 233 0, 234 vop_mknod_vp_offsets, 235 VOPARG_OFFSETOF(struct vop_mknod_v3_args, a_vpp), 236 VDESC_NO_OFFSET, 237 VOPARG_OFFSETOF(struct vop_mknod_v3_args, a_cnp), 238 }; 239 int 240 VOP_MKNOD(struct vnode *dvp, 241 struct vnode **vpp, 242 struct componentname *cnp, 243 struct vattr *vap) 244 { 245 int error; 246 bool mpsafe; 247 struct vop_mknod_v3_args a; 248 struct mount *mp; 249 a.a_desc = VDESC(vop_mknod); 250 a.a_dvp = dvp; 251 a.a_vpp = vpp; 252 a.a_cnp = cnp; 253 a.a_vap = vap; 254 error = vop_pre(dvp, &mp, &mpsafe, FST_NO); 255 if (error) 256 return error; 257 error = (VCALL(dvp, VOFFSET(vop_mknod), &a)); 258 vop_post(dvp, mp, mpsafe, FST_NO); 259 #ifdef DIAGNOSTIC 260 if (error == 0) 261 KASSERT((*vpp)->v_size != VSIZENOTSET 262 && (*vpp)->v_writesize != VSIZENOTSET); 263 #endif /* DIAGNOSTIC */ 264 return error; 265 } 266 267 const int vop_open_vp_offsets[] = { 268 VOPARG_OFFSETOF(struct vop_open_args,a_vp), 269 VDESC_NO_OFFSET 270 }; 271 const struct vnodeop_desc vop_open_desc = { 272 VOP_OPEN_DESCOFFSET, 273 "vop_open", 274 0, 275 vop_open_vp_offsets, 276 VDESC_NO_OFFSET, 277 VOPARG_OFFSETOF(struct vop_open_args, a_cred), 278 VDESC_NO_OFFSET, 279 }; 280 int 281 VOP_OPEN(struct vnode *vp, 282 int mode, 283 kauth_cred_t cred) 284 { 285 int error; 286 bool mpsafe; 287 struct vop_open_args a; 288 struct mount *mp; 289 a.a_desc = VDESC(vop_open); 290 a.a_vp = vp; 291 a.a_mode = mode; 292 a.a_cred = cred; 293 error = vop_pre(vp, &mp, &mpsafe, FST_NO); 294 if (error) 295 return error; 296 error = (VCALL(vp, VOFFSET(vop_open), &a)); 297 vop_post(vp, mp, mpsafe, FST_NO); 298 return error; 299 } 300 301 const int vop_close_vp_offsets[] = { 302 VOPARG_OFFSETOF(struct vop_close_args,a_vp), 303 VDESC_NO_OFFSET 304 }; 305 const struct vnodeop_desc vop_close_desc = { 306 VOP_CLOSE_DESCOFFSET, 307 "vop_close", 308 0, 309 vop_close_vp_offsets, 310 VDESC_NO_OFFSET, 311 VOPARG_OFFSETOF(struct vop_close_args, a_cred), 312 VDESC_NO_OFFSET, 313 }; 314 int 315 VOP_CLOSE(struct vnode *vp, 316 int fflag, 317 kauth_cred_t cred) 318 { 319 int error; 320 bool mpsafe; 321 struct vop_close_args a; 322 struct mount *mp; 323 a.a_desc = VDESC(vop_close); 324 a.a_vp = vp; 325 a.a_fflag = fflag; 326 a.a_cred = cred; 327 error = vop_pre(vp, &mp, &mpsafe, FST_NO); 328 if (error) 329 return error; 330 error = (VCALL(vp, VOFFSET(vop_close), &a)); 331 vop_post(vp, mp, mpsafe, FST_NO); 332 return error; 333 } 334 335 const int vop_access_vp_offsets[] = { 336 VOPARG_OFFSETOF(struct vop_access_args,a_vp), 337 VDESC_NO_OFFSET 338 }; 339 const struct vnodeop_desc vop_access_desc = { 340 VOP_ACCESS_DESCOFFSET, 341 "vop_access", 342 0, 343 vop_access_vp_offsets, 344 VDESC_NO_OFFSET, 345 VOPARG_OFFSETOF(struct vop_access_args, a_cred), 346 VDESC_NO_OFFSET, 347 }; 348 int 349 VOP_ACCESS(struct vnode *vp, 350 int mode, 351 kauth_cred_t cred) 352 { 353 int error; 354 bool mpsafe; 355 struct vop_access_args a; 356 struct mount *mp; 357 a.a_desc = VDESC(vop_access); 358 a.a_vp = vp; 359 a.a_mode = mode; 360 a.a_cred = cred; 361 error = vop_pre(vp, &mp, &mpsafe, FST_NO); 362 if (error) 363 return error; 364 error = (VCALL(vp, VOFFSET(vop_access), &a)); 365 vop_post(vp, mp, mpsafe, FST_NO); 366 return error; 367 } 368 369 const int vop_getattr_vp_offsets[] = { 370 VOPARG_OFFSETOF(struct vop_getattr_args,a_vp), 371 VDESC_NO_OFFSET 372 }; 373 const struct vnodeop_desc vop_getattr_desc = { 374 VOP_GETATTR_DESCOFFSET, 375 "vop_getattr", 376 0, 377 vop_getattr_vp_offsets, 378 VDESC_NO_OFFSET, 379 VOPARG_OFFSETOF(struct vop_getattr_args, a_cred), 380 VDESC_NO_OFFSET, 381 }; 382 int 383 VOP_GETATTR(struct vnode *vp, 384 struct vattr *vap, 385 kauth_cred_t cred) 386 { 387 int error; 388 bool mpsafe; 389 struct vop_getattr_args a; 390 struct mount *mp; 391 a.a_desc = VDESC(vop_getattr); 392 a.a_vp = vp; 393 a.a_vap = vap; 394 a.a_cred = cred; 395 error = vop_pre(vp, &mp, &mpsafe, FST_NO); 396 if (error) 397 return error; 398 error = (VCALL(vp, VOFFSET(vop_getattr), &a)); 399 vop_post(vp, mp, mpsafe, FST_NO); 400 return error; 401 } 402 403 const int vop_setattr_vp_offsets[] = { 404 VOPARG_OFFSETOF(struct vop_setattr_args,a_vp), 405 VDESC_NO_OFFSET 406 }; 407 const struct vnodeop_desc vop_setattr_desc = { 408 VOP_SETATTR_DESCOFFSET, 409 "vop_setattr", 410 0, 411 vop_setattr_vp_offsets, 412 VDESC_NO_OFFSET, 413 VOPARG_OFFSETOF(struct vop_setattr_args, a_cred), 414 VDESC_NO_OFFSET, 415 }; 416 int 417 VOP_SETATTR(struct vnode *vp, 418 struct vattr *vap, 419 kauth_cred_t cred) 420 { 421 int error; 422 bool mpsafe; 423 struct vop_setattr_args a; 424 struct mount *mp; 425 a.a_desc = VDESC(vop_setattr); 426 a.a_vp = vp; 427 a.a_vap = vap; 428 a.a_cred = cred; 429 error = vop_pre(vp, &mp, &mpsafe, FST_NO); 430 if (error) 431 return error; 432 error = (VCALL(vp, VOFFSET(vop_setattr), &a)); 433 vop_post(vp, mp, mpsafe, FST_NO); 434 return error; 435 } 436 437 const int vop_read_vp_offsets[] = { 438 VOPARG_OFFSETOF(struct vop_read_args,a_vp), 439 VDESC_NO_OFFSET 440 }; 441 const struct vnodeop_desc vop_read_desc = { 442 VOP_READ_DESCOFFSET, 443 "vop_read", 444 0, 445 vop_read_vp_offsets, 446 VDESC_NO_OFFSET, 447 VOPARG_OFFSETOF(struct vop_read_args, a_cred), 448 VDESC_NO_OFFSET, 449 }; 450 int 451 VOP_READ(struct vnode *vp, 452 struct uio *uio, 453 int ioflag, 454 kauth_cred_t cred) 455 { 456 int error; 457 bool mpsafe; 458 struct vop_read_args a; 459 struct mount *mp; 460 a.a_desc = VDESC(vop_read); 461 a.a_vp = vp; 462 a.a_uio = uio; 463 a.a_ioflag = ioflag; 464 a.a_cred = cred; 465 error = vop_pre(vp, &mp, &mpsafe, FST_NO); 466 if (error) 467 return error; 468 error = (VCALL(vp, VOFFSET(vop_read), &a)); 469 vop_post(vp, mp, mpsafe, FST_NO); 470 return error; 471 } 472 473 const int vop_write_vp_offsets[] = { 474 VOPARG_OFFSETOF(struct vop_write_args,a_vp), 475 VDESC_NO_OFFSET 476 }; 477 const struct vnodeop_desc vop_write_desc = { 478 VOP_WRITE_DESCOFFSET, 479 "vop_write", 480 0, 481 vop_write_vp_offsets, 482 VDESC_NO_OFFSET, 483 VOPARG_OFFSETOF(struct vop_write_args, a_cred), 484 VDESC_NO_OFFSET, 485 }; 486 int 487 VOP_WRITE(struct vnode *vp, 488 struct uio *uio, 489 int ioflag, 490 kauth_cred_t cred) 491 { 492 int error; 493 bool mpsafe; 494 struct vop_write_args a; 495 struct mount *mp; 496 a.a_desc = VDESC(vop_write); 497 a.a_vp = vp; 498 a.a_uio = uio; 499 a.a_ioflag = ioflag; 500 a.a_cred = cred; 501 error = vop_pre(vp, &mp, &mpsafe, FST_NO); 502 if (error) 503 return error; 504 error = (VCALL(vp, VOFFSET(vop_write), &a)); 505 vop_post(vp, mp, mpsafe, FST_NO); 506 return error; 507 } 508 509 const int vop_fallocate_vp_offsets[] = { 510 VOPARG_OFFSETOF(struct vop_fallocate_args,a_vp), 511 VDESC_NO_OFFSET 512 }; 513 const struct vnodeop_desc vop_fallocate_desc = { 514 VOP_FALLOCATE_DESCOFFSET, 515 "vop_fallocate", 516 0, 517 vop_fallocate_vp_offsets, 518 VDESC_NO_OFFSET, 519 VDESC_NO_OFFSET, 520 VDESC_NO_OFFSET, 521 }; 522 int 523 VOP_FALLOCATE(struct vnode *vp, 524 off_t pos, 525 off_t len) 526 { 527 int error; 528 bool mpsafe; 529 struct vop_fallocate_args a; 530 struct mount *mp; 531 a.a_desc = VDESC(vop_fallocate); 532 a.a_vp = vp; 533 a.a_pos = pos; 534 a.a_len = len; 535 error = vop_pre(vp, &mp, &mpsafe, FST_NO); 536 if (error) 537 return error; 538 error = (VCALL(vp, VOFFSET(vop_fallocate), &a)); 539 vop_post(vp, mp, mpsafe, FST_NO); 540 return error; 541 } 542 543 const int vop_fdiscard_vp_offsets[] = { 544 VOPARG_OFFSETOF(struct vop_fdiscard_args,a_vp), 545 VDESC_NO_OFFSET 546 }; 547 const struct vnodeop_desc vop_fdiscard_desc = { 548 VOP_FDISCARD_DESCOFFSET, 549 "vop_fdiscard", 550 0, 551 vop_fdiscard_vp_offsets, 552 VDESC_NO_OFFSET, 553 VDESC_NO_OFFSET, 554 VDESC_NO_OFFSET, 555 }; 556 int 557 VOP_FDISCARD(struct vnode *vp, 558 off_t pos, 559 off_t len) 560 { 561 int error; 562 bool mpsafe; 563 struct vop_fdiscard_args a; 564 struct mount *mp; 565 a.a_desc = VDESC(vop_fdiscard); 566 a.a_vp = vp; 567 a.a_pos = pos; 568 a.a_len = len; 569 error = vop_pre(vp, &mp, &mpsafe, FST_NO); 570 if (error) 571 return error; 572 error = (VCALL(vp, VOFFSET(vop_fdiscard), &a)); 573 vop_post(vp, mp, mpsafe, FST_NO); 574 return error; 575 } 576 577 const int vop_ioctl_vp_offsets[] = { 578 VOPARG_OFFSETOF(struct vop_ioctl_args,a_vp), 579 VDESC_NO_OFFSET 580 }; 581 const struct vnodeop_desc vop_ioctl_desc = { 582 VOP_IOCTL_DESCOFFSET, 583 "vop_ioctl", 584 0, 585 vop_ioctl_vp_offsets, 586 VDESC_NO_OFFSET, 587 VOPARG_OFFSETOF(struct vop_ioctl_args, a_cred), 588 VDESC_NO_OFFSET, 589 }; 590 int 591 VOP_IOCTL(struct vnode *vp, 592 u_long command, 593 void *data, 594 int fflag, 595 kauth_cred_t cred) 596 { 597 int error; 598 bool mpsafe; 599 struct vop_ioctl_args a; 600 struct mount *mp; 601 a.a_desc = VDESC(vop_ioctl); 602 a.a_vp = vp; 603 a.a_command = command; 604 a.a_data = data; 605 a.a_fflag = fflag; 606 a.a_cred = cred; 607 error = vop_pre(vp, &mp, &mpsafe, FST_NO); 608 if (error) 609 return error; 610 error = (VCALL(vp, VOFFSET(vop_ioctl), &a)); 611 vop_post(vp, mp, mpsafe, FST_NO); 612 return error; 613 } 614 615 const int vop_fcntl_vp_offsets[] = { 616 VOPARG_OFFSETOF(struct vop_fcntl_args,a_vp), 617 VDESC_NO_OFFSET 618 }; 619 const struct vnodeop_desc vop_fcntl_desc = { 620 VOP_FCNTL_DESCOFFSET, 621 "vop_fcntl", 622 0, 623 vop_fcntl_vp_offsets, 624 VDESC_NO_OFFSET, 625 VOPARG_OFFSETOF(struct vop_fcntl_args, a_cred), 626 VDESC_NO_OFFSET, 627 }; 628 int 629 VOP_FCNTL(struct vnode *vp, 630 u_int command, 631 void *data, 632 int fflag, 633 kauth_cred_t cred) 634 { 635 int error; 636 bool mpsafe; 637 struct vop_fcntl_args a; 638 struct mount *mp; 639 a.a_desc = VDESC(vop_fcntl); 640 a.a_vp = vp; 641 a.a_command = command; 642 a.a_data = data; 643 a.a_fflag = fflag; 644 a.a_cred = cred; 645 error = vop_pre(vp, &mp, &mpsafe, FST_NO); 646 if (error) 647 return error; 648 error = (VCALL(vp, VOFFSET(vop_fcntl), &a)); 649 vop_post(vp, mp, mpsafe, FST_NO); 650 return error; 651 } 652 653 const int vop_poll_vp_offsets[] = { 654 VOPARG_OFFSETOF(struct vop_poll_args,a_vp), 655 VDESC_NO_OFFSET 656 }; 657 const struct vnodeop_desc vop_poll_desc = { 658 VOP_POLL_DESCOFFSET, 659 "vop_poll", 660 0, 661 vop_poll_vp_offsets, 662 VDESC_NO_OFFSET, 663 VDESC_NO_OFFSET, 664 VDESC_NO_OFFSET, 665 }; 666 int 667 VOP_POLL(struct vnode *vp, 668 int events) 669 { 670 int error; 671 bool mpsafe; 672 struct vop_poll_args a; 673 struct mount *mp; 674 a.a_desc = VDESC(vop_poll); 675 a.a_vp = vp; 676 a.a_events = events; 677 error = vop_pre(vp, &mp, &mpsafe, FST_YES); 678 if (error) 679 return error; 680 error = (VCALL(vp, VOFFSET(vop_poll), &a)); 681 vop_post(vp, mp, mpsafe, FST_YES); 682 return error; 683 } 684 685 const int vop_kqfilter_vp_offsets[] = { 686 VOPARG_OFFSETOF(struct vop_kqfilter_args,a_vp), 687 VDESC_NO_OFFSET 688 }; 689 const struct vnodeop_desc vop_kqfilter_desc = { 690 VOP_KQFILTER_DESCOFFSET, 691 "vop_kqfilter", 692 0, 693 vop_kqfilter_vp_offsets, 694 VDESC_NO_OFFSET, 695 VDESC_NO_OFFSET, 696 VDESC_NO_OFFSET, 697 }; 698 int 699 VOP_KQFILTER(struct vnode *vp, 700 struct knote *kn) 701 { 702 int error; 703 bool mpsafe; 704 struct vop_kqfilter_args a; 705 struct mount *mp; 706 a.a_desc = VDESC(vop_kqfilter); 707 a.a_vp = vp; 708 a.a_kn = kn; 709 error = vop_pre(vp, &mp, &mpsafe, FST_YES); 710 if (error) 711 return error; 712 error = (VCALL(vp, VOFFSET(vop_kqfilter), &a)); 713 vop_post(vp, mp, mpsafe, FST_YES); 714 return error; 715 } 716 717 const int vop_revoke_vp_offsets[] = { 718 VOPARG_OFFSETOF(struct vop_revoke_args,a_vp), 719 VDESC_NO_OFFSET 720 }; 721 const struct vnodeop_desc vop_revoke_desc = { 722 VOP_REVOKE_DESCOFFSET, 723 "vop_revoke", 724 0, 725 vop_revoke_vp_offsets, 726 VDESC_NO_OFFSET, 727 VDESC_NO_OFFSET, 728 VDESC_NO_OFFSET, 729 }; 730 int 731 VOP_REVOKE(struct vnode *vp, 732 int flags) 733 { 734 int error; 735 bool mpsafe; 736 struct vop_revoke_args a; 737 struct mount *mp; 738 a.a_desc = VDESC(vop_revoke); 739 a.a_vp = vp; 740 a.a_flags = flags; 741 error = vop_pre(vp, &mp, &mpsafe, FST_NO); 742 if (error) 743 return error; 744 error = (VCALL(vp, VOFFSET(vop_revoke), &a)); 745 vop_post(vp, mp, mpsafe, FST_NO); 746 return error; 747 } 748 749 const int vop_mmap_vp_offsets[] = { 750 VOPARG_OFFSETOF(struct vop_mmap_args,a_vp), 751 VDESC_NO_OFFSET 752 }; 753 const struct vnodeop_desc vop_mmap_desc = { 754 VOP_MMAP_DESCOFFSET, 755 "vop_mmap", 756 0, 757 vop_mmap_vp_offsets, 758 VDESC_NO_OFFSET, 759 VOPARG_OFFSETOF(struct vop_mmap_args, a_cred), 760 VDESC_NO_OFFSET, 761 }; 762 int 763 VOP_MMAP(struct vnode *vp, 764 vm_prot_t prot, 765 kauth_cred_t cred) 766 { 767 int error; 768 bool mpsafe; 769 struct vop_mmap_args a; 770 struct mount *mp; 771 a.a_desc = VDESC(vop_mmap); 772 a.a_vp = vp; 773 a.a_prot = prot; 774 a.a_cred = cred; 775 error = vop_pre(vp, &mp, &mpsafe, FST_YES); 776 if (error) 777 return error; 778 error = (VCALL(vp, VOFFSET(vop_mmap), &a)); 779 vop_post(vp, mp, mpsafe, FST_YES); 780 return error; 781 } 782 783 const int vop_fsync_vp_offsets[] = { 784 VOPARG_OFFSETOF(struct vop_fsync_args,a_vp), 785 VDESC_NO_OFFSET 786 }; 787 const struct vnodeop_desc vop_fsync_desc = { 788 VOP_FSYNC_DESCOFFSET, 789 "vop_fsync", 790 0, 791 vop_fsync_vp_offsets, 792 VDESC_NO_OFFSET, 793 VOPARG_OFFSETOF(struct vop_fsync_args, a_cred), 794 VDESC_NO_OFFSET, 795 }; 796 int 797 VOP_FSYNC(struct vnode *vp, 798 kauth_cred_t cred, 799 int flags, 800 off_t offlo, 801 off_t offhi) 802 { 803 int error; 804 bool mpsafe; 805 struct vop_fsync_args a; 806 struct mount *mp; 807 a.a_desc = VDESC(vop_fsync); 808 a.a_vp = vp; 809 a.a_cred = cred; 810 a.a_flags = flags; 811 a.a_offlo = offlo; 812 a.a_offhi = offhi; 813 error = vop_pre(vp, &mp, &mpsafe, FST_NO); 814 if (error) 815 return error; 816 error = (VCALL(vp, VOFFSET(vop_fsync), &a)); 817 vop_post(vp, mp, mpsafe, FST_NO); 818 return error; 819 } 820 821 const int vop_seek_vp_offsets[] = { 822 VOPARG_OFFSETOF(struct vop_seek_args,a_vp), 823 VDESC_NO_OFFSET 824 }; 825 const struct vnodeop_desc vop_seek_desc = { 826 VOP_SEEK_DESCOFFSET, 827 "vop_seek", 828 0, 829 vop_seek_vp_offsets, 830 VDESC_NO_OFFSET, 831 VOPARG_OFFSETOF(struct vop_seek_args, a_cred), 832 VDESC_NO_OFFSET, 833 }; 834 int 835 VOP_SEEK(struct vnode *vp, 836 off_t oldoff, 837 off_t newoff, 838 kauth_cred_t cred) 839 { 840 int error; 841 bool mpsafe; 842 struct vop_seek_args a; 843 struct mount *mp; 844 a.a_desc = VDESC(vop_seek); 845 a.a_vp = vp; 846 a.a_oldoff = oldoff; 847 a.a_newoff = newoff; 848 a.a_cred = cred; 849 error = vop_pre(vp, &mp, &mpsafe, FST_YES); 850 if (error) 851 return error; 852 error = (VCALL(vp, VOFFSET(vop_seek), &a)); 853 vop_post(vp, mp, mpsafe, FST_YES); 854 return error; 855 } 856 857 const int vop_remove_vp_offsets[] = { 858 VOPARG_OFFSETOF(struct vop_remove_v2_args,a_dvp), 859 VOPARG_OFFSETOF(struct vop_remove_v2_args,a_vp), 860 VDESC_NO_OFFSET 861 }; 862 const struct vnodeop_desc vop_remove_desc = { 863 VOP_REMOVE_DESCOFFSET, 864 "vop_remove", 865 0 | VDESC_VP1_WILLPUT, 866 vop_remove_vp_offsets, 867 VDESC_NO_OFFSET, 868 VDESC_NO_OFFSET, 869 VOPARG_OFFSETOF(struct vop_remove_v2_args, a_cnp), 870 }; 871 int 872 VOP_REMOVE(struct vnode *dvp, 873 struct vnode *vp, 874 struct componentname *cnp) 875 { 876 int error; 877 bool mpsafe; 878 struct vop_remove_v2_args a; 879 struct mount *mp; 880 a.a_desc = VDESC(vop_remove); 881 a.a_dvp = dvp; 882 a.a_vp = vp; 883 a.a_cnp = cnp; 884 error = vop_pre(dvp, &mp, &mpsafe, FST_NO); 885 if (error) 886 return error; 887 error = (VCALL(dvp, VOFFSET(vop_remove), &a)); 888 vop_post(dvp, mp, mpsafe, FST_NO); 889 return error; 890 } 891 892 const int vop_link_vp_offsets[] = { 893 VOPARG_OFFSETOF(struct vop_link_v2_args,a_dvp), 894 VOPARG_OFFSETOF(struct vop_link_v2_args,a_vp), 895 VDESC_NO_OFFSET 896 }; 897 const struct vnodeop_desc vop_link_desc = { 898 VOP_LINK_DESCOFFSET, 899 "vop_link", 900 0, 901 vop_link_vp_offsets, 902 VDESC_NO_OFFSET, 903 VDESC_NO_OFFSET, 904 VOPARG_OFFSETOF(struct vop_link_v2_args, a_cnp), 905 }; 906 int 907 VOP_LINK(struct vnode *dvp, 908 struct vnode *vp, 909 struct componentname *cnp) 910 { 911 int error; 912 bool mpsafe; 913 struct vop_link_v2_args a; 914 struct mount *mp; 915 a.a_desc = VDESC(vop_link); 916 a.a_dvp = dvp; 917 a.a_vp = vp; 918 a.a_cnp = cnp; 919 error = vop_pre(dvp, &mp, &mpsafe, FST_NO); 920 if (error) 921 return error; 922 error = (VCALL(dvp, VOFFSET(vop_link), &a)); 923 vop_post(dvp, mp, mpsafe, FST_NO); 924 return error; 925 } 926 927 const int vop_rename_vp_offsets[] = { 928 VOPARG_OFFSETOF(struct vop_rename_args,a_fdvp), 929 VOPARG_OFFSETOF(struct vop_rename_args,a_fvp), 930 VOPARG_OFFSETOF(struct vop_rename_args,a_tdvp), 931 VOPARG_OFFSETOF(struct vop_rename_args,a_tvp), 932 VDESC_NO_OFFSET 933 }; 934 const struct vnodeop_desc vop_rename_desc = { 935 VOP_RENAME_DESCOFFSET, 936 "vop_rename", 937 0 | VDESC_VP0_WILLRELE | VDESC_VP1_WILLRELE | VDESC_VP2_WILLPUT | VDESC_VP3_WILLPUT, 938 vop_rename_vp_offsets, 939 VDESC_NO_OFFSET, 940 VDESC_NO_OFFSET, 941 VOPARG_OFFSETOF(struct vop_rename_args, a_fcnp), 942 }; 943 int 944 VOP_RENAME(struct vnode *fdvp, 945 struct vnode *fvp, 946 struct componentname *fcnp, 947 struct vnode *tdvp, 948 struct vnode *tvp, 949 struct componentname *tcnp) 950 { 951 int error; 952 bool mpsafe; 953 struct vop_rename_args a; 954 struct mount *mp; 955 a.a_desc = VDESC(vop_rename); 956 a.a_fdvp = fdvp; 957 a.a_fvp = fvp; 958 a.a_fcnp = fcnp; 959 a.a_tdvp = tdvp; 960 a.a_tvp = tvp; 961 a.a_tcnp = tcnp; 962 error = vop_pre(fdvp, &mp, &mpsafe, FST_YES); 963 if (error) 964 return error; 965 error = (VCALL(fdvp, VOFFSET(vop_rename), &a)); 966 vop_post(fdvp, mp, mpsafe, FST_YES); 967 return error; 968 } 969 970 const int vop_mkdir_vp_offsets[] = { 971 VOPARG_OFFSETOF(struct vop_mkdir_v3_args,a_dvp), 972 VDESC_NO_OFFSET 973 }; 974 const struct vnodeop_desc vop_mkdir_desc = { 975 VOP_MKDIR_DESCOFFSET, 976 "vop_mkdir", 977 0, 978 vop_mkdir_vp_offsets, 979 VOPARG_OFFSETOF(struct vop_mkdir_v3_args, a_vpp), 980 VDESC_NO_OFFSET, 981 VOPARG_OFFSETOF(struct vop_mkdir_v3_args, a_cnp), 982 }; 983 int 984 VOP_MKDIR(struct vnode *dvp, 985 struct vnode **vpp, 986 struct componentname *cnp, 987 struct vattr *vap) 988 { 989 int error; 990 bool mpsafe; 991 struct vop_mkdir_v3_args a; 992 struct mount *mp; 993 a.a_desc = VDESC(vop_mkdir); 994 a.a_dvp = dvp; 995 a.a_vpp = vpp; 996 a.a_cnp = cnp; 997 a.a_vap = vap; 998 error = vop_pre(dvp, &mp, &mpsafe, FST_NO); 999 if (error) 1000 return error; 1001 error = (VCALL(dvp, VOFFSET(vop_mkdir), &a)); 1002 vop_post(dvp, mp, mpsafe, FST_NO); 1003 #ifdef DIAGNOSTIC 1004 if (error == 0) 1005 KASSERT((*vpp)->v_size != VSIZENOTSET 1006 && (*vpp)->v_writesize != VSIZENOTSET); 1007 #endif /* DIAGNOSTIC */ 1008 return error; 1009 } 1010 1011 const int vop_rmdir_vp_offsets[] = { 1012 VOPARG_OFFSETOF(struct vop_rmdir_v2_args,a_dvp), 1013 VOPARG_OFFSETOF(struct vop_rmdir_v2_args,a_vp), 1014 VDESC_NO_OFFSET 1015 }; 1016 const struct vnodeop_desc vop_rmdir_desc = { 1017 VOP_RMDIR_DESCOFFSET, 1018 "vop_rmdir", 1019 0 | VDESC_VP1_WILLPUT, 1020 vop_rmdir_vp_offsets, 1021 VDESC_NO_OFFSET, 1022 VDESC_NO_OFFSET, 1023 VOPARG_OFFSETOF(struct vop_rmdir_v2_args, a_cnp), 1024 }; 1025 int 1026 VOP_RMDIR(struct vnode *dvp, 1027 struct vnode *vp, 1028 struct componentname *cnp) 1029 { 1030 int error; 1031 bool mpsafe; 1032 struct vop_rmdir_v2_args a; 1033 struct mount *mp; 1034 a.a_desc = VDESC(vop_rmdir); 1035 a.a_dvp = dvp; 1036 a.a_vp = vp; 1037 a.a_cnp = cnp; 1038 error = vop_pre(dvp, &mp, &mpsafe, FST_NO); 1039 if (error) 1040 return error; 1041 error = (VCALL(dvp, VOFFSET(vop_rmdir), &a)); 1042 vop_post(dvp, mp, mpsafe, FST_NO); 1043 return error; 1044 } 1045 1046 const int vop_symlink_vp_offsets[] = { 1047 VOPARG_OFFSETOF(struct vop_symlink_v3_args,a_dvp), 1048 VDESC_NO_OFFSET 1049 }; 1050 const struct vnodeop_desc vop_symlink_desc = { 1051 VOP_SYMLINK_DESCOFFSET, 1052 "vop_symlink", 1053 0, 1054 vop_symlink_vp_offsets, 1055 VOPARG_OFFSETOF(struct vop_symlink_v3_args, a_vpp), 1056 VDESC_NO_OFFSET, 1057 VOPARG_OFFSETOF(struct vop_symlink_v3_args, a_cnp), 1058 }; 1059 int 1060 VOP_SYMLINK(struct vnode *dvp, 1061 struct vnode **vpp, 1062 struct componentname *cnp, 1063 struct vattr *vap, 1064 char *target) 1065 { 1066 int error; 1067 bool mpsafe; 1068 struct vop_symlink_v3_args a; 1069 struct mount *mp; 1070 a.a_desc = VDESC(vop_symlink); 1071 a.a_dvp = dvp; 1072 a.a_vpp = vpp; 1073 a.a_cnp = cnp; 1074 a.a_vap = vap; 1075 a.a_target = target; 1076 error = vop_pre(dvp, &mp, &mpsafe, FST_NO); 1077 if (error) 1078 return error; 1079 error = (VCALL(dvp, VOFFSET(vop_symlink), &a)); 1080 vop_post(dvp, mp, mpsafe, FST_NO); 1081 #ifdef DIAGNOSTIC 1082 if (error == 0) 1083 KASSERT((*vpp)->v_size != VSIZENOTSET 1084 && (*vpp)->v_writesize != VSIZENOTSET); 1085 #endif /* DIAGNOSTIC */ 1086 return error; 1087 } 1088 1089 const int vop_readdir_vp_offsets[] = { 1090 VOPARG_OFFSETOF(struct vop_readdir_args,a_vp), 1091 VDESC_NO_OFFSET 1092 }; 1093 const struct vnodeop_desc vop_readdir_desc = { 1094 VOP_READDIR_DESCOFFSET, 1095 "vop_readdir", 1096 0, 1097 vop_readdir_vp_offsets, 1098 VDESC_NO_OFFSET, 1099 VOPARG_OFFSETOF(struct vop_readdir_args, a_cred), 1100 VDESC_NO_OFFSET, 1101 }; 1102 int 1103 VOP_READDIR(struct vnode *vp, 1104 struct uio *uio, 1105 kauth_cred_t cred, 1106 int *eofflag, 1107 off_t **cookies, 1108 int *ncookies) 1109 { 1110 int error; 1111 bool mpsafe; 1112 struct vop_readdir_args a; 1113 struct mount *mp; 1114 a.a_desc = VDESC(vop_readdir); 1115 a.a_vp = vp; 1116 a.a_uio = uio; 1117 a.a_cred = cred; 1118 a.a_eofflag = eofflag; 1119 a.a_cookies = cookies; 1120 a.a_ncookies = ncookies; 1121 error = vop_pre(vp, &mp, &mpsafe, FST_NO); 1122 if (error) 1123 return error; 1124 error = (VCALL(vp, VOFFSET(vop_readdir), &a)); 1125 vop_post(vp, mp, mpsafe, FST_NO); 1126 return error; 1127 } 1128 1129 const int vop_readlink_vp_offsets[] = { 1130 VOPARG_OFFSETOF(struct vop_readlink_args,a_vp), 1131 VDESC_NO_OFFSET 1132 }; 1133 const struct vnodeop_desc vop_readlink_desc = { 1134 VOP_READLINK_DESCOFFSET, 1135 "vop_readlink", 1136 0, 1137 vop_readlink_vp_offsets, 1138 VDESC_NO_OFFSET, 1139 VOPARG_OFFSETOF(struct vop_readlink_args, a_cred), 1140 VDESC_NO_OFFSET, 1141 }; 1142 int 1143 VOP_READLINK(struct vnode *vp, 1144 struct uio *uio, 1145 kauth_cred_t cred) 1146 { 1147 int error; 1148 bool mpsafe; 1149 struct vop_readlink_args a; 1150 struct mount *mp; 1151 a.a_desc = VDESC(vop_readlink); 1152 a.a_vp = vp; 1153 a.a_uio = uio; 1154 a.a_cred = cred; 1155 error = vop_pre(vp, &mp, &mpsafe, FST_NO); 1156 if (error) 1157 return error; 1158 error = (VCALL(vp, VOFFSET(vop_readlink), &a)); 1159 vop_post(vp, mp, mpsafe, FST_NO); 1160 return error; 1161 } 1162 1163 const int vop_abortop_vp_offsets[] = { 1164 VOPARG_OFFSETOF(struct vop_abortop_args,a_dvp), 1165 VDESC_NO_OFFSET 1166 }; 1167 const struct vnodeop_desc vop_abortop_desc = { 1168 VOP_ABORTOP_DESCOFFSET, 1169 "vop_abortop", 1170 0, 1171 vop_abortop_vp_offsets, 1172 VDESC_NO_OFFSET, 1173 VDESC_NO_OFFSET, 1174 VOPARG_OFFSETOF(struct vop_abortop_args, a_cnp), 1175 }; 1176 int 1177 VOP_ABORTOP(struct vnode *dvp, 1178 struct componentname *cnp) 1179 { 1180 int error; 1181 bool mpsafe; 1182 struct vop_abortop_args a; 1183 struct mount *mp; 1184 a.a_desc = VDESC(vop_abortop); 1185 a.a_dvp = dvp; 1186 a.a_cnp = cnp; 1187 error = vop_pre(dvp, &mp, &mpsafe, FST_YES); 1188 if (error) 1189 return error; 1190 error = (VCALL(dvp, VOFFSET(vop_abortop), &a)); 1191 vop_post(dvp, mp, mpsafe, FST_YES); 1192 return error; 1193 } 1194 1195 const int vop_inactive_vp_offsets[] = { 1196 VOPARG_OFFSETOF(struct vop_inactive_v2_args,a_vp), 1197 VDESC_NO_OFFSET 1198 }; 1199 const struct vnodeop_desc vop_inactive_desc = { 1200 VOP_INACTIVE_DESCOFFSET, 1201 "vop_inactive", 1202 0, 1203 vop_inactive_vp_offsets, 1204 VDESC_NO_OFFSET, 1205 VDESC_NO_OFFSET, 1206 VDESC_NO_OFFSET, 1207 }; 1208 int 1209 VOP_INACTIVE(struct vnode *vp, 1210 bool *recycle) 1211 { 1212 int error; 1213 bool mpsafe; 1214 struct vop_inactive_v2_args a; 1215 struct mount *mp; 1216 a.a_desc = VDESC(vop_inactive); 1217 a.a_vp = vp; 1218 a.a_recycle = recycle; 1219 error = vop_pre(vp, &mp, &mpsafe, FST_NO); 1220 if (error) 1221 return error; 1222 error = (VCALL(vp, VOFFSET(vop_inactive), &a)); 1223 vop_post(vp, mp, mpsafe, FST_NO); 1224 return error; 1225 } 1226 1227 const int vop_reclaim_vp_offsets[] = { 1228 VOPARG_OFFSETOF(struct vop_reclaim_v2_args,a_vp), 1229 VDESC_NO_OFFSET 1230 }; 1231 const struct vnodeop_desc vop_reclaim_desc = { 1232 VOP_RECLAIM_DESCOFFSET, 1233 "vop_reclaim", 1234 0, 1235 vop_reclaim_vp_offsets, 1236 VDESC_NO_OFFSET, 1237 VDESC_NO_OFFSET, 1238 VDESC_NO_OFFSET, 1239 }; 1240 int 1241 VOP_RECLAIM(struct vnode *vp) 1242 { 1243 int error; 1244 bool mpsafe; 1245 struct vop_reclaim_v2_args a; 1246 struct mount *mp; 1247 a.a_desc = VDESC(vop_reclaim); 1248 a.a_vp = vp; 1249 error = vop_pre(vp, &mp, &mpsafe, FST_NO); 1250 if (error) 1251 return error; 1252 error = (VCALL(vp, VOFFSET(vop_reclaim), &a)); 1253 vop_post(vp, mp, mpsafe, FST_NO); 1254 return error; 1255 } 1256 1257 const int vop_lock_vp_offsets[] = { 1258 VOPARG_OFFSETOF(struct vop_lock_args,a_vp), 1259 VDESC_NO_OFFSET 1260 }; 1261 const struct vnodeop_desc vop_lock_desc = { 1262 VOP_LOCK_DESCOFFSET, 1263 "vop_lock", 1264 0, 1265 vop_lock_vp_offsets, 1266 VDESC_NO_OFFSET, 1267 VDESC_NO_OFFSET, 1268 VDESC_NO_OFFSET, 1269 }; 1270 int 1271 VOP_LOCK(struct vnode *vp, 1272 int flags) 1273 { 1274 int error; 1275 bool mpsafe; 1276 struct vop_lock_args a; 1277 struct mount *mp; 1278 a.a_desc = VDESC(vop_lock); 1279 a.a_vp = vp; 1280 a.a_flags = flags; 1281 error = vop_pre(vp, &mp, &mpsafe, (flags & LK_NOWAIT ? FST_TRY : FST_YES)); 1282 if (error) 1283 return error; 1284 error = (VCALL(vp, VOFFSET(vop_lock), &a)); 1285 vop_post(vp, mp, mpsafe, (error ? FST_YES : FST_NO)); 1286 return error; 1287 } 1288 1289 const int vop_unlock_vp_offsets[] = { 1290 VOPARG_OFFSETOF(struct vop_unlock_args,a_vp), 1291 VDESC_NO_OFFSET 1292 }; 1293 const struct vnodeop_desc vop_unlock_desc = { 1294 VOP_UNLOCK_DESCOFFSET, 1295 "vop_unlock", 1296 0, 1297 vop_unlock_vp_offsets, 1298 VDESC_NO_OFFSET, 1299 VDESC_NO_OFFSET, 1300 VDESC_NO_OFFSET, 1301 }; 1302 int 1303 VOP_UNLOCK(struct vnode *vp) 1304 { 1305 int error; 1306 bool mpsafe; 1307 struct vop_unlock_args a; 1308 struct mount *mp; 1309 a.a_desc = VDESC(vop_unlock); 1310 a.a_vp = vp; 1311 error = vop_pre(vp, &mp, &mpsafe, FST_NO); 1312 if (error) 1313 return error; 1314 error = (VCALL(vp, VOFFSET(vop_unlock), &a)); 1315 vop_post(vp, mp, mpsafe, FST_YES); 1316 return error; 1317 } 1318 1319 const int vop_bmap_vp_offsets[] = { 1320 VOPARG_OFFSETOF(struct vop_bmap_args,a_vp), 1321 VDESC_NO_OFFSET 1322 }; 1323 const struct vnodeop_desc vop_bmap_desc = { 1324 VOP_BMAP_DESCOFFSET, 1325 "vop_bmap", 1326 0, 1327 vop_bmap_vp_offsets, 1328 VOPARG_OFFSETOF(struct vop_bmap_args, a_vpp), 1329 VDESC_NO_OFFSET, 1330 VDESC_NO_OFFSET, 1331 }; 1332 int 1333 VOP_BMAP(struct vnode *vp, 1334 daddr_t bn, 1335 struct vnode **vpp, 1336 daddr_t *bnp, 1337 int *runp) 1338 { 1339 int error; 1340 bool mpsafe; 1341 struct vop_bmap_args a; 1342 struct mount *mp; 1343 a.a_desc = VDESC(vop_bmap); 1344 a.a_vp = vp; 1345 a.a_bn = bn; 1346 a.a_vpp = vpp; 1347 a.a_bnp = bnp; 1348 a.a_runp = runp; 1349 error = vop_pre(vp, &mp, &mpsafe, FST_YES); 1350 if (error) 1351 return error; 1352 error = (VCALL(vp, VOFFSET(vop_bmap), &a)); 1353 vop_post(vp, mp, mpsafe, FST_YES); 1354 return error; 1355 } 1356 1357 const int vop_strategy_vp_offsets[] = { 1358 VOPARG_OFFSETOF(struct vop_strategy_args,a_vp), 1359 VDESC_NO_OFFSET 1360 }; 1361 const struct vnodeop_desc vop_strategy_desc = { 1362 VOP_STRATEGY_DESCOFFSET, 1363 "vop_strategy", 1364 0, 1365 vop_strategy_vp_offsets, 1366 VDESC_NO_OFFSET, 1367 VDESC_NO_OFFSET, 1368 VDESC_NO_OFFSET, 1369 }; 1370 int 1371 VOP_STRATEGY(struct vnode *vp, 1372 struct buf *bp) 1373 { 1374 int error; 1375 bool mpsafe; 1376 struct vop_strategy_args a; 1377 struct mount *mp; 1378 a.a_desc = VDESC(vop_strategy); 1379 a.a_vp = vp; 1380 a.a_bp = bp; 1381 error = vop_pre(vp, &mp, &mpsafe, FST_YES); 1382 if (error) 1383 return error; 1384 error = (VCALL(vp, VOFFSET(vop_strategy), &a)); 1385 vop_post(vp, mp, mpsafe, FST_YES); 1386 return error; 1387 } 1388 1389 const int vop_print_vp_offsets[] = { 1390 VOPARG_OFFSETOF(struct vop_print_args,a_vp), 1391 VDESC_NO_OFFSET 1392 }; 1393 const struct vnodeop_desc vop_print_desc = { 1394 VOP_PRINT_DESCOFFSET, 1395 "vop_print", 1396 0, 1397 vop_print_vp_offsets, 1398 VDESC_NO_OFFSET, 1399 VDESC_NO_OFFSET, 1400 VDESC_NO_OFFSET, 1401 }; 1402 int 1403 VOP_PRINT(struct vnode *vp) 1404 { 1405 int error; 1406 bool mpsafe; 1407 struct vop_print_args a; 1408 struct mount *mp; 1409 a.a_desc = VDESC(vop_print); 1410 a.a_vp = vp; 1411 error = vop_pre(vp, &mp, &mpsafe, FST_YES); 1412 if (error) 1413 return error; 1414 error = (VCALL(vp, VOFFSET(vop_print), &a)); 1415 vop_post(vp, mp, mpsafe, FST_YES); 1416 return error; 1417 } 1418 1419 const int vop_islocked_vp_offsets[] = { 1420 VOPARG_OFFSETOF(struct vop_islocked_args,a_vp), 1421 VDESC_NO_OFFSET 1422 }; 1423 const struct vnodeop_desc vop_islocked_desc = { 1424 VOP_ISLOCKED_DESCOFFSET, 1425 "vop_islocked", 1426 0, 1427 vop_islocked_vp_offsets, 1428 VDESC_NO_OFFSET, 1429 VDESC_NO_OFFSET, 1430 VDESC_NO_OFFSET, 1431 }; 1432 int 1433 VOP_ISLOCKED(struct vnode *vp) 1434 { 1435 int error; 1436 bool mpsafe; 1437 struct vop_islocked_args a; 1438 struct mount *mp; 1439 a.a_desc = VDESC(vop_islocked); 1440 a.a_vp = vp; 1441 error = vop_pre(vp, &mp, &mpsafe, FST_NO); 1442 if (error) 1443 return error; 1444 error = (VCALL(vp, VOFFSET(vop_islocked), &a)); 1445 vop_post(vp, mp, mpsafe, FST_NO); 1446 return error; 1447 } 1448 1449 const int vop_pathconf_vp_offsets[] = { 1450 VOPARG_OFFSETOF(struct vop_pathconf_args,a_vp), 1451 VDESC_NO_OFFSET 1452 }; 1453 const struct vnodeop_desc vop_pathconf_desc = { 1454 VOP_PATHCONF_DESCOFFSET, 1455 "vop_pathconf", 1456 0, 1457 vop_pathconf_vp_offsets, 1458 VDESC_NO_OFFSET, 1459 VDESC_NO_OFFSET, 1460 VDESC_NO_OFFSET, 1461 }; 1462 int 1463 VOP_PATHCONF(struct vnode *vp, 1464 int name, 1465 register_t *retval) 1466 { 1467 int error; 1468 bool mpsafe; 1469 struct vop_pathconf_args a; 1470 struct mount *mp; 1471 a.a_desc = VDESC(vop_pathconf); 1472 a.a_vp = vp; 1473 a.a_name = name; 1474 a.a_retval = retval; 1475 error = vop_pre(vp, &mp, &mpsafe, FST_NO); 1476 if (error) 1477 return error; 1478 error = (VCALL(vp, VOFFSET(vop_pathconf), &a)); 1479 vop_post(vp, mp, mpsafe, FST_NO); 1480 return error; 1481 } 1482 1483 const int vop_advlock_vp_offsets[] = { 1484 VOPARG_OFFSETOF(struct vop_advlock_args,a_vp), 1485 VDESC_NO_OFFSET 1486 }; 1487 const struct vnodeop_desc vop_advlock_desc = { 1488 VOP_ADVLOCK_DESCOFFSET, 1489 "vop_advlock", 1490 0, 1491 vop_advlock_vp_offsets, 1492 VDESC_NO_OFFSET, 1493 VDESC_NO_OFFSET, 1494 VDESC_NO_OFFSET, 1495 }; 1496 int 1497 VOP_ADVLOCK(struct vnode *vp, 1498 void *id, 1499 int op, 1500 struct flock *fl, 1501 int flags) 1502 { 1503 int error; 1504 bool mpsafe; 1505 struct vop_advlock_args a; 1506 struct mount *mp; 1507 a.a_desc = VDESC(vop_advlock); 1508 a.a_vp = vp; 1509 a.a_id = id; 1510 a.a_op = op; 1511 a.a_fl = fl; 1512 a.a_flags = flags; 1513 error = vop_pre(vp, &mp, &mpsafe, FST_NO); 1514 if (error) 1515 return error; 1516 error = (VCALL(vp, VOFFSET(vop_advlock), &a)); 1517 vop_post(vp, mp, mpsafe, FST_NO); 1518 return error; 1519 } 1520 1521 const int vop_whiteout_vp_offsets[] = { 1522 VOPARG_OFFSETOF(struct vop_whiteout_args,a_dvp), 1523 VDESC_NO_OFFSET 1524 }; 1525 const struct vnodeop_desc vop_whiteout_desc = { 1526 VOP_WHITEOUT_DESCOFFSET, 1527 "vop_whiteout", 1528 0, 1529 vop_whiteout_vp_offsets, 1530 VDESC_NO_OFFSET, 1531 VDESC_NO_OFFSET, 1532 VOPARG_OFFSETOF(struct vop_whiteout_args, a_cnp), 1533 }; 1534 int 1535 VOP_WHITEOUT(struct vnode *dvp, 1536 struct componentname *cnp, 1537 int flags) 1538 { 1539 int error; 1540 bool mpsafe; 1541 struct vop_whiteout_args a; 1542 struct mount *mp; 1543 a.a_desc = VDESC(vop_whiteout); 1544 a.a_dvp = dvp; 1545 a.a_cnp = cnp; 1546 a.a_flags = flags; 1547 error = vop_pre(dvp, &mp, &mpsafe, FST_NO); 1548 if (error) 1549 return error; 1550 error = (VCALL(dvp, VOFFSET(vop_whiteout), &a)); 1551 vop_post(dvp, mp, mpsafe, FST_NO); 1552 return error; 1553 } 1554 1555 const int vop_getpages_vp_offsets[] = { 1556 VOPARG_OFFSETOF(struct vop_getpages_args,a_vp), 1557 VDESC_NO_OFFSET 1558 }; 1559 const struct vnodeop_desc vop_getpages_desc = { 1560 VOP_GETPAGES_DESCOFFSET, 1561 "vop_getpages", 1562 0, 1563 vop_getpages_vp_offsets, 1564 VDESC_NO_OFFSET, 1565 VDESC_NO_OFFSET, 1566 VDESC_NO_OFFSET, 1567 }; 1568 int 1569 VOP_GETPAGES(struct vnode *vp, 1570 voff_t offset, 1571 struct vm_page **m, 1572 int *count, 1573 int centeridx, 1574 vm_prot_t access_type, 1575 int advice, 1576 int flags) 1577 { 1578 int error; 1579 bool mpsafe; 1580 struct vop_getpages_args a; 1581 struct mount *mp; 1582 a.a_desc = VDESC(vop_getpages); 1583 a.a_vp = vp; 1584 a.a_offset = offset; 1585 a.a_m = m; 1586 a.a_count = count; 1587 a.a_centeridx = centeridx; 1588 a.a_access_type = access_type; 1589 a.a_advice = advice; 1590 a.a_flags = flags; 1591 error = vop_pre(vp, &mp, &mpsafe, FST_NO); 1592 if (error) 1593 return error; 1594 error = (VCALL(vp, VOFFSET(vop_getpages), &a)); 1595 vop_post(vp, mp, mpsafe, FST_NO); 1596 return error; 1597 } 1598 1599 const int vop_putpages_vp_offsets[] = { 1600 VOPARG_OFFSETOF(struct vop_putpages_args,a_vp), 1601 VDESC_NO_OFFSET 1602 }; 1603 const struct vnodeop_desc vop_putpages_desc = { 1604 VOP_PUTPAGES_DESCOFFSET, 1605 "vop_putpages", 1606 0, 1607 vop_putpages_vp_offsets, 1608 VDESC_NO_OFFSET, 1609 VDESC_NO_OFFSET, 1610 VDESC_NO_OFFSET, 1611 }; 1612 int 1613 VOP_PUTPAGES(struct vnode *vp, 1614 voff_t offlo, 1615 voff_t offhi, 1616 int flags) 1617 { 1618 int error; 1619 bool mpsafe; 1620 struct vop_putpages_args a; 1621 struct mount *mp; 1622 a.a_desc = VDESC(vop_putpages); 1623 a.a_vp = vp; 1624 a.a_offlo = offlo; 1625 a.a_offhi = offhi; 1626 a.a_flags = flags; 1627 error = vop_pre(vp, &mp, &mpsafe, FST_NO); 1628 if (error) 1629 return error; 1630 error = (VCALL(vp, VOFFSET(vop_putpages), &a)); 1631 vop_post(vp, mp, mpsafe, FST_NO); 1632 return error; 1633 } 1634 1635 const int vop_closeextattr_vp_offsets[] = { 1636 VOPARG_OFFSETOF(struct vop_closeextattr_args,a_vp), 1637 VDESC_NO_OFFSET 1638 }; 1639 const struct vnodeop_desc vop_closeextattr_desc = { 1640 VOP_CLOSEEXTATTR_DESCOFFSET, 1641 "vop_closeextattr", 1642 0, 1643 vop_closeextattr_vp_offsets, 1644 VDESC_NO_OFFSET, 1645 VOPARG_OFFSETOF(struct vop_closeextattr_args, a_cred), 1646 VDESC_NO_OFFSET, 1647 }; 1648 int 1649 VOP_CLOSEEXTATTR(struct vnode *vp, 1650 int commit, 1651 kauth_cred_t cred) 1652 { 1653 int error; 1654 bool mpsafe; 1655 struct vop_closeextattr_args a; 1656 struct mount *mp; 1657 a.a_desc = VDESC(vop_closeextattr); 1658 a.a_vp = vp; 1659 a.a_commit = commit; 1660 a.a_cred = cred; 1661 error = vop_pre(vp, &mp, &mpsafe, FST_NO); 1662 if (error) 1663 return error; 1664 error = (VCALL(vp, VOFFSET(vop_closeextattr), &a)); 1665 vop_post(vp, mp, mpsafe, FST_NO); 1666 return error; 1667 } 1668 1669 const int vop_getextattr_vp_offsets[] = { 1670 VOPARG_OFFSETOF(struct vop_getextattr_args,a_vp), 1671 VDESC_NO_OFFSET 1672 }; 1673 const struct vnodeop_desc vop_getextattr_desc = { 1674 VOP_GETEXTATTR_DESCOFFSET, 1675 "vop_getextattr", 1676 0, 1677 vop_getextattr_vp_offsets, 1678 VDESC_NO_OFFSET, 1679 VOPARG_OFFSETOF(struct vop_getextattr_args, a_cred), 1680 VDESC_NO_OFFSET, 1681 }; 1682 int 1683 VOP_GETEXTATTR(struct vnode *vp, 1684 int attrnamespace, 1685 const char *name, 1686 struct uio *uio, 1687 size_t *size, 1688 kauth_cred_t cred) 1689 { 1690 int error; 1691 bool mpsafe; 1692 struct vop_getextattr_args a; 1693 struct mount *mp; 1694 a.a_desc = VDESC(vop_getextattr); 1695 a.a_vp = vp; 1696 a.a_attrnamespace = attrnamespace; 1697 a.a_name = name; 1698 a.a_uio = uio; 1699 a.a_size = size; 1700 a.a_cred = cred; 1701 error = vop_pre(vp, &mp, &mpsafe, FST_NO); 1702 if (error) 1703 return error; 1704 error = (VCALL(vp, VOFFSET(vop_getextattr), &a)); 1705 vop_post(vp, mp, mpsafe, FST_NO); 1706 return error; 1707 } 1708 1709 const int vop_listextattr_vp_offsets[] = { 1710 VOPARG_OFFSETOF(struct vop_listextattr_args,a_vp), 1711 VDESC_NO_OFFSET 1712 }; 1713 const struct vnodeop_desc vop_listextattr_desc = { 1714 VOP_LISTEXTATTR_DESCOFFSET, 1715 "vop_listextattr", 1716 0, 1717 vop_listextattr_vp_offsets, 1718 VDESC_NO_OFFSET, 1719 VOPARG_OFFSETOF(struct vop_listextattr_args, a_cred), 1720 VDESC_NO_OFFSET, 1721 }; 1722 int 1723 VOP_LISTEXTATTR(struct vnode *vp, 1724 int attrnamespace, 1725 struct uio *uio, 1726 size_t *size, 1727 int flag, 1728 kauth_cred_t cred) 1729 { 1730 int error; 1731 bool mpsafe; 1732 struct vop_listextattr_args a; 1733 struct mount *mp; 1734 a.a_desc = VDESC(vop_listextattr); 1735 a.a_vp = vp; 1736 a.a_attrnamespace = attrnamespace; 1737 a.a_uio = uio; 1738 a.a_size = size; 1739 a.a_flag = flag; 1740 a.a_cred = cred; 1741 error = vop_pre(vp, &mp, &mpsafe, FST_NO); 1742 if (error) 1743 return error; 1744 error = (VCALL(vp, VOFFSET(vop_listextattr), &a)); 1745 vop_post(vp, mp, mpsafe, FST_NO); 1746 return error; 1747 } 1748 1749 const int vop_openextattr_vp_offsets[] = { 1750 VOPARG_OFFSETOF(struct vop_openextattr_args,a_vp), 1751 VDESC_NO_OFFSET 1752 }; 1753 const struct vnodeop_desc vop_openextattr_desc = { 1754 VOP_OPENEXTATTR_DESCOFFSET, 1755 "vop_openextattr", 1756 0, 1757 vop_openextattr_vp_offsets, 1758 VDESC_NO_OFFSET, 1759 VOPARG_OFFSETOF(struct vop_openextattr_args, a_cred), 1760 VDESC_NO_OFFSET, 1761 }; 1762 int 1763 VOP_OPENEXTATTR(struct vnode *vp, 1764 kauth_cred_t cred) 1765 { 1766 int error; 1767 bool mpsafe; 1768 struct vop_openextattr_args a; 1769 struct mount *mp; 1770 a.a_desc = VDESC(vop_openextattr); 1771 a.a_vp = vp; 1772 a.a_cred = cred; 1773 error = vop_pre(vp, &mp, &mpsafe, FST_NO); 1774 if (error) 1775 return error; 1776 error = (VCALL(vp, VOFFSET(vop_openextattr), &a)); 1777 vop_post(vp, mp, mpsafe, FST_NO); 1778 return error; 1779 } 1780 1781 const int vop_deleteextattr_vp_offsets[] = { 1782 VOPARG_OFFSETOF(struct vop_deleteextattr_args,a_vp), 1783 VDESC_NO_OFFSET 1784 }; 1785 const struct vnodeop_desc vop_deleteextattr_desc = { 1786 VOP_DELETEEXTATTR_DESCOFFSET, 1787 "vop_deleteextattr", 1788 0, 1789 vop_deleteextattr_vp_offsets, 1790 VDESC_NO_OFFSET, 1791 VOPARG_OFFSETOF(struct vop_deleteextattr_args, a_cred), 1792 VDESC_NO_OFFSET, 1793 }; 1794 int 1795 VOP_DELETEEXTATTR(struct vnode *vp, 1796 int attrnamespace, 1797 const char *name, 1798 kauth_cred_t cred) 1799 { 1800 int error; 1801 bool mpsafe; 1802 struct vop_deleteextattr_args a; 1803 struct mount *mp; 1804 a.a_desc = VDESC(vop_deleteextattr); 1805 a.a_vp = vp; 1806 a.a_attrnamespace = attrnamespace; 1807 a.a_name = name; 1808 a.a_cred = cred; 1809 error = vop_pre(vp, &mp, &mpsafe, FST_NO); 1810 if (error) 1811 return error; 1812 error = (VCALL(vp, VOFFSET(vop_deleteextattr), &a)); 1813 vop_post(vp, mp, mpsafe, FST_NO); 1814 return error; 1815 } 1816 1817 const int vop_setextattr_vp_offsets[] = { 1818 VOPARG_OFFSETOF(struct vop_setextattr_args,a_vp), 1819 VDESC_NO_OFFSET 1820 }; 1821 const struct vnodeop_desc vop_setextattr_desc = { 1822 VOP_SETEXTATTR_DESCOFFSET, 1823 "vop_setextattr", 1824 0, 1825 vop_setextattr_vp_offsets, 1826 VDESC_NO_OFFSET, 1827 VOPARG_OFFSETOF(struct vop_setextattr_args, a_cred), 1828 VDESC_NO_OFFSET, 1829 }; 1830 int 1831 VOP_SETEXTATTR(struct vnode *vp, 1832 int attrnamespace, 1833 const char *name, 1834 struct uio *uio, 1835 kauth_cred_t cred) 1836 { 1837 int error; 1838 bool mpsafe; 1839 struct vop_setextattr_args a; 1840 struct mount *mp; 1841 a.a_desc = VDESC(vop_setextattr); 1842 a.a_vp = vp; 1843 a.a_attrnamespace = attrnamespace; 1844 a.a_name = name; 1845 a.a_uio = uio; 1846 a.a_cred = cred; 1847 error = vop_pre(vp, &mp, &mpsafe, FST_NO); 1848 if (error) 1849 return error; 1850 error = (VCALL(vp, VOFFSET(vop_setextattr), &a)); 1851 vop_post(vp, mp, mpsafe, FST_NO); 1852 return error; 1853 } 1854 1855 const struct vnodeop_desc * const vfs_op_descs[] = { 1856 &vop_default_desc, /* MUST BE FIRST */ 1857 1858 &vop_bwrite_desc, 1859 &vop_lookup_desc, 1860 &vop_create_desc, 1861 &vop_mknod_desc, 1862 &vop_open_desc, 1863 &vop_close_desc, 1864 &vop_access_desc, 1865 &vop_getattr_desc, 1866 &vop_setattr_desc, 1867 &vop_read_desc, 1868 &vop_write_desc, 1869 &vop_fallocate_desc, 1870 &vop_fdiscard_desc, 1871 &vop_ioctl_desc, 1872 &vop_fcntl_desc, 1873 &vop_poll_desc, 1874 &vop_kqfilter_desc, 1875 &vop_revoke_desc, 1876 &vop_mmap_desc, 1877 &vop_fsync_desc, 1878 &vop_seek_desc, 1879 &vop_remove_desc, 1880 &vop_link_desc, 1881 &vop_rename_desc, 1882 &vop_mkdir_desc, 1883 &vop_rmdir_desc, 1884 &vop_symlink_desc, 1885 &vop_readdir_desc, 1886 &vop_readlink_desc, 1887 &vop_abortop_desc, 1888 &vop_inactive_desc, 1889 &vop_reclaim_desc, 1890 &vop_lock_desc, 1891 &vop_unlock_desc, 1892 &vop_bmap_desc, 1893 &vop_strategy_desc, 1894 &vop_print_desc, 1895 &vop_islocked_desc, 1896 &vop_pathconf_desc, 1897 &vop_advlock_desc, 1898 &vop_whiteout_desc, 1899 &vop_getpages_desc, 1900 &vop_putpages_desc, 1901 &vop_closeextattr_desc, 1902 &vop_getextattr_desc, 1903 &vop_listextattr_desc, 1904 &vop_openextattr_desc, 1905 &vop_deleteextattr_desc, 1906 &vop_setextattr_desc, 1907 NULL 1908 }; 1909