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/filio.h> 47 #include <sys/kernel.h> 48 #include <sys/limits.h> 49 #include <sys/lock.h> 50 #include <sys/lockf.h> 51 #include <sys/malloc.h> 52 #include <sys/mount.h> 53 #include <sys/namei.h> 54 #include <sys/rwlock.h> 55 #include <sys/fcntl.h> 56 #include <sys/unistd.h> 57 #include <sys/vnode.h> 58 #include <sys/dirent.h> 59 #include <sys/poll.h> 60 #include <sys/stat.h> 61 #include <security/audit/audit.h> 62 #include <sys/priv.h> 63 64 #include <security/mac/mac_framework.h> 65 66 #include <vm/vm.h> 67 #include <vm/vm_object.h> 68 #include <vm/vm_extern.h> 69 #include <vm/pmap.h> 70 #include <vm/vm_map.h> 71 #include <vm/vm_page.h> 72 #include <vm/vm_pager.h> 73 #include <vm/vnode_pager.h> 74 75 static int vop_nolookup(struct vop_lookup_args *); 76 static int vop_norename(struct vop_rename_args *); 77 static int vop_nostrategy(struct vop_strategy_args *); 78 static int get_next_dirent(struct vnode *vp, struct dirent **dpp, 79 char *dirbuf, int dirbuflen, off_t *off, 80 char **cpos, int *len, int *eofflag, 81 struct thread *td); 82 static int dirent_exists(struct vnode *vp, const char *dirname, 83 struct thread *td); 84 85 #define DIRENT_MINSIZE (sizeof(struct dirent) - (MAXNAMLEN+1) + 4) 86 87 static int vop_stdis_text(struct vop_is_text_args *ap); 88 static int vop_stdunset_text(struct vop_unset_text_args *ap); 89 static int vop_stdadd_writecount(struct vop_add_writecount_args *ap); 90 static int vop_stdcopy_file_range(struct vop_copy_file_range_args *ap); 91 static int vop_stdfdatasync(struct vop_fdatasync_args *ap); 92 static int vop_stdgetpages_async(struct vop_getpages_async_args *ap); 93 static int vop_stdread_pgcache(struct vop_read_pgcache_args *ap); 94 static int vop_stdstat(struct vop_stat_args *ap); 95 static int vop_stdvput_pair(struct vop_vput_pair_args *ap); 96 97 /* 98 * This vnode table stores what we want to do if the filesystem doesn't 99 * implement a particular VOP. 100 * 101 * If there is no specific entry here, we will return EOPNOTSUPP. 102 * 103 * Note that every filesystem has to implement either vop_access 104 * or vop_accessx; failing to do so will result in immediate crash 105 * due to stack overflow, as vop_stdaccess() calls vop_stdaccessx(), 106 * which calls vop_stdaccess() etc. 107 */ 108 109 struct vop_vector default_vnodeops = { 110 .vop_default = NULL, 111 .vop_bypass = VOP_EOPNOTSUPP, 112 113 .vop_access = vop_stdaccess, 114 .vop_accessx = vop_stdaccessx, 115 .vop_advise = vop_stdadvise, 116 .vop_advlock = vop_stdadvlock, 117 .vop_advlockasync = vop_stdadvlockasync, 118 .vop_advlockpurge = vop_stdadvlockpurge, 119 .vop_allocate = vop_stdallocate, 120 .vop_deallocate = vop_stddeallocate, 121 .vop_bmap = vop_stdbmap, 122 .vop_close = VOP_NULL, 123 .vop_fsync = VOP_NULL, 124 .vop_stat = vop_stdstat, 125 .vop_fdatasync = vop_stdfdatasync, 126 .vop_getpages = vop_stdgetpages, 127 .vop_getpages_async = vop_stdgetpages_async, 128 .vop_getwritemount = vop_stdgetwritemount, 129 .vop_inactive = VOP_NULL, 130 .vop_need_inactive = vop_stdneed_inactive, 131 .vop_ioctl = vop_stdioctl, 132 .vop_kqfilter = vop_stdkqfilter, 133 .vop_islocked = vop_stdislocked, 134 .vop_lock1 = vop_stdlock, 135 .vop_lookup = vop_nolookup, 136 .vop_open = VOP_NULL, 137 .vop_pathconf = VOP_EINVAL, 138 .vop_poll = vop_nopoll, 139 .vop_putpages = vop_stdputpages, 140 .vop_readlink = VOP_EINVAL, 141 .vop_read_pgcache = vop_stdread_pgcache, 142 .vop_rename = vop_norename, 143 .vop_revoke = VOP_PANIC, 144 .vop_strategy = vop_nostrategy, 145 .vop_unlock = vop_stdunlock, 146 .vop_vptocnp = vop_stdvptocnp, 147 .vop_vptofh = vop_stdvptofh, 148 .vop_unp_bind = vop_stdunp_bind, 149 .vop_unp_connect = vop_stdunp_connect, 150 .vop_unp_detach = vop_stdunp_detach, 151 .vop_is_text = vop_stdis_text, 152 .vop_set_text = vop_stdset_text, 153 .vop_unset_text = vop_stdunset_text, 154 .vop_add_writecount = vop_stdadd_writecount, 155 .vop_copy_file_range = vop_stdcopy_file_range, 156 .vop_vput_pair = vop_stdvput_pair, 157 }; 158 VFS_VOP_VECTOR_REGISTER(default_vnodeops); 159 160 /* 161 * Series of placeholder functions for various error returns for 162 * VOPs. 163 */ 164 165 int 166 vop_eopnotsupp(struct vop_generic_args *ap) 167 { 168 /* 169 printf("vop_notsupp[%s]\n", ap->a_desc->vdesc_name); 170 */ 171 172 return (EOPNOTSUPP); 173 } 174 175 int 176 vop_ebadf(struct vop_generic_args *ap) 177 { 178 179 return (EBADF); 180 } 181 182 int 183 vop_enotty(struct vop_generic_args *ap) 184 { 185 186 return (ENOTTY); 187 } 188 189 int 190 vop_einval(struct vop_generic_args *ap) 191 { 192 193 return (EINVAL); 194 } 195 196 int 197 vop_enoent(struct vop_generic_args *ap) 198 { 199 200 return (ENOENT); 201 } 202 203 int 204 vop_eagain(struct vop_generic_args *ap) 205 { 206 207 return (EAGAIN); 208 } 209 210 int 211 vop_null(struct vop_generic_args *ap) 212 { 213 214 return (0); 215 } 216 217 /* 218 * Helper function to panic on some bad VOPs in some filesystems. 219 */ 220 int 221 vop_panic(struct vop_generic_args *ap) 222 { 223 224 panic("filesystem goof: vop_panic[%s]", ap->a_desc->vdesc_name); 225 } 226 227 /* 228 * vop_std<something> and vop_no<something> are default functions for use by 229 * filesystems that need the "default reasonable" implementation for a 230 * particular operation. 231 * 232 * The documentation for the operations they implement exists (if it exists) 233 * in the VOP_<SOMETHING>(9) manpage (all uppercase). 234 */ 235 236 /* 237 * Default vop for filesystems that do not support name lookup 238 */ 239 static int 240 vop_nolookup(ap) 241 struct vop_lookup_args /* { 242 struct vnode *a_dvp; 243 struct vnode **a_vpp; 244 struct componentname *a_cnp; 245 } */ *ap; 246 { 247 248 *ap->a_vpp = NULL; 249 return (ENOTDIR); 250 } 251 252 /* 253 * vop_norename: 254 * 255 * Handle unlock and reference counting for arguments of vop_rename 256 * for filesystems that do not implement rename operation. 257 */ 258 static int 259 vop_norename(struct vop_rename_args *ap) 260 { 261 262 vop_rename_fail(ap); 263 return (EOPNOTSUPP); 264 } 265 266 /* 267 * vop_nostrategy: 268 * 269 * Strategy routine for VFS devices that have none. 270 * 271 * BIO_ERROR and B_INVAL must be cleared prior to calling any strategy 272 * routine. Typically this is done for a BIO_READ strategy call. 273 * Typically B_INVAL is assumed to already be clear prior to a write 274 * and should not be cleared manually unless you just made the buffer 275 * invalid. BIO_ERROR should be cleared either way. 276 */ 277 278 static int 279 vop_nostrategy (struct vop_strategy_args *ap) 280 { 281 printf("No strategy for buffer at %p\n", ap->a_bp); 282 vn_printf(ap->a_vp, "vnode "); 283 ap->a_bp->b_ioflags |= BIO_ERROR; 284 ap->a_bp->b_error = EOPNOTSUPP; 285 bufdone(ap->a_bp); 286 return (EOPNOTSUPP); 287 } 288 289 static int 290 get_next_dirent(struct vnode *vp, struct dirent **dpp, char *dirbuf, 291 int dirbuflen, off_t *off, char **cpos, int *len, 292 int *eofflag, struct thread *td) 293 { 294 int error, reclen; 295 struct uio uio; 296 struct iovec iov; 297 struct dirent *dp; 298 299 KASSERT(VOP_ISLOCKED(vp), ("vp %p is not locked", vp)); 300 KASSERT(vp->v_type == VDIR, ("vp %p is not a directory", vp)); 301 302 if (*len == 0) { 303 iov.iov_base = dirbuf; 304 iov.iov_len = dirbuflen; 305 306 uio.uio_iov = &iov; 307 uio.uio_iovcnt = 1; 308 uio.uio_offset = *off; 309 uio.uio_resid = dirbuflen; 310 uio.uio_segflg = UIO_SYSSPACE; 311 uio.uio_rw = UIO_READ; 312 uio.uio_td = td; 313 314 *eofflag = 0; 315 316 #ifdef MAC 317 error = mac_vnode_check_readdir(td->td_ucred, vp); 318 if (error == 0) 319 #endif 320 error = VOP_READDIR(vp, &uio, td->td_ucred, eofflag, 321 NULL, NULL); 322 if (error) 323 return (error); 324 325 *off = uio.uio_offset; 326 327 *cpos = dirbuf; 328 *len = (dirbuflen - uio.uio_resid); 329 330 if (*len == 0) 331 return (ENOENT); 332 } 333 334 dp = (struct dirent *)(*cpos); 335 reclen = dp->d_reclen; 336 *dpp = dp; 337 338 /* check for malformed directory.. */ 339 if (reclen < DIRENT_MINSIZE) 340 return (EINVAL); 341 342 *cpos += reclen; 343 *len -= reclen; 344 345 return (0); 346 } 347 348 /* 349 * Check if a named file exists in a given directory vnode. 350 */ 351 static int 352 dirent_exists(struct vnode *vp, const char *dirname, struct thread *td) 353 { 354 char *dirbuf, *cpos; 355 int error, eofflag, dirbuflen, len, found; 356 off_t off; 357 struct dirent *dp; 358 struct vattr va; 359 360 KASSERT(VOP_ISLOCKED(vp), ("vp %p is not locked", vp)); 361 KASSERT(vp->v_type == VDIR, ("vp %p is not a directory", vp)); 362 363 found = 0; 364 365 error = VOP_GETATTR(vp, &va, td->td_ucred); 366 if (error) 367 return (found); 368 369 dirbuflen = DEV_BSIZE; 370 if (dirbuflen < va.va_blocksize) 371 dirbuflen = va.va_blocksize; 372 dirbuf = (char *)malloc(dirbuflen, M_TEMP, M_WAITOK); 373 374 off = 0; 375 len = 0; 376 do { 377 error = get_next_dirent(vp, &dp, dirbuf, dirbuflen, &off, 378 &cpos, &len, &eofflag, td); 379 if (error) 380 goto out; 381 382 if (dp->d_type != DT_WHT && dp->d_fileno != 0 && 383 strcmp(dp->d_name, dirname) == 0) { 384 found = 1; 385 goto out; 386 } 387 } while (len > 0 || !eofflag); 388 389 out: 390 free(dirbuf, M_TEMP); 391 return (found); 392 } 393 394 int 395 vop_stdaccess(struct vop_access_args *ap) 396 { 397 398 KASSERT((ap->a_accmode & ~(VEXEC | VWRITE | VREAD | VADMIN | 399 VAPPEND)) == 0, ("invalid bit in accmode")); 400 401 return (VOP_ACCESSX(ap->a_vp, ap->a_accmode, ap->a_cred, ap->a_td)); 402 } 403 404 int 405 vop_stdaccessx(struct vop_accessx_args *ap) 406 { 407 int error; 408 accmode_t accmode = ap->a_accmode; 409 410 error = vfs_unixify_accmode(&accmode); 411 if (error != 0) 412 return (error); 413 414 if (accmode == 0) 415 return (0); 416 417 return (VOP_ACCESS(ap->a_vp, accmode, ap->a_cred, ap->a_td)); 418 } 419 420 /* 421 * Advisory record locking support 422 */ 423 int 424 vop_stdadvlock(struct vop_advlock_args *ap) 425 { 426 struct vnode *vp; 427 struct mount *mp; 428 struct vattr vattr; 429 int error; 430 431 vp = ap->a_vp; 432 433 /* 434 * Provide atomicity of open(O_CREAT | O_EXCL | O_EXLOCK) for 435 * local filesystems. See vn_open_cred() for reciprocal part. 436 */ 437 mp = vp->v_mount; 438 if (mp != NULL && (mp->mnt_flag & MNT_LOCAL) != 0 && 439 ap->a_op == F_SETLK && (ap->a_flags & F_FIRSTOPEN) == 0) { 440 VI_LOCK(vp); 441 while ((vp->v_iflag & VI_FOPENING) != 0) 442 msleep(vp, VI_MTX(vp), PLOCK, "lockfo", 0); 443 VI_UNLOCK(vp); 444 } 445 446 if (ap->a_fl->l_whence == SEEK_END) { 447 /* 448 * The NFSv4 server must avoid doing a vn_lock() here, since it 449 * can deadlock the nfsd threads, due to a LOR. Fortunately 450 * the NFSv4 server always uses SEEK_SET and this code is 451 * only required for the SEEK_END case. 452 */ 453 vn_lock(vp, LK_SHARED | LK_RETRY); 454 error = VOP_GETATTR(vp, &vattr, curthread->td_ucred); 455 VOP_UNLOCK(vp); 456 if (error) 457 return (error); 458 } else 459 vattr.va_size = 0; 460 461 return (lf_advlock(ap, &(vp->v_lockf), vattr.va_size)); 462 } 463 464 int 465 vop_stdadvlockasync(struct vop_advlockasync_args *ap) 466 { 467 struct vnode *vp; 468 struct vattr vattr; 469 int error; 470 471 vp = ap->a_vp; 472 if (ap->a_fl->l_whence == SEEK_END) { 473 /* The size argument is only needed for SEEK_END. */ 474 vn_lock(vp, LK_SHARED | LK_RETRY); 475 error = VOP_GETATTR(vp, &vattr, curthread->td_ucred); 476 VOP_UNLOCK(vp); 477 if (error) 478 return (error); 479 } else 480 vattr.va_size = 0; 481 482 return (lf_advlockasync(ap, &(vp->v_lockf), vattr.va_size)); 483 } 484 485 int 486 vop_stdadvlockpurge(struct vop_advlockpurge_args *ap) 487 { 488 struct vnode *vp; 489 490 vp = ap->a_vp; 491 lf_purgelocks(vp, &vp->v_lockf); 492 return (0); 493 } 494 495 /* 496 * vop_stdpathconf: 497 * 498 * Standard implementation of POSIX pathconf, to get information about limits 499 * for a filesystem. 500 * Override per filesystem for the case where the filesystem has smaller 501 * limits. 502 */ 503 int 504 vop_stdpathconf(ap) 505 struct vop_pathconf_args /* { 506 struct vnode *a_vp; 507 int a_name; 508 int *a_retval; 509 } */ *ap; 510 { 511 512 switch (ap->a_name) { 513 case _PC_ASYNC_IO: 514 *ap->a_retval = _POSIX_ASYNCHRONOUS_IO; 515 return (0); 516 case _PC_PATH_MAX: 517 *ap->a_retval = PATH_MAX; 518 return (0); 519 case _PC_ACL_EXTENDED: 520 case _PC_ACL_NFS4: 521 case _PC_CAP_PRESENT: 522 case _PC_DEALLOC_PRESENT: 523 case _PC_INF_PRESENT: 524 case _PC_MAC_PRESENT: 525 *ap->a_retval = 0; 526 return (0); 527 default: 528 return (EINVAL); 529 } 530 /* NOTREACHED */ 531 } 532 533 /* 534 * Standard lock, unlock and islocked functions. 535 */ 536 int 537 vop_stdlock(ap) 538 struct vop_lock1_args /* { 539 struct vnode *a_vp; 540 int a_flags; 541 char *file; 542 int line; 543 } */ *ap; 544 { 545 struct vnode *vp = ap->a_vp; 546 struct mtx *ilk; 547 548 ilk = VI_MTX(vp); 549 return (lockmgr_lock_flags(vp->v_vnlock, ap->a_flags, 550 &ilk->lock_object, ap->a_file, ap->a_line)); 551 } 552 553 /* See above. */ 554 int 555 vop_stdunlock(ap) 556 struct vop_unlock_args /* { 557 struct vnode *a_vp; 558 } */ *ap; 559 { 560 struct vnode *vp = ap->a_vp; 561 562 return (lockmgr_unlock(vp->v_vnlock)); 563 } 564 565 /* See above. */ 566 int 567 vop_stdislocked(ap) 568 struct vop_islocked_args /* { 569 struct vnode *a_vp; 570 } */ *ap; 571 { 572 573 return (lockstatus(ap->a_vp->v_vnlock)); 574 } 575 576 /* 577 * Variants of the above set. 578 * 579 * Differences are: 580 * - shared locking disablement is not supported 581 * - v_vnlock pointer is not honored 582 */ 583 int 584 vop_lock(ap) 585 struct vop_lock1_args /* { 586 struct vnode *a_vp; 587 int a_flags; 588 char *file; 589 int line; 590 } */ *ap; 591 { 592 struct vnode *vp = ap->a_vp; 593 int flags = ap->a_flags; 594 struct mtx *ilk; 595 596 MPASS(vp->v_vnlock == &vp->v_lock); 597 598 if (__predict_false((flags & ~(LK_TYPE_MASK | LK_NODDLKTREAT | LK_RETRY)) != 0)) 599 goto other; 600 601 switch (flags & LK_TYPE_MASK) { 602 case LK_SHARED: 603 return (lockmgr_slock(&vp->v_lock, flags, ap->a_file, ap->a_line)); 604 case LK_EXCLUSIVE: 605 return (lockmgr_xlock(&vp->v_lock, flags, ap->a_file, ap->a_line)); 606 } 607 other: 608 ilk = VI_MTX(vp); 609 return (lockmgr_lock_flags(&vp->v_lock, flags, 610 &ilk->lock_object, ap->a_file, ap->a_line)); 611 } 612 613 int 614 vop_unlock(ap) 615 struct vop_unlock_args /* { 616 struct vnode *a_vp; 617 } */ *ap; 618 { 619 struct vnode *vp = ap->a_vp; 620 621 MPASS(vp->v_vnlock == &vp->v_lock); 622 623 return (lockmgr_unlock(&vp->v_lock)); 624 } 625 626 int 627 vop_islocked(ap) 628 struct vop_islocked_args /* { 629 struct vnode *a_vp; 630 } */ *ap; 631 { 632 struct vnode *vp = ap->a_vp; 633 634 MPASS(vp->v_vnlock == &vp->v_lock); 635 636 return (lockstatus(&vp->v_lock)); 637 } 638 639 /* 640 * Return true for select/poll. 641 */ 642 int 643 vop_nopoll(ap) 644 struct vop_poll_args /* { 645 struct vnode *a_vp; 646 int a_events; 647 struct ucred *a_cred; 648 struct thread *a_td; 649 } */ *ap; 650 { 651 652 if (ap->a_events & ~POLLSTANDARD) 653 return (POLLNVAL); 654 return (ap->a_events & (POLLIN | POLLOUT | POLLRDNORM | POLLWRNORM)); 655 } 656 657 /* 658 * Implement poll for local filesystems that support it. 659 */ 660 int 661 vop_stdpoll(ap) 662 struct vop_poll_args /* { 663 struct vnode *a_vp; 664 int a_events; 665 struct ucred *a_cred; 666 struct thread *a_td; 667 } */ *ap; 668 { 669 if (ap->a_events & ~POLLSTANDARD) 670 return (vn_pollrecord(ap->a_vp, ap->a_td, ap->a_events)); 671 return (ap->a_events & (POLLIN | POLLOUT | POLLRDNORM | POLLWRNORM)); 672 } 673 674 /* 675 * Return our mount point, as we will take charge of the writes. 676 */ 677 int 678 vop_stdgetwritemount(ap) 679 struct vop_getwritemount_args /* { 680 struct vnode *a_vp; 681 struct mount **a_mpp; 682 } */ *ap; 683 { 684 struct mount *mp; 685 struct vnode *vp; 686 687 /* 688 * Note that having a reference does not prevent forced unmount from 689 * setting ->v_mount to NULL after the lock gets released. This is of 690 * no consequence for typical consumers (most notably vn_start_write) 691 * since in this case the vnode is VIRF_DOOMED. Unmount might have 692 * progressed far enough that its completion is only delayed by the 693 * reference obtained here. The consumer only needs to concern itself 694 * with releasing it. 695 */ 696 vp = ap->a_vp; 697 mp = vfs_ref_from_vp(vp); 698 *(ap->a_mpp) = mp; 699 return (0); 700 } 701 702 /* 703 * If the file system doesn't implement VOP_BMAP, then return sensible defaults: 704 * - Return the vnode's bufobj instead of any underlying device's bufobj 705 * - Calculate the physical block number as if there were equal size 706 * consecutive blocks, but 707 * - Report no contiguous runs of blocks. 708 */ 709 int 710 vop_stdbmap(ap) 711 struct vop_bmap_args /* { 712 struct vnode *a_vp; 713 daddr_t a_bn; 714 struct bufobj **a_bop; 715 daddr_t *a_bnp; 716 int *a_runp; 717 int *a_runb; 718 } */ *ap; 719 { 720 721 if (ap->a_bop != NULL) 722 *ap->a_bop = &ap->a_vp->v_bufobj; 723 if (ap->a_bnp != NULL) 724 *ap->a_bnp = ap->a_bn * btodb(ap->a_vp->v_mount->mnt_stat.f_iosize); 725 if (ap->a_runp != NULL) 726 *ap->a_runp = 0; 727 if (ap->a_runb != NULL) 728 *ap->a_runb = 0; 729 return (0); 730 } 731 732 int 733 vop_stdfsync(ap) 734 struct vop_fsync_args /* { 735 struct vnode *a_vp; 736 int a_waitfor; 737 struct thread *a_td; 738 } */ *ap; 739 { 740 741 return (vn_fsync_buf(ap->a_vp, ap->a_waitfor)); 742 } 743 744 static int 745 vop_stdfdatasync(struct vop_fdatasync_args *ap) 746 { 747 748 return (VOP_FSYNC(ap->a_vp, MNT_WAIT, ap->a_td)); 749 } 750 751 int 752 vop_stdfdatasync_buf(struct vop_fdatasync_args *ap) 753 { 754 755 return (vn_fsync_buf(ap->a_vp, MNT_WAIT)); 756 } 757 758 /* XXX Needs good comment and more info in the manpage (VOP_GETPAGES(9)). */ 759 int 760 vop_stdgetpages(ap) 761 struct vop_getpages_args /* { 762 struct vnode *a_vp; 763 vm_page_t *a_m; 764 int a_count; 765 int *a_rbehind; 766 int *a_rahead; 767 } */ *ap; 768 { 769 770 return vnode_pager_generic_getpages(ap->a_vp, ap->a_m, 771 ap->a_count, ap->a_rbehind, ap->a_rahead, NULL, NULL); 772 } 773 774 static int 775 vop_stdgetpages_async(struct vop_getpages_async_args *ap) 776 { 777 int error; 778 779 error = VOP_GETPAGES(ap->a_vp, ap->a_m, ap->a_count, ap->a_rbehind, 780 ap->a_rahead); 781 if (ap->a_iodone != NULL) 782 ap->a_iodone(ap->a_arg, ap->a_m, ap->a_count, error); 783 return (error); 784 } 785 786 int 787 vop_stdkqfilter(struct vop_kqfilter_args *ap) 788 { 789 return vfs_kqfilter(ap); 790 } 791 792 /* XXX Needs good comment and more info in the manpage (VOP_PUTPAGES(9)). */ 793 int 794 vop_stdputpages(ap) 795 struct vop_putpages_args /* { 796 struct vnode *a_vp; 797 vm_page_t *a_m; 798 int a_count; 799 int a_sync; 800 int *a_rtvals; 801 } */ *ap; 802 { 803 804 return vnode_pager_generic_putpages(ap->a_vp, ap->a_m, ap->a_count, 805 ap->a_sync, ap->a_rtvals); 806 } 807 808 int 809 vop_stdvptofh(struct vop_vptofh_args *ap) 810 { 811 return (EOPNOTSUPP); 812 } 813 814 int 815 vop_stdvptocnp(struct vop_vptocnp_args *ap) 816 { 817 struct vnode *vp = ap->a_vp; 818 struct vnode **dvp = ap->a_vpp; 819 struct ucred *cred; 820 char *buf = ap->a_buf; 821 size_t *buflen = ap->a_buflen; 822 char *dirbuf, *cpos; 823 int i, error, eofflag, dirbuflen, flags, locked, len, covered; 824 off_t off; 825 ino_t fileno; 826 struct vattr va; 827 struct nameidata nd; 828 struct thread *td; 829 struct dirent *dp; 830 struct vnode *mvp; 831 832 i = *buflen; 833 error = 0; 834 covered = 0; 835 td = curthread; 836 cred = td->td_ucred; 837 838 if (vp->v_type != VDIR) 839 return (ENOENT); 840 841 error = VOP_GETATTR(vp, &va, cred); 842 if (error) 843 return (error); 844 845 VREF(vp); 846 locked = VOP_ISLOCKED(vp); 847 VOP_UNLOCK(vp); 848 NDINIT_ATVP(&nd, LOOKUP, FOLLOW | LOCKSHARED | LOCKLEAF, UIO_SYSSPACE, 849 "..", vp); 850 flags = FREAD; 851 error = vn_open_cred(&nd, &flags, 0, VN_OPEN_NOAUDIT, cred, NULL); 852 if (error) { 853 vn_lock(vp, locked | LK_RETRY); 854 return (error); 855 } 856 NDFREE_PNBUF(&nd); 857 858 mvp = *dvp = nd.ni_vp; 859 860 if (vp->v_mount != (*dvp)->v_mount && 861 ((*dvp)->v_vflag & VV_ROOT) && 862 ((*dvp)->v_mount->mnt_flag & MNT_UNION)) { 863 *dvp = (*dvp)->v_mount->mnt_vnodecovered; 864 VREF(mvp); 865 VOP_UNLOCK(mvp); 866 vn_close(mvp, FREAD, cred, td); 867 VREF(*dvp); 868 vn_lock(*dvp, LK_SHARED | LK_RETRY); 869 covered = 1; 870 } 871 872 fileno = va.va_fileid; 873 874 dirbuflen = DEV_BSIZE; 875 if (dirbuflen < va.va_blocksize) 876 dirbuflen = va.va_blocksize; 877 dirbuf = (char *)malloc(dirbuflen, M_TEMP, M_WAITOK); 878 879 if ((*dvp)->v_type != VDIR) { 880 error = ENOENT; 881 goto out; 882 } 883 884 off = 0; 885 len = 0; 886 do { 887 /* call VOP_READDIR of parent */ 888 error = get_next_dirent(*dvp, &dp, dirbuf, dirbuflen, &off, 889 &cpos, &len, &eofflag, td); 890 if (error) 891 goto out; 892 893 if ((dp->d_type != DT_WHT) && 894 (dp->d_fileno == fileno)) { 895 if (covered) { 896 VOP_UNLOCK(*dvp); 897 vn_lock(mvp, LK_SHARED | LK_RETRY); 898 if (dirent_exists(mvp, dp->d_name, td)) { 899 error = ENOENT; 900 VOP_UNLOCK(mvp); 901 vn_lock(*dvp, LK_SHARED | LK_RETRY); 902 goto out; 903 } 904 VOP_UNLOCK(mvp); 905 vn_lock(*dvp, LK_SHARED | LK_RETRY); 906 } 907 i -= dp->d_namlen; 908 909 if (i < 0) { 910 error = ENOMEM; 911 goto out; 912 } 913 if (dp->d_namlen == 1 && dp->d_name[0] == '.') { 914 error = ENOENT; 915 } else { 916 bcopy(dp->d_name, buf + i, dp->d_namlen); 917 error = 0; 918 } 919 goto out; 920 } 921 } while (len > 0 || !eofflag); 922 error = ENOENT; 923 924 out: 925 free(dirbuf, M_TEMP); 926 if (!error) { 927 *buflen = i; 928 vref(*dvp); 929 } 930 if (covered) { 931 vput(*dvp); 932 vrele(mvp); 933 } else { 934 VOP_UNLOCK(mvp); 935 vn_close(mvp, FREAD, cred, td); 936 } 937 vn_lock(vp, locked | LK_RETRY); 938 return (error); 939 } 940 941 int 942 vop_stdallocate(struct vop_allocate_args *ap) 943 { 944 #ifdef __notyet__ 945 struct statfs *sfs; 946 off_t maxfilesize = 0; 947 #endif 948 struct iovec aiov; 949 struct vattr vattr, *vap; 950 struct uio auio; 951 off_t fsize, len, cur, offset; 952 uint8_t *buf; 953 struct thread *td; 954 struct vnode *vp; 955 size_t iosize; 956 int error; 957 958 buf = NULL; 959 error = 0; 960 td = curthread; 961 vap = &vattr; 962 vp = ap->a_vp; 963 len = *ap->a_len; 964 offset = *ap->a_offset; 965 966 error = VOP_GETATTR(vp, vap, ap->a_cred); 967 if (error != 0) 968 goto out; 969 fsize = vap->va_size; 970 iosize = vap->va_blocksize; 971 if (iosize == 0) 972 iosize = BLKDEV_IOSIZE; 973 if (iosize > maxphys) 974 iosize = maxphys; 975 buf = malloc(iosize, M_TEMP, M_WAITOK); 976 977 #ifdef __notyet__ 978 /* 979 * Check if the filesystem sets f_maxfilesize; if not use 980 * VOP_SETATTR to perform the check. 981 */ 982 sfs = malloc(sizeof(struct statfs), M_STATFS, M_WAITOK); 983 error = VFS_STATFS(vp->v_mount, sfs, td); 984 if (error == 0) 985 maxfilesize = sfs->f_maxfilesize; 986 free(sfs, M_STATFS); 987 if (error != 0) 988 goto out; 989 if (maxfilesize) { 990 if (offset > maxfilesize || len > maxfilesize || 991 offset + len > maxfilesize) { 992 error = EFBIG; 993 goto out; 994 } 995 } else 996 #endif 997 if (offset + len > vap->va_size) { 998 /* 999 * Test offset + len against the filesystem's maxfilesize. 1000 */ 1001 VATTR_NULL(vap); 1002 vap->va_size = offset + len; 1003 error = VOP_SETATTR(vp, vap, ap->a_cred); 1004 if (error != 0) 1005 goto out; 1006 VATTR_NULL(vap); 1007 vap->va_size = fsize; 1008 error = VOP_SETATTR(vp, vap, ap->a_cred); 1009 if (error != 0) 1010 goto out; 1011 } 1012 1013 for (;;) { 1014 /* 1015 * Read and write back anything below the nominal file 1016 * size. There's currently no way outside the filesystem 1017 * to know whether this area is sparse or not. 1018 */ 1019 cur = iosize; 1020 if ((offset % iosize) != 0) 1021 cur -= (offset % iosize); 1022 if (cur > len) 1023 cur = len; 1024 if (offset < fsize) { 1025 aiov.iov_base = buf; 1026 aiov.iov_len = cur; 1027 auio.uio_iov = &aiov; 1028 auio.uio_iovcnt = 1; 1029 auio.uio_offset = offset; 1030 auio.uio_resid = cur; 1031 auio.uio_segflg = UIO_SYSSPACE; 1032 auio.uio_rw = UIO_READ; 1033 auio.uio_td = td; 1034 error = VOP_READ(vp, &auio, ap->a_ioflag, ap->a_cred); 1035 if (error != 0) 1036 break; 1037 if (auio.uio_resid > 0) { 1038 bzero(buf + cur - auio.uio_resid, 1039 auio.uio_resid); 1040 } 1041 } else { 1042 bzero(buf, cur); 1043 } 1044 1045 aiov.iov_base = buf; 1046 aiov.iov_len = cur; 1047 auio.uio_iov = &aiov; 1048 auio.uio_iovcnt = 1; 1049 auio.uio_offset = offset; 1050 auio.uio_resid = cur; 1051 auio.uio_segflg = UIO_SYSSPACE; 1052 auio.uio_rw = UIO_WRITE; 1053 auio.uio_td = td; 1054 1055 error = VOP_WRITE(vp, &auio, ap->a_ioflag, ap->a_cred); 1056 if (error != 0) 1057 break; 1058 1059 len -= cur; 1060 offset += cur; 1061 if (len == 0) 1062 break; 1063 if (should_yield()) 1064 break; 1065 } 1066 1067 out: 1068 *ap->a_len = len; 1069 *ap->a_offset = offset; 1070 free(buf, M_TEMP); 1071 return (error); 1072 } 1073 1074 static int 1075 vp_zerofill(struct vnode *vp, struct vattr *vap, off_t *offsetp, off_t *lenp, 1076 int ioflag, struct ucred *cred) 1077 { 1078 int iosize; 1079 int error = 0; 1080 struct iovec aiov; 1081 struct uio auio; 1082 struct thread *td; 1083 off_t offset, len; 1084 1085 iosize = vap->va_blocksize; 1086 td = curthread; 1087 offset = *offsetp; 1088 len = *lenp; 1089 1090 if (iosize == 0) 1091 iosize = BLKDEV_IOSIZE; 1092 /* If va_blocksize is 512 bytes, iosize will be 4 kilobytes */ 1093 iosize = min(iosize * 8, ZERO_REGION_SIZE); 1094 1095 while (len > 0) { 1096 int xfersize = iosize; 1097 if (offset % iosize != 0) 1098 xfersize -= offset % iosize; 1099 if (xfersize > len) 1100 xfersize = len; 1101 1102 aiov.iov_base = __DECONST(void *, zero_region); 1103 aiov.iov_len = xfersize; 1104 auio.uio_iov = &aiov; 1105 auio.uio_iovcnt = 1; 1106 auio.uio_offset = offset; 1107 auio.uio_resid = xfersize; 1108 auio.uio_segflg = UIO_SYSSPACE; 1109 auio.uio_rw = UIO_WRITE; 1110 auio.uio_td = td; 1111 1112 error = VOP_WRITE(vp, &auio, ioflag, cred); 1113 if (error != 0) { 1114 len -= xfersize - auio.uio_resid; 1115 offset += xfersize - auio.uio_resid; 1116 break; 1117 } 1118 1119 len -= xfersize; 1120 offset += xfersize; 1121 } 1122 1123 *offsetp = offset; 1124 *lenp = len; 1125 return (error); 1126 } 1127 1128 int 1129 vop_stddeallocate(struct vop_deallocate_args *ap) 1130 { 1131 struct vnode *vp; 1132 off_t offset, len; 1133 struct ucred *cred; 1134 int error; 1135 struct vattr va; 1136 off_t noff, xfersize, rem; 1137 1138 vp = ap->a_vp; 1139 offset = *ap->a_offset; 1140 cred = ap->a_cred; 1141 1142 error = VOP_GETATTR(vp, &va, cred); 1143 if (error) 1144 return (error); 1145 1146 len = omin((off_t)va.va_size - offset, *ap->a_len); 1147 while (len > 0) { 1148 noff = offset; 1149 error = vn_bmap_seekhole_locked(vp, FIOSEEKDATA, &noff, cred); 1150 if (error) { 1151 if (error != ENXIO) 1152 /* XXX: Is it okay to fallback further? */ 1153 goto out; 1154 1155 /* 1156 * No more data region to be filled 1157 */ 1158 offset += len; 1159 len = 0; 1160 error = 0; 1161 break; 1162 } 1163 KASSERT(noff >= offset, ("FIOSEEKDATA going backward")); 1164 if (noff != offset) { 1165 xfersize = omin(noff - offset, len); 1166 len -= xfersize; 1167 offset += xfersize; 1168 if (len == 0) 1169 break; 1170 } 1171 error = vn_bmap_seekhole_locked(vp, FIOSEEKHOLE, &noff, cred); 1172 if (error) 1173 goto out; 1174 1175 /* Fill zeroes */ 1176 xfersize = rem = omin(noff - offset, len); 1177 error = vp_zerofill(vp, &va, &offset, &rem, ap->a_ioflag, cred); 1178 if (error) { 1179 len -= xfersize - rem; 1180 goto out; 1181 } 1182 1183 len -= xfersize; 1184 if (should_yield()) 1185 break; 1186 } 1187 /* Handle the case when offset is beyond EOF */ 1188 if (len < 0) 1189 len = 0; 1190 out: 1191 *ap->a_offset = offset; 1192 *ap->a_len = len; 1193 return (error); 1194 } 1195 1196 int 1197 vop_stdadvise(struct vop_advise_args *ap) 1198 { 1199 struct vnode *vp; 1200 struct bufobj *bo; 1201 daddr_t startn, endn; 1202 off_t bstart, bend, start, end; 1203 int bsize, error; 1204 1205 vp = ap->a_vp; 1206 switch (ap->a_advice) { 1207 case POSIX_FADV_WILLNEED: 1208 /* 1209 * Do nothing for now. Filesystems should provide a 1210 * custom method which starts an asynchronous read of 1211 * the requested region. 1212 */ 1213 error = 0; 1214 break; 1215 case POSIX_FADV_DONTNEED: 1216 error = 0; 1217 vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); 1218 if (VN_IS_DOOMED(vp)) { 1219 VOP_UNLOCK(vp); 1220 break; 1221 } 1222 1223 /* 1224 * Round to block boundaries (and later possibly further to 1225 * page boundaries). Applications cannot reasonably be aware 1226 * of the boundaries, and the rounding must be to expand at 1227 * both extremities to cover enough. It still doesn't cover 1228 * read-ahead. For partial blocks, this gives unnecessary 1229 * discarding of buffers but is efficient enough since the 1230 * pages usually remain in VMIO for some time. 1231 */ 1232 bsize = vp->v_bufobj.bo_bsize; 1233 bstart = rounddown(ap->a_start, bsize); 1234 bend = roundup(ap->a_end, bsize); 1235 1236 /* 1237 * Deactivate pages in the specified range from the backing VM 1238 * object. Pages that are resident in the buffer cache will 1239 * remain wired until their corresponding buffers are released 1240 * below. 1241 */ 1242 if (vp->v_object != NULL) { 1243 start = trunc_page(bstart); 1244 end = round_page(bend); 1245 VM_OBJECT_RLOCK(vp->v_object); 1246 vm_object_page_noreuse(vp->v_object, OFF_TO_IDX(start), 1247 OFF_TO_IDX(end)); 1248 VM_OBJECT_RUNLOCK(vp->v_object); 1249 } 1250 1251 bo = &vp->v_bufobj; 1252 BO_RLOCK(bo); 1253 startn = bstart / bsize; 1254 endn = bend / bsize; 1255 error = bnoreuselist(&bo->bo_clean, bo, startn, endn); 1256 if (error == 0) 1257 error = bnoreuselist(&bo->bo_dirty, bo, startn, endn); 1258 BO_RUNLOCK(bo); 1259 VOP_UNLOCK(vp); 1260 break; 1261 default: 1262 error = EINVAL; 1263 break; 1264 } 1265 return (error); 1266 } 1267 1268 int 1269 vop_stdunp_bind(struct vop_unp_bind_args *ap) 1270 { 1271 1272 ap->a_vp->v_unpcb = ap->a_unpcb; 1273 return (0); 1274 } 1275 1276 int 1277 vop_stdunp_connect(struct vop_unp_connect_args *ap) 1278 { 1279 1280 *ap->a_unpcb = ap->a_vp->v_unpcb; 1281 return (0); 1282 } 1283 1284 int 1285 vop_stdunp_detach(struct vop_unp_detach_args *ap) 1286 { 1287 1288 ap->a_vp->v_unpcb = NULL; 1289 return (0); 1290 } 1291 1292 static int 1293 vop_stdis_text(struct vop_is_text_args *ap) 1294 { 1295 1296 return (atomic_load_int(&ap->a_vp->v_writecount) < 0); 1297 } 1298 1299 int 1300 vop_stdset_text(struct vop_set_text_args *ap) 1301 { 1302 struct vnode *vp; 1303 int n; 1304 bool gotref; 1305 1306 vp = ap->a_vp; 1307 1308 n = atomic_load_int(&vp->v_writecount); 1309 for (;;) { 1310 if (__predict_false(n > 0)) { 1311 return (ETXTBSY); 1312 } 1313 1314 /* 1315 * Transition point, we may need to grab a reference on the vnode. 1316 * 1317 * Take the ref early As a safety measure against bogus calls 1318 * to vop_stdunset_text. 1319 */ 1320 if (n == 0) { 1321 gotref = false; 1322 if ((vn_irflag_read(vp) & VIRF_TEXT_REF) != 0) { 1323 vref(vp); 1324 gotref = true; 1325 } 1326 if (atomic_fcmpset_int(&vp->v_writecount, &n, -1)) { 1327 return (0); 1328 } 1329 if (gotref) { 1330 vunref(vp); 1331 } 1332 continue; 1333 } 1334 1335 MPASS(n < 0); 1336 if (atomic_fcmpset_int(&vp->v_writecount, &n, n - 1)) { 1337 return (0); 1338 } 1339 } 1340 __assert_unreachable(); 1341 } 1342 1343 static int 1344 vop_stdunset_text(struct vop_unset_text_args *ap) 1345 { 1346 struct vnode *vp; 1347 int n; 1348 1349 vp = ap->a_vp; 1350 1351 n = atomic_load_int(&vp->v_writecount); 1352 for (;;) { 1353 if (__predict_false(n >= 0)) { 1354 return (EINVAL); 1355 } 1356 1357 /* 1358 * Transition point, we may need to release a reference on the vnode. 1359 */ 1360 if (n == -1) { 1361 if (atomic_fcmpset_int(&vp->v_writecount, &n, 0)) { 1362 if ((vn_irflag_read(vp) & VIRF_TEXT_REF) != 0) { 1363 vunref(vp); 1364 } 1365 return (0); 1366 } 1367 continue; 1368 } 1369 1370 MPASS(n < -1); 1371 if (atomic_fcmpset_int(&vp->v_writecount, &n, n + 1)) { 1372 return (0); 1373 } 1374 } 1375 __assert_unreachable(); 1376 } 1377 1378 static int __always_inline 1379 vop_stdadd_writecount_impl(struct vop_add_writecount_args *ap, bool handle_msync) 1380 { 1381 struct vnode *vp; 1382 struct mount *mp __diagused; 1383 int n; 1384 1385 vp = ap->a_vp; 1386 1387 #ifdef INVARIANTS 1388 mp = vp->v_mount; 1389 if (mp != NULL) { 1390 if (handle_msync) { 1391 VNPASS((mp->mnt_kern_flag & MNTK_NOMSYNC) == 0, vp); 1392 } else { 1393 VNPASS((mp->mnt_kern_flag & MNTK_NOMSYNC) != 0, vp); 1394 } 1395 } 1396 #endif 1397 1398 n = atomic_load_int(&vp->v_writecount); 1399 for (;;) { 1400 if (__predict_false(n < 0)) { 1401 return (ETXTBSY); 1402 } 1403 1404 VNASSERT(n + ap->a_inc >= 0, vp, 1405 ("neg writecount increment %d + %d = %d", n, ap->a_inc, 1406 n + ap->a_inc)); 1407 if (n == 0) { 1408 if (handle_msync) { 1409 vlazy(vp); 1410 } 1411 } 1412 1413 if (atomic_fcmpset_int(&vp->v_writecount, &n, n + ap->a_inc)) { 1414 return (0); 1415 } 1416 } 1417 __assert_unreachable(); 1418 } 1419 1420 int 1421 vop_stdadd_writecount(struct vop_add_writecount_args *ap) 1422 { 1423 1424 return (vop_stdadd_writecount_impl(ap, true)); 1425 } 1426 1427 int 1428 vop_stdadd_writecount_nomsync(struct vop_add_writecount_args *ap) 1429 { 1430 1431 return (vop_stdadd_writecount_impl(ap, false)); 1432 } 1433 1434 int 1435 vop_stdneed_inactive(struct vop_need_inactive_args *ap) 1436 { 1437 1438 return (1); 1439 } 1440 1441 int 1442 vop_stdioctl(struct vop_ioctl_args *ap) 1443 { 1444 struct vnode *vp; 1445 struct vattr va; 1446 off_t *offp; 1447 int error; 1448 1449 switch (ap->a_command) { 1450 case FIOSEEKDATA: 1451 case FIOSEEKHOLE: 1452 vp = ap->a_vp; 1453 error = vn_lock(vp, LK_SHARED); 1454 if (error != 0) 1455 return (EBADF); 1456 if (vp->v_type == VREG) 1457 error = VOP_GETATTR(vp, &va, ap->a_cred); 1458 else 1459 error = ENOTTY; 1460 if (error == 0) { 1461 offp = ap->a_data; 1462 if (*offp < 0 || *offp >= va.va_size) 1463 error = ENXIO; 1464 else if (ap->a_command == FIOSEEKHOLE) 1465 *offp = va.va_size; 1466 } 1467 VOP_UNLOCK(vp); 1468 break; 1469 default: 1470 error = ENOTTY; 1471 break; 1472 } 1473 return (error); 1474 } 1475 1476 /* 1477 * vfs default ops 1478 * used to fill the vfs function table to get reasonable default return values. 1479 */ 1480 int 1481 vfs_stdroot (mp, flags, vpp) 1482 struct mount *mp; 1483 int flags; 1484 struct vnode **vpp; 1485 { 1486 1487 return (EOPNOTSUPP); 1488 } 1489 1490 int 1491 vfs_stdstatfs (mp, sbp) 1492 struct mount *mp; 1493 struct statfs *sbp; 1494 { 1495 1496 return (EOPNOTSUPP); 1497 } 1498 1499 int 1500 vfs_stdquotactl (mp, cmds, uid, arg, mp_busy) 1501 struct mount *mp; 1502 int cmds; 1503 uid_t uid; 1504 void *arg; 1505 bool *mp_busy; 1506 { 1507 return (EOPNOTSUPP); 1508 } 1509 1510 int 1511 vfs_stdsync(mp, waitfor) 1512 struct mount *mp; 1513 int waitfor; 1514 { 1515 struct vnode *vp, *mvp; 1516 struct thread *td; 1517 int error, lockreq, allerror = 0; 1518 1519 td = curthread; 1520 lockreq = LK_EXCLUSIVE | LK_INTERLOCK; 1521 if (waitfor != MNT_WAIT) 1522 lockreq |= LK_NOWAIT; 1523 /* 1524 * Force stale buffer cache information to be flushed. 1525 */ 1526 loop: 1527 MNT_VNODE_FOREACH_ALL(vp, mp, mvp) { 1528 if (vp->v_bufobj.bo_dirty.bv_cnt == 0) { 1529 VI_UNLOCK(vp); 1530 continue; 1531 } 1532 if ((error = vget(vp, lockreq)) != 0) { 1533 if (error == ENOENT) { 1534 MNT_VNODE_FOREACH_ALL_ABORT(mp, mvp); 1535 goto loop; 1536 } 1537 continue; 1538 } 1539 error = VOP_FSYNC(vp, waitfor, td); 1540 if (error) 1541 allerror = error; 1542 vput(vp); 1543 } 1544 return (allerror); 1545 } 1546 1547 int 1548 vfs_stdnosync (mp, waitfor) 1549 struct mount *mp; 1550 int waitfor; 1551 { 1552 1553 return (0); 1554 } 1555 1556 static int 1557 vop_stdcopy_file_range(struct vop_copy_file_range_args *ap) 1558 { 1559 int error; 1560 1561 error = vn_generic_copy_file_range(ap->a_invp, ap->a_inoffp, 1562 ap->a_outvp, ap->a_outoffp, ap->a_lenp, ap->a_flags, ap->a_incred, 1563 ap->a_outcred, ap->a_fsizetd); 1564 return (error); 1565 } 1566 1567 int 1568 vfs_stdvget (mp, ino, flags, vpp) 1569 struct mount *mp; 1570 ino_t ino; 1571 int flags; 1572 struct vnode **vpp; 1573 { 1574 1575 return (EOPNOTSUPP); 1576 } 1577 1578 int 1579 vfs_stdfhtovp (mp, fhp, flags, vpp) 1580 struct mount *mp; 1581 struct fid *fhp; 1582 int flags; 1583 struct vnode **vpp; 1584 { 1585 1586 return (EOPNOTSUPP); 1587 } 1588 1589 int 1590 vfs_stdinit (vfsp) 1591 struct vfsconf *vfsp; 1592 { 1593 1594 return (0); 1595 } 1596 1597 int 1598 vfs_stduninit (vfsp) 1599 struct vfsconf *vfsp; 1600 { 1601 1602 return(0); 1603 } 1604 1605 int 1606 vfs_stdextattrctl(mp, cmd, filename_vp, attrnamespace, attrname) 1607 struct mount *mp; 1608 int cmd; 1609 struct vnode *filename_vp; 1610 int attrnamespace; 1611 const char *attrname; 1612 { 1613 1614 if (filename_vp != NULL) 1615 VOP_UNLOCK(filename_vp); 1616 return (EOPNOTSUPP); 1617 } 1618 1619 int 1620 vfs_stdsysctl(mp, op, req) 1621 struct mount *mp; 1622 fsctlop_t op; 1623 struct sysctl_req *req; 1624 { 1625 1626 return (EOPNOTSUPP); 1627 } 1628 1629 static vop_bypass_t * 1630 bp_by_off(struct vop_vector *vop, struct vop_generic_args *a) 1631 { 1632 1633 return (*(vop_bypass_t **)((char *)vop + a->a_desc->vdesc_vop_offset)); 1634 } 1635 1636 int 1637 vop_sigdefer(struct vop_vector *vop, struct vop_generic_args *a) 1638 { 1639 vop_bypass_t *bp; 1640 int prev_stops, rc; 1641 1642 bp = bp_by_off(vop, a); 1643 MPASS(bp != NULL); 1644 1645 prev_stops = sigdeferstop(SIGDEFERSTOP_SILENT); 1646 rc = bp(a); 1647 sigallowstop(prev_stops); 1648 return (rc); 1649 } 1650 1651 static int 1652 vop_stdstat(struct vop_stat_args *a) 1653 { 1654 struct vattr vattr; 1655 struct vattr *vap; 1656 struct vnode *vp; 1657 struct stat *sb; 1658 int error; 1659 u_short mode; 1660 1661 vp = a->a_vp; 1662 sb = a->a_sb; 1663 1664 error = vop_stat_helper_pre(a); 1665 if (error != 0) 1666 return (error); 1667 1668 vap = &vattr; 1669 1670 /* 1671 * Initialize defaults for new and unusual fields, so that file 1672 * systems which don't support these fields don't need to know 1673 * about them. 1674 */ 1675 vap->va_birthtime.tv_sec = -1; 1676 vap->va_birthtime.tv_nsec = 0; 1677 vap->va_fsid = VNOVAL; 1678 vap->va_gen = 0; 1679 vap->va_rdev = NODEV; 1680 1681 error = VOP_GETATTR(vp, vap, a->a_active_cred); 1682 if (error) 1683 goto out; 1684 1685 /* 1686 * Zero the spare stat fields 1687 */ 1688 bzero(sb, sizeof *sb); 1689 1690 /* 1691 * Copy from vattr table 1692 */ 1693 if (vap->va_fsid != VNOVAL) 1694 sb->st_dev = vap->va_fsid; 1695 else 1696 sb->st_dev = vp->v_mount->mnt_stat.f_fsid.val[0]; 1697 sb->st_ino = vap->va_fileid; 1698 mode = vap->va_mode; 1699 switch (vap->va_type) { 1700 case VREG: 1701 mode |= S_IFREG; 1702 break; 1703 case VDIR: 1704 mode |= S_IFDIR; 1705 break; 1706 case VBLK: 1707 mode |= S_IFBLK; 1708 break; 1709 case VCHR: 1710 mode |= S_IFCHR; 1711 break; 1712 case VLNK: 1713 mode |= S_IFLNK; 1714 break; 1715 case VSOCK: 1716 mode |= S_IFSOCK; 1717 break; 1718 case VFIFO: 1719 mode |= S_IFIFO; 1720 break; 1721 default: 1722 error = EBADF; 1723 goto out; 1724 } 1725 sb->st_mode = mode; 1726 sb->st_nlink = vap->va_nlink; 1727 sb->st_uid = vap->va_uid; 1728 sb->st_gid = vap->va_gid; 1729 sb->st_rdev = vap->va_rdev; 1730 if (vap->va_size > OFF_MAX) { 1731 error = EOVERFLOW; 1732 goto out; 1733 } 1734 sb->st_size = vap->va_size; 1735 sb->st_atim.tv_sec = vap->va_atime.tv_sec; 1736 sb->st_atim.tv_nsec = vap->va_atime.tv_nsec; 1737 sb->st_mtim.tv_sec = vap->va_mtime.tv_sec; 1738 sb->st_mtim.tv_nsec = vap->va_mtime.tv_nsec; 1739 sb->st_ctim.tv_sec = vap->va_ctime.tv_sec; 1740 sb->st_ctim.tv_nsec = vap->va_ctime.tv_nsec; 1741 sb->st_birthtim.tv_sec = vap->va_birthtime.tv_sec; 1742 sb->st_birthtim.tv_nsec = vap->va_birthtime.tv_nsec; 1743 1744 /* 1745 * According to www.opengroup.org, the meaning of st_blksize is 1746 * "a filesystem-specific preferred I/O block size for this 1747 * object. In some filesystem types, this may vary from file 1748 * to file" 1749 * Use minimum/default of PAGE_SIZE (e.g. for VCHR). 1750 */ 1751 1752 sb->st_blksize = max(PAGE_SIZE, vap->va_blocksize); 1753 sb->st_flags = vap->va_flags; 1754 sb->st_blocks = vap->va_bytes / S_BLKSIZE; 1755 sb->st_gen = vap->va_gen; 1756 out: 1757 return (vop_stat_helper_post(a, error)); 1758 } 1759 1760 static int 1761 vop_stdread_pgcache(struct vop_read_pgcache_args *ap __unused) 1762 { 1763 return (EJUSTRETURN); 1764 } 1765 1766 static int 1767 vop_stdvput_pair(struct vop_vput_pair_args *ap) 1768 { 1769 struct vnode *dvp, *vp, **vpp; 1770 1771 dvp = ap->a_dvp; 1772 vpp = ap->a_vpp; 1773 vput(dvp); 1774 if (vpp != NULL && ap->a_unlock_vp && (vp = *vpp) != NULL) 1775 vput(vp); 1776 return (0); 1777 } 1778