1 /*- 2 * SPDX-License-Identifier: BSD-3-Clause 3 * 4 * Copyright (c) 1989, 1993 5 * The Regents of the University of California. All rights reserved. 6 * 7 * This code is derived from software contributed 8 * to Berkeley by John Heidemann of the UCLA Ficus project. 9 * 10 * Source: * @(#)i405_init.c 2.10 92/04/27 UCLA Ficus project 11 * 12 * Redistribution and use in source and binary forms, with or without 13 * modification, are permitted provided that the following conditions 14 * are met: 15 * 1. Redistributions of source code must retain the above copyright 16 * notice, this list of conditions and the following disclaimer. 17 * 2. Redistributions in binary form must reproduce the above copyright 18 * notice, this list of conditions and the following disclaimer in the 19 * documentation and/or other materials provided with the distribution. 20 * 3. Neither the name of the University nor the names of its contributors 21 * may be used to endorse or promote products derived from this software 22 * without specific prior written permission. 23 * 24 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 25 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 27 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 28 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 30 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 31 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 32 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 33 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 34 * SUCH DAMAGE. 35 */ 36 37 #include <sys/cdefs.h> 38 __FBSDID("$FreeBSD$"); 39 40 #include <sys/param.h> 41 #include <sys/systm.h> 42 #include <sys/bio.h> 43 #include <sys/buf.h> 44 #include <sys/conf.h> 45 #include <sys/event.h> 46 #include <sys/kernel.h> 47 #include <sys/limits.h> 48 #include <sys/lock.h> 49 #include <sys/lockf.h> 50 #include <sys/malloc.h> 51 #include <sys/mount.h> 52 #include <sys/namei.h> 53 #include <sys/rwlock.h> 54 #include <sys/fcntl.h> 55 #include <sys/unistd.h> 56 #include <sys/vnode.h> 57 #include <sys/dirent.h> 58 #include <sys/poll.h> 59 60 #include <security/mac/mac_framework.h> 61 62 #include <vm/vm.h> 63 #include <vm/vm_object.h> 64 #include <vm/vm_extern.h> 65 #include <vm/pmap.h> 66 #include <vm/vm_map.h> 67 #include <vm/vm_page.h> 68 #include <vm/vm_pager.h> 69 #include <vm/vnode_pager.h> 70 71 static int vop_nolookup(struct vop_lookup_args *); 72 static int vop_norename(struct vop_rename_args *); 73 static int vop_nostrategy(struct vop_strategy_args *); 74 static int get_next_dirent(struct vnode *vp, struct dirent **dpp, 75 char *dirbuf, int dirbuflen, off_t *off, 76 char **cpos, int *len, int *eofflag, 77 struct thread *td); 78 static int dirent_exists(struct vnode *vp, const char *dirname, 79 struct thread *td); 80 81 #define DIRENT_MINSIZE (sizeof(struct dirent) - (MAXNAMLEN+1) + 4) 82 83 static int vop_stdis_text(struct vop_is_text_args *ap); 84 static int vop_stdunset_text(struct vop_unset_text_args *ap); 85 static int vop_stdadd_writecount(struct vop_add_writecount_args *ap); 86 static int vop_stdcopy_file_range(struct vop_copy_file_range_args *ap); 87 static int vop_stdfdatasync(struct vop_fdatasync_args *ap); 88 static int vop_stdgetpages_async(struct vop_getpages_async_args *ap); 89 90 /* 91 * This vnode table stores what we want to do if the filesystem doesn't 92 * implement a particular VOP. 93 * 94 * If there is no specific entry here, we will return EOPNOTSUPP. 95 * 96 * Note that every filesystem has to implement either vop_access 97 * or vop_accessx; failing to do so will result in immediate crash 98 * due to stack overflow, as vop_stdaccess() calls vop_stdaccessx(), 99 * which calls vop_stdaccess() etc. 100 */ 101 102 struct vop_vector default_vnodeops = { 103 .vop_default = NULL, 104 .vop_bypass = VOP_EOPNOTSUPP, 105 106 .vop_access = vop_stdaccess, 107 .vop_accessx = vop_stdaccessx, 108 .vop_advise = vop_stdadvise, 109 .vop_advlock = vop_stdadvlock, 110 .vop_advlockasync = vop_stdadvlockasync, 111 .vop_advlockpurge = vop_stdadvlockpurge, 112 .vop_allocate = vop_stdallocate, 113 .vop_bmap = vop_stdbmap, 114 .vop_close = VOP_NULL, 115 .vop_fsync = VOP_NULL, 116 .vop_fdatasync = vop_stdfdatasync, 117 .vop_getpages = vop_stdgetpages, 118 .vop_getpages_async = vop_stdgetpages_async, 119 .vop_getwritemount = vop_stdgetwritemount, 120 .vop_inactive = VOP_NULL, 121 .vop_ioctl = VOP_ENOTTY, 122 .vop_kqfilter = vop_stdkqfilter, 123 .vop_islocked = vop_stdislocked, 124 .vop_lock1 = vop_stdlock, 125 .vop_lookup = vop_nolookup, 126 .vop_open = VOP_NULL, 127 .vop_pathconf = VOP_EINVAL, 128 .vop_poll = vop_nopoll, 129 .vop_putpages = vop_stdputpages, 130 .vop_readlink = VOP_EINVAL, 131 .vop_rename = vop_norename, 132 .vop_revoke = VOP_PANIC, 133 .vop_strategy = vop_nostrategy, 134 .vop_unlock = vop_stdunlock, 135 .vop_vptocnp = vop_stdvptocnp, 136 .vop_vptofh = vop_stdvptofh, 137 .vop_unp_bind = vop_stdunp_bind, 138 .vop_unp_connect = vop_stdunp_connect, 139 .vop_unp_detach = vop_stdunp_detach, 140 .vop_is_text = vop_stdis_text, 141 .vop_set_text = vop_stdset_text, 142 .vop_unset_text = vop_stdunset_text, 143 .vop_add_writecount = vop_stdadd_writecount, 144 .vop_copy_file_range = vop_stdcopy_file_range, 145 }; 146 147 /* 148 * Series of placeholder functions for various error returns for 149 * VOPs. 150 */ 151 152 int 153 vop_eopnotsupp(struct vop_generic_args *ap) 154 { 155 /* 156 printf("vop_notsupp[%s]\n", ap->a_desc->vdesc_name); 157 */ 158 159 return (EOPNOTSUPP); 160 } 161 162 int 163 vop_ebadf(struct vop_generic_args *ap) 164 { 165 166 return (EBADF); 167 } 168 169 int 170 vop_enotty(struct vop_generic_args *ap) 171 { 172 173 return (ENOTTY); 174 } 175 176 int 177 vop_einval(struct vop_generic_args *ap) 178 { 179 180 return (EINVAL); 181 } 182 183 int 184 vop_enoent(struct vop_generic_args *ap) 185 { 186 187 return (ENOENT); 188 } 189 190 int 191 vop_null(struct vop_generic_args *ap) 192 { 193 194 return (0); 195 } 196 197 /* 198 * Helper function to panic on some bad VOPs in some filesystems. 199 */ 200 int 201 vop_panic(struct vop_generic_args *ap) 202 { 203 204 panic("filesystem goof: vop_panic[%s]", ap->a_desc->vdesc_name); 205 } 206 207 /* 208 * vop_std<something> and vop_no<something> are default functions for use by 209 * filesystems that need the "default reasonable" implementation for a 210 * particular operation. 211 * 212 * The documentation for the operations they implement exists (if it exists) 213 * in the VOP_<SOMETHING>(9) manpage (all uppercase). 214 */ 215 216 /* 217 * Default vop for filesystems that do not support name lookup 218 */ 219 static int 220 vop_nolookup(ap) 221 struct vop_lookup_args /* { 222 struct vnode *a_dvp; 223 struct vnode **a_vpp; 224 struct componentname *a_cnp; 225 } */ *ap; 226 { 227 228 *ap->a_vpp = NULL; 229 return (ENOTDIR); 230 } 231 232 /* 233 * vop_norename: 234 * 235 * Handle unlock and reference counting for arguments of vop_rename 236 * for filesystems that do not implement rename operation. 237 */ 238 static int 239 vop_norename(struct vop_rename_args *ap) 240 { 241 242 vop_rename_fail(ap); 243 return (EOPNOTSUPP); 244 } 245 246 /* 247 * vop_nostrategy: 248 * 249 * Strategy routine for VFS devices that have none. 250 * 251 * BIO_ERROR and B_INVAL must be cleared prior to calling any strategy 252 * routine. Typically this is done for a BIO_READ strategy call. 253 * Typically B_INVAL is assumed to already be clear prior to a write 254 * and should not be cleared manually unless you just made the buffer 255 * invalid. BIO_ERROR should be cleared either way. 256 */ 257 258 static int 259 vop_nostrategy (struct vop_strategy_args *ap) 260 { 261 printf("No strategy for buffer at %p\n", ap->a_bp); 262 vn_printf(ap->a_vp, "vnode "); 263 ap->a_bp->b_ioflags |= BIO_ERROR; 264 ap->a_bp->b_error = EOPNOTSUPP; 265 bufdone(ap->a_bp); 266 return (EOPNOTSUPP); 267 } 268 269 static int 270 get_next_dirent(struct vnode *vp, struct dirent **dpp, char *dirbuf, 271 int dirbuflen, off_t *off, char **cpos, int *len, 272 int *eofflag, struct thread *td) 273 { 274 int error, reclen; 275 struct uio uio; 276 struct iovec iov; 277 struct dirent *dp; 278 279 KASSERT(VOP_ISLOCKED(vp), ("vp %p is not locked", vp)); 280 KASSERT(vp->v_type == VDIR, ("vp %p is not a directory", vp)); 281 282 if (*len == 0) { 283 iov.iov_base = dirbuf; 284 iov.iov_len = dirbuflen; 285 286 uio.uio_iov = &iov; 287 uio.uio_iovcnt = 1; 288 uio.uio_offset = *off; 289 uio.uio_resid = dirbuflen; 290 uio.uio_segflg = UIO_SYSSPACE; 291 uio.uio_rw = UIO_READ; 292 uio.uio_td = td; 293 294 *eofflag = 0; 295 296 #ifdef MAC 297 error = mac_vnode_check_readdir(td->td_ucred, vp); 298 if (error == 0) 299 #endif 300 error = VOP_READDIR(vp, &uio, td->td_ucred, eofflag, 301 NULL, NULL); 302 if (error) 303 return (error); 304 305 *off = uio.uio_offset; 306 307 *cpos = dirbuf; 308 *len = (dirbuflen - uio.uio_resid); 309 310 if (*len == 0) 311 return (ENOENT); 312 } 313 314 dp = (struct dirent *)(*cpos); 315 reclen = dp->d_reclen; 316 *dpp = dp; 317 318 /* check for malformed directory.. */ 319 if (reclen < DIRENT_MINSIZE) 320 return (EINVAL); 321 322 *cpos += reclen; 323 *len -= reclen; 324 325 return (0); 326 } 327 328 /* 329 * Check if a named file exists in a given directory vnode. 330 */ 331 static int 332 dirent_exists(struct vnode *vp, const char *dirname, struct thread *td) 333 { 334 char *dirbuf, *cpos; 335 int error, eofflag, dirbuflen, len, found; 336 off_t off; 337 struct dirent *dp; 338 struct vattr va; 339 340 KASSERT(VOP_ISLOCKED(vp), ("vp %p is not locked", vp)); 341 KASSERT(vp->v_type == VDIR, ("vp %p is not a directory", vp)); 342 343 found = 0; 344 345 error = VOP_GETATTR(vp, &va, td->td_ucred); 346 if (error) 347 return (found); 348 349 dirbuflen = DEV_BSIZE; 350 if (dirbuflen < va.va_blocksize) 351 dirbuflen = va.va_blocksize; 352 dirbuf = (char *)malloc(dirbuflen, M_TEMP, M_WAITOK); 353 354 off = 0; 355 len = 0; 356 do { 357 error = get_next_dirent(vp, &dp, dirbuf, dirbuflen, &off, 358 &cpos, &len, &eofflag, td); 359 if (error) 360 goto out; 361 362 if (dp->d_type != DT_WHT && dp->d_fileno != 0 && 363 strcmp(dp->d_name, dirname) == 0) { 364 found = 1; 365 goto out; 366 } 367 } while (len > 0 || !eofflag); 368 369 out: 370 free(dirbuf, M_TEMP); 371 return (found); 372 } 373 374 int 375 vop_stdaccess(struct vop_access_args *ap) 376 { 377 378 KASSERT((ap->a_accmode & ~(VEXEC | VWRITE | VREAD | VADMIN | 379 VAPPEND)) == 0, ("invalid bit in accmode")); 380 381 return (VOP_ACCESSX(ap->a_vp, ap->a_accmode, ap->a_cred, ap->a_td)); 382 } 383 384 int 385 vop_stdaccessx(struct vop_accessx_args *ap) 386 { 387 int error; 388 accmode_t accmode = ap->a_accmode; 389 390 error = vfs_unixify_accmode(&accmode); 391 if (error != 0) 392 return (error); 393 394 if (accmode == 0) 395 return (0); 396 397 return (VOP_ACCESS(ap->a_vp, accmode, ap->a_cred, ap->a_td)); 398 } 399 400 /* 401 * Advisory record locking support 402 */ 403 int 404 vop_stdadvlock(struct vop_advlock_args *ap) 405 { 406 struct vnode *vp; 407 struct vattr vattr; 408 int error; 409 410 vp = ap->a_vp; 411 if (ap->a_fl->l_whence == SEEK_END) { 412 /* 413 * The NFSv4 server must avoid doing a vn_lock() here, since it 414 * can deadlock the nfsd threads, due to a LOR. Fortunately 415 * the NFSv4 server always uses SEEK_SET and this code is 416 * only required for the SEEK_END case. 417 */ 418 vn_lock(vp, LK_SHARED | LK_RETRY); 419 error = VOP_GETATTR(vp, &vattr, curthread->td_ucred); 420 VOP_UNLOCK(vp, 0); 421 if (error) 422 return (error); 423 } else 424 vattr.va_size = 0; 425 426 return (lf_advlock(ap, &(vp->v_lockf), vattr.va_size)); 427 } 428 429 int 430 vop_stdadvlockasync(struct vop_advlockasync_args *ap) 431 { 432 struct vnode *vp; 433 struct vattr vattr; 434 int error; 435 436 vp = ap->a_vp; 437 if (ap->a_fl->l_whence == SEEK_END) { 438 /* The size argument is only needed for SEEK_END. */ 439 vn_lock(vp, LK_SHARED | LK_RETRY); 440 error = VOP_GETATTR(vp, &vattr, curthread->td_ucred); 441 VOP_UNLOCK(vp, 0); 442 if (error) 443 return (error); 444 } else 445 vattr.va_size = 0; 446 447 return (lf_advlockasync(ap, &(vp->v_lockf), vattr.va_size)); 448 } 449 450 int 451 vop_stdadvlockpurge(struct vop_advlockpurge_args *ap) 452 { 453 struct vnode *vp; 454 455 vp = ap->a_vp; 456 lf_purgelocks(vp, &vp->v_lockf); 457 return (0); 458 } 459 460 /* 461 * vop_stdpathconf: 462 * 463 * Standard implementation of POSIX pathconf, to get information about limits 464 * for a filesystem. 465 * Override per filesystem for the case where the filesystem has smaller 466 * limits. 467 */ 468 int 469 vop_stdpathconf(ap) 470 struct vop_pathconf_args /* { 471 struct vnode *a_vp; 472 int a_name; 473 int *a_retval; 474 } */ *ap; 475 { 476 477 switch (ap->a_name) { 478 case _PC_ASYNC_IO: 479 *ap->a_retval = _POSIX_ASYNCHRONOUS_IO; 480 return (0); 481 case _PC_PATH_MAX: 482 *ap->a_retval = PATH_MAX; 483 return (0); 484 case _PC_ACL_EXTENDED: 485 case _PC_ACL_NFS4: 486 case _PC_CAP_PRESENT: 487 case _PC_INF_PRESENT: 488 case _PC_MAC_PRESENT: 489 *ap->a_retval = 0; 490 return (0); 491 default: 492 return (EINVAL); 493 } 494 /* NOTREACHED */ 495 } 496 497 /* 498 * Standard lock, unlock and islocked functions. 499 */ 500 int 501 vop_stdlock(ap) 502 struct vop_lock1_args /* { 503 struct vnode *a_vp; 504 int a_flags; 505 char *file; 506 int line; 507 } */ *ap; 508 { 509 struct vnode *vp = ap->a_vp; 510 struct mtx *ilk; 511 512 ilk = VI_MTX(vp); 513 return (lockmgr_lock_fast_path(vp->v_vnlock, ap->a_flags, 514 &ilk->lock_object, ap->a_file, ap->a_line)); 515 } 516 517 /* See above. */ 518 int 519 vop_stdunlock(ap) 520 struct vop_unlock_args /* { 521 struct vnode *a_vp; 522 int a_flags; 523 } */ *ap; 524 { 525 struct vnode *vp = ap->a_vp; 526 struct mtx *ilk; 527 528 ilk = VI_MTX(vp); 529 return (lockmgr_unlock_fast_path(vp->v_vnlock, ap->a_flags, 530 &ilk->lock_object)); 531 } 532 533 /* See above. */ 534 int 535 vop_stdislocked(ap) 536 struct vop_islocked_args /* { 537 struct vnode *a_vp; 538 } */ *ap; 539 { 540 541 return (lockstatus(ap->a_vp->v_vnlock)); 542 } 543 544 /* 545 * Return true for select/poll. 546 */ 547 int 548 vop_nopoll(ap) 549 struct vop_poll_args /* { 550 struct vnode *a_vp; 551 int a_events; 552 struct ucred *a_cred; 553 struct thread *a_td; 554 } */ *ap; 555 { 556 557 return (poll_no_poll(ap->a_events)); 558 } 559 560 /* 561 * Implement poll for local filesystems that support it. 562 */ 563 int 564 vop_stdpoll(ap) 565 struct vop_poll_args /* { 566 struct vnode *a_vp; 567 int a_events; 568 struct ucred *a_cred; 569 struct thread *a_td; 570 } */ *ap; 571 { 572 if (ap->a_events & ~POLLSTANDARD) 573 return (vn_pollrecord(ap->a_vp, ap->a_td, ap->a_events)); 574 return (ap->a_events & (POLLIN | POLLOUT | POLLRDNORM | POLLWRNORM)); 575 } 576 577 /* 578 * Return our mount point, as we will take charge of the writes. 579 */ 580 int 581 vop_stdgetwritemount(ap) 582 struct vop_getwritemount_args /* { 583 struct vnode *a_vp; 584 struct mount **a_mpp; 585 } */ *ap; 586 { 587 struct mount *mp; 588 589 /* 590 * XXX Since this is called unlocked we may be recycled while 591 * attempting to ref the mount. If this is the case or mountpoint 592 * will be set to NULL. We only have to prevent this call from 593 * returning with a ref to an incorrect mountpoint. It is not 594 * harmful to return with a ref to our previous mountpoint. 595 */ 596 mp = ap->a_vp->v_mount; 597 if (mp != NULL) { 598 vfs_ref(mp); 599 if (mp != ap->a_vp->v_mount) { 600 vfs_rel(mp); 601 mp = NULL; 602 } 603 } 604 *(ap->a_mpp) = mp; 605 return (0); 606 } 607 608 /* 609 * If the file system doesn't implement VOP_BMAP, then return sensible defaults: 610 * - Return the vnode's bufobj instead of any underlying device's bufobj 611 * - Calculate the physical block number as if there were equal size 612 * consecutive blocks, but 613 * - Report no contiguous runs of blocks. 614 */ 615 int 616 vop_stdbmap(ap) 617 struct vop_bmap_args /* { 618 struct vnode *a_vp; 619 daddr_t a_bn; 620 struct bufobj **a_bop; 621 daddr_t *a_bnp; 622 int *a_runp; 623 int *a_runb; 624 } */ *ap; 625 { 626 627 if (ap->a_bop != NULL) 628 *ap->a_bop = &ap->a_vp->v_bufobj; 629 if (ap->a_bnp != NULL) 630 *ap->a_bnp = ap->a_bn * btodb(ap->a_vp->v_mount->mnt_stat.f_iosize); 631 if (ap->a_runp != NULL) 632 *ap->a_runp = 0; 633 if (ap->a_runb != NULL) 634 *ap->a_runb = 0; 635 return (0); 636 } 637 638 int 639 vop_stdfsync(ap) 640 struct vop_fsync_args /* { 641 struct vnode *a_vp; 642 int a_waitfor; 643 struct thread *a_td; 644 } */ *ap; 645 { 646 647 return (vn_fsync_buf(ap->a_vp, ap->a_waitfor)); 648 } 649 650 static int 651 vop_stdfdatasync(struct vop_fdatasync_args *ap) 652 { 653 654 return (VOP_FSYNC(ap->a_vp, MNT_WAIT, ap->a_td)); 655 } 656 657 int 658 vop_stdfdatasync_buf(struct vop_fdatasync_args *ap) 659 { 660 661 return (vn_fsync_buf(ap->a_vp, MNT_WAIT)); 662 } 663 664 /* XXX Needs good comment and more info in the manpage (VOP_GETPAGES(9)). */ 665 int 666 vop_stdgetpages(ap) 667 struct vop_getpages_args /* { 668 struct vnode *a_vp; 669 vm_page_t *a_m; 670 int a_count; 671 int *a_rbehind; 672 int *a_rahead; 673 } */ *ap; 674 { 675 676 return vnode_pager_generic_getpages(ap->a_vp, ap->a_m, 677 ap->a_count, ap->a_rbehind, ap->a_rahead, NULL, NULL); 678 } 679 680 static int 681 vop_stdgetpages_async(struct vop_getpages_async_args *ap) 682 { 683 int error; 684 685 error = VOP_GETPAGES(ap->a_vp, ap->a_m, ap->a_count, ap->a_rbehind, 686 ap->a_rahead); 687 ap->a_iodone(ap->a_arg, ap->a_m, ap->a_count, error); 688 return (error); 689 } 690 691 int 692 vop_stdkqfilter(struct vop_kqfilter_args *ap) 693 { 694 return vfs_kqfilter(ap); 695 } 696 697 /* XXX Needs good comment and more info in the manpage (VOP_PUTPAGES(9)). */ 698 int 699 vop_stdputpages(ap) 700 struct vop_putpages_args /* { 701 struct vnode *a_vp; 702 vm_page_t *a_m; 703 int a_count; 704 int a_sync; 705 int *a_rtvals; 706 } */ *ap; 707 { 708 709 return vnode_pager_generic_putpages(ap->a_vp, ap->a_m, ap->a_count, 710 ap->a_sync, ap->a_rtvals); 711 } 712 713 int 714 vop_stdvptofh(struct vop_vptofh_args *ap) 715 { 716 return (EOPNOTSUPP); 717 } 718 719 int 720 vop_stdvptocnp(struct vop_vptocnp_args *ap) 721 { 722 struct vnode *vp = ap->a_vp; 723 struct vnode **dvp = ap->a_vpp; 724 struct ucred *cred = ap->a_cred; 725 char *buf = ap->a_buf; 726 int *buflen = ap->a_buflen; 727 char *dirbuf, *cpos; 728 int i, error, eofflag, dirbuflen, flags, locked, len, covered; 729 off_t off; 730 ino_t fileno; 731 struct vattr va; 732 struct nameidata nd; 733 struct thread *td; 734 struct dirent *dp; 735 struct vnode *mvp; 736 737 i = *buflen; 738 error = 0; 739 covered = 0; 740 td = curthread; 741 742 if (vp->v_type != VDIR) 743 return (ENOENT); 744 745 error = VOP_GETATTR(vp, &va, cred); 746 if (error) 747 return (error); 748 749 VREF(vp); 750 locked = VOP_ISLOCKED(vp); 751 VOP_UNLOCK(vp, 0); 752 NDINIT_ATVP(&nd, LOOKUP, FOLLOW | LOCKSHARED | LOCKLEAF, UIO_SYSSPACE, 753 "..", vp, td); 754 flags = FREAD; 755 error = vn_open_cred(&nd, &flags, 0, VN_OPEN_NOAUDIT, cred, NULL); 756 if (error) { 757 vn_lock(vp, locked | LK_RETRY); 758 return (error); 759 } 760 NDFREE(&nd, NDF_ONLY_PNBUF); 761 762 mvp = *dvp = nd.ni_vp; 763 764 if (vp->v_mount != (*dvp)->v_mount && 765 ((*dvp)->v_vflag & VV_ROOT) && 766 ((*dvp)->v_mount->mnt_flag & MNT_UNION)) { 767 *dvp = (*dvp)->v_mount->mnt_vnodecovered; 768 VREF(mvp); 769 VOP_UNLOCK(mvp, 0); 770 vn_close(mvp, FREAD, cred, td); 771 VREF(*dvp); 772 vn_lock(*dvp, LK_SHARED | LK_RETRY); 773 covered = 1; 774 } 775 776 fileno = va.va_fileid; 777 778 dirbuflen = DEV_BSIZE; 779 if (dirbuflen < va.va_blocksize) 780 dirbuflen = va.va_blocksize; 781 dirbuf = (char *)malloc(dirbuflen, M_TEMP, M_WAITOK); 782 783 if ((*dvp)->v_type != VDIR) { 784 error = ENOENT; 785 goto out; 786 } 787 788 off = 0; 789 len = 0; 790 do { 791 /* call VOP_READDIR of parent */ 792 error = get_next_dirent(*dvp, &dp, dirbuf, dirbuflen, &off, 793 &cpos, &len, &eofflag, td); 794 if (error) 795 goto out; 796 797 if ((dp->d_type != DT_WHT) && 798 (dp->d_fileno == fileno)) { 799 if (covered) { 800 VOP_UNLOCK(*dvp, 0); 801 vn_lock(mvp, LK_SHARED | LK_RETRY); 802 if (dirent_exists(mvp, dp->d_name, td)) { 803 error = ENOENT; 804 VOP_UNLOCK(mvp, 0); 805 vn_lock(*dvp, LK_SHARED | LK_RETRY); 806 goto out; 807 } 808 VOP_UNLOCK(mvp, 0); 809 vn_lock(*dvp, LK_SHARED | LK_RETRY); 810 } 811 i -= dp->d_namlen; 812 813 if (i < 0) { 814 error = ENOMEM; 815 goto out; 816 } 817 if (dp->d_namlen == 1 && dp->d_name[0] == '.') { 818 error = ENOENT; 819 } else { 820 bcopy(dp->d_name, buf + i, dp->d_namlen); 821 error = 0; 822 } 823 goto out; 824 } 825 } while (len > 0 || !eofflag); 826 error = ENOENT; 827 828 out: 829 free(dirbuf, M_TEMP); 830 if (!error) { 831 *buflen = i; 832 vref(*dvp); 833 } 834 if (covered) { 835 vput(*dvp); 836 vrele(mvp); 837 } else { 838 VOP_UNLOCK(mvp, 0); 839 vn_close(mvp, FREAD, cred, td); 840 } 841 vn_lock(vp, locked | LK_RETRY); 842 return (error); 843 } 844 845 int 846 vop_stdallocate(struct vop_allocate_args *ap) 847 { 848 #ifdef __notyet__ 849 struct statfs *sfs; 850 off_t maxfilesize = 0; 851 #endif 852 struct iovec aiov; 853 struct vattr vattr, *vap; 854 struct uio auio; 855 off_t fsize, len, cur, offset; 856 uint8_t *buf; 857 struct thread *td; 858 struct vnode *vp; 859 size_t iosize; 860 int error; 861 862 buf = NULL; 863 error = 0; 864 td = curthread; 865 vap = &vattr; 866 vp = ap->a_vp; 867 len = *ap->a_len; 868 offset = *ap->a_offset; 869 870 error = VOP_GETATTR(vp, vap, td->td_ucred); 871 if (error != 0) 872 goto out; 873 fsize = vap->va_size; 874 iosize = vap->va_blocksize; 875 if (iosize == 0) 876 iosize = BLKDEV_IOSIZE; 877 if (iosize > MAXPHYS) 878 iosize = MAXPHYS; 879 buf = malloc(iosize, M_TEMP, M_WAITOK); 880 881 #ifdef __notyet__ 882 /* 883 * Check if the filesystem sets f_maxfilesize; if not use 884 * VOP_SETATTR to perform the check. 885 */ 886 sfs = malloc(sizeof(struct statfs), M_STATFS, M_WAITOK); 887 error = VFS_STATFS(vp->v_mount, sfs, td); 888 if (error == 0) 889 maxfilesize = sfs->f_maxfilesize; 890 free(sfs, M_STATFS); 891 if (error != 0) 892 goto out; 893 if (maxfilesize) { 894 if (offset > maxfilesize || len > maxfilesize || 895 offset + len > maxfilesize) { 896 error = EFBIG; 897 goto out; 898 } 899 } else 900 #endif 901 if (offset + len > vap->va_size) { 902 /* 903 * Test offset + len against the filesystem's maxfilesize. 904 */ 905 VATTR_NULL(vap); 906 vap->va_size = offset + len; 907 error = VOP_SETATTR(vp, vap, td->td_ucred); 908 if (error != 0) 909 goto out; 910 VATTR_NULL(vap); 911 vap->va_size = fsize; 912 error = VOP_SETATTR(vp, vap, td->td_ucred); 913 if (error != 0) 914 goto out; 915 } 916 917 for (;;) { 918 /* 919 * Read and write back anything below the nominal file 920 * size. There's currently no way outside the filesystem 921 * to know whether this area is sparse or not. 922 */ 923 cur = iosize; 924 if ((offset % iosize) != 0) 925 cur -= (offset % iosize); 926 if (cur > len) 927 cur = len; 928 if (offset < fsize) { 929 aiov.iov_base = buf; 930 aiov.iov_len = cur; 931 auio.uio_iov = &aiov; 932 auio.uio_iovcnt = 1; 933 auio.uio_offset = offset; 934 auio.uio_resid = cur; 935 auio.uio_segflg = UIO_SYSSPACE; 936 auio.uio_rw = UIO_READ; 937 auio.uio_td = td; 938 error = VOP_READ(vp, &auio, 0, td->td_ucred); 939 if (error != 0) 940 break; 941 if (auio.uio_resid > 0) { 942 bzero(buf + cur - auio.uio_resid, 943 auio.uio_resid); 944 } 945 } else { 946 bzero(buf, cur); 947 } 948 949 aiov.iov_base = buf; 950 aiov.iov_len = cur; 951 auio.uio_iov = &aiov; 952 auio.uio_iovcnt = 1; 953 auio.uio_offset = offset; 954 auio.uio_resid = cur; 955 auio.uio_segflg = UIO_SYSSPACE; 956 auio.uio_rw = UIO_WRITE; 957 auio.uio_td = td; 958 959 error = VOP_WRITE(vp, &auio, 0, td->td_ucred); 960 if (error != 0) 961 break; 962 963 len -= cur; 964 offset += cur; 965 if (len == 0) 966 break; 967 if (should_yield()) 968 break; 969 } 970 971 out: 972 *ap->a_len = len; 973 *ap->a_offset = offset; 974 free(buf, M_TEMP); 975 return (error); 976 } 977 978 int 979 vop_stdadvise(struct vop_advise_args *ap) 980 { 981 struct vnode *vp; 982 struct bufobj *bo; 983 daddr_t startn, endn; 984 off_t bstart, bend, start, end; 985 int bsize, error; 986 987 vp = ap->a_vp; 988 switch (ap->a_advice) { 989 case POSIX_FADV_WILLNEED: 990 /* 991 * Do nothing for now. Filesystems should provide a 992 * custom method which starts an asynchronous read of 993 * the requested region. 994 */ 995 error = 0; 996 break; 997 case POSIX_FADV_DONTNEED: 998 error = 0; 999 vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); 1000 if (vp->v_iflag & VI_DOOMED) { 1001 VOP_UNLOCK(vp, 0); 1002 break; 1003 } 1004 1005 /* 1006 * Round to block boundaries (and later possibly further to 1007 * page boundaries). Applications cannot reasonably be aware 1008 * of the boundaries, and the rounding must be to expand at 1009 * both extremities to cover enough. It still doesn't cover 1010 * read-ahead. For partial blocks, this gives unnecessary 1011 * discarding of buffers but is efficient enough since the 1012 * pages usually remain in VMIO for some time. 1013 */ 1014 bsize = vp->v_bufobj.bo_bsize; 1015 bstart = rounddown(ap->a_start, bsize); 1016 bend = roundup(ap->a_end, bsize); 1017 1018 /* 1019 * Deactivate pages in the specified range from the backing VM 1020 * object. Pages that are resident in the buffer cache will 1021 * remain wired until their corresponding buffers are released 1022 * below. 1023 */ 1024 if (vp->v_object != NULL) { 1025 start = trunc_page(bstart); 1026 end = round_page(bend); 1027 VM_OBJECT_RLOCK(vp->v_object); 1028 vm_object_page_noreuse(vp->v_object, OFF_TO_IDX(start), 1029 OFF_TO_IDX(end)); 1030 VM_OBJECT_RUNLOCK(vp->v_object); 1031 } 1032 1033 bo = &vp->v_bufobj; 1034 BO_RLOCK(bo); 1035 startn = bstart / bsize; 1036 endn = bend / bsize; 1037 error = bnoreuselist(&bo->bo_clean, bo, startn, endn); 1038 if (error == 0) 1039 error = bnoreuselist(&bo->bo_dirty, bo, startn, endn); 1040 BO_RUNLOCK(bo); 1041 VOP_UNLOCK(vp, 0); 1042 break; 1043 default: 1044 error = EINVAL; 1045 break; 1046 } 1047 return (error); 1048 } 1049 1050 int 1051 vop_stdunp_bind(struct vop_unp_bind_args *ap) 1052 { 1053 1054 ap->a_vp->v_unpcb = ap->a_unpcb; 1055 return (0); 1056 } 1057 1058 int 1059 vop_stdunp_connect(struct vop_unp_connect_args *ap) 1060 { 1061 1062 *ap->a_unpcb = ap->a_vp->v_unpcb; 1063 return (0); 1064 } 1065 1066 int 1067 vop_stdunp_detach(struct vop_unp_detach_args *ap) 1068 { 1069 1070 ap->a_vp->v_unpcb = NULL; 1071 return (0); 1072 } 1073 1074 static int 1075 vop_stdis_text(struct vop_is_text_args *ap) 1076 { 1077 1078 return (ap->a_vp->v_writecount < 0); 1079 } 1080 1081 int 1082 vop_stdset_text(struct vop_set_text_args *ap) 1083 { 1084 struct vnode *vp; 1085 int error; 1086 1087 vp = ap->a_vp; 1088 VI_LOCK(vp); 1089 if (vp->v_writecount > 0) { 1090 error = ETXTBSY; 1091 } else { 1092 vp->v_writecount--; 1093 error = 0; 1094 } 1095 VI_UNLOCK(vp); 1096 return (error); 1097 } 1098 1099 static int 1100 vop_stdunset_text(struct vop_unset_text_args *ap) 1101 { 1102 struct vnode *vp; 1103 int error; 1104 1105 vp = ap->a_vp; 1106 VI_LOCK(vp); 1107 if (vp->v_writecount < 0) { 1108 vp->v_writecount++; 1109 error = 0; 1110 } else { 1111 error = EINVAL; 1112 } 1113 VI_UNLOCK(vp); 1114 return (error); 1115 } 1116 1117 static int 1118 vop_stdadd_writecount(struct vop_add_writecount_args *ap) 1119 { 1120 struct vnode *vp; 1121 int error; 1122 1123 vp = ap->a_vp; 1124 VI_LOCK_FLAGS(vp, MTX_DUPOK); 1125 if (vp->v_writecount < 0) { 1126 error = ETXTBSY; 1127 } else { 1128 VNASSERT(vp->v_writecount + ap->a_inc >= 0, vp, 1129 ("neg writecount increment %d", ap->a_inc)); 1130 vp->v_writecount += ap->a_inc; 1131 error = 0; 1132 } 1133 VI_UNLOCK(vp); 1134 return (error); 1135 } 1136 1137 /* 1138 * vfs default ops 1139 * used to fill the vfs function table to get reasonable default return values. 1140 */ 1141 int 1142 vfs_stdroot (mp, flags, vpp) 1143 struct mount *mp; 1144 int flags; 1145 struct vnode **vpp; 1146 { 1147 1148 return (EOPNOTSUPP); 1149 } 1150 1151 int 1152 vfs_stdstatfs (mp, sbp) 1153 struct mount *mp; 1154 struct statfs *sbp; 1155 { 1156 1157 return (EOPNOTSUPP); 1158 } 1159 1160 int 1161 vfs_stdquotactl (mp, cmds, uid, arg) 1162 struct mount *mp; 1163 int cmds; 1164 uid_t uid; 1165 void *arg; 1166 { 1167 1168 return (EOPNOTSUPP); 1169 } 1170 1171 int 1172 vfs_stdsync(mp, waitfor) 1173 struct mount *mp; 1174 int waitfor; 1175 { 1176 struct vnode *vp, *mvp; 1177 struct thread *td; 1178 int error, lockreq, allerror = 0; 1179 1180 td = curthread; 1181 lockreq = LK_EXCLUSIVE | LK_INTERLOCK; 1182 if (waitfor != MNT_WAIT) 1183 lockreq |= LK_NOWAIT; 1184 /* 1185 * Force stale buffer cache information to be flushed. 1186 */ 1187 loop: 1188 MNT_VNODE_FOREACH_ALL(vp, mp, mvp) { 1189 if (vp->v_bufobj.bo_dirty.bv_cnt == 0) { 1190 VI_UNLOCK(vp); 1191 continue; 1192 } 1193 if ((error = vget(vp, lockreq, td)) != 0) { 1194 if (error == ENOENT) { 1195 MNT_VNODE_FOREACH_ALL_ABORT(mp, mvp); 1196 goto loop; 1197 } 1198 continue; 1199 } 1200 error = VOP_FSYNC(vp, waitfor, td); 1201 if (error) 1202 allerror = error; 1203 vput(vp); 1204 } 1205 return (allerror); 1206 } 1207 1208 int 1209 vfs_stdnosync (mp, waitfor) 1210 struct mount *mp; 1211 int waitfor; 1212 { 1213 1214 return (0); 1215 } 1216 1217 static int 1218 vop_stdcopy_file_range(struct vop_copy_file_range_args *ap) 1219 { 1220 int error; 1221 1222 error = vn_generic_copy_file_range(ap->a_invp, ap->a_inoffp, 1223 ap->a_outvp, ap->a_outoffp, ap->a_lenp, ap->a_flags, ap->a_incred, 1224 ap->a_outcred, ap->a_fsizetd); 1225 return (error); 1226 } 1227 1228 int 1229 vfs_stdvget (mp, ino, flags, vpp) 1230 struct mount *mp; 1231 ino_t ino; 1232 int flags; 1233 struct vnode **vpp; 1234 { 1235 1236 return (EOPNOTSUPP); 1237 } 1238 1239 int 1240 vfs_stdfhtovp (mp, fhp, flags, vpp) 1241 struct mount *mp; 1242 struct fid *fhp; 1243 int flags; 1244 struct vnode **vpp; 1245 { 1246 1247 return (EOPNOTSUPP); 1248 } 1249 1250 int 1251 vfs_stdinit (vfsp) 1252 struct vfsconf *vfsp; 1253 { 1254 1255 return (0); 1256 } 1257 1258 int 1259 vfs_stduninit (vfsp) 1260 struct vfsconf *vfsp; 1261 { 1262 1263 return(0); 1264 } 1265 1266 int 1267 vfs_stdextattrctl(mp, cmd, filename_vp, attrnamespace, attrname) 1268 struct mount *mp; 1269 int cmd; 1270 struct vnode *filename_vp; 1271 int attrnamespace; 1272 const char *attrname; 1273 { 1274 1275 if (filename_vp != NULL) 1276 VOP_UNLOCK(filename_vp, 0); 1277 return (EOPNOTSUPP); 1278 } 1279 1280 int 1281 vfs_stdsysctl(mp, op, req) 1282 struct mount *mp; 1283 fsctlop_t op; 1284 struct sysctl_req *req; 1285 { 1286 1287 return (EOPNOTSUPP); 1288 } 1289 1290 static vop_bypass_t * 1291 bp_by_off(struct vop_vector *vop, struct vop_generic_args *a) 1292 { 1293 1294 return (*(vop_bypass_t **)((char *)vop + a->a_desc->vdesc_vop_offset)); 1295 } 1296 1297 int 1298 vop_sigdefer(struct vop_vector *vop, struct vop_generic_args *a) 1299 { 1300 vop_bypass_t *bp; 1301 int prev_stops, rc; 1302 1303 for (; vop != NULL; vop = vop->vop_default) { 1304 bp = bp_by_off(vop, a); 1305 if (bp != NULL) 1306 break; 1307 1308 /* 1309 * Bypass is not really supported. It is done for 1310 * fallback to unimplemented vops in the default 1311 * vector. 1312 */ 1313 bp = vop->vop_bypass; 1314 if (bp != NULL) 1315 break; 1316 } 1317 MPASS(bp != NULL); 1318 1319 prev_stops = sigdeferstop(SIGDEFERSTOP_SILENT); 1320 rc = bp(a); 1321 sigallowstop(prev_stops); 1322 return (rc); 1323 } 1324