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