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