1 /* $NetBSD: vnode_if.c,v 1.118 2022/07/18 04:32:35 thorpej 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.84 2022/05/03 08:33:59 hannken Exp 9 * by the script: 10 * NetBSD: vnode_if.sh,v 1.76 2022/07/18 04:30:30 thorpej 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.118 2022/07/18 04:32:35 thorpej Exp $"); 44 45 #ifdef _KERNEL_OPT 46 #include "opt_vnode_lockdebug.h" 47 #endif /* _KERNEL_OPT */ 48 49 #include <sys/param.h> 50 #include <sys/mount.h> 51 #include <sys/buf.h> 52 #include <sys/fcntl.h> 53 #include <sys/vnode.h> 54 #include <sys/lock.h> 55 #include <sys/fstrans.h> 56 57 enum fst_op { FST_NO, FST_YES, FST_LAZY, FST_TRY }; 58 59 static inline int 60 vop_pre(vnode_t *vp, struct mount **mp, bool *mpsafe, enum fst_op op) 61 { 62 int error; 63 64 *mpsafe = (vp->v_vflag & VV_MPSAFE); 65 66 if (!*mpsafe) { 67 KERNEL_LOCK(1, curlwp); 68 } 69 70 if (op == FST_YES || op == FST_LAZY || op == FST_TRY) { 71 for (;;) { 72 *mp = vp->v_mount; 73 if (op == FST_TRY) { 74 error = fstrans_start_nowait(*mp); 75 if (error) { 76 if (!*mpsafe) { 77 KERNEL_UNLOCK_ONE(curlwp); 78 } 79 return error; 80 } 81 } else if (op == FST_LAZY) { 82 fstrans_start_lazy(*mp); 83 } else { 84 fstrans_start(*mp); 85 } 86 if (__predict_true(*mp == vp->v_mount)) 87 break; 88 fstrans_done(*mp); 89 } 90 } else { 91 *mp = vp->v_mount; 92 } 93 94 return 0; 95 } 96 97 static inline u_quad_t 98 vop_pre_get_size(struct vnode *vp) 99 { 100 mutex_enter(vp->v_interlock); 101 KASSERT(vp->v_size != VSIZENOTSET); 102 u_quad_t rv = (u_quad_t)vp->v_size; 103 mutex_exit(vp->v_interlock); 104 105 return rv; 106 } 107 108 /* 109 * VOP_RMDIR(), VOP_REMOVE(), and VOP_RENAME() need special handling 110 * because they each drop the caller's references on one or more of 111 * their arguments. While there must be an open file descriptor in 112 * associated with a vnode in order for knotes to be attached to it, 113 * that status could change during the course of the operation. So, 114 * for the vnode arguments that are WILLRELE or WILLPUT, we check 115 * pre-op if there are registered knotes, take a hold count if so, 116 * and post-op release the hold after activating any knotes still 117 * associated with the vnode. 118 */ 119 120 #define VOP_POST_KNOTE(thisvp, e, n) \ 121 do { \ 122 if (__predict_true((e) == 0)) { \ 123 /* \ 124 * VN_KNOTE() does the VN_KEVENT_INTEREST() \ 125 * check for us. \ 126 */ \ 127 VN_KNOTE((thisvp), (n)); \ 128 } \ 129 } while (/*CONSTCOND*/0) 130 131 #define VOP_POST_KNOTE_HELD(thisvp, e, n) \ 132 do { \ 133 /* \ 134 * We don't perform a VN_KEVENT_INTEREST() check here; it \ 135 * was already performed when we did the pre-op work that \ 136 * caused the vnode to be held in the first place. \ 137 */ \ 138 mutex_enter((thisvp)->v_interlock); \ 139 if (__predict_true((e) == 0)) { \ 140 knote(&(thisvp)->v_klist->vk_klist, (n)); \ 141 } \ 142 holdrelel((thisvp)); \ 143 mutex_exit((thisvp)->v_interlock); \ 144 /* \ 145 * thisvp might be gone now! Don't touch! \ 146 */ \ 147 } while (/*CONSTCOND*/0) 148 149 #define vop_create_post(ap, e) \ 150 VOP_POST_KNOTE((ap)->a_dvp, (e), NOTE_WRITE) 151 152 #define vop_mknod_post(ap, e) \ 153 VOP_POST_KNOTE((ap)->a_dvp, (e), NOTE_WRITE) 154 155 #define vop_setattr_pre(ap) \ 156 u_quad_t osize = 0; \ 157 long vp_events = \ 158 VN_KEVENT_INTEREST((ap)->a_vp, NOTE_ATTRIB | NOTE_EXTEND) \ 159 ? NOTE_ATTRIB : 0; \ 160 bool check_extend = false; \ 161 if (__predict_false(vp_events != 0 && \ 162 (ap)->a_vap->va_size != VNOVALSIZE)) { \ 163 check_extend = true; \ 164 osize = vop_pre_get_size((ap)->a_vp); \ 165 } 166 167 #define vop_setattr_post(ap, e) \ 168 do { \ 169 if (__predict_false(vp_events != 0)) { \ 170 if (__predict_false(check_extend && \ 171 (ap)->a_vap->va_size > osize)) { \ 172 vp_events |= NOTE_EXTEND; \ 173 } \ 174 VOP_POST_KNOTE((ap)->a_vp, (e), vp_events); \ 175 } \ 176 } while (/*CONSTCOND*/0) 177 178 #define vop_setacl_post(ap, e) \ 179 VOP_POST_KNOTE((ap)->a_vp, (e), NOTE_ATTRIB) 180 181 #define vop_link_post(ap, e) \ 182 do { \ 183 VOP_POST_KNOTE((ap)->a_dvp, (e), NOTE_WRITE); \ 184 VOP_POST_KNOTE((ap)->a_vp, (e), NOTE_LINK); \ 185 } while (/*CONSTCOND*/0) 186 187 #define vop_mkdir_post(ap, e) \ 188 VOP_POST_KNOTE((ap)->a_dvp, (e), NOTE_WRITE | NOTE_LINK) 189 190 #define vop_remove_pre_common(ap) \ 191 bool post_event_vp = \ 192 VN_KEVENT_INTEREST((ap)->a_vp, NOTE_DELETE | NOTE_LINK); \ 193 if (__predict_false(post_event_vp)) { \ 194 vhold((ap)->a_vp); \ 195 } 196 197 #define vop_remove_post_common(ap, e, dn, lc) \ 198 do { \ 199 VOP_POST_KNOTE((ap)->a_dvp, (e), (dn)); \ 200 if (__predict_false(post_event_vp)) { \ 201 VOP_POST_KNOTE_HELD((ap)->a_vp, (e), \ 202 (lc) ? NOTE_LINK : NOTE_DELETE); \ 203 } \ 204 } while (/*CONSTCOND*/0) 205 206 /* 207 * One could make the argument that VOP_REMOVE() should send NOTE_LINK 208 * on vp if the resulting link count is not zero, but that's not what 209 * the documentation says. 210 * 211 * We could change this easily by passing ap->ctx_vp_new_nlink to 212 * vop_remove_post_common(). 213 */ 214 #define vop_remove_pre(ap) \ 215 vop_remove_pre_common((ap)); \ 216 /* \ 217 * We will assume that the file being removed is deleted unless \ 218 * the file system tells us otherwise by updating vp_new_nlink. \ 219 */ \ 220 (ap)->ctx_vp_new_nlink = 0; 221 222 #define vop_remove_post(ap, e) \ 223 vop_remove_post_common((ap), (e), NOTE_WRITE, 0) 224 225 #define vop_rmdir_pre(ap) \ 226 vop_remove_pre_common(ap) 227 228 #define vop_rmdir_post(ap, e) \ 229 vop_remove_post_common((ap), (e), NOTE_WRITE | NOTE_LINK, 0) 230 231 #define vop_symlink_post(ap, e) \ 232 VOP_POST_KNOTE((ap)->a_dvp, (e), NOTE_WRITE) 233 234 #define vop_open_post(ap, e) \ 235 VOP_POST_KNOTE((ap)->a_vp, (e), NOTE_OPEN) 236 237 #define vop_close_post(ap, e) \ 238 do { \ 239 extern int (**dead_vnodeop_p)(void *); \ 240 \ 241 /* See the definition of VN_KNOTE() in <sys/vnode.h>. */ \ 242 if (__predict_false(VN_KEVENT_INTEREST((ap)->a_vp, \ 243 NOTE_CLOSE_WRITE | NOTE_CLOSE) && (e) == 0)) { \ 244 struct vnode *thisvp = (ap)->a_vp; \ 245 mutex_enter(thisvp->v_interlock); \ 246 /* \ 247 * Don't send NOTE_CLOSE when closing a vnode that's \ 248 * been reclaimed or otherwise revoked; a NOTE_REVOKE \ 249 * has already been sent, and this close is effectively \ 250 * meaningless from the watcher's perspective. \ 251 */ \ 252 if (__predict_true(thisvp->v_op != dead_vnodeop_p)) { \ 253 knote(&thisvp->v_klist->vk_klist, \ 254 ((ap)->a_fflag & FWRITE) \ 255 ? NOTE_CLOSE_WRITE : NOTE_CLOSE); \ 256 } \ 257 mutex_exit(thisvp->v_interlock); \ 258 } \ 259 } while (/*CONSTCOND*/0) 260 261 #define vop_read_post(ap, e) \ 262 VOP_POST_KNOTE((ap)->a_vp, (e), NOTE_READ) 263 264 #define vop_write_pre(ap) \ 265 off_t ooffset = 0, noffset = 0; \ 266 u_quad_t osize = 0; \ 267 long vp_events = \ 268 VN_KEVENT_INTEREST((ap)->a_vp, NOTE_WRITE | NOTE_EXTEND) \ 269 ? NOTE_WRITE : 0; \ 270 if (__predict_false(vp_events != 0)) { \ 271 ooffset = (ap)->a_uio->uio_offset; \ 272 osize = vop_pre_get_size((ap)->a_vp); \ 273 } 274 275 #define vop_write_post(ap, e) \ 276 do { \ 277 /* \ 278 * If any data was written, we'll post an event, even if \ 279 * there was an error. \ 280 */ \ 281 noffset = (ap)->a_uio->uio_offset; \ 282 if (__predict_false(vp_events != 0 && noffset > ooffset)) { \ 283 if (noffset > osize) { \ 284 vp_events |= NOTE_EXTEND; \ 285 } \ 286 VN_KNOTE((ap)->a_vp, vp_events); \ 287 } \ 288 } while (/*CONSTCOND*/0) 289 290 static inline void 291 vop_post(vnode_t *vp, struct mount *mp, bool mpsafe, enum fst_op op) 292 { 293 294 if (op == FST_YES || op == FST_LAZY) { 295 fstrans_done(mp); 296 } 297 298 if (!mpsafe) { 299 KERNEL_UNLOCK_ONE(curlwp); 300 } 301 } 302 303 static inline void 304 assert_vop_unlocked(vnode_t *vp, const char *str) 305 { 306 #if defined(VNODE_LOCKDEBUG) 307 308 if (VOP_ISLOCKED(vp) == LK_EXCLUSIVE) 309 panic("%s: %p %d/%d is locked but should not be", 310 str, vp, vp->v_tag, vp->v_type); 311 #endif 312 } 313 314 static inline void 315 assert_vop_locked(vnode_t *vp, const char *str) 316 { 317 #if defined(VNODE_LOCKDEBUG) 318 319 if (VOP_ISLOCKED(vp) == LK_NONE) 320 panic("%s: %p %d/%d is not locked but should be", 321 str, vp, vp->v_tag, vp->v_type); 322 #endif 323 } 324 325 static inline void 326 assert_vop_elocked(vnode_t *vp, const char *str) 327 { 328 #if defined(VNODE_LOCKDEBUG) 329 330 if (VOP_ISLOCKED(vp) != LK_EXCLUSIVE) 331 panic("%s: %p %d/%d is not exclusive locked but should be", 332 str, vp, vp->v_tag, vp->v_type); 333 #endif 334 } 335 336 const struct vnodeop_desc vop_default_desc = { 337 0, 338 "default", 339 0, 340 NULL, 341 VDESC_NO_OFFSET, 342 VDESC_NO_OFFSET, 343 VDESC_NO_OFFSET, 344 }; 345 346 347 const int vop_bwrite_vp_offsets[] = { 348 VOPARG_OFFSETOF(struct vop_bwrite_args,a_vp), 349 VDESC_NO_OFFSET 350 }; 351 const struct vnodeop_desc vop_bwrite_desc = { 352 VOP_BWRITE_DESCOFFSET, 353 "vop_bwrite", 354 0, 355 vop_bwrite_vp_offsets, 356 VDESC_NO_OFFSET, 357 VDESC_NO_OFFSET, 358 VDESC_NO_OFFSET, 359 }; 360 int 361 VOP_BWRITE(struct vnode *vp, 362 struct buf *bp) 363 { 364 int error; 365 bool mpsafe; 366 struct vop_bwrite_args a; 367 struct mount *mp; 368 a.a_desc = VDESC(vop_bwrite); 369 a.a_vp = vp; 370 a.a_bp = bp; 371 error = vop_pre(vp, &mp, &mpsafe, FST_YES); 372 if (error) 373 return error; 374 error = (VCALL(vp, VOFFSET(vop_bwrite), &a)); 375 vop_post(vp, mp, mpsafe, FST_YES); 376 return error; 377 } 378 379 const int vop_parsepath_vp_offsets[] = { 380 VOPARG_OFFSETOF(struct vop_parsepath_args,a_dvp), 381 VDESC_NO_OFFSET 382 }; 383 const struct vnodeop_desc vop_parsepath_desc = { 384 VOP_PARSEPATH_DESCOFFSET, 385 "vop_parsepath", 386 0, 387 vop_parsepath_vp_offsets, 388 VDESC_NO_OFFSET, 389 VDESC_NO_OFFSET, 390 VDESC_NO_OFFSET, 391 }; 392 int 393 VOP_PARSEPATH(struct vnode *dvp, 394 const char *name, 395 size_t *retval) 396 { 397 int error; 398 bool mpsafe; 399 struct vop_parsepath_args a; 400 struct mount *mp; 401 a.a_desc = VDESC(vop_parsepath); 402 a.a_dvp = dvp; 403 a.a_name = name; 404 a.a_retval = retval; 405 error = vop_pre(dvp, &mp, &mpsafe, FST_NO); 406 if (error) 407 return error; 408 error = (VCALL(dvp, VOFFSET(vop_parsepath), &a)); 409 vop_post(dvp, mp, mpsafe, FST_NO); 410 return error; 411 } 412 413 const int vop_lookup_vp_offsets[] = { 414 VOPARG_OFFSETOF(struct vop_lookup_v2_args,a_dvp), 415 VDESC_NO_OFFSET 416 }; 417 const struct vnodeop_desc vop_lookup_desc = { 418 VOP_LOOKUP_DESCOFFSET, 419 "vop_lookup", 420 0, 421 vop_lookup_vp_offsets, 422 VOPARG_OFFSETOF(struct vop_lookup_v2_args, a_vpp), 423 VDESC_NO_OFFSET, 424 VOPARG_OFFSETOF(struct vop_lookup_v2_args, a_cnp), 425 }; 426 int 427 VOP_LOOKUP(struct vnode *dvp, 428 struct vnode **vpp, 429 struct componentname *cnp) 430 { 431 int error; 432 bool mpsafe; 433 struct vop_lookup_v2_args a; 434 struct mount *mp; 435 a.a_desc = VDESC(vop_lookup); 436 a.a_dvp = dvp; 437 a.a_vpp = vpp; 438 a.a_cnp = cnp; 439 assert_vop_locked(dvp, "vop_lookup: dvp"); 440 error = vop_pre(dvp, &mp, &mpsafe, FST_NO); 441 if (error) 442 return error; 443 error = (VCALL(dvp, VOFFSET(vop_lookup), &a)); 444 vop_post(dvp, mp, mpsafe, FST_NO); 445 #ifdef DIAGNOSTIC 446 if (error == 0) 447 KASSERT((*vpp)->v_size != VSIZENOTSET 448 && (*vpp)->v_writesize != VSIZENOTSET); 449 #endif /* DIAGNOSTIC */ 450 return error; 451 } 452 453 const int vop_create_vp_offsets[] = { 454 VOPARG_OFFSETOF(struct vop_create_v3_args,a_dvp), 455 VDESC_NO_OFFSET 456 }; 457 const struct vnodeop_desc vop_create_desc = { 458 VOP_CREATE_DESCOFFSET, 459 "vop_create", 460 0, 461 vop_create_vp_offsets, 462 VOPARG_OFFSETOF(struct vop_create_v3_args, a_vpp), 463 VDESC_NO_OFFSET, 464 VOPARG_OFFSETOF(struct vop_create_v3_args, a_cnp), 465 }; 466 int 467 VOP_CREATE(struct vnode *dvp, 468 struct vnode **vpp, 469 struct componentname *cnp, 470 struct vattr *vap) 471 { 472 int error; 473 bool mpsafe; 474 struct vop_create_v3_args a; 475 struct mount *mp; 476 a.a_desc = VDESC(vop_create); 477 a.a_dvp = dvp; 478 a.a_vpp = vpp; 479 a.a_cnp = cnp; 480 a.a_vap = vap; 481 assert_vop_elocked(dvp, "vop_create: dvp"); 482 error = vop_pre(dvp, &mp, &mpsafe, FST_NO); 483 if (error) 484 return error; 485 error = (VCALL(dvp, VOFFSET(vop_create), &a)); 486 vop_post(dvp, mp, mpsafe, FST_NO); 487 vop_create_post(&a, error); 488 #ifdef DIAGNOSTIC 489 if (error == 0) 490 KASSERT((*vpp)->v_size != VSIZENOTSET 491 && (*vpp)->v_writesize != VSIZENOTSET); 492 #endif /* DIAGNOSTIC */ 493 return error; 494 } 495 496 const int vop_mknod_vp_offsets[] = { 497 VOPARG_OFFSETOF(struct vop_mknod_v3_args,a_dvp), 498 VDESC_NO_OFFSET 499 }; 500 const struct vnodeop_desc vop_mknod_desc = { 501 VOP_MKNOD_DESCOFFSET, 502 "vop_mknod", 503 0, 504 vop_mknod_vp_offsets, 505 VOPARG_OFFSETOF(struct vop_mknod_v3_args, a_vpp), 506 VDESC_NO_OFFSET, 507 VOPARG_OFFSETOF(struct vop_mknod_v3_args, a_cnp), 508 }; 509 int 510 VOP_MKNOD(struct vnode *dvp, 511 struct vnode **vpp, 512 struct componentname *cnp, 513 struct vattr *vap) 514 { 515 int error; 516 bool mpsafe; 517 struct vop_mknod_v3_args a; 518 struct mount *mp; 519 a.a_desc = VDESC(vop_mknod); 520 a.a_dvp = dvp; 521 a.a_vpp = vpp; 522 a.a_cnp = cnp; 523 a.a_vap = vap; 524 assert_vop_elocked(dvp, "vop_mknod: dvp"); 525 error = vop_pre(dvp, &mp, &mpsafe, FST_NO); 526 if (error) 527 return error; 528 error = (VCALL(dvp, VOFFSET(vop_mknod), &a)); 529 vop_post(dvp, mp, mpsafe, FST_NO); 530 vop_mknod_post(&a, error); 531 #ifdef DIAGNOSTIC 532 if (error == 0) 533 KASSERT((*vpp)->v_size != VSIZENOTSET 534 && (*vpp)->v_writesize != VSIZENOTSET); 535 #endif /* DIAGNOSTIC */ 536 return error; 537 } 538 539 const int vop_open_vp_offsets[] = { 540 VOPARG_OFFSETOF(struct vop_open_args,a_vp), 541 VDESC_NO_OFFSET 542 }; 543 const struct vnodeop_desc vop_open_desc = { 544 VOP_OPEN_DESCOFFSET, 545 "vop_open", 546 0, 547 vop_open_vp_offsets, 548 VDESC_NO_OFFSET, 549 VOPARG_OFFSETOF(struct vop_open_args, a_cred), 550 VDESC_NO_OFFSET, 551 }; 552 int 553 VOP_OPEN(struct vnode *vp, 554 int mode, 555 kauth_cred_t cred) 556 { 557 int error; 558 bool mpsafe; 559 struct vop_open_args a; 560 struct mount *mp; 561 a.a_desc = VDESC(vop_open); 562 a.a_vp = vp; 563 a.a_mode = mode; 564 a.a_cred = cred; 565 assert_vop_locked(vp, "vop_open: vp"); 566 error = vop_pre(vp, &mp, &mpsafe, FST_NO); 567 if (error) 568 return error; 569 error = (VCALL(vp, VOFFSET(vop_open), &a)); 570 vop_post(vp, mp, mpsafe, FST_NO); 571 vop_open_post(&a, error); 572 return error; 573 } 574 575 const int vop_close_vp_offsets[] = { 576 VOPARG_OFFSETOF(struct vop_close_args,a_vp), 577 VDESC_NO_OFFSET 578 }; 579 const struct vnodeop_desc vop_close_desc = { 580 VOP_CLOSE_DESCOFFSET, 581 "vop_close", 582 0, 583 vop_close_vp_offsets, 584 VDESC_NO_OFFSET, 585 VOPARG_OFFSETOF(struct vop_close_args, a_cred), 586 VDESC_NO_OFFSET, 587 }; 588 int 589 VOP_CLOSE(struct vnode *vp, 590 int fflag, 591 kauth_cred_t cred) 592 { 593 int error; 594 bool mpsafe; 595 struct vop_close_args a; 596 struct mount *mp; 597 a.a_desc = VDESC(vop_close); 598 a.a_vp = vp; 599 a.a_fflag = fflag; 600 a.a_cred = cred; 601 assert_vop_locked(vp, "vop_close: vp"); 602 error = vop_pre(vp, &mp, &mpsafe, FST_NO); 603 if (error) 604 return error; 605 error = (VCALL(vp, VOFFSET(vop_close), &a)); 606 vop_post(vp, mp, mpsafe, FST_NO); 607 vop_close_post(&a, error); 608 return error; 609 } 610 611 const int vop_access_vp_offsets[] = { 612 VOPARG_OFFSETOF(struct vop_access_args,a_vp), 613 VDESC_NO_OFFSET 614 }; 615 const struct vnodeop_desc vop_access_desc = { 616 VOP_ACCESS_DESCOFFSET, 617 "vop_access", 618 0, 619 vop_access_vp_offsets, 620 VDESC_NO_OFFSET, 621 VOPARG_OFFSETOF(struct vop_access_args, a_cred), 622 VDESC_NO_OFFSET, 623 }; 624 int 625 VOP_ACCESS(struct vnode *vp, 626 accmode_t accmode, 627 kauth_cred_t cred) 628 { 629 int error; 630 bool mpsafe; 631 struct vop_access_args a; 632 struct mount *mp; 633 a.a_desc = VDESC(vop_access); 634 a.a_vp = vp; 635 a.a_accmode = accmode; 636 a.a_cred = cred; 637 assert_vop_locked(vp, "vop_access: vp"); 638 error = vop_pre(vp, &mp, &mpsafe, FST_NO); 639 if (error) 640 return error; 641 error = (VCALL(vp, VOFFSET(vop_access), &a)); 642 vop_post(vp, mp, mpsafe, FST_NO); 643 return error; 644 } 645 646 const int vop_accessx_vp_offsets[] = { 647 VOPARG_OFFSETOF(struct vop_accessx_args,a_vp), 648 VDESC_NO_OFFSET 649 }; 650 const struct vnodeop_desc vop_accessx_desc = { 651 VOP_ACCESSX_DESCOFFSET, 652 "vop_accessx", 653 0, 654 vop_accessx_vp_offsets, 655 VDESC_NO_OFFSET, 656 VOPARG_OFFSETOF(struct vop_accessx_args, a_cred), 657 VDESC_NO_OFFSET, 658 }; 659 int 660 VOP_ACCESSX(struct vnode *vp, 661 accmode_t accmode, 662 kauth_cred_t cred) 663 { 664 int error; 665 bool mpsafe; 666 struct vop_accessx_args a; 667 struct mount *mp; 668 a.a_desc = VDESC(vop_accessx); 669 a.a_vp = vp; 670 a.a_accmode = accmode; 671 a.a_cred = cred; 672 assert_vop_locked(vp, "vop_accessx: vp"); 673 error = vop_pre(vp, &mp, &mpsafe, FST_NO); 674 if (error) 675 return error; 676 error = (VCALL(vp, VOFFSET(vop_accessx), &a)); 677 vop_post(vp, mp, mpsafe, FST_NO); 678 return error; 679 } 680 681 const int vop_getattr_vp_offsets[] = { 682 VOPARG_OFFSETOF(struct vop_getattr_args,a_vp), 683 VDESC_NO_OFFSET 684 }; 685 const struct vnodeop_desc vop_getattr_desc = { 686 VOP_GETATTR_DESCOFFSET, 687 "vop_getattr", 688 0, 689 vop_getattr_vp_offsets, 690 VDESC_NO_OFFSET, 691 VOPARG_OFFSETOF(struct vop_getattr_args, a_cred), 692 VDESC_NO_OFFSET, 693 }; 694 int 695 VOP_GETATTR(struct vnode *vp, 696 struct vattr *vap, 697 kauth_cred_t cred) 698 { 699 int error; 700 bool mpsafe; 701 struct vop_getattr_args a; 702 struct mount *mp; 703 a.a_desc = VDESC(vop_getattr); 704 a.a_vp = vp; 705 a.a_vap = vap; 706 a.a_cred = cred; 707 assert_vop_locked(vp, "vop_getattr: vp"); 708 error = vop_pre(vp, &mp, &mpsafe, FST_NO); 709 if (error) 710 return error; 711 error = (VCALL(vp, VOFFSET(vop_getattr), &a)); 712 vop_post(vp, mp, mpsafe, FST_NO); 713 return error; 714 } 715 716 const int vop_setattr_vp_offsets[] = { 717 VOPARG_OFFSETOF(struct vop_setattr_args,a_vp), 718 VDESC_NO_OFFSET 719 }; 720 const struct vnodeop_desc vop_setattr_desc = { 721 VOP_SETATTR_DESCOFFSET, 722 "vop_setattr", 723 0, 724 vop_setattr_vp_offsets, 725 VDESC_NO_OFFSET, 726 VOPARG_OFFSETOF(struct vop_setattr_args, a_cred), 727 VDESC_NO_OFFSET, 728 }; 729 int 730 VOP_SETATTR(struct vnode *vp, 731 struct vattr *vap, 732 kauth_cred_t cred) 733 { 734 int error; 735 bool mpsafe; 736 struct vop_setattr_args a; 737 struct mount *mp; 738 a.a_desc = VDESC(vop_setattr); 739 a.a_vp = vp; 740 a.a_vap = vap; 741 a.a_cred = cred; 742 assert_vop_elocked(vp, "vop_setattr: vp"); 743 vop_setattr_pre(&a); 744 error = vop_pre(vp, &mp, &mpsafe, FST_NO); 745 if (error) 746 return error; 747 error = (VCALL(vp, VOFFSET(vop_setattr), &a)); 748 vop_post(vp, mp, mpsafe, FST_NO); 749 vop_setattr_post(&a, error); 750 return error; 751 } 752 753 const int vop_read_vp_offsets[] = { 754 VOPARG_OFFSETOF(struct vop_read_args,a_vp), 755 VDESC_NO_OFFSET 756 }; 757 const struct vnodeop_desc vop_read_desc = { 758 VOP_READ_DESCOFFSET, 759 "vop_read", 760 0, 761 vop_read_vp_offsets, 762 VDESC_NO_OFFSET, 763 VOPARG_OFFSETOF(struct vop_read_args, a_cred), 764 VDESC_NO_OFFSET, 765 }; 766 int 767 VOP_READ(struct vnode *vp, 768 struct uio *uio, 769 int ioflag, 770 kauth_cred_t cred) 771 { 772 int error; 773 bool mpsafe; 774 struct vop_read_args a; 775 struct mount *mp; 776 a.a_desc = VDESC(vop_read); 777 a.a_vp = vp; 778 a.a_uio = uio; 779 a.a_ioflag = ioflag; 780 a.a_cred = cred; 781 assert_vop_locked(vp, "vop_read: vp"); 782 error = vop_pre(vp, &mp, &mpsafe, FST_NO); 783 if (error) 784 return error; 785 error = (VCALL(vp, VOFFSET(vop_read), &a)); 786 vop_post(vp, mp, mpsafe, FST_NO); 787 vop_read_post(&a, error); 788 return error; 789 } 790 791 const int vop_write_vp_offsets[] = { 792 VOPARG_OFFSETOF(struct vop_write_args,a_vp), 793 VDESC_NO_OFFSET 794 }; 795 const struct vnodeop_desc vop_write_desc = { 796 VOP_WRITE_DESCOFFSET, 797 "vop_write", 798 0, 799 vop_write_vp_offsets, 800 VDESC_NO_OFFSET, 801 VOPARG_OFFSETOF(struct vop_write_args, a_cred), 802 VDESC_NO_OFFSET, 803 }; 804 int 805 VOP_WRITE(struct vnode *vp, 806 struct uio *uio, 807 int ioflag, 808 kauth_cred_t cred) 809 { 810 int error; 811 bool mpsafe; 812 struct vop_write_args a; 813 struct mount *mp; 814 a.a_desc = VDESC(vop_write); 815 a.a_vp = vp; 816 a.a_uio = uio; 817 a.a_ioflag = ioflag; 818 a.a_cred = cred; 819 assert_vop_locked(vp, "vop_write: vp"); 820 vop_write_pre(&a); 821 error = vop_pre(vp, &mp, &mpsafe, FST_NO); 822 if (error) 823 return error; 824 error = (VCALL(vp, VOFFSET(vop_write), &a)); 825 vop_post(vp, mp, mpsafe, FST_NO); 826 vop_write_post(&a, error); 827 return error; 828 } 829 830 const int vop_fallocate_vp_offsets[] = { 831 VOPARG_OFFSETOF(struct vop_fallocate_args,a_vp), 832 VDESC_NO_OFFSET 833 }; 834 const struct vnodeop_desc vop_fallocate_desc = { 835 VOP_FALLOCATE_DESCOFFSET, 836 "vop_fallocate", 837 0, 838 vop_fallocate_vp_offsets, 839 VDESC_NO_OFFSET, 840 VDESC_NO_OFFSET, 841 VDESC_NO_OFFSET, 842 }; 843 int 844 VOP_FALLOCATE(struct vnode *vp, 845 off_t pos, 846 off_t len) 847 { 848 int error; 849 bool mpsafe; 850 struct vop_fallocate_args a; 851 struct mount *mp; 852 a.a_desc = VDESC(vop_fallocate); 853 a.a_vp = vp; 854 a.a_pos = pos; 855 a.a_len = len; 856 assert_vop_locked(vp, "vop_fallocate: vp"); 857 error = vop_pre(vp, &mp, &mpsafe, FST_NO); 858 if (error) 859 return error; 860 error = (VCALL(vp, VOFFSET(vop_fallocate), &a)); 861 vop_post(vp, mp, mpsafe, FST_NO); 862 return error; 863 } 864 865 const int vop_fdiscard_vp_offsets[] = { 866 VOPARG_OFFSETOF(struct vop_fdiscard_args,a_vp), 867 VDESC_NO_OFFSET 868 }; 869 const struct vnodeop_desc vop_fdiscard_desc = { 870 VOP_FDISCARD_DESCOFFSET, 871 "vop_fdiscard", 872 0, 873 vop_fdiscard_vp_offsets, 874 VDESC_NO_OFFSET, 875 VDESC_NO_OFFSET, 876 VDESC_NO_OFFSET, 877 }; 878 int 879 VOP_FDISCARD(struct vnode *vp, 880 off_t pos, 881 off_t len) 882 { 883 int error; 884 bool mpsafe; 885 struct vop_fdiscard_args a; 886 struct mount *mp; 887 a.a_desc = VDESC(vop_fdiscard); 888 a.a_vp = vp; 889 a.a_pos = pos; 890 a.a_len = len; 891 assert_vop_locked(vp, "vop_fdiscard: vp"); 892 error = vop_pre(vp, &mp, &mpsafe, FST_NO); 893 if (error) 894 return error; 895 error = (VCALL(vp, VOFFSET(vop_fdiscard), &a)); 896 vop_post(vp, mp, mpsafe, FST_NO); 897 return error; 898 } 899 900 const int vop_ioctl_vp_offsets[] = { 901 VOPARG_OFFSETOF(struct vop_ioctl_args,a_vp), 902 VDESC_NO_OFFSET 903 }; 904 const struct vnodeop_desc vop_ioctl_desc = { 905 VOP_IOCTL_DESCOFFSET, 906 "vop_ioctl", 907 0, 908 vop_ioctl_vp_offsets, 909 VDESC_NO_OFFSET, 910 VOPARG_OFFSETOF(struct vop_ioctl_args, a_cred), 911 VDESC_NO_OFFSET, 912 }; 913 int 914 VOP_IOCTL(struct vnode *vp, 915 u_long command, 916 void *data, 917 int fflag, 918 kauth_cred_t cred) 919 { 920 int error; 921 bool mpsafe; 922 struct vop_ioctl_args a; 923 struct mount *mp; 924 a.a_desc = VDESC(vop_ioctl); 925 a.a_vp = vp; 926 a.a_command = command; 927 a.a_data = data; 928 a.a_fflag = fflag; 929 a.a_cred = cred; 930 assert_vop_unlocked(vp, "vop_ioctl: vp"); 931 error = vop_pre(vp, &mp, &mpsafe, FST_NO); 932 if (error) 933 return error; 934 error = (VCALL(vp, VOFFSET(vop_ioctl), &a)); 935 vop_post(vp, mp, mpsafe, FST_NO); 936 return error; 937 } 938 939 const int vop_fcntl_vp_offsets[] = { 940 VOPARG_OFFSETOF(struct vop_fcntl_args,a_vp), 941 VDESC_NO_OFFSET 942 }; 943 const struct vnodeop_desc vop_fcntl_desc = { 944 VOP_FCNTL_DESCOFFSET, 945 "vop_fcntl", 946 0, 947 vop_fcntl_vp_offsets, 948 VDESC_NO_OFFSET, 949 VOPARG_OFFSETOF(struct vop_fcntl_args, a_cred), 950 VDESC_NO_OFFSET, 951 }; 952 int 953 VOP_FCNTL(struct vnode *vp, 954 u_int command, 955 void *data, 956 int fflag, 957 kauth_cred_t cred) 958 { 959 int error; 960 bool mpsafe; 961 struct vop_fcntl_args a; 962 struct mount *mp; 963 a.a_desc = VDESC(vop_fcntl); 964 a.a_vp = vp; 965 a.a_command = command; 966 a.a_data = data; 967 a.a_fflag = fflag; 968 a.a_cred = cred; 969 assert_vop_unlocked(vp, "vop_fcntl: vp"); 970 error = vop_pre(vp, &mp, &mpsafe, FST_NO); 971 if (error) 972 return error; 973 error = (VCALL(vp, VOFFSET(vop_fcntl), &a)); 974 vop_post(vp, mp, mpsafe, FST_NO); 975 return error; 976 } 977 978 const int vop_poll_vp_offsets[] = { 979 VOPARG_OFFSETOF(struct vop_poll_args,a_vp), 980 VDESC_NO_OFFSET 981 }; 982 const struct vnodeop_desc vop_poll_desc = { 983 VOP_POLL_DESCOFFSET, 984 "vop_poll", 985 0, 986 vop_poll_vp_offsets, 987 VDESC_NO_OFFSET, 988 VDESC_NO_OFFSET, 989 VDESC_NO_OFFSET, 990 }; 991 int 992 VOP_POLL(struct vnode *vp, 993 int events) 994 { 995 int error; 996 bool mpsafe; 997 struct vop_poll_args a; 998 struct mount *mp; 999 a.a_desc = VDESC(vop_poll); 1000 a.a_vp = vp; 1001 a.a_events = events; 1002 assert_vop_unlocked(vp, "vop_poll: vp"); 1003 error = vop_pre(vp, &mp, &mpsafe, FST_YES); 1004 if (error) 1005 return error; 1006 error = (VCALL(vp, VOFFSET(vop_poll), &a)); 1007 vop_post(vp, mp, mpsafe, FST_YES); 1008 return error; 1009 } 1010 1011 const int vop_kqfilter_vp_offsets[] = { 1012 VOPARG_OFFSETOF(struct vop_kqfilter_args,a_vp), 1013 VDESC_NO_OFFSET 1014 }; 1015 const struct vnodeop_desc vop_kqfilter_desc = { 1016 VOP_KQFILTER_DESCOFFSET, 1017 "vop_kqfilter", 1018 0, 1019 vop_kqfilter_vp_offsets, 1020 VDESC_NO_OFFSET, 1021 VDESC_NO_OFFSET, 1022 VDESC_NO_OFFSET, 1023 }; 1024 int 1025 VOP_KQFILTER(struct vnode *vp, 1026 struct knote *kn) 1027 { 1028 int error; 1029 bool mpsafe; 1030 struct vop_kqfilter_args a; 1031 struct mount *mp; 1032 a.a_desc = VDESC(vop_kqfilter); 1033 a.a_vp = vp; 1034 a.a_kn = kn; 1035 assert_vop_unlocked(vp, "vop_kqfilter: vp"); 1036 error = vop_pre(vp, &mp, &mpsafe, FST_YES); 1037 if (error) 1038 return error; 1039 error = (VCALL(vp, VOFFSET(vop_kqfilter), &a)); 1040 vop_post(vp, mp, mpsafe, FST_YES); 1041 return error; 1042 } 1043 1044 const int vop_revoke_vp_offsets[] = { 1045 VOPARG_OFFSETOF(struct vop_revoke_args,a_vp), 1046 VDESC_NO_OFFSET 1047 }; 1048 const struct vnodeop_desc vop_revoke_desc = { 1049 VOP_REVOKE_DESCOFFSET, 1050 "vop_revoke", 1051 0, 1052 vop_revoke_vp_offsets, 1053 VDESC_NO_OFFSET, 1054 VDESC_NO_OFFSET, 1055 VDESC_NO_OFFSET, 1056 }; 1057 int 1058 VOP_REVOKE(struct vnode *vp, 1059 int flags) 1060 { 1061 int error; 1062 bool mpsafe; 1063 struct vop_revoke_args a; 1064 struct mount *mp; 1065 a.a_desc = VDESC(vop_revoke); 1066 a.a_vp = vp; 1067 a.a_flags = flags; 1068 assert_vop_unlocked(vp, "vop_revoke: vp"); 1069 error = vop_pre(vp, &mp, &mpsafe, FST_NO); 1070 if (error) 1071 return error; 1072 error = (VCALL(vp, VOFFSET(vop_revoke), &a)); 1073 vop_post(vp, mp, mpsafe, FST_NO); 1074 return error; 1075 } 1076 1077 const int vop_mmap_vp_offsets[] = { 1078 VOPARG_OFFSETOF(struct vop_mmap_args,a_vp), 1079 VDESC_NO_OFFSET 1080 }; 1081 const struct vnodeop_desc vop_mmap_desc = { 1082 VOP_MMAP_DESCOFFSET, 1083 "vop_mmap", 1084 0, 1085 vop_mmap_vp_offsets, 1086 VDESC_NO_OFFSET, 1087 VOPARG_OFFSETOF(struct vop_mmap_args, a_cred), 1088 VDESC_NO_OFFSET, 1089 }; 1090 int 1091 VOP_MMAP(struct vnode *vp, 1092 vm_prot_t prot, 1093 kauth_cred_t cred) 1094 { 1095 int error; 1096 bool mpsafe; 1097 struct vop_mmap_args a; 1098 struct mount *mp; 1099 a.a_desc = VDESC(vop_mmap); 1100 a.a_vp = vp; 1101 a.a_prot = prot; 1102 a.a_cred = cred; 1103 error = vop_pre(vp, &mp, &mpsafe, FST_YES); 1104 if (error) 1105 return error; 1106 error = (VCALL(vp, VOFFSET(vop_mmap), &a)); 1107 vop_post(vp, mp, mpsafe, FST_YES); 1108 return error; 1109 } 1110 1111 const int vop_fsync_vp_offsets[] = { 1112 VOPARG_OFFSETOF(struct vop_fsync_args,a_vp), 1113 VDESC_NO_OFFSET 1114 }; 1115 const struct vnodeop_desc vop_fsync_desc = { 1116 VOP_FSYNC_DESCOFFSET, 1117 "vop_fsync", 1118 0, 1119 vop_fsync_vp_offsets, 1120 VDESC_NO_OFFSET, 1121 VOPARG_OFFSETOF(struct vop_fsync_args, a_cred), 1122 VDESC_NO_OFFSET, 1123 }; 1124 int 1125 VOP_FSYNC(struct vnode *vp, 1126 kauth_cred_t cred, 1127 int flags, 1128 off_t offlo, 1129 off_t offhi) 1130 { 1131 int error; 1132 bool mpsafe; 1133 struct vop_fsync_args a; 1134 struct mount *mp; 1135 a.a_desc = VDESC(vop_fsync); 1136 a.a_vp = vp; 1137 a.a_cred = cred; 1138 a.a_flags = flags; 1139 a.a_offlo = offlo; 1140 a.a_offhi = offhi; 1141 assert_vop_locked(vp, "vop_fsync: vp"); 1142 error = vop_pre(vp, &mp, &mpsafe, FST_NO); 1143 if (error) 1144 return error; 1145 error = (VCALL(vp, VOFFSET(vop_fsync), &a)); 1146 vop_post(vp, mp, mpsafe, FST_NO); 1147 return error; 1148 } 1149 1150 const int vop_seek_vp_offsets[] = { 1151 VOPARG_OFFSETOF(struct vop_seek_args,a_vp), 1152 VDESC_NO_OFFSET 1153 }; 1154 const struct vnodeop_desc vop_seek_desc = { 1155 VOP_SEEK_DESCOFFSET, 1156 "vop_seek", 1157 0, 1158 vop_seek_vp_offsets, 1159 VDESC_NO_OFFSET, 1160 VOPARG_OFFSETOF(struct vop_seek_args, a_cred), 1161 VDESC_NO_OFFSET, 1162 }; 1163 int 1164 VOP_SEEK(struct vnode *vp, 1165 off_t oldoff, 1166 off_t newoff, 1167 kauth_cred_t cred) 1168 { 1169 int error; 1170 bool mpsafe; 1171 struct vop_seek_args a; 1172 struct mount *mp; 1173 a.a_desc = VDESC(vop_seek); 1174 a.a_vp = vp; 1175 a.a_oldoff = oldoff; 1176 a.a_newoff = newoff; 1177 a.a_cred = cred; 1178 error = vop_pre(vp, &mp, &mpsafe, FST_YES); 1179 if (error) 1180 return error; 1181 error = (VCALL(vp, VOFFSET(vop_seek), &a)); 1182 vop_post(vp, mp, mpsafe, FST_YES); 1183 return error; 1184 } 1185 1186 const int vop_remove_vp_offsets[] = { 1187 VOPARG_OFFSETOF(struct vop_remove_v3_args,a_dvp), 1188 VOPARG_OFFSETOF(struct vop_remove_v3_args,a_vp), 1189 VDESC_NO_OFFSET 1190 }; 1191 const struct vnodeop_desc vop_remove_desc = { 1192 VOP_REMOVE_DESCOFFSET, 1193 "vop_remove", 1194 0 | VDESC_VP1_WILLPUT, 1195 vop_remove_vp_offsets, 1196 VDESC_NO_OFFSET, 1197 VDESC_NO_OFFSET, 1198 VOPARG_OFFSETOF(struct vop_remove_v3_args, a_cnp), 1199 }; 1200 int 1201 VOP_REMOVE(struct vnode *dvp, 1202 struct vnode *vp, 1203 struct componentname *cnp) 1204 { 1205 int error; 1206 bool mpsafe; 1207 struct vop_remove_v3_args a; 1208 struct mount *mp; 1209 a.a_desc = VDESC(vop_remove); 1210 a.a_dvp = dvp; 1211 a.a_vp = vp; 1212 a.a_cnp = cnp; 1213 assert_vop_elocked(dvp, "vop_remove: dvp"); 1214 assert_vop_locked(vp, "vop_remove: vp"); 1215 vop_remove_pre(&a); 1216 error = vop_pre(dvp, &mp, &mpsafe, FST_NO); 1217 if (error) 1218 return error; 1219 error = (VCALL(dvp, VOFFSET(vop_remove), &a)); 1220 vop_post(dvp, mp, mpsafe, FST_NO); 1221 vop_remove_post(&a, error); 1222 return error; 1223 } 1224 1225 const int vop_link_vp_offsets[] = { 1226 VOPARG_OFFSETOF(struct vop_link_v2_args,a_dvp), 1227 VOPARG_OFFSETOF(struct vop_link_v2_args,a_vp), 1228 VDESC_NO_OFFSET 1229 }; 1230 const struct vnodeop_desc vop_link_desc = { 1231 VOP_LINK_DESCOFFSET, 1232 "vop_link", 1233 0, 1234 vop_link_vp_offsets, 1235 VDESC_NO_OFFSET, 1236 VDESC_NO_OFFSET, 1237 VOPARG_OFFSETOF(struct vop_link_v2_args, a_cnp), 1238 }; 1239 int 1240 VOP_LINK(struct vnode *dvp, 1241 struct vnode *vp, 1242 struct componentname *cnp) 1243 { 1244 int error; 1245 bool mpsafe; 1246 struct vop_link_v2_args a; 1247 struct mount *mp; 1248 a.a_desc = VDESC(vop_link); 1249 a.a_dvp = dvp; 1250 a.a_vp = vp; 1251 a.a_cnp = cnp; 1252 assert_vop_elocked(dvp, "vop_link: dvp"); 1253 assert_vop_unlocked(vp, "vop_link: vp"); 1254 error = vop_pre(dvp, &mp, &mpsafe, FST_NO); 1255 if (error) 1256 return error; 1257 error = (VCALL(dvp, VOFFSET(vop_link), &a)); 1258 vop_post(dvp, mp, mpsafe, FST_NO); 1259 vop_link_post(&a, error); 1260 return error; 1261 } 1262 1263 const int vop_rename_vp_offsets[] = { 1264 VOPARG_OFFSETOF(struct vop_rename_args,a_fdvp), 1265 VOPARG_OFFSETOF(struct vop_rename_args,a_fvp), 1266 VOPARG_OFFSETOF(struct vop_rename_args,a_tdvp), 1267 VOPARG_OFFSETOF(struct vop_rename_args,a_tvp), 1268 VDESC_NO_OFFSET 1269 }; 1270 const struct vnodeop_desc vop_rename_desc = { 1271 VOP_RENAME_DESCOFFSET, 1272 "vop_rename", 1273 0 | VDESC_VP0_WILLRELE | VDESC_VP1_WILLRELE | VDESC_VP2_WILLPUT | VDESC_VP3_WILLPUT, 1274 vop_rename_vp_offsets, 1275 VDESC_NO_OFFSET, 1276 VDESC_NO_OFFSET, 1277 VOPARG_OFFSETOF(struct vop_rename_args, a_fcnp), 1278 }; 1279 int 1280 VOP_RENAME(struct vnode *fdvp, 1281 struct vnode *fvp, 1282 struct componentname *fcnp, 1283 struct vnode *tdvp, 1284 struct vnode *tvp, 1285 struct componentname *tcnp) 1286 { 1287 int error; 1288 bool mpsafe; 1289 struct vop_rename_args a; 1290 struct mount *mp; 1291 a.a_desc = VDESC(vop_rename); 1292 a.a_fdvp = fdvp; 1293 a.a_fvp = fvp; 1294 a.a_fcnp = fcnp; 1295 a.a_tdvp = tdvp; 1296 a.a_tvp = tvp; 1297 a.a_tcnp = tcnp; 1298 assert_vop_locked(tdvp, "vop_rename: tdvp"); 1299 error = vop_pre(fdvp, &mp, &mpsafe, FST_YES); 1300 if (error) 1301 return error; 1302 error = (VCALL(fdvp, VOFFSET(vop_rename), &a)); 1303 vop_post(fdvp, mp, mpsafe, FST_YES); 1304 return error; 1305 } 1306 1307 const int vop_mkdir_vp_offsets[] = { 1308 VOPARG_OFFSETOF(struct vop_mkdir_v3_args,a_dvp), 1309 VDESC_NO_OFFSET 1310 }; 1311 const struct vnodeop_desc vop_mkdir_desc = { 1312 VOP_MKDIR_DESCOFFSET, 1313 "vop_mkdir", 1314 0, 1315 vop_mkdir_vp_offsets, 1316 VOPARG_OFFSETOF(struct vop_mkdir_v3_args, a_vpp), 1317 VDESC_NO_OFFSET, 1318 VOPARG_OFFSETOF(struct vop_mkdir_v3_args, a_cnp), 1319 }; 1320 int 1321 VOP_MKDIR(struct vnode *dvp, 1322 struct vnode **vpp, 1323 struct componentname *cnp, 1324 struct vattr *vap) 1325 { 1326 int error; 1327 bool mpsafe; 1328 struct vop_mkdir_v3_args a; 1329 struct mount *mp; 1330 a.a_desc = VDESC(vop_mkdir); 1331 a.a_dvp = dvp; 1332 a.a_vpp = vpp; 1333 a.a_cnp = cnp; 1334 a.a_vap = vap; 1335 assert_vop_elocked(dvp, "vop_mkdir: dvp"); 1336 error = vop_pre(dvp, &mp, &mpsafe, FST_NO); 1337 if (error) 1338 return error; 1339 error = (VCALL(dvp, VOFFSET(vop_mkdir), &a)); 1340 vop_post(dvp, mp, mpsafe, FST_NO); 1341 vop_mkdir_post(&a, error); 1342 #ifdef DIAGNOSTIC 1343 if (error == 0) 1344 KASSERT((*vpp)->v_size != VSIZENOTSET 1345 && (*vpp)->v_writesize != VSIZENOTSET); 1346 #endif /* DIAGNOSTIC */ 1347 return error; 1348 } 1349 1350 const int vop_rmdir_vp_offsets[] = { 1351 VOPARG_OFFSETOF(struct vop_rmdir_v2_args,a_dvp), 1352 VOPARG_OFFSETOF(struct vop_rmdir_v2_args,a_vp), 1353 VDESC_NO_OFFSET 1354 }; 1355 const struct vnodeop_desc vop_rmdir_desc = { 1356 VOP_RMDIR_DESCOFFSET, 1357 "vop_rmdir", 1358 0 | VDESC_VP1_WILLPUT, 1359 vop_rmdir_vp_offsets, 1360 VDESC_NO_OFFSET, 1361 VDESC_NO_OFFSET, 1362 VOPARG_OFFSETOF(struct vop_rmdir_v2_args, a_cnp), 1363 }; 1364 int 1365 VOP_RMDIR(struct vnode *dvp, 1366 struct vnode *vp, 1367 struct componentname *cnp) 1368 { 1369 int error; 1370 bool mpsafe; 1371 struct vop_rmdir_v2_args a; 1372 struct mount *mp; 1373 a.a_desc = VDESC(vop_rmdir); 1374 a.a_dvp = dvp; 1375 a.a_vp = vp; 1376 a.a_cnp = cnp; 1377 assert_vop_elocked(dvp, "vop_rmdir: dvp"); 1378 assert_vop_elocked(vp, "vop_rmdir: vp"); 1379 vop_rmdir_pre(&a); 1380 error = vop_pre(dvp, &mp, &mpsafe, FST_NO); 1381 if (error) 1382 return error; 1383 error = (VCALL(dvp, VOFFSET(vop_rmdir), &a)); 1384 vop_post(dvp, mp, mpsafe, FST_NO); 1385 vop_rmdir_post(&a, error); 1386 return error; 1387 } 1388 1389 const int vop_symlink_vp_offsets[] = { 1390 VOPARG_OFFSETOF(struct vop_symlink_v3_args,a_dvp), 1391 VDESC_NO_OFFSET 1392 }; 1393 const struct vnodeop_desc vop_symlink_desc = { 1394 VOP_SYMLINK_DESCOFFSET, 1395 "vop_symlink", 1396 0, 1397 vop_symlink_vp_offsets, 1398 VOPARG_OFFSETOF(struct vop_symlink_v3_args, a_vpp), 1399 VDESC_NO_OFFSET, 1400 VOPARG_OFFSETOF(struct vop_symlink_v3_args, a_cnp), 1401 }; 1402 int 1403 VOP_SYMLINK(struct vnode *dvp, 1404 struct vnode **vpp, 1405 struct componentname *cnp, 1406 struct vattr *vap, 1407 char *target) 1408 { 1409 int error; 1410 bool mpsafe; 1411 struct vop_symlink_v3_args a; 1412 struct mount *mp; 1413 a.a_desc = VDESC(vop_symlink); 1414 a.a_dvp = dvp; 1415 a.a_vpp = vpp; 1416 a.a_cnp = cnp; 1417 a.a_vap = vap; 1418 a.a_target = target; 1419 assert_vop_elocked(dvp, "vop_symlink: dvp"); 1420 error = vop_pre(dvp, &mp, &mpsafe, FST_NO); 1421 if (error) 1422 return error; 1423 error = (VCALL(dvp, VOFFSET(vop_symlink), &a)); 1424 vop_post(dvp, mp, mpsafe, FST_NO); 1425 vop_symlink_post(&a, error); 1426 #ifdef DIAGNOSTIC 1427 if (error == 0) 1428 KASSERT((*vpp)->v_size != VSIZENOTSET 1429 && (*vpp)->v_writesize != VSIZENOTSET); 1430 #endif /* DIAGNOSTIC */ 1431 return error; 1432 } 1433 1434 const int vop_readdir_vp_offsets[] = { 1435 VOPARG_OFFSETOF(struct vop_readdir_args,a_vp), 1436 VDESC_NO_OFFSET 1437 }; 1438 const struct vnodeop_desc vop_readdir_desc = { 1439 VOP_READDIR_DESCOFFSET, 1440 "vop_readdir", 1441 0, 1442 vop_readdir_vp_offsets, 1443 VDESC_NO_OFFSET, 1444 VOPARG_OFFSETOF(struct vop_readdir_args, a_cred), 1445 VDESC_NO_OFFSET, 1446 }; 1447 int 1448 VOP_READDIR(struct vnode *vp, 1449 struct uio *uio, 1450 kauth_cred_t cred, 1451 int *eofflag, 1452 off_t **cookies, 1453 int *ncookies) 1454 { 1455 int error; 1456 bool mpsafe; 1457 struct vop_readdir_args a; 1458 struct mount *mp; 1459 a.a_desc = VDESC(vop_readdir); 1460 a.a_vp = vp; 1461 a.a_uio = uio; 1462 a.a_cred = cred; 1463 a.a_eofflag = eofflag; 1464 a.a_cookies = cookies; 1465 a.a_ncookies = ncookies; 1466 assert_vop_locked(vp, "vop_readdir: vp"); 1467 error = vop_pre(vp, &mp, &mpsafe, FST_NO); 1468 if (error) 1469 return error; 1470 error = (VCALL(vp, VOFFSET(vop_readdir), &a)); 1471 vop_post(vp, mp, mpsafe, FST_NO); 1472 return error; 1473 } 1474 1475 const int vop_readlink_vp_offsets[] = { 1476 VOPARG_OFFSETOF(struct vop_readlink_args,a_vp), 1477 VDESC_NO_OFFSET 1478 }; 1479 const struct vnodeop_desc vop_readlink_desc = { 1480 VOP_READLINK_DESCOFFSET, 1481 "vop_readlink", 1482 0, 1483 vop_readlink_vp_offsets, 1484 VDESC_NO_OFFSET, 1485 VOPARG_OFFSETOF(struct vop_readlink_args, a_cred), 1486 VDESC_NO_OFFSET, 1487 }; 1488 int 1489 VOP_READLINK(struct vnode *vp, 1490 struct uio *uio, 1491 kauth_cred_t cred) 1492 { 1493 int error; 1494 bool mpsafe; 1495 struct vop_readlink_args a; 1496 struct mount *mp; 1497 a.a_desc = VDESC(vop_readlink); 1498 a.a_vp = vp; 1499 a.a_uio = uio; 1500 a.a_cred = cred; 1501 assert_vop_locked(vp, "vop_readlink: vp"); 1502 error = vop_pre(vp, &mp, &mpsafe, FST_NO); 1503 if (error) 1504 return error; 1505 error = (VCALL(vp, VOFFSET(vop_readlink), &a)); 1506 vop_post(vp, mp, mpsafe, FST_NO); 1507 return error; 1508 } 1509 1510 const int vop_abortop_vp_offsets[] = { 1511 VOPARG_OFFSETOF(struct vop_abortop_args,a_dvp), 1512 VDESC_NO_OFFSET 1513 }; 1514 const struct vnodeop_desc vop_abortop_desc = { 1515 VOP_ABORTOP_DESCOFFSET, 1516 "vop_abortop", 1517 0, 1518 vop_abortop_vp_offsets, 1519 VDESC_NO_OFFSET, 1520 VDESC_NO_OFFSET, 1521 VOPARG_OFFSETOF(struct vop_abortop_args, a_cnp), 1522 }; 1523 int 1524 VOP_ABORTOP(struct vnode *dvp, 1525 struct componentname *cnp) 1526 { 1527 int error; 1528 bool mpsafe; 1529 struct vop_abortop_args a; 1530 struct mount *mp; 1531 a.a_desc = VDESC(vop_abortop); 1532 a.a_dvp = dvp; 1533 a.a_cnp = cnp; 1534 error = vop_pre(dvp, &mp, &mpsafe, FST_YES); 1535 if (error) 1536 return error; 1537 error = (VCALL(dvp, VOFFSET(vop_abortop), &a)); 1538 vop_post(dvp, mp, mpsafe, FST_YES); 1539 return error; 1540 } 1541 1542 const int vop_inactive_vp_offsets[] = { 1543 VOPARG_OFFSETOF(struct vop_inactive_v2_args,a_vp), 1544 VDESC_NO_OFFSET 1545 }; 1546 const struct vnodeop_desc vop_inactive_desc = { 1547 VOP_INACTIVE_DESCOFFSET, 1548 "vop_inactive", 1549 0, 1550 vop_inactive_vp_offsets, 1551 VDESC_NO_OFFSET, 1552 VDESC_NO_OFFSET, 1553 VDESC_NO_OFFSET, 1554 }; 1555 int 1556 VOP_INACTIVE(struct vnode *vp, 1557 bool *recycle) 1558 { 1559 int error; 1560 bool mpsafe; 1561 struct vop_inactive_v2_args a; 1562 struct mount *mp; 1563 a.a_desc = VDESC(vop_inactive); 1564 a.a_vp = vp; 1565 a.a_recycle = recycle; 1566 assert_vop_elocked(vp, "vop_inactive: vp"); 1567 error = vop_pre(vp, &mp, &mpsafe, FST_NO); 1568 if (error) 1569 return error; 1570 error = (VCALL(vp, VOFFSET(vop_inactive), &a)); 1571 vop_post(vp, mp, mpsafe, FST_NO); 1572 return error; 1573 } 1574 1575 const int vop_reclaim_vp_offsets[] = { 1576 VOPARG_OFFSETOF(struct vop_reclaim_v2_args,a_vp), 1577 VDESC_NO_OFFSET 1578 }; 1579 const struct vnodeop_desc vop_reclaim_desc = { 1580 VOP_RECLAIM_DESCOFFSET, 1581 "vop_reclaim", 1582 0, 1583 vop_reclaim_vp_offsets, 1584 VDESC_NO_OFFSET, 1585 VDESC_NO_OFFSET, 1586 VDESC_NO_OFFSET, 1587 }; 1588 int 1589 VOP_RECLAIM(struct vnode *vp) 1590 { 1591 int error; 1592 bool mpsafe; 1593 struct vop_reclaim_v2_args a; 1594 struct mount *mp; 1595 a.a_desc = VDESC(vop_reclaim); 1596 a.a_vp = vp; 1597 assert_vop_elocked(vp, "vop_reclaim: vp"); 1598 error = vop_pre(vp, &mp, &mpsafe, FST_NO); 1599 if (error) 1600 return error; 1601 error = (VCALL(vp, VOFFSET(vop_reclaim), &a)); 1602 vop_post(vp, mp, mpsafe, FST_NO); 1603 return error; 1604 } 1605 1606 const int vop_lock_vp_offsets[] = { 1607 VOPARG_OFFSETOF(struct vop_lock_args,a_vp), 1608 VDESC_NO_OFFSET 1609 }; 1610 const struct vnodeop_desc vop_lock_desc = { 1611 VOP_LOCK_DESCOFFSET, 1612 "vop_lock", 1613 0, 1614 vop_lock_vp_offsets, 1615 VDESC_NO_OFFSET, 1616 VDESC_NO_OFFSET, 1617 VDESC_NO_OFFSET, 1618 }; 1619 int 1620 VOP_LOCK(struct vnode *vp, 1621 int flags) 1622 { 1623 int error; 1624 bool mpsafe; 1625 struct vop_lock_args a; 1626 struct mount *mp; 1627 a.a_desc = VDESC(vop_lock); 1628 a.a_vp = vp; 1629 a.a_flags = flags; 1630 error = vop_pre(vp, &mp, &mpsafe, (!(flags & (LK_SHARED|LK_EXCLUSIVE)) ? FST_NO : (flags & LK_NOWAIT ? FST_TRY : FST_YES))); 1631 if (error) 1632 return error; 1633 error = (VCALL(vp, VOFFSET(vop_lock), &a)); 1634 vop_post(vp, mp, mpsafe, (flags & (LK_UPGRADE|LK_DOWNGRADE) ? FST_NO : (error ? FST_YES : FST_NO))); 1635 return error; 1636 } 1637 1638 const int vop_unlock_vp_offsets[] = { 1639 VOPARG_OFFSETOF(struct vop_unlock_args,a_vp), 1640 VDESC_NO_OFFSET 1641 }; 1642 const struct vnodeop_desc vop_unlock_desc = { 1643 VOP_UNLOCK_DESCOFFSET, 1644 "vop_unlock", 1645 0, 1646 vop_unlock_vp_offsets, 1647 VDESC_NO_OFFSET, 1648 VDESC_NO_OFFSET, 1649 VDESC_NO_OFFSET, 1650 }; 1651 int 1652 VOP_UNLOCK(struct vnode *vp) 1653 { 1654 int error; 1655 bool mpsafe; 1656 struct vop_unlock_args a; 1657 struct mount *mp; 1658 a.a_desc = VDESC(vop_unlock); 1659 a.a_vp = vp; 1660 assert_vop_locked(vp, "vop_unlock: vp"); 1661 error = vop_pre(vp, &mp, &mpsafe, FST_NO); 1662 if (error) 1663 return error; 1664 error = (VCALL(vp, VOFFSET(vop_unlock), &a)); 1665 vop_post(vp, mp, mpsafe, FST_YES); 1666 return error; 1667 } 1668 1669 const int vop_bmap_vp_offsets[] = { 1670 VOPARG_OFFSETOF(struct vop_bmap_args,a_vp), 1671 VDESC_NO_OFFSET 1672 }; 1673 const struct vnodeop_desc vop_bmap_desc = { 1674 VOP_BMAP_DESCOFFSET, 1675 "vop_bmap", 1676 0, 1677 vop_bmap_vp_offsets, 1678 VOPARG_OFFSETOF(struct vop_bmap_args, a_vpp), 1679 VDESC_NO_OFFSET, 1680 VDESC_NO_OFFSET, 1681 }; 1682 int 1683 VOP_BMAP(struct vnode *vp, 1684 daddr_t bn, 1685 struct vnode **vpp, 1686 daddr_t *bnp, 1687 int *runp) 1688 { 1689 int error; 1690 bool mpsafe; 1691 struct vop_bmap_args a; 1692 struct mount *mp; 1693 a.a_desc = VDESC(vop_bmap); 1694 a.a_vp = vp; 1695 a.a_bn = bn; 1696 a.a_vpp = vpp; 1697 a.a_bnp = bnp; 1698 a.a_runp = runp; 1699 error = vop_pre(vp, &mp, &mpsafe, FST_YES); 1700 if (error) 1701 return error; 1702 error = (VCALL(vp, VOFFSET(vop_bmap), &a)); 1703 vop_post(vp, mp, mpsafe, FST_YES); 1704 return error; 1705 } 1706 1707 const int vop_strategy_vp_offsets[] = { 1708 VOPARG_OFFSETOF(struct vop_strategy_args,a_vp), 1709 VDESC_NO_OFFSET 1710 }; 1711 const struct vnodeop_desc vop_strategy_desc = { 1712 VOP_STRATEGY_DESCOFFSET, 1713 "vop_strategy", 1714 0, 1715 vop_strategy_vp_offsets, 1716 VDESC_NO_OFFSET, 1717 VDESC_NO_OFFSET, 1718 VDESC_NO_OFFSET, 1719 }; 1720 int 1721 VOP_STRATEGY(struct vnode *vp, 1722 struct buf *bp) 1723 { 1724 int error; 1725 bool mpsafe; 1726 struct vop_strategy_args a; 1727 struct mount *mp; 1728 a.a_desc = VDESC(vop_strategy); 1729 a.a_vp = vp; 1730 a.a_bp = bp; 1731 error = vop_pre(vp, &mp, &mpsafe, FST_NO); 1732 if (error) 1733 return error; 1734 error = (VCALL(vp, VOFFSET(vop_strategy), &a)); 1735 vop_post(vp, mp, mpsafe, FST_NO); 1736 return error; 1737 } 1738 1739 const int vop_print_vp_offsets[] = { 1740 VOPARG_OFFSETOF(struct vop_print_args,a_vp), 1741 VDESC_NO_OFFSET 1742 }; 1743 const struct vnodeop_desc vop_print_desc = { 1744 VOP_PRINT_DESCOFFSET, 1745 "vop_print", 1746 0, 1747 vop_print_vp_offsets, 1748 VDESC_NO_OFFSET, 1749 VDESC_NO_OFFSET, 1750 VDESC_NO_OFFSET, 1751 }; 1752 int 1753 VOP_PRINT(struct vnode *vp) 1754 { 1755 int error; 1756 bool mpsafe; 1757 struct vop_print_args a; 1758 struct mount *mp; 1759 a.a_desc = VDESC(vop_print); 1760 a.a_vp = vp; 1761 error = vop_pre(vp, &mp, &mpsafe, FST_YES); 1762 if (error) 1763 return error; 1764 error = (VCALL(vp, VOFFSET(vop_print), &a)); 1765 vop_post(vp, mp, mpsafe, FST_YES); 1766 return error; 1767 } 1768 1769 const int vop_islocked_vp_offsets[] = { 1770 VOPARG_OFFSETOF(struct vop_islocked_args,a_vp), 1771 VDESC_NO_OFFSET 1772 }; 1773 const struct vnodeop_desc vop_islocked_desc = { 1774 VOP_ISLOCKED_DESCOFFSET, 1775 "vop_islocked", 1776 0, 1777 vop_islocked_vp_offsets, 1778 VDESC_NO_OFFSET, 1779 VDESC_NO_OFFSET, 1780 VDESC_NO_OFFSET, 1781 }; 1782 int 1783 VOP_ISLOCKED(struct vnode *vp) 1784 { 1785 int error; 1786 bool mpsafe; 1787 struct vop_islocked_args a; 1788 struct mount *mp; 1789 a.a_desc = VDESC(vop_islocked); 1790 a.a_vp = vp; 1791 error = vop_pre(vp, &mp, &mpsafe, FST_NO); 1792 if (error) 1793 return error; 1794 error = (VCALL(vp, VOFFSET(vop_islocked), &a)); 1795 vop_post(vp, mp, mpsafe, FST_NO); 1796 return error; 1797 } 1798 1799 const int vop_pathconf_vp_offsets[] = { 1800 VOPARG_OFFSETOF(struct vop_pathconf_args,a_vp), 1801 VDESC_NO_OFFSET 1802 }; 1803 const struct vnodeop_desc vop_pathconf_desc = { 1804 VOP_PATHCONF_DESCOFFSET, 1805 "vop_pathconf", 1806 0, 1807 vop_pathconf_vp_offsets, 1808 VDESC_NO_OFFSET, 1809 VDESC_NO_OFFSET, 1810 VDESC_NO_OFFSET, 1811 }; 1812 int 1813 VOP_PATHCONF(struct vnode *vp, 1814 int name, 1815 register_t *retval) 1816 { 1817 int error; 1818 bool mpsafe; 1819 struct vop_pathconf_args a; 1820 struct mount *mp; 1821 a.a_desc = VDESC(vop_pathconf); 1822 a.a_vp = vp; 1823 a.a_name = name; 1824 a.a_retval = retval; 1825 assert_vop_locked(vp, "vop_pathconf: vp"); 1826 error = vop_pre(vp, &mp, &mpsafe, FST_NO); 1827 if (error) 1828 return error; 1829 error = (VCALL(vp, VOFFSET(vop_pathconf), &a)); 1830 vop_post(vp, mp, mpsafe, FST_NO); 1831 return error; 1832 } 1833 1834 const int vop_advlock_vp_offsets[] = { 1835 VOPARG_OFFSETOF(struct vop_advlock_args,a_vp), 1836 VDESC_NO_OFFSET 1837 }; 1838 const struct vnodeop_desc vop_advlock_desc = { 1839 VOP_ADVLOCK_DESCOFFSET, 1840 "vop_advlock", 1841 0, 1842 vop_advlock_vp_offsets, 1843 VDESC_NO_OFFSET, 1844 VDESC_NO_OFFSET, 1845 VDESC_NO_OFFSET, 1846 }; 1847 int 1848 VOP_ADVLOCK(struct vnode *vp, 1849 void *id, 1850 int op, 1851 struct flock *fl, 1852 int flags) 1853 { 1854 int error; 1855 bool mpsafe; 1856 struct vop_advlock_args a; 1857 struct mount *mp; 1858 a.a_desc = VDESC(vop_advlock); 1859 a.a_vp = vp; 1860 a.a_id = id; 1861 a.a_op = op; 1862 a.a_fl = fl; 1863 a.a_flags = flags; 1864 assert_vop_unlocked(vp, "vop_advlock: vp"); 1865 error = vop_pre(vp, &mp, &mpsafe, FST_NO); 1866 if (error) 1867 return error; 1868 error = (VCALL(vp, VOFFSET(vop_advlock), &a)); 1869 vop_post(vp, mp, mpsafe, FST_NO); 1870 return error; 1871 } 1872 1873 const int vop_whiteout_vp_offsets[] = { 1874 VOPARG_OFFSETOF(struct vop_whiteout_args,a_dvp), 1875 VDESC_NO_OFFSET 1876 }; 1877 const struct vnodeop_desc vop_whiteout_desc = { 1878 VOP_WHITEOUT_DESCOFFSET, 1879 "vop_whiteout", 1880 0, 1881 vop_whiteout_vp_offsets, 1882 VDESC_NO_OFFSET, 1883 VDESC_NO_OFFSET, 1884 VOPARG_OFFSETOF(struct vop_whiteout_args, a_cnp), 1885 }; 1886 int 1887 VOP_WHITEOUT(struct vnode *dvp, 1888 struct componentname *cnp, 1889 int flags) 1890 { 1891 int error; 1892 bool mpsafe; 1893 struct vop_whiteout_args a; 1894 struct mount *mp; 1895 a.a_desc = VDESC(vop_whiteout); 1896 a.a_dvp = dvp; 1897 a.a_cnp = cnp; 1898 a.a_flags = flags; 1899 assert_vop_elocked(dvp, "vop_whiteout: dvp"); 1900 error = vop_pre(dvp, &mp, &mpsafe, FST_NO); 1901 if (error) 1902 return error; 1903 error = (VCALL(dvp, VOFFSET(vop_whiteout), &a)); 1904 vop_post(dvp, mp, mpsafe, FST_NO); 1905 return error; 1906 } 1907 1908 const int vop_getpages_vp_offsets[] = { 1909 VOPARG_OFFSETOF(struct vop_getpages_args,a_vp), 1910 VDESC_NO_OFFSET 1911 }; 1912 const struct vnodeop_desc vop_getpages_desc = { 1913 VOP_GETPAGES_DESCOFFSET, 1914 "vop_getpages", 1915 0, 1916 vop_getpages_vp_offsets, 1917 VDESC_NO_OFFSET, 1918 VDESC_NO_OFFSET, 1919 VDESC_NO_OFFSET, 1920 }; 1921 int 1922 VOP_GETPAGES(struct vnode *vp, 1923 voff_t offset, 1924 struct vm_page **m, 1925 int *count, 1926 int centeridx, 1927 vm_prot_t access_type, 1928 int advice, 1929 int flags) 1930 { 1931 int error; 1932 bool mpsafe; 1933 struct vop_getpages_args a; 1934 struct mount *mp; 1935 a.a_desc = VDESC(vop_getpages); 1936 a.a_vp = vp; 1937 a.a_offset = offset; 1938 a.a_m = m; 1939 a.a_count = count; 1940 a.a_centeridx = centeridx; 1941 a.a_access_type = access_type; 1942 a.a_advice = advice; 1943 a.a_flags = flags; 1944 error = vop_pre(vp, &mp, &mpsafe, FST_NO); 1945 if (error) 1946 return error; 1947 error = (VCALL(vp, VOFFSET(vop_getpages), &a)); 1948 vop_post(vp, mp, mpsafe, FST_NO); 1949 return error; 1950 } 1951 1952 const int vop_putpages_vp_offsets[] = { 1953 VOPARG_OFFSETOF(struct vop_putpages_args,a_vp), 1954 VDESC_NO_OFFSET 1955 }; 1956 const struct vnodeop_desc vop_putpages_desc = { 1957 VOP_PUTPAGES_DESCOFFSET, 1958 "vop_putpages", 1959 0, 1960 vop_putpages_vp_offsets, 1961 VDESC_NO_OFFSET, 1962 VDESC_NO_OFFSET, 1963 VDESC_NO_OFFSET, 1964 }; 1965 int 1966 VOP_PUTPAGES(struct vnode *vp, 1967 voff_t offlo, 1968 voff_t offhi, 1969 int flags) 1970 { 1971 int error; 1972 bool mpsafe; 1973 struct vop_putpages_args a; 1974 struct mount *mp; 1975 a.a_desc = VDESC(vop_putpages); 1976 a.a_vp = vp; 1977 a.a_offlo = offlo; 1978 a.a_offhi = offhi; 1979 a.a_flags = flags; 1980 error = vop_pre(vp, &mp, &mpsafe, FST_NO); 1981 if (error) 1982 return error; 1983 error = (VCALL(vp, VOFFSET(vop_putpages), &a)); 1984 vop_post(vp, mp, mpsafe, FST_NO); 1985 return error; 1986 } 1987 1988 const int vop_getacl_vp_offsets[] = { 1989 VOPARG_OFFSETOF(struct vop_getacl_args,a_vp), 1990 VDESC_NO_OFFSET 1991 }; 1992 const struct vnodeop_desc vop_getacl_desc = { 1993 VOP_GETACL_DESCOFFSET, 1994 "vop_getacl", 1995 0, 1996 vop_getacl_vp_offsets, 1997 VDESC_NO_OFFSET, 1998 VOPARG_OFFSETOF(struct vop_getacl_args, a_cred), 1999 VDESC_NO_OFFSET, 2000 }; 2001 int 2002 VOP_GETACL(struct vnode *vp, 2003 acl_type_t type, 2004 struct acl *aclp, 2005 kauth_cred_t cred) 2006 { 2007 int error; 2008 bool mpsafe; 2009 struct vop_getacl_args a; 2010 struct mount *mp; 2011 a.a_desc = VDESC(vop_getacl); 2012 a.a_vp = vp; 2013 a.a_type = type; 2014 a.a_aclp = aclp; 2015 a.a_cred = cred; 2016 error = vop_pre(vp, &mp, &mpsafe, FST_YES); 2017 if (error) 2018 return error; 2019 error = (VCALL(vp, VOFFSET(vop_getacl), &a)); 2020 vop_post(vp, mp, mpsafe, FST_YES); 2021 return error; 2022 } 2023 2024 const int vop_setacl_vp_offsets[] = { 2025 VOPARG_OFFSETOF(struct vop_setacl_args,a_vp), 2026 VDESC_NO_OFFSET 2027 }; 2028 const struct vnodeop_desc vop_setacl_desc = { 2029 VOP_SETACL_DESCOFFSET, 2030 "vop_setacl", 2031 0, 2032 vop_setacl_vp_offsets, 2033 VDESC_NO_OFFSET, 2034 VOPARG_OFFSETOF(struct vop_setacl_args, a_cred), 2035 VDESC_NO_OFFSET, 2036 }; 2037 int 2038 VOP_SETACL(struct vnode *vp, 2039 acl_type_t type, 2040 struct acl *aclp, 2041 kauth_cred_t cred) 2042 { 2043 int error; 2044 bool mpsafe; 2045 struct vop_setacl_args a; 2046 struct mount *mp; 2047 a.a_desc = VDESC(vop_setacl); 2048 a.a_vp = vp; 2049 a.a_type = type; 2050 a.a_aclp = aclp; 2051 a.a_cred = cred; 2052 assert_vop_elocked(vp, "vop_setacl: vp"); 2053 error = vop_pre(vp, &mp, &mpsafe, FST_NO); 2054 if (error) 2055 return error; 2056 error = (VCALL(vp, VOFFSET(vop_setacl), &a)); 2057 vop_post(vp, mp, mpsafe, FST_NO); 2058 vop_setacl_post(&a, error); 2059 return error; 2060 } 2061 2062 const int vop_aclcheck_vp_offsets[] = { 2063 VOPARG_OFFSETOF(struct vop_aclcheck_args,a_vp), 2064 VDESC_NO_OFFSET 2065 }; 2066 const struct vnodeop_desc vop_aclcheck_desc = { 2067 VOP_ACLCHECK_DESCOFFSET, 2068 "vop_aclcheck", 2069 0, 2070 vop_aclcheck_vp_offsets, 2071 VDESC_NO_OFFSET, 2072 VOPARG_OFFSETOF(struct vop_aclcheck_args, a_cred), 2073 VDESC_NO_OFFSET, 2074 }; 2075 int 2076 VOP_ACLCHECK(struct vnode *vp, 2077 acl_type_t type, 2078 struct acl *aclp, 2079 kauth_cred_t cred) 2080 { 2081 int error; 2082 bool mpsafe; 2083 struct vop_aclcheck_args a; 2084 struct mount *mp; 2085 a.a_desc = VDESC(vop_aclcheck); 2086 a.a_vp = vp; 2087 a.a_type = type; 2088 a.a_aclp = aclp; 2089 a.a_cred = cred; 2090 error = vop_pre(vp, &mp, &mpsafe, FST_YES); 2091 if (error) 2092 return error; 2093 error = (VCALL(vp, VOFFSET(vop_aclcheck), &a)); 2094 vop_post(vp, mp, mpsafe, FST_YES); 2095 return error; 2096 } 2097 2098 const int vop_closeextattr_vp_offsets[] = { 2099 VOPARG_OFFSETOF(struct vop_closeextattr_args,a_vp), 2100 VDESC_NO_OFFSET 2101 }; 2102 const struct vnodeop_desc vop_closeextattr_desc = { 2103 VOP_CLOSEEXTATTR_DESCOFFSET, 2104 "vop_closeextattr", 2105 0, 2106 vop_closeextattr_vp_offsets, 2107 VDESC_NO_OFFSET, 2108 VOPARG_OFFSETOF(struct vop_closeextattr_args, a_cred), 2109 VDESC_NO_OFFSET, 2110 }; 2111 int 2112 VOP_CLOSEEXTATTR(struct vnode *vp, 2113 int commit, 2114 kauth_cred_t cred) 2115 { 2116 int error; 2117 bool mpsafe; 2118 struct vop_closeextattr_args a; 2119 struct mount *mp; 2120 a.a_desc = VDESC(vop_closeextattr); 2121 a.a_vp = vp; 2122 a.a_commit = commit; 2123 a.a_cred = cred; 2124 assert_vop_locked(vp, "vop_closeextattr: vp"); 2125 error = vop_pre(vp, &mp, &mpsafe, FST_NO); 2126 if (error) 2127 return error; 2128 error = (VCALL(vp, VOFFSET(vop_closeextattr), &a)); 2129 vop_post(vp, mp, mpsafe, FST_NO); 2130 return error; 2131 } 2132 2133 const int vop_getextattr_vp_offsets[] = { 2134 VOPARG_OFFSETOF(struct vop_getextattr_args,a_vp), 2135 VDESC_NO_OFFSET 2136 }; 2137 const struct vnodeop_desc vop_getextattr_desc = { 2138 VOP_GETEXTATTR_DESCOFFSET, 2139 "vop_getextattr", 2140 0, 2141 vop_getextattr_vp_offsets, 2142 VDESC_NO_OFFSET, 2143 VOPARG_OFFSETOF(struct vop_getextattr_args, a_cred), 2144 VDESC_NO_OFFSET, 2145 }; 2146 int 2147 VOP_GETEXTATTR(struct vnode *vp, 2148 int attrnamespace, 2149 const char *name, 2150 struct uio *uio, 2151 size_t *size, 2152 kauth_cred_t cred) 2153 { 2154 int error; 2155 bool mpsafe; 2156 struct vop_getextattr_args a; 2157 struct mount *mp; 2158 a.a_desc = VDESC(vop_getextattr); 2159 a.a_vp = vp; 2160 a.a_attrnamespace = attrnamespace; 2161 a.a_name = name; 2162 a.a_uio = uio; 2163 a.a_size = size; 2164 a.a_cred = cred; 2165 assert_vop_locked(vp, "vop_getextattr: vp"); 2166 error = vop_pre(vp, &mp, &mpsafe, FST_NO); 2167 if (error) 2168 return error; 2169 error = (VCALL(vp, VOFFSET(vop_getextattr), &a)); 2170 vop_post(vp, mp, mpsafe, FST_NO); 2171 return error; 2172 } 2173 2174 const int vop_listextattr_vp_offsets[] = { 2175 VOPARG_OFFSETOF(struct vop_listextattr_args,a_vp), 2176 VDESC_NO_OFFSET 2177 }; 2178 const struct vnodeop_desc vop_listextattr_desc = { 2179 VOP_LISTEXTATTR_DESCOFFSET, 2180 "vop_listextattr", 2181 0, 2182 vop_listextattr_vp_offsets, 2183 VDESC_NO_OFFSET, 2184 VOPARG_OFFSETOF(struct vop_listextattr_args, a_cred), 2185 VDESC_NO_OFFSET, 2186 }; 2187 int 2188 VOP_LISTEXTATTR(struct vnode *vp, 2189 int attrnamespace, 2190 struct uio *uio, 2191 size_t *size, 2192 int flag, 2193 kauth_cred_t cred) 2194 { 2195 int error; 2196 bool mpsafe; 2197 struct vop_listextattr_args a; 2198 struct mount *mp; 2199 a.a_desc = VDESC(vop_listextattr); 2200 a.a_vp = vp; 2201 a.a_attrnamespace = attrnamespace; 2202 a.a_uio = uio; 2203 a.a_size = size; 2204 a.a_flag = flag; 2205 a.a_cred = cred; 2206 assert_vop_locked(vp, "vop_listextattr: vp"); 2207 error = vop_pre(vp, &mp, &mpsafe, FST_NO); 2208 if (error) 2209 return error; 2210 error = (VCALL(vp, VOFFSET(vop_listextattr), &a)); 2211 vop_post(vp, mp, mpsafe, FST_NO); 2212 return error; 2213 } 2214 2215 const int vop_openextattr_vp_offsets[] = { 2216 VOPARG_OFFSETOF(struct vop_openextattr_args,a_vp), 2217 VDESC_NO_OFFSET 2218 }; 2219 const struct vnodeop_desc vop_openextattr_desc = { 2220 VOP_OPENEXTATTR_DESCOFFSET, 2221 "vop_openextattr", 2222 0, 2223 vop_openextattr_vp_offsets, 2224 VDESC_NO_OFFSET, 2225 VOPARG_OFFSETOF(struct vop_openextattr_args, a_cred), 2226 VDESC_NO_OFFSET, 2227 }; 2228 int 2229 VOP_OPENEXTATTR(struct vnode *vp, 2230 kauth_cred_t cred) 2231 { 2232 int error; 2233 bool mpsafe; 2234 struct vop_openextattr_args a; 2235 struct mount *mp; 2236 a.a_desc = VDESC(vop_openextattr); 2237 a.a_vp = vp; 2238 a.a_cred = cred; 2239 assert_vop_locked(vp, "vop_openextattr: vp"); 2240 error = vop_pre(vp, &mp, &mpsafe, FST_NO); 2241 if (error) 2242 return error; 2243 error = (VCALL(vp, VOFFSET(vop_openextattr), &a)); 2244 vop_post(vp, mp, mpsafe, FST_NO); 2245 return error; 2246 } 2247 2248 const int vop_deleteextattr_vp_offsets[] = { 2249 VOPARG_OFFSETOF(struct vop_deleteextattr_args,a_vp), 2250 VDESC_NO_OFFSET 2251 }; 2252 const struct vnodeop_desc vop_deleteextattr_desc = { 2253 VOP_DELETEEXTATTR_DESCOFFSET, 2254 "vop_deleteextattr", 2255 0, 2256 vop_deleteextattr_vp_offsets, 2257 VDESC_NO_OFFSET, 2258 VOPARG_OFFSETOF(struct vop_deleteextattr_args, a_cred), 2259 VDESC_NO_OFFSET, 2260 }; 2261 int 2262 VOP_DELETEEXTATTR(struct vnode *vp, 2263 int attrnamespace, 2264 const char *name, 2265 kauth_cred_t cred) 2266 { 2267 int error; 2268 bool mpsafe; 2269 struct vop_deleteextattr_args a; 2270 struct mount *mp; 2271 a.a_desc = VDESC(vop_deleteextattr); 2272 a.a_vp = vp; 2273 a.a_attrnamespace = attrnamespace; 2274 a.a_name = name; 2275 a.a_cred = cred; 2276 assert_vop_elocked(vp, "vop_deleteextattr: vp"); 2277 error = vop_pre(vp, &mp, &mpsafe, FST_NO); 2278 if (error) 2279 return error; 2280 error = (VCALL(vp, VOFFSET(vop_deleteextattr), &a)); 2281 vop_post(vp, mp, mpsafe, FST_NO); 2282 return error; 2283 } 2284 2285 const int vop_setextattr_vp_offsets[] = { 2286 VOPARG_OFFSETOF(struct vop_setextattr_args,a_vp), 2287 VDESC_NO_OFFSET 2288 }; 2289 const struct vnodeop_desc vop_setextattr_desc = { 2290 VOP_SETEXTATTR_DESCOFFSET, 2291 "vop_setextattr", 2292 0, 2293 vop_setextattr_vp_offsets, 2294 VDESC_NO_OFFSET, 2295 VOPARG_OFFSETOF(struct vop_setextattr_args, a_cred), 2296 VDESC_NO_OFFSET, 2297 }; 2298 int 2299 VOP_SETEXTATTR(struct vnode *vp, 2300 int attrnamespace, 2301 const char *name, 2302 struct uio *uio, 2303 kauth_cred_t cred) 2304 { 2305 int error; 2306 bool mpsafe; 2307 struct vop_setextattr_args a; 2308 struct mount *mp; 2309 a.a_desc = VDESC(vop_setextattr); 2310 a.a_vp = vp; 2311 a.a_attrnamespace = attrnamespace; 2312 a.a_name = name; 2313 a.a_uio = uio; 2314 a.a_cred = cred; 2315 assert_vop_elocked(vp, "vop_setextattr: vp"); 2316 error = vop_pre(vp, &mp, &mpsafe, FST_NO); 2317 if (error) 2318 return error; 2319 error = (VCALL(vp, VOFFSET(vop_setextattr), &a)); 2320 vop_post(vp, mp, mpsafe, FST_NO); 2321 return error; 2322 } 2323 2324 const struct vnodeop_desc * const vfs_op_descs[] = { 2325 &vop_default_desc, /* MUST BE FIRST */ 2326 2327 &vop_bwrite_desc, 2328 &vop_parsepath_desc, 2329 &vop_lookup_desc, 2330 &vop_create_desc, 2331 &vop_mknod_desc, 2332 &vop_open_desc, 2333 &vop_close_desc, 2334 &vop_access_desc, 2335 &vop_accessx_desc, 2336 &vop_getattr_desc, 2337 &vop_setattr_desc, 2338 &vop_read_desc, 2339 &vop_write_desc, 2340 &vop_fallocate_desc, 2341 &vop_fdiscard_desc, 2342 &vop_ioctl_desc, 2343 &vop_fcntl_desc, 2344 &vop_poll_desc, 2345 &vop_kqfilter_desc, 2346 &vop_revoke_desc, 2347 &vop_mmap_desc, 2348 &vop_fsync_desc, 2349 &vop_seek_desc, 2350 &vop_remove_desc, 2351 &vop_link_desc, 2352 &vop_rename_desc, 2353 &vop_mkdir_desc, 2354 &vop_rmdir_desc, 2355 &vop_symlink_desc, 2356 &vop_readdir_desc, 2357 &vop_readlink_desc, 2358 &vop_abortop_desc, 2359 &vop_inactive_desc, 2360 &vop_reclaim_desc, 2361 &vop_lock_desc, 2362 &vop_unlock_desc, 2363 &vop_bmap_desc, 2364 &vop_strategy_desc, 2365 &vop_print_desc, 2366 &vop_islocked_desc, 2367 &vop_pathconf_desc, 2368 &vop_advlock_desc, 2369 &vop_whiteout_desc, 2370 &vop_getpages_desc, 2371 &vop_putpages_desc, 2372 &vop_getacl_desc, 2373 &vop_setacl_desc, 2374 &vop_aclcheck_desc, 2375 &vop_closeextattr_desc, 2376 &vop_getextattr_desc, 2377 &vop_listextattr_desc, 2378 &vop_openextattr_desc, 2379 &vop_deleteextattr_desc, 2380 &vop_setextattr_desc, 2381 NULL 2382 }; 2383