1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 /* 22 * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. 23 * Copyright (c) 2012, 2015 by Delphix. All rights reserved. 24 * Copyright 2015, OmniTI Computer Consulting, Inc. All rights reserved. 25 */ 26 27 /* 28 * ZFS control directory (a.k.a. ".zfs") 29 * 30 * This directory provides a common location for all ZFS meta-objects. 31 * Currently, this is only the 'snapshot' directory, but this may expand in the 32 * future. The elements are built using the GFS primitives, as the hierarchy 33 * does not actually exist on disk. 34 * 35 * For 'snapshot', we don't want to have all snapshots always mounted, because 36 * this would take up a huge amount of space in /etc/mnttab. We have three 37 * types of objects: 38 * 39 * ctldir ------> snapshotdir -------> snapshot 40 * | 41 * | 42 * V 43 * mounted fs 44 * 45 * The 'snapshot' node contains just enough information to lookup '..' and act 46 * as a mountpoint for the snapshot. Whenever we lookup a specific snapshot, we 47 * perform an automount of the underlying filesystem and return the 48 * corresponding vnode. 49 * 50 * All mounts are handled automatically by the kernel, but unmounts are 51 * (currently) handled from user land. The main reason is that there is no 52 * reliable way to auto-unmount the filesystem when it's "no longer in use". 53 * When the user unmounts a filesystem, we call zfsctl_unmount(), which 54 * unmounts any snapshots within the snapshot directory. 55 * 56 * The '.zfs', '.zfs/snapshot', and all directories created under 57 * '.zfs/snapshot' (ie: '.zfs/snapshot/<snapname>') are all GFS nodes and 58 * share the same vfs_t as the head filesystem (what '.zfs' lives under). 59 * 60 * File systems mounted ontop of the GFS nodes '.zfs/snapshot/<snapname>' 61 * (ie: snapshots) are ZFS nodes and have their own unique vfs_t. 62 * However, vnodes within these mounted on file systems have their v_vfsp 63 * fields set to the head filesystem to make NFS happy (see 64 * zfsctl_snapdir_lookup()). We VFS_HOLD the head filesystem's vfs_t 65 * so that it cannot be freed until all snapshots have been unmounted. 66 */ 67 68 #ifdef __FreeBSD__ 69 70 #include <sys/zfs_context.h> 71 #include <sys/zfs_ctldir.h> 72 #include <sys/zfs_ioctl.h> 73 #include <sys/zfs_vfsops.h> 74 #include <sys/namei.h> 75 #include <sys/stat.h> 76 #include <sys/dmu.h> 77 #include <sys/dsl_dataset.h> 78 #include <sys/dsl_destroy.h> 79 #include <sys/dsl_deleg.h> 80 #include <sys/mount.h> 81 #include <sys/zap.h> 82 83 #include "zfs_namecheck.h" 84 85 /* 86 * "Synthetic" filesystem implementation. 87 */ 88 89 /* 90 * Assert that A implies B. 91 */ 92 #define KASSERT_IMPLY(A, B, msg) KASSERT(!(A) || (B), (msg)); 93 94 static MALLOC_DEFINE(M_SFSNODES, "sfs_nodes", "synthetic-fs nodes"); 95 96 typedef struct sfs_node { 97 char sn_name[ZFS_MAX_DATASET_NAME_LEN]; 98 uint64_t sn_parent_id; 99 uint64_t sn_id; 100 } sfs_node_t; 101 102 /* 103 * Check the parent's ID as well as the node's to account for a chance 104 * that IDs originating from different domains (snapshot IDs, artifical 105 * IDs, znode IDs) may clash. 106 */ 107 static int 108 sfs_compare_ids(struct vnode *vp, void *arg) 109 { 110 sfs_node_t *n1 = vp->v_data; 111 sfs_node_t *n2 = arg; 112 bool equal; 113 114 equal = n1->sn_id == n2->sn_id && 115 n1->sn_parent_id == n2->sn_parent_id; 116 117 /* Zero means equality. */ 118 return (!equal); 119 } 120 121 static int 122 sfs_vnode_get(const struct mount *mp, int flags, uint64_t parent_id, 123 uint64_t id, struct vnode **vpp) 124 { 125 sfs_node_t search; 126 int err; 127 128 search.sn_id = id; 129 search.sn_parent_id = parent_id; 130 err = vfs_hash_get(mp, (u_int)id, flags, curthread, vpp, 131 sfs_compare_ids, &search); 132 return (err); 133 } 134 135 static int 136 sfs_vnode_insert(struct vnode *vp, int flags, uint64_t parent_id, 137 uint64_t id, struct vnode **vpp) 138 { 139 int err; 140 141 KASSERT(vp->v_data != NULL, ("sfs_vnode_insert with NULL v_data")); 142 err = vfs_hash_insert(vp, (u_int)id, flags, curthread, vpp, 143 sfs_compare_ids, vp->v_data); 144 return (err); 145 } 146 147 static void 148 sfs_vnode_remove(struct vnode *vp) 149 { 150 vfs_hash_remove(vp); 151 } 152 153 typedef void sfs_vnode_setup_fn(vnode_t *vp, void *arg); 154 155 static int 156 sfs_vgetx(struct mount *mp, int flags, uint64_t parent_id, uint64_t id, 157 const char *tag, struct vop_vector *vops, 158 sfs_vnode_setup_fn setup, void *arg, 159 struct vnode **vpp) 160 { 161 struct vnode *vp; 162 int error; 163 164 error = sfs_vnode_get(mp, flags, parent_id, id, vpp); 165 if (error != 0 || *vpp != NULL) { 166 KASSERT_IMPLY(error == 0, (*vpp)->v_data != NULL, 167 "sfs vnode with no data"); 168 return (error); 169 } 170 171 /* Allocate a new vnode/inode. */ 172 error = getnewvnode(tag, mp, vops, &vp); 173 if (error != 0) { 174 *vpp = NULL; 175 return (error); 176 } 177 178 /* 179 * Exclusively lock the vnode vnode while it's being constructed. 180 */ 181 lockmgr(vp->v_vnlock, LK_EXCLUSIVE, NULL); 182 error = insmntque(vp, mp); 183 if (error != 0) { 184 *vpp = NULL; 185 return (error); 186 } 187 188 setup(vp, arg); 189 190 error = sfs_vnode_insert(vp, flags, parent_id, id, vpp); 191 if (error != 0 || *vpp != NULL) { 192 KASSERT_IMPLY(error == 0, (*vpp)->v_data != NULL, 193 "sfs vnode with no data"); 194 return (error); 195 } 196 197 *vpp = vp; 198 return (0); 199 } 200 201 static void 202 sfs_print_node(sfs_node_t *node) 203 { 204 printf("\tname = %s\n", node->sn_name); 205 printf("\tparent_id = %ju\n", (uintmax_t)node->sn_parent_id); 206 printf("\tid = %ju\n", (uintmax_t)node->sn_id); 207 } 208 209 static sfs_node_t * 210 sfs_alloc_node(size_t size, const char *name, uint64_t parent_id, uint64_t id) 211 { 212 struct sfs_node *node; 213 214 KASSERT(strlen(name) < sizeof(node->sn_name), 215 ("sfs node name is too long")); 216 KASSERT(size >= sizeof(*node), ("sfs node size is too small")); 217 node = malloc(size, M_SFSNODES, M_WAITOK | M_ZERO); 218 strlcpy(node->sn_name, name, sizeof(node->sn_name)); 219 node->sn_parent_id = parent_id; 220 node->sn_id = id; 221 222 return (node); 223 } 224 225 static void 226 sfs_destroy_node(sfs_node_t *node) 227 { 228 free(node, M_SFSNODES); 229 } 230 231 static void * 232 sfs_reclaim_vnode(vnode_t *vp) 233 { 234 sfs_node_t *node; 235 void *data; 236 237 sfs_vnode_remove(vp); 238 data = vp->v_data; 239 vp->v_data = NULL; 240 return (data); 241 } 242 243 static int 244 sfs_readdir_common(uint64_t parent_id, uint64_t id, struct vop_readdir_args *ap, 245 uio_t *uio, off_t *offp) 246 { 247 struct dirent entry; 248 int error; 249 250 /* Reset ncookies for subsequent use of vfs_read_dirent. */ 251 if (ap->a_ncookies != NULL) 252 *ap->a_ncookies = 0; 253 254 if (uio->uio_resid < sizeof(entry)) 255 return (SET_ERROR(EINVAL)); 256 257 if (uio->uio_offset < 0) 258 return (SET_ERROR(EINVAL)); 259 if (uio->uio_offset == 0) { 260 entry.d_fileno = id; 261 entry.d_type = DT_DIR; 262 entry.d_name[0] = '.'; 263 entry.d_name[1] = '\0'; 264 entry.d_namlen = 1; 265 entry.d_reclen = sizeof(entry); 266 error = vfs_read_dirent(ap, &entry, uio->uio_offset); 267 if (error != 0) 268 return (SET_ERROR(error)); 269 } 270 271 if (uio->uio_offset < sizeof(entry)) 272 return (SET_ERROR(EINVAL)); 273 if (uio->uio_offset == sizeof(entry)) { 274 entry.d_fileno = parent_id; 275 entry.d_type = DT_DIR; 276 entry.d_name[0] = '.'; 277 entry.d_name[1] = '.'; 278 entry.d_name[2] = '\0'; 279 entry.d_namlen = 2; 280 entry.d_reclen = sizeof(entry); 281 error = vfs_read_dirent(ap, &entry, uio->uio_offset); 282 if (error != 0) 283 return (SET_ERROR(error)); 284 } 285 286 if (offp != NULL) 287 *offp = 2 * sizeof(entry); 288 return (0); 289 } 290 291 292 /* 293 * .zfs inode namespace 294 * 295 * We need to generate unique inode numbers for all files and directories 296 * within the .zfs pseudo-filesystem. We use the following scheme: 297 * 298 * ENTRY ZFSCTL_INODE 299 * .zfs 1 300 * .zfs/snapshot 2 301 * .zfs/snapshot/<snap> objectid(snap) 302 */ 303 #define ZFSCTL_INO_SNAP(id) (id) 304 305 static struct vop_vector zfsctl_ops_root; 306 static struct vop_vector zfsctl_ops_snapdir; 307 static struct vop_vector zfsctl_ops_snapshot; 308 static struct vop_vector zfsctl_ops_shares_dir; 309 310 void 311 zfsctl_init(void) 312 { 313 } 314 315 void 316 zfsctl_fini(void) 317 { 318 } 319 320 boolean_t 321 zfsctl_is_node(vnode_t *vp) 322 { 323 return (vn_matchops(vp, zfsctl_ops_root) || 324 vn_matchops(vp, zfsctl_ops_snapdir) || 325 vn_matchops(vp, zfsctl_ops_snapshot) || 326 vn_matchops(vp, zfsctl_ops_shares_dir)); 327 328 } 329 330 typedef struct zfsctl_root { 331 sfs_node_t node; 332 sfs_node_t *snapdir; 333 timestruc_t cmtime; 334 } zfsctl_root_t; 335 336 337 /* 338 * Create the '.zfs' directory. 339 */ 340 void 341 zfsctl_create(zfsvfs_t *zfsvfs) 342 { 343 zfsctl_root_t *dot_zfs; 344 sfs_node_t *snapdir; 345 vnode_t *rvp; 346 uint64_t crtime[2]; 347 348 ASSERT(zfsvfs->z_ctldir == NULL); 349 350 snapdir = sfs_alloc_node(sizeof(*snapdir), "snapshot", ZFSCTL_INO_ROOT, 351 ZFSCTL_INO_SNAPDIR); 352 dot_zfs = (zfsctl_root_t *)sfs_alloc_node(sizeof(*dot_zfs), ".zfs", 0, 353 ZFSCTL_INO_ROOT); 354 dot_zfs->snapdir = snapdir; 355 356 VERIFY(VFS_ROOT(zfsvfs->z_vfs, LK_EXCLUSIVE, &rvp) == 0); 357 VERIFY(0 == sa_lookup(VTOZ(rvp)->z_sa_hdl, SA_ZPL_CRTIME(zfsvfs), 358 &crtime, sizeof(crtime))); 359 ZFS_TIME_DECODE(&dot_zfs->cmtime, crtime); 360 vput(rvp); 361 362 zfsvfs->z_ctldir = dot_zfs; 363 } 364 365 /* 366 * Destroy the '.zfs' directory. Only called when the filesystem is unmounted. 367 * The nodes must not have any associated vnodes by now as they should be 368 * vflush-ed. 369 */ 370 void 371 zfsctl_destroy(zfsvfs_t *zfsvfs) 372 { 373 sfs_destroy_node(zfsvfs->z_ctldir->snapdir); 374 sfs_destroy_node((sfs_node_t *)zfsvfs->z_ctldir); 375 zfsvfs->z_ctldir = NULL; 376 } 377 378 static int 379 zfsctl_fs_root_vnode(struct mount *mp, void *arg __unused, int flags, 380 struct vnode **vpp) 381 { 382 return (VFS_ROOT(mp, flags, vpp)); 383 } 384 385 static void 386 zfsctl_common_vnode_setup(vnode_t *vp, void *arg) 387 { 388 ASSERT_VOP_ELOCKED(vp, __func__); 389 390 /* We support shared locking. */ 391 VN_LOCK_ASHARE(vp); 392 vp->v_type = VDIR; 393 vp->v_data = arg; 394 } 395 396 static int 397 zfsctl_root_vnode(struct mount *mp, void *arg __unused, int flags, 398 struct vnode **vpp) 399 { 400 void *node; 401 int err; 402 403 node = ((zfsvfs_t*)mp->mnt_data)->z_ctldir; 404 err = sfs_vgetx(mp, flags, 0, ZFSCTL_INO_ROOT, "zfs", &zfsctl_ops_root, 405 zfsctl_common_vnode_setup, node, vpp); 406 return (err); 407 } 408 409 static int 410 zfsctl_snapdir_vnode(struct mount *mp, void *arg __unused, int flags, 411 struct vnode **vpp) 412 { 413 void *node; 414 int err; 415 416 node = ((zfsvfs_t*)mp->mnt_data)->z_ctldir->snapdir; 417 err = sfs_vgetx(mp, flags, ZFSCTL_INO_ROOT, ZFSCTL_INO_SNAPDIR, "zfs", 418 &zfsctl_ops_snapdir, zfsctl_common_vnode_setup, node, vpp); 419 return (err); 420 } 421 422 /* 423 * Given a root znode, retrieve the associated .zfs directory. 424 * Add a hold to the vnode and return it. 425 */ 426 int 427 zfsctl_root(zfsvfs_t *zfsvfs, int flags, vnode_t **vpp) 428 { 429 vnode_t *vp; 430 int error; 431 432 error = zfsctl_root_vnode(zfsvfs->z_vfs, NULL, flags, vpp); 433 return (error); 434 } 435 436 /* 437 * Common open routine. Disallow any write access. 438 */ 439 /* ARGSUSED */ 440 static int 441 zfsctl_common_open(struct vop_open_args *ap) 442 { 443 int flags = ap->a_mode; 444 445 if (flags & FWRITE) 446 return (SET_ERROR(EACCES)); 447 448 return (0); 449 } 450 451 /* 452 * Common close routine. Nothing to do here. 453 */ 454 /* ARGSUSED */ 455 static int 456 zfsctl_common_close(struct vop_close_args *ap) 457 { 458 return (0); 459 } 460 461 /* 462 * Common access routine. Disallow writes. 463 */ 464 /* ARGSUSED */ 465 static int 466 zfsctl_common_access(ap) 467 struct vop_access_args /* { 468 struct vnode *a_vp; 469 accmode_t a_accmode; 470 struct ucred *a_cred; 471 struct thread *a_td; 472 } */ *ap; 473 { 474 accmode_t accmode = ap->a_accmode; 475 476 if (accmode & VWRITE) 477 return (SET_ERROR(EACCES)); 478 return (0); 479 } 480 481 /* 482 * Common getattr function. Fill in basic information. 483 */ 484 static void 485 zfsctl_common_getattr(vnode_t *vp, vattr_t *vap) 486 { 487 timestruc_t now; 488 sfs_node_t *node; 489 490 node = vp->v_data; 491 492 vap->va_uid = 0; 493 vap->va_gid = 0; 494 vap->va_rdev = 0; 495 /* 496 * We are a purely virtual object, so we have no 497 * blocksize or allocated blocks. 498 */ 499 vap->va_blksize = 0; 500 vap->va_nblocks = 0; 501 vap->va_seq = 0; 502 vap->va_fsid = vp->v_mount->mnt_stat.f_fsid.val[0]; 503 vap->va_mode = S_IRUSR | S_IXUSR | S_IRGRP | S_IXGRP | 504 S_IROTH | S_IXOTH; 505 vap->va_type = VDIR; 506 /* 507 * We live in the now (for atime). 508 */ 509 gethrestime(&now); 510 vap->va_atime = now; 511 /* FreeBSD: Reset chflags(2) flags. */ 512 vap->va_flags = 0; 513 514 vap->va_nodeid = node->sn_id; 515 516 /* At least '.' and '..'. */ 517 vap->va_nlink = 2; 518 } 519 520 /*ARGSUSED*/ 521 static int 522 zfsctl_common_fid(ap) 523 struct vop_fid_args /* { 524 struct vnode *a_vp; 525 struct fid *a_fid; 526 } */ *ap; 527 { 528 vnode_t *vp = ap->a_vp; 529 fid_t *fidp = (void *)ap->a_fid; 530 sfs_node_t *node = vp->v_data; 531 uint64_t object = node->sn_id; 532 zfid_short_t *zfid; 533 int i; 534 535 zfid = (zfid_short_t *)fidp; 536 zfid->zf_len = SHORT_FID_LEN; 537 538 for (i = 0; i < sizeof(zfid->zf_object); i++) 539 zfid->zf_object[i] = (uint8_t)(object >> (8 * i)); 540 541 /* .zfs nodes always have a generation number of 0 */ 542 for (i = 0; i < sizeof(zfid->zf_gen); i++) 543 zfid->zf_gen[i] = 0; 544 545 return (0); 546 } 547 548 static int 549 zfsctl_common_reclaim(ap) 550 struct vop_reclaim_args /* { 551 struct vnode *a_vp; 552 struct thread *a_td; 553 } */ *ap; 554 { 555 vnode_t *vp = ap->a_vp; 556 557 (void) sfs_reclaim_vnode(vp); 558 return (0); 559 } 560 561 static int 562 zfsctl_common_print(ap) 563 struct vop_print_args /* { 564 struct vnode *a_vp; 565 } */ *ap; 566 { 567 sfs_print_node(ap->a_vp->v_data); 568 return (0); 569 } 570 571 /* 572 * Get root directory attributes. 573 */ 574 /* ARGSUSED */ 575 static int 576 zfsctl_root_getattr(ap) 577 struct vop_getattr_args /* { 578 struct vnode *a_vp; 579 struct vattr *a_vap; 580 struct ucred *a_cred; 581 } */ *ap; 582 { 583 struct vnode *vp = ap->a_vp; 584 struct vattr *vap = ap->a_vap; 585 zfsctl_root_t *node = vp->v_data; 586 587 zfsctl_common_getattr(vp, vap); 588 vap->va_ctime = node->cmtime; 589 vap->va_mtime = vap->va_ctime; 590 vap->va_birthtime = vap->va_ctime; 591 vap->va_nlink += 1; /* snapdir */ 592 vap->va_size = vap->va_nlink; 593 return (0); 594 } 595 596 /* 597 * When we lookup "." we still can be asked to lock it 598 * differently, can't we? 599 */ 600 int 601 zfsctl_relock_dot(vnode_t *dvp, int ltype) 602 { 603 vref(dvp); 604 if (ltype != VOP_ISLOCKED(dvp)) { 605 if (ltype == LK_EXCLUSIVE) 606 vn_lock(dvp, LK_UPGRADE | LK_RETRY); 607 else /* if (ltype == LK_SHARED) */ 608 vn_lock(dvp, LK_DOWNGRADE | LK_RETRY); 609 610 /* Relock for the "." case may left us with reclaimed vnode. */ 611 if ((dvp->v_iflag & VI_DOOMED) != 0) { 612 vrele(dvp); 613 return (SET_ERROR(ENOENT)); 614 } 615 } 616 return (0); 617 } 618 619 /* 620 * Special case the handling of "..". 621 */ 622 int 623 zfsctl_root_lookup(ap) 624 struct vop_lookup_args /* { 625 struct vnode *a_dvp; 626 struct vnode **a_vpp; 627 struct componentname *a_cnp; 628 } */ *ap; 629 { 630 struct componentname *cnp = ap->a_cnp; 631 vnode_t *dvp = ap->a_dvp; 632 vnode_t **vpp = ap->a_vpp; 633 cred_t *cr = ap->a_cnp->cn_cred; 634 int flags = ap->a_cnp->cn_flags; 635 int lkflags = ap->a_cnp->cn_lkflags; 636 int nameiop = ap->a_cnp->cn_nameiop; 637 int err; 638 int ltype; 639 640 ASSERT(dvp->v_type == VDIR); 641 642 if ((flags & ISLASTCN) != 0 && nameiop != LOOKUP) 643 return (SET_ERROR(ENOTSUP)); 644 645 if (cnp->cn_namelen == 1 && *cnp->cn_nameptr == '.') { 646 err = zfsctl_relock_dot(dvp, lkflags & LK_TYPE_MASK); 647 if (err == 0) 648 *vpp = dvp; 649 } else if ((flags & ISDOTDOT) != 0) { 650 err = vn_vget_ino_gen(dvp, zfsctl_fs_root_vnode, NULL, 651 lkflags, vpp); 652 } else if (strncmp(cnp->cn_nameptr, "snapshot", cnp->cn_namelen) == 0) { 653 err = zfsctl_snapdir_vnode(dvp->v_mount, NULL, lkflags, vpp); 654 } else { 655 err = SET_ERROR(ENOENT); 656 } 657 if (err != 0) 658 *vpp = NULL; 659 return (err); 660 } 661 662 static int 663 zfsctl_root_readdir(ap) 664 struct vop_readdir_args /* { 665 struct vnode *a_vp; 666 struct uio *a_uio; 667 struct ucred *a_cred; 668 int *a_eofflag; 669 int *ncookies; 670 u_long **a_cookies; 671 } */ *ap; 672 { 673 struct dirent entry; 674 vnode_t *vp = ap->a_vp; 675 zfsvfs_t *zfsvfs = vp->v_vfsp->vfs_data; 676 zfsctl_root_t *node = vp->v_data; 677 uio_t *uio = ap->a_uio; 678 int *eofp = ap->a_eofflag; 679 off_t dots_offset; 680 int error; 681 682 ASSERT(vp->v_type == VDIR); 683 684 error = sfs_readdir_common(zfsvfs->z_root, ZFSCTL_INO_ROOT, ap, uio, 685 &dots_offset); 686 if (error != 0) { 687 if (error == ENAMETOOLONG) /* ran out of destination space */ 688 error = 0; 689 return (error); 690 } 691 if (uio->uio_offset != dots_offset) 692 return (SET_ERROR(EINVAL)); 693 694 CTASSERT(sizeof(node->snapdir->sn_name) <= sizeof(entry.d_name)); 695 entry.d_fileno = node->snapdir->sn_id; 696 entry.d_type = DT_DIR; 697 strcpy(entry.d_name, node->snapdir->sn_name); 698 entry.d_namlen = strlen(entry.d_name); 699 entry.d_reclen = sizeof(entry); 700 error = vfs_read_dirent(ap, &entry, uio->uio_offset); 701 if (error != 0) { 702 if (error == ENAMETOOLONG) 703 error = 0; 704 return (SET_ERROR(error)); 705 } 706 if (eofp != NULL) 707 *eofp = 1; 708 return (0); 709 } 710 711 static int 712 zfsctl_root_vptocnp(struct vop_vptocnp_args *ap) 713 { 714 static const char dotzfs_name[4] = ".zfs"; 715 vnode_t *dvp; 716 int error; 717 718 if (*ap->a_buflen < sizeof (dotzfs_name)) 719 return (SET_ERROR(ENOMEM)); 720 721 error = vn_vget_ino_gen(ap->a_vp, zfsctl_fs_root_vnode, NULL, 722 LK_SHARED, &dvp); 723 if (error != 0) 724 return (SET_ERROR(error)); 725 726 VOP_UNLOCK(dvp, 0); 727 *ap->a_vpp = dvp; 728 *ap->a_buflen -= sizeof (dotzfs_name); 729 bcopy(dotzfs_name, ap->a_buf + *ap->a_buflen, sizeof (dotzfs_name)); 730 return (0); 731 } 732 733 static struct vop_vector zfsctl_ops_root = { 734 .vop_default = &default_vnodeops, 735 .vop_open = zfsctl_common_open, 736 .vop_close = zfsctl_common_close, 737 .vop_ioctl = VOP_EINVAL, 738 .vop_getattr = zfsctl_root_getattr, 739 .vop_access = zfsctl_common_access, 740 .vop_readdir = zfsctl_root_readdir, 741 .vop_lookup = zfsctl_root_lookup, 742 .vop_inactive = VOP_NULL, 743 .vop_reclaim = zfsctl_common_reclaim, 744 .vop_fid = zfsctl_common_fid, 745 .vop_print = zfsctl_common_print, 746 .vop_vptocnp = zfsctl_root_vptocnp, 747 }; 748 749 static int 750 zfsctl_snapshot_zname(vnode_t *vp, const char *name, int len, char *zname) 751 { 752 objset_t *os = ((zfsvfs_t *)((vp)->v_vfsp->vfs_data))->z_os; 753 754 dmu_objset_name(os, zname); 755 if (strlen(zname) + 1 + strlen(name) >= len) 756 return (SET_ERROR(ENAMETOOLONG)); 757 (void) strcat(zname, "@"); 758 (void) strcat(zname, name); 759 return (0); 760 } 761 762 static int 763 zfsctl_snapshot_lookup(vnode_t *vp, const char *name, uint64_t *id) 764 { 765 objset_t *os = ((zfsvfs_t *)((vp)->v_vfsp->vfs_data))->z_os; 766 int err; 767 768 err = dsl_dataset_snap_lookup(dmu_objset_ds(os), name, id); 769 return (err); 770 } 771 772 /* 773 * Given a vnode get a root vnode of a filesystem mounted on top of 774 * the vnode, if any. The root vnode is referenced and locked. 775 * If no filesystem is mounted then the orinal vnode remains referenced 776 * and locked. If any error happens the orinal vnode is unlocked and 777 * released. 778 */ 779 static int 780 zfsctl_mounted_here(vnode_t **vpp, int flags) 781 { 782 struct mount *mp; 783 int err; 784 785 ASSERT_VOP_LOCKED(*vpp, __func__); 786 ASSERT3S((*vpp)->v_type, ==, VDIR); 787 788 if ((mp = (*vpp)->v_mountedhere) != NULL) { 789 err = vfs_busy(mp, 0); 790 KASSERT(err == 0, ("vfs_busy(mp, 0) failed with %d", err)); 791 KASSERT(vrefcnt(*vpp) > 1, ("unreferenced mountpoint")); 792 vput(*vpp); 793 err = VFS_ROOT(mp, flags, vpp); 794 vfs_unbusy(mp); 795 return (err); 796 } 797 return (EJUSTRETURN); 798 } 799 800 typedef struct { 801 const char *snap_name; 802 uint64_t snap_id; 803 } snapshot_setup_arg_t; 804 805 static void 806 zfsctl_snapshot_vnode_setup(vnode_t *vp, void *arg) 807 { 808 snapshot_setup_arg_t *ssa = arg; 809 sfs_node_t *node; 810 811 ASSERT_VOP_ELOCKED(vp, __func__); 812 813 node = sfs_alloc_node(sizeof(sfs_node_t), 814 ssa->snap_name, ZFSCTL_INO_SNAPDIR, ssa->snap_id); 815 zfsctl_common_vnode_setup(vp, node); 816 817 /* We have to support recursive locking. */ 818 VN_LOCK_AREC(vp); 819 } 820 821 /* 822 * Lookup entry point for the 'snapshot' directory. Try to open the 823 * snapshot if it exist, creating the pseudo filesystem vnode as necessary. 824 * Perform a mount of the associated dataset on top of the vnode. 825 */ 826 /* ARGSUSED */ 827 int 828 zfsctl_snapdir_lookup(ap) 829 struct vop_lookup_args /* { 830 struct vnode *a_dvp; 831 struct vnode **a_vpp; 832 struct componentname *a_cnp; 833 } */ *ap; 834 { 835 vnode_t *dvp = ap->a_dvp; 836 vnode_t **vpp = ap->a_vpp; 837 struct componentname *cnp = ap->a_cnp; 838 char name[NAME_MAX + 1]; 839 char fullname[ZFS_MAX_DATASET_NAME_LEN]; 840 char *mountpoint; 841 size_t mountpoint_len; 842 zfsvfs_t *zfsvfs = dvp->v_vfsp->vfs_data; 843 uint64_t snap_id; 844 int nameiop = cnp->cn_nameiop; 845 int lkflags = cnp->cn_lkflags; 846 int flags = cnp->cn_flags; 847 int err; 848 849 ASSERT(dvp->v_type == VDIR); 850 851 if ((flags & ISLASTCN) != 0 && nameiop != LOOKUP) 852 return (SET_ERROR(ENOTSUP)); 853 854 if (cnp->cn_namelen == 1 && *cnp->cn_nameptr == '.') { 855 err = zfsctl_relock_dot(dvp, lkflags & LK_TYPE_MASK); 856 if (err == 0) 857 *vpp = dvp; 858 return (err); 859 } 860 if (flags & ISDOTDOT) { 861 err = vn_vget_ino_gen(dvp, zfsctl_root_vnode, NULL, lkflags, 862 vpp); 863 return (err); 864 } 865 866 if (cnp->cn_namelen >= sizeof(name)) 867 return (SET_ERROR(ENAMETOOLONG)); 868 869 strlcpy(name, ap->a_cnp->cn_nameptr, ap->a_cnp->cn_namelen + 1); 870 err = zfsctl_snapshot_lookup(dvp, name, &snap_id); 871 if (err != 0) 872 return (SET_ERROR(ENOENT)); 873 874 for (;;) { 875 snapshot_setup_arg_t ssa; 876 877 ssa.snap_name = name; 878 ssa.snap_id = snap_id; 879 err = sfs_vgetx(dvp->v_mount, LK_SHARED, ZFSCTL_INO_SNAPDIR, 880 snap_id, "zfs", &zfsctl_ops_snapshot, 881 zfsctl_snapshot_vnode_setup, &ssa, vpp); 882 if (err != 0) 883 return (err); 884 885 /* Check if a new vnode has just been created. */ 886 if (VOP_ISLOCKED(*vpp) == LK_EXCLUSIVE) 887 break; 888 889 /* 890 * The vnode must be referenced at least by this thread and 891 * the mounted snapshot or the thread doing the mounting. 892 * There can be more references from concurrent lookups. 893 */ 894 KASSERT(vrefcnt(*vpp) > 1, ("found unreferenced mountpoint")); 895 896 /* 897 * Check if a snapshot is already mounted on top of the vnode. 898 */ 899 err = zfsctl_mounted_here(vpp, lkflags); 900 if (err != EJUSTRETURN) 901 return (err); 902 903 #ifdef INVARIANTS 904 /* 905 * If the vnode not covered yet, then the mount operation 906 * must be in progress. 907 */ 908 VI_LOCK(*vpp); 909 KASSERT(((*vpp)->v_iflag & VI_MOUNT) != 0, 910 ("snapshot vnode not covered")); 911 VI_UNLOCK(*vpp); 912 #endif 913 vput(*vpp); 914 915 /* 916 * In this situation we can loop on uncontested locks and starve 917 * the thread doing the lengthy, non-trivial mount operation. 918 */ 919 kern_yield(PRI_USER); 920 } 921 922 VERIFY0(zfsctl_snapshot_zname(dvp, name, sizeof(fullname), fullname)); 923 924 mountpoint_len = strlen(dvp->v_vfsp->mnt_stat.f_mntonname) + 925 strlen("/" ZFS_CTLDIR_NAME "/snapshot/") + strlen(name) + 1; 926 mountpoint = kmem_alloc(mountpoint_len, KM_SLEEP); 927 (void) snprintf(mountpoint, mountpoint_len, 928 "%s/" ZFS_CTLDIR_NAME "/snapshot/%s", 929 dvp->v_vfsp->mnt_stat.f_mntonname, name); 930 931 err = mount_snapshot(curthread, vpp, "zfs", mountpoint, fullname, 0); 932 kmem_free(mountpoint, mountpoint_len); 933 if (err == 0) { 934 /* 935 * Fix up the root vnode mounted on .zfs/snapshot/<snapname>. 936 * 937 * This is where we lie about our v_vfsp in order to 938 * make .zfs/snapshot/<snapname> accessible over NFS 939 * without requiring manual mounts of <snapname>. 940 */ 941 ASSERT(VTOZ(*vpp)->z_zfsvfs != zfsvfs); 942 VTOZ(*vpp)->z_zfsvfs->z_parent = zfsvfs; 943 944 /* Clear the root flag (set via VFS_ROOT) as well. */ 945 (*vpp)->v_vflag &= ~VV_ROOT; 946 } 947 948 if (err != 0) 949 *vpp = NULL; 950 return (err); 951 } 952 953 static int 954 zfsctl_snapdir_readdir(ap) 955 struct vop_readdir_args /* { 956 struct vnode *a_vp; 957 struct uio *a_uio; 958 struct ucred *a_cred; 959 int *a_eofflag; 960 int *ncookies; 961 u_long **a_cookies; 962 } */ *ap; 963 { 964 char snapname[ZFS_MAX_DATASET_NAME_LEN]; 965 struct dirent entry; 966 vnode_t *vp = ap->a_vp; 967 zfsvfs_t *zfsvfs = vp->v_vfsp->vfs_data; 968 uio_t *uio = ap->a_uio; 969 int *eofp = ap->a_eofflag; 970 off_t dots_offset; 971 int error; 972 973 ASSERT(vp->v_type == VDIR); 974 975 error = sfs_readdir_common(ZFSCTL_INO_ROOT, ZFSCTL_INO_SNAPDIR, ap, uio, 976 &dots_offset); 977 if (error != 0) { 978 if (error == ENAMETOOLONG) /* ran out of destination space */ 979 error = 0; 980 return (error); 981 } 982 983 for (;;) { 984 uint64_t cookie; 985 uint64_t id; 986 987 cookie = uio->uio_offset - dots_offset; 988 989 dsl_pool_config_enter(dmu_objset_pool(zfsvfs->z_os), FTAG); 990 error = dmu_snapshot_list_next(zfsvfs->z_os, sizeof(snapname), 991 snapname, &id, &cookie, NULL); 992 dsl_pool_config_exit(dmu_objset_pool(zfsvfs->z_os), FTAG); 993 if (error != 0) { 994 if (error == ENOENT) { 995 if (eofp != NULL) 996 *eofp = 1; 997 error = 0; 998 } 999 return (error); 1000 } 1001 1002 entry.d_fileno = id; 1003 entry.d_type = DT_DIR; 1004 strcpy(entry.d_name, snapname); 1005 entry.d_namlen = strlen(entry.d_name); 1006 entry.d_reclen = sizeof(entry); 1007 error = vfs_read_dirent(ap, &entry, uio->uio_offset); 1008 if (error != 0) { 1009 if (error == ENAMETOOLONG) 1010 error = 0; 1011 return (SET_ERROR(error)); 1012 } 1013 uio->uio_offset = cookie + dots_offset; 1014 } 1015 /* NOTREACHED */ 1016 } 1017 1018 /* ARGSUSED */ 1019 static int 1020 zfsctl_snapdir_getattr(ap) 1021 struct vop_getattr_args /* { 1022 struct vnode *a_vp; 1023 struct vattr *a_vap; 1024 struct ucred *a_cred; 1025 } */ *ap; 1026 { 1027 vnode_t *vp = ap->a_vp; 1028 vattr_t *vap = ap->a_vap; 1029 zfsvfs_t *zfsvfs = vp->v_vfsp->vfs_data; 1030 dsl_dataset_t *ds = dmu_objset_ds(zfsvfs->z_os); 1031 sfs_node_t *node = vp->v_data; 1032 uint64_t snap_count; 1033 int err; 1034 1035 zfsctl_common_getattr(vp, vap); 1036 vap->va_ctime = dmu_objset_snap_cmtime(zfsvfs->z_os); 1037 vap->va_mtime = vap->va_ctime; 1038 vap->va_birthtime = vap->va_ctime; 1039 if (dsl_dataset_phys(ds)->ds_snapnames_zapobj != 0) { 1040 err = zap_count(dmu_objset_pool(ds->ds_objset)->dp_meta_objset, 1041 dsl_dataset_phys(ds)->ds_snapnames_zapobj, &snap_count); 1042 if (err != 0) 1043 return (err); 1044 vap->va_nlink += snap_count; 1045 } 1046 vap->va_size = vap->va_nlink; 1047 1048 return (0); 1049 } 1050 1051 static struct vop_vector zfsctl_ops_snapdir = { 1052 .vop_default = &default_vnodeops, 1053 .vop_open = zfsctl_common_open, 1054 .vop_close = zfsctl_common_close, 1055 .vop_getattr = zfsctl_snapdir_getattr, 1056 .vop_access = zfsctl_common_access, 1057 .vop_readdir = zfsctl_snapdir_readdir, 1058 .vop_lookup = zfsctl_snapdir_lookup, 1059 .vop_reclaim = zfsctl_common_reclaim, 1060 .vop_fid = zfsctl_common_fid, 1061 .vop_print = zfsctl_common_print, 1062 }; 1063 1064 static int 1065 zfsctl_snapshot_inactive(ap) 1066 struct vop_inactive_args /* { 1067 struct vnode *a_vp; 1068 struct thread *a_td; 1069 } */ *ap; 1070 { 1071 vnode_t *vp = ap->a_vp; 1072 1073 VERIFY(vrecycle(vp) == 1); 1074 return (0); 1075 } 1076 1077 static int 1078 zfsctl_snapshot_reclaim(ap) 1079 struct vop_reclaim_args /* { 1080 struct vnode *a_vp; 1081 struct thread *a_td; 1082 } */ *ap; 1083 { 1084 vnode_t *vp = ap->a_vp; 1085 void *data = vp->v_data; 1086 1087 sfs_reclaim_vnode(vp); 1088 sfs_destroy_node(data); 1089 return (0); 1090 } 1091 1092 static int 1093 zfsctl_snapshot_vptocnp(struct vop_vptocnp_args *ap) 1094 { 1095 struct mount *mp; 1096 vnode_t *dvp; 1097 vnode_t *vp; 1098 sfs_node_t *node; 1099 size_t len; 1100 int locked; 1101 int error; 1102 1103 vp = ap->a_vp; 1104 node = vp->v_data; 1105 len = strlen(node->sn_name); 1106 if (*ap->a_buflen < len) 1107 return (SET_ERROR(ENOMEM)); 1108 1109 /* 1110 * Prevent unmounting of the snapshot while the vnode lock 1111 * is not held. That is not strictly required, but allows 1112 * us to assert that an uncovered snapshot vnode is never 1113 * "leaked". 1114 */ 1115 mp = vp->v_mountedhere; 1116 if (mp == NULL) 1117 return (SET_ERROR(ENOENT)); 1118 error = vfs_busy(mp, 0); 1119 KASSERT(error == 0, ("vfs_busy(mp, 0) failed with %d", error)); 1120 1121 /* 1122 * We can vput the vnode as we can now depend on the reference owned 1123 * by the busied mp. But we also need to hold the vnode, because 1124 * the reference may go after vfs_unbusy() which has to be called 1125 * before we can lock the vnode again. 1126 */ 1127 locked = VOP_ISLOCKED(vp); 1128 vhold(vp); 1129 vput(vp); 1130 1131 /* Look up .zfs/snapshot, our parent. */ 1132 error = zfsctl_snapdir_vnode(vp->v_mount, NULL, LK_SHARED, &dvp); 1133 if (error == 0) { 1134 VOP_UNLOCK(dvp, 0); 1135 *ap->a_vpp = dvp; 1136 *ap->a_buflen -= len; 1137 bcopy(node->sn_name, ap->a_buf + *ap->a_buflen, len); 1138 } 1139 vfs_unbusy(mp); 1140 vget(vp, locked | LK_VNHELD | LK_RETRY, curthread); 1141 return (error); 1142 } 1143 1144 /* 1145 * These VP's should never see the light of day. They should always 1146 * be covered. 1147 */ 1148 static struct vop_vector zfsctl_ops_snapshot = { 1149 .vop_default = NULL, /* ensure very restricted access */ 1150 .vop_inactive = zfsctl_snapshot_inactive, 1151 .vop_reclaim = zfsctl_snapshot_reclaim, 1152 .vop_vptocnp = zfsctl_snapshot_vptocnp, 1153 .vop_lock1 = vop_stdlock, 1154 .vop_unlock = vop_stdunlock, 1155 .vop_islocked = vop_stdislocked, 1156 .vop_advlockpurge = vop_stdadvlockpurge, /* called by vgone */ 1157 .vop_print = zfsctl_common_print, 1158 }; 1159 1160 int 1161 zfsctl_lookup_objset(vfs_t *vfsp, uint64_t objsetid, zfsvfs_t **zfsvfsp) 1162 { 1163 struct mount *mp; 1164 zfsvfs_t *zfsvfs = vfsp->vfs_data; 1165 vnode_t *vp; 1166 int error; 1167 1168 ASSERT(zfsvfs->z_ctldir != NULL); 1169 *zfsvfsp = NULL; 1170 error = sfs_vnode_get(vfsp, LK_EXCLUSIVE, 1171 ZFSCTL_INO_SNAPDIR, objsetid, &vp); 1172 if (error == 0 && vp != NULL) { 1173 /* 1174 * XXX Probably need to at least reference, if not busy, the mp. 1175 */ 1176 if (vp->v_mountedhere != NULL) 1177 *zfsvfsp = vp->v_mountedhere->mnt_data; 1178 vput(vp); 1179 } 1180 if (*zfsvfsp == NULL) 1181 return (SET_ERROR(EINVAL)); 1182 return (0); 1183 } 1184 1185 /* 1186 * Unmount any snapshots for the given filesystem. This is called from 1187 * zfs_umount() - if we have a ctldir, then go through and unmount all the 1188 * snapshots. 1189 */ 1190 int 1191 zfsctl_umount_snapshots(vfs_t *vfsp, int fflags, cred_t *cr) 1192 { 1193 char snapname[ZFS_MAX_DATASET_NAME_LEN]; 1194 zfsvfs_t *zfsvfs = vfsp->vfs_data; 1195 struct mount *mp; 1196 vnode_t *dvp; 1197 vnode_t *vp; 1198 sfs_node_t *node; 1199 sfs_node_t *snap; 1200 uint64_t cookie; 1201 int error; 1202 1203 ASSERT(zfsvfs->z_ctldir != NULL); 1204 1205 cookie = 0; 1206 for (;;) { 1207 uint64_t id; 1208 1209 dsl_pool_config_enter(dmu_objset_pool(zfsvfs->z_os), FTAG); 1210 error = dmu_snapshot_list_next(zfsvfs->z_os, sizeof(snapname), 1211 snapname, &id, &cookie, NULL); 1212 dsl_pool_config_exit(dmu_objset_pool(zfsvfs->z_os), FTAG); 1213 if (error != 0) { 1214 if (error == ENOENT) 1215 error = 0; 1216 break; 1217 } 1218 1219 for (;;) { 1220 error = sfs_vnode_get(vfsp, LK_EXCLUSIVE, 1221 ZFSCTL_INO_SNAPDIR, id, &vp); 1222 if (error != 0 || vp == NULL) 1223 break; 1224 1225 mp = vp->v_mountedhere; 1226 1227 /* 1228 * v_mountedhere being NULL means that the 1229 * (uncovered) vnode is in a transient state 1230 * (mounting or unmounting), so loop until it 1231 * settles down. 1232 */ 1233 if (mp != NULL) 1234 break; 1235 vput(vp); 1236 } 1237 if (error != 0) 1238 break; 1239 if (vp == NULL) 1240 continue; /* no mountpoint, nothing to do */ 1241 1242 /* 1243 * The mount-point vnode is kept locked to avoid spurious EBUSY 1244 * from a concurrent umount. 1245 * The vnode lock must have recursive locking enabled. 1246 */ 1247 vfs_ref(mp); 1248 error = dounmount(mp, fflags, curthread); 1249 KASSERT_IMPLY(error == 0, vrefcnt(vp) == 1, 1250 ("extra references after unmount")); 1251 vput(vp); 1252 if (error != 0) 1253 break; 1254 } 1255 KASSERT_IMPLY((fflags & MS_FORCE) != 0, error == 0, 1256 ("force unmounting failed")); 1257 return (error); 1258 } 1259 1260 #endif /* __FreeBSD__ */ 1261 1262 #ifdef __NetBSD__ 1263 1264 #include <sys/malloc.h> 1265 #include <sys/pathname.h> 1266 #include <miscfs/genfs/genfs.h> 1267 #include <sys/zfs_context.h> 1268 #include <sys/zfs_ctldir.h> 1269 #include <sys/dsl_dataset.h> 1270 #include <sys/zap.h> 1271 1272 struct zfsctl_root { 1273 timestruc_t zc_cmtime; 1274 }; 1275 1276 struct sfs_node_key { 1277 uint64_t parent_id; 1278 uint64_t id; 1279 }; 1280 struct sfs_node { 1281 struct sfs_node_key sn_key; 1282 #define sn_parent_id sn_key.parent_id 1283 #define sn_id sn_key.id 1284 lwp_t *sn_mounting; 1285 }; 1286 1287 #define ZFS_SNAPDIR_NAME "snapshot" 1288 1289 #define VTOSFS(vp) ((struct sfs_node *)((vp)->v_data)) 1290 1291 #define SFS_NODE_ASSERT(vp) \ 1292 do { \ 1293 struct sfs_node *np = VTOSFS(vp); \ 1294 ASSERT((vp)->v_op == zfs_sfsop_p); \ 1295 ASSERT((vp)->v_type == VDIR); \ 1296 } while (/*CONSTCOND*/ 0) 1297 1298 static int (**zfs_sfsop_p)(void *); 1299 1300 /* 1301 * Mount a snapshot. Cannot use do_sys_umount() as it 1302 * doesn't allow its "path" argument from SYSSPACE. 1303 */ 1304 static int 1305 sfs_snapshot_mount(vnode_t *vp, const char *snapname) 1306 { 1307 struct sfs_node *node = VTOSFS(vp); 1308 zfsvfs_t *zfsvfs = vp->v_vfsp->vfs_data; 1309 vfs_t *vfsp; 1310 char *path, *osname; 1311 int error; 1312 extern int zfs_domount(vfs_t *, char *); 1313 1314 path = PNBUF_GET(); 1315 osname = PNBUF_GET(); 1316 1317 dmu_objset_name(zfsvfs->z_os, path); 1318 snprintf(osname, MAXPATHLEN, "%s@%s", path, snapname); 1319 snprintf(path, MAXPATHLEN, 1320 "%s/" ZFS_CTLDIR_NAME "/" ZFS_SNAPDIR_NAME "/%s", 1321 vp->v_vfsp->mnt_stat.f_mntonname, snapname); 1322 1323 vfsp = vfs_mountalloc(vp->v_vfsp->mnt_op, vp); 1324 if (vfsp == NULL) { 1325 error = ENOMEM; 1326 goto out; 1327 } 1328 vfsp->mnt_op->vfs_refcount++; 1329 vfsp->mnt_stat.f_owner = 0; 1330 vfsp->mnt_flag = MNT_RDONLY | MNT_NOSUID | MNT_IGNORE; 1331 1332 mutex_enter(vfsp->mnt_updating); 1333 1334 error = zfs_domount(vfsp, osname); 1335 if (error) 1336 goto out; 1337 1338 /* Set f_fsidx from parent to cheat NFSD. */ 1339 vfsp->mnt_stat.f_fsidx = vp->v_vfsp->mnt_stat.f_fsidx; 1340 1341 strlcpy(vfsp->mnt_stat.f_mntfromname, osname, 1342 sizeof(vfsp->mnt_stat.f_mntfromname)); 1343 set_statvfs_info(path, UIO_SYSSPACE, vfsp->mnt_stat.f_mntfromname, 1344 UIO_SYSSPACE, vfsp->mnt_op->vfs_name, vfsp, curlwp); 1345 1346 error = vfs_set_lowermount(vfsp, vp->v_vfsp); 1347 if (error) 1348 goto out; 1349 1350 mountlist_append(vfsp); 1351 vref(vp); 1352 vp->v_mountedhere = vfsp; 1353 1354 mutex_exit(vfsp->mnt_updating); 1355 (void) VFS_STATVFS(vfsp, &vfsp->mnt_stat); 1356 1357 out:; 1358 if (error && vfsp) { 1359 mutex_exit(vfsp->mnt_updating); 1360 vfs_rele(vfsp); 1361 } 1362 PNBUF_PUT(osname); 1363 PNBUF_PUT(path); 1364 1365 return error; 1366 } 1367 1368 static int 1369 sfs_lookup_snapshot(vnode_t *dvp, struct componentname *cnp, vnode_t **vpp) 1370 { 1371 zfsvfs_t *zfsvfs = dvp->v_vfsp->vfs_data; 1372 vnode_t *vp; 1373 struct sfs_node *node; 1374 struct sfs_node_key key; 1375 char snapname[ZFS_MAX_DATASET_NAME_LEN]; 1376 int error; 1377 1378 /* Retrieve the snapshot object id and the to be mounted on vnode. */ 1379 if (cnp->cn_namelen >= sizeof(snapname)) 1380 return ENOENT; 1381 1382 strlcpy(snapname, cnp->cn_nameptr, cnp->cn_namelen + 1); 1383 error = dsl_dataset_snap_lookup( dmu_objset_ds(zfsvfs->z_os), 1384 snapname, &key.id); 1385 if (error) 1386 return error; 1387 key.parent_id = ZFSCTL_INO_SNAPDIR; 1388 error = vcache_get(zfsvfs->z_vfs, &key, sizeof(key), vpp); 1389 if (error) 1390 return error; 1391 1392 /* Handle case where the vnode is currently mounting. */ 1393 vp = *vpp; 1394 mutex_enter(vp->v_interlock); 1395 node = VTOSFS(vp); 1396 if (node->sn_mounting) { 1397 if (node->sn_mounting == curlwp) 1398 error = 0; 1399 else 1400 error = ERESTART; 1401 mutex_exit(vp->v_interlock); 1402 if (error) 1403 yield(); 1404 return error; 1405 } 1406 1407 /* If not yet mounted mount the snapshot. */ 1408 if (vp->v_mountedhere == NULL) { 1409 ASSERT(node->sn_mounting == NULL); 1410 node->sn_mounting = curlwp; 1411 mutex_exit(vp->v_interlock); 1412 1413 VOP_UNLOCK(dvp, 0); 1414 error = sfs_snapshot_mount(vp, snapname); 1415 if (vn_lock(dvp, LK_EXCLUSIVE) != 0) { 1416 vn_lock(dvp, LK_EXCLUSIVE | LK_RETRY); 1417 error = ENOENT; 1418 } 1419 1420 mutex_enter(vp->v_interlock); 1421 if ((node = VTOSFS(vp))) 1422 node->sn_mounting = NULL; 1423 mutex_exit(vp->v_interlock); 1424 1425 if (error) { 1426 vrele(vp); 1427 *vpp = NULL; 1428 return error; 1429 } 1430 } else 1431 mutex_exit(vp->v_interlock); 1432 1433 /* Return the mounted root rather than the covered mount point. */ 1434 ASSERT(vp->v_mountedhere); 1435 error = VFS_ROOT(vp->v_mountedhere, LK_EXCLUSIVE, vpp); 1436 vrele(vp); 1437 if (error) 1438 return error; 1439 1440 /* 1441 * Fix up the root vnode mounted on .zfs/snapshot/<snapname> 1442 * 1443 * Here we make .zfs/snapshot/<snapname> accessible over NFS 1444 * without requiring manual mounts of <snapname>. 1445 */ 1446 if (((*vpp)->v_vflag & VV_ROOT)) { 1447 ASSERT(VTOZ(*vpp)->z_zfsvfs != zfsvfs); 1448 VTOZ(*vpp)->z_zfsvfs->z_parent = zfsvfs; 1449 (*vpp)->v_vflag &= ~VV_ROOT; 1450 } 1451 VOP_UNLOCK(*vpp, 0); 1452 1453 return 0; 1454 } 1455 1456 static int 1457 sfs_lookup(void *v) 1458 { 1459 struct vop_lookup_v2_args /* { 1460 struct vnode *a_dvp; 1461 struct vnode **a_vpp; 1462 struct componentname *a_cnp; 1463 } */ *ap = v; 1464 vnode_t *dvp = ap->a_dvp; 1465 vnode_t **vpp = ap->a_vpp; 1466 struct componentname *cnp = ap->a_cnp; 1467 zfsvfs_t *zfsvfs = dvp->v_vfsp->vfs_data; 1468 struct sfs_node *dnode = VTOSFS(dvp); 1469 int error; 1470 1471 SFS_NODE_ASSERT(dvp); 1472 ZFS_ENTER(zfsvfs); 1473 1474 /* 1475 * No CREATE, DELETE or RENAME. 1476 */ 1477 if ((cnp->cn_flags & ISLASTCN) && cnp->cn_nameiop != LOOKUP) { 1478 ZFS_EXIT(zfsvfs); 1479 1480 return ENOTSUP; 1481 } 1482 1483 /* 1484 * Handle DOT and DOTDOT. 1485 */ 1486 if (cnp->cn_namelen == 1 && cnp->cn_nameptr[0] == '.') { 1487 vref(dvp); 1488 *vpp = dvp; 1489 ZFS_EXIT(zfsvfs); 1490 1491 return 0; 1492 } 1493 if ((cnp->cn_flags & ISDOTDOT)) { 1494 if (dnode->sn_parent_id == 0) { 1495 error = vcache_get(zfsvfs->z_vfs, 1496 &zfsvfs->z_root, sizeof(zfsvfs->z_root), vpp); 1497 } else if (dnode->sn_parent_id == ZFSCTL_INO_ROOT) { 1498 error = zfsctl_root(zfsvfs, vpp); 1499 } else if (dnode->sn_parent_id == ZFSCTL_INO_SNAPDIR) { 1500 error = zfsctl_snapshot(zfsvfs, vpp); 1501 } else { 1502 error = ENOENT; 1503 } 1504 ZFS_EXIT(zfsvfs); 1505 1506 return error; 1507 } 1508 1509 /* 1510 * Lookup in ".zfs". 1511 */ 1512 if (dnode->sn_id == ZFSCTL_INO_ROOT) { 1513 if (cnp->cn_namelen == strlen(ZFS_SNAPDIR_NAME) && 1514 strncmp(cnp->cn_nameptr, ZFS_SNAPDIR_NAME, 1515 cnp->cn_namelen) == 0) { 1516 error = zfsctl_snapshot(zfsvfs, vpp); 1517 } else { 1518 error = ENOENT; 1519 } 1520 ZFS_EXIT(zfsvfs); 1521 1522 return error; 1523 } 1524 1525 /* 1526 * Lookup in ".zfs/snapshot". 1527 */ 1528 if (dnode->sn_id == ZFSCTL_INO_SNAPDIR) { 1529 error = sfs_lookup_snapshot(dvp, cnp, vpp); 1530 ZFS_EXIT(zfsvfs); 1531 1532 return error; 1533 } 1534 1535 vprint("sfs_lookup: unexpected node for lookup", dvp); 1536 ZFS_EXIT(zfsvfs); 1537 1538 return ENOENT; 1539 } 1540 1541 static int 1542 sfs_open(void *v) 1543 { 1544 struct vop_open_args /* { 1545 struct vnode *a_vp; 1546 int a_mode; 1547 kauth_cred_t a_cred; 1548 } */ *ap = v; 1549 zfsvfs_t *zfsvfs = ap->a_vp->v_vfsp->vfs_data; 1550 int error = 0; 1551 1552 SFS_NODE_ASSERT(ap->a_vp); 1553 ZFS_ENTER(zfsvfs); 1554 1555 if (ap->a_mode & FWRITE) 1556 error = EACCES; 1557 1558 ZFS_EXIT(zfsvfs); 1559 1560 return error; 1561 } 1562 1563 static int 1564 sfs_close(void *v) 1565 { 1566 struct vop_close_args /* { 1567 struct vnode *a_vp; 1568 int a_mode; 1569 kauth_cred_t a_cred; 1570 } */ *ap = v; 1571 zfsvfs_t *zfsvfs = ap->a_vp->v_vfsp->vfs_data; 1572 1573 SFS_NODE_ASSERT(ap->a_vp); 1574 ZFS_ENTER(zfsvfs); 1575 1576 ZFS_EXIT(zfsvfs); 1577 1578 return 0; 1579 } 1580 1581 static int 1582 sfs_access(void *v) 1583 { 1584 struct vop_access_args /* { 1585 struct vnode *a_vp; 1586 int a_mode; 1587 kauth_cred_t a_cred; 1588 } */ *ap = v; 1589 zfsvfs_t *zfsvfs = ap->a_vp->v_vfsp->vfs_data; 1590 int error = 0; 1591 1592 SFS_NODE_ASSERT(ap->a_vp); 1593 ZFS_ENTER(zfsvfs); 1594 1595 if (ap->a_accmode & FWRITE) 1596 error = EACCES; 1597 1598 ZFS_EXIT(zfsvfs); 1599 1600 return error; 1601 } 1602 1603 static int 1604 sfs_getattr(void *v) 1605 { 1606 struct vop_getattr_args /* { 1607 struct vnode *a_vp; 1608 struct vattr *a_vap; 1609 kauth_cred_t a_cred; 1610 } */ *ap = v; 1611 vnode_t *vp = ap->a_vp; 1612 struct sfs_node *node = VTOSFS(vp); 1613 struct vattr *vap = ap->a_vap; 1614 zfsvfs_t *zfsvfs = vp->v_vfsp->vfs_data; 1615 dsl_dataset_t *ds = dmu_objset_ds(zfsvfs->z_os); 1616 timestruc_t now; 1617 uint64_t snap_count; 1618 int error; 1619 1620 SFS_NODE_ASSERT(vp); 1621 ZFS_ENTER(zfsvfs); 1622 1623 vap->va_type = VDIR; 1624 vap->va_mode = S_IRUSR | S_IXUSR | S_IRGRP | S_IXGRP | 1625 S_IROTH | S_IXOTH; 1626 vap->va_nlink = 2; 1627 vap->va_uid = 0; 1628 vap->va_gid = 0; 1629 vap->va_fsid = vp->v_vfsp->mnt_stat.f_fsid; 1630 vap->va_fileid = node->sn_id; 1631 vap->va_size = 0; 1632 vap->va_blocksize = 0; 1633 gethrestime(&now); 1634 vap->va_atime = now; 1635 vap->va_ctime = zfsvfs->z_ctldir->zc_cmtime; 1636 vap->va_mtime = vap->va_ctime; 1637 vap->va_birthtime = vap->va_ctime; 1638 vap->va_gen = 0; 1639 vap->va_flags = 0; 1640 vap->va_rdev = 0; 1641 vap->va_bytes = 0; 1642 vap->va_filerev = 0; 1643 1644 switch (node->sn_id){ 1645 case ZFSCTL_INO_ROOT: 1646 vap->va_nlink += 1; /* snapdir */ 1647 vap->va_size = vap->va_nlink; 1648 break; 1649 case ZFSCTL_INO_SNAPDIR: 1650 if (dsl_dataset_phys(ds)->ds_snapnames_zapobj) { 1651 error = zap_count( 1652 dmu_objset_pool(ds->ds_objset)->dp_meta_objset, 1653 dsl_dataset_phys(ds)->ds_snapnames_zapobj, 1654 &snap_count); 1655 if (error) 1656 return error; 1657 vap->va_nlink += snap_count; 1658 } 1659 vap->va_size = vap->va_nlink; 1660 break; 1661 } 1662 1663 ZFS_EXIT(zfsvfs); 1664 1665 return 0; 1666 } 1667 1668 static int 1669 sfs_readdir_one(struct vop_readdir_args *ap, struct dirent *dp, 1670 const char *name, ino_t ino, off_t *offp) 1671 { 1672 int error; 1673 1674 dp->d_fileno = ino; 1675 dp->d_type = DT_DIR; 1676 strlcpy(dp->d_name, name, sizeof(dp->d_name)); 1677 dp->d_namlen = strlen(dp->d_name); 1678 dp->d_reclen = _DIRENT_SIZE(dp); 1679 1680 if (ap->a_uio->uio_resid < dp->d_reclen) 1681 return ENAMETOOLONG; 1682 if (ap->a_uio->uio_offset > *offp) { 1683 *offp += dp->d_reclen; 1684 return 0; 1685 } 1686 1687 error = uiomove(dp, dp->d_reclen, UIO_READ, ap->a_uio); 1688 if (error) 1689 return error; 1690 if (ap->a_ncookies) 1691 (*ap->a_cookies)[(*ap->a_ncookies)++] = *offp; 1692 *offp += dp->d_reclen; 1693 1694 return 0; 1695 } 1696 1697 static int 1698 sfs_readdir(void *v) 1699 { 1700 struct vop_readdir_args /* { 1701 struct vnode *a_vp; 1702 struct uio *a_uio; 1703 kauth_cred_t a_cred; 1704 int *a_eofflag; 1705 off_t **a_cookies; 1706 int *a_ncookies; 1707 } */ *ap = v; 1708 vnode_t *vp = ap->a_vp; 1709 struct sfs_node *node = VTOSFS(vp); 1710 zfsvfs_t *zfsvfs = vp->v_vfsp->vfs_data; 1711 struct dirent *dp; 1712 uint64_t parent; 1713 off_t offset; 1714 int error, ncookies; 1715 1716 SFS_NODE_ASSERT(ap->a_vp); 1717 ZFS_ENTER(zfsvfs); 1718 1719 parent = node->sn_parent_id == 0 ? zfsvfs->z_root : node->sn_parent_id; 1720 dp = kmem_alloc(sizeof(*dp), KM_SLEEP); 1721 if (ap->a_ncookies) { 1722 ncookies = ap->a_uio->uio_resid / _DIRENT_MINSIZE(dp); 1723 *ap->a_ncookies = 0; 1724 *ap->a_cookies = malloc(ncookies * sizeof (off_t), 1725 M_TEMP, M_WAITOK); 1726 } 1727 1728 offset = 0; 1729 error = sfs_readdir_one(ap, dp, ".", node->sn_id, &offset); 1730 if (error == 0) 1731 error = sfs_readdir_one(ap, dp, "..", parent, &offset); 1732 if (error == 0 && node->sn_id == ZFSCTL_INO_ROOT) { 1733 error = sfs_readdir_one(ap, dp, ZFS_SNAPDIR_NAME, 1734 ZFSCTL_INO_SNAPDIR, &offset); 1735 } else if (error == 0 && node->sn_id == ZFSCTL_INO_SNAPDIR) { 1736 char snapname[ZFS_MAX_DATASET_NAME_LEN]; 1737 uint64_t cookie, id; 1738 1739 cookie = 0; 1740 for (;;) { 1741 dsl_pool_config_enter(dmu_objset_pool(zfsvfs->z_os), 1742 FTAG); 1743 error = dmu_snapshot_list_next(zfsvfs->z_os, 1744 sizeof(snapname), snapname, &id, &cookie, NULL); 1745 dsl_pool_config_exit(dmu_objset_pool(zfsvfs->z_os), 1746 FTAG); 1747 if (error) { 1748 if (error == ENOENT) 1749 error = 0; 1750 break; 1751 } 1752 error = sfs_readdir_one(ap, dp, snapname, id, &offset); 1753 if (error) 1754 break; 1755 } 1756 } 1757 1758 if (ap->a_eofflag && error == 0) 1759 *ap->a_eofflag = 1; 1760 1761 if (error == ENAMETOOLONG) 1762 error = 0; 1763 1764 if (ap->a_ncookies && error) { 1765 free(*ap->a_cookies, M_TEMP); 1766 *ap->a_ncookies = 0; 1767 *ap->a_cookies = NULL; 1768 } 1769 kmem_free(dp, sizeof(*dp)); 1770 1771 ZFS_EXIT(zfsvfs); 1772 1773 return error; 1774 } 1775 1776 static int 1777 sfs_inactive(void *v) 1778 { 1779 struct vop_inactive_v2_args /* { 1780 struct vnode *a_vp; 1781 bool *a_recycle; 1782 } */ *ap = v; 1783 vnode_t *vp = ap->a_vp; 1784 struct sfs_node *node = VTOSFS(vp); 1785 1786 SFS_NODE_ASSERT(vp); 1787 1788 *ap->a_recycle = (node->sn_parent_id == ZFSCTL_INO_SNAPDIR); 1789 1790 return 0; 1791 } 1792 1793 static int 1794 sfs_reclaim(void *v) 1795 { 1796 struct vop_reclaim_v2_args /* { 1797 struct vnode *a_vp; 1798 } */ *ap = v; 1799 vnode_t *vp = ap->a_vp; 1800 struct sfs_node *node = VTOSFS(vp); 1801 1802 SFS_NODE_ASSERT(ap->a_vp); 1803 1804 vp->v_data = NULL; 1805 VOP_UNLOCK(vp, 0); 1806 1807 kmem_free(node, sizeof(*node)); 1808 1809 return 0; 1810 } 1811 1812 static int 1813 sfs_print(void *v) 1814 { 1815 struct vop_print_args /* { 1816 struct vnode *a_vp; 1817 } */ *ap = v; 1818 struct sfs_node *node = VTOSFS(ap->a_vp); 1819 1820 SFS_NODE_ASSERT(ap->a_vp); 1821 1822 printf("\tid %" PRIu64 ", parent %" PRIu64 "\n", 1823 node->sn_id, node->sn_parent_id); 1824 1825 return 0; 1826 } 1827 1828 const struct vnodeopv_entry_desc zfs_sfsop_entries[] = { 1829 { &vop_default_desc, vn_default_error }, 1830 { &vop_parsepath_desc, genfs_parsepath }, 1831 { &vop_lookup_desc, sfs_lookup }, 1832 { &vop_open_desc, sfs_open }, 1833 { &vop_close_desc, sfs_close }, 1834 { &vop_access_desc, sfs_access }, 1835 { &vop_getattr_desc, sfs_getattr }, 1836 { &vop_lock_desc, genfs_lock }, 1837 { &vop_unlock_desc, genfs_unlock }, 1838 { &vop_readdir_desc, sfs_readdir }, 1839 { &vop_inactive_desc, sfs_inactive }, 1840 { &vop_reclaim_desc, sfs_reclaim }, 1841 { &vop_seek_desc, genfs_seek }, 1842 { &vop_putpages_desc, genfs_null_putpages }, 1843 { &vop_islocked_desc, genfs_islocked }, 1844 { &vop_print_desc, sfs_print }, 1845 { &vop_pathconf_desc, genfs_pathconf }, 1846 { NULL, NULL } 1847 }; 1848 1849 const struct vnodeopv_desc zfs_sfsop_opv_desc = 1850 { &zfs_sfsop_p, zfs_sfsop_entries }; 1851 1852 void 1853 zfsctl_init(void) 1854 { 1855 } 1856 1857 void 1858 zfsctl_fini(void) 1859 { 1860 } 1861 1862 int 1863 zfsctl_loadvnode(vfs_t *vfsp, vnode_t *vp, 1864 const void *key, size_t key_len, const void **new_key) 1865 { 1866 struct sfs_node_key node_key; 1867 struct sfs_node *node; 1868 1869 if (key_len != sizeof(node_key)) 1870 return EINVAL; 1871 if ((vfsp->mnt_iflag & IMNT_UNMOUNT)) 1872 return ENOENT; 1873 1874 memcpy(&node_key, key, key_len); 1875 1876 node = kmem_alloc(sizeof(*node), KM_SLEEP); 1877 1878 node->sn_mounting = NULL; 1879 node->sn_key = node_key; 1880 1881 vp->v_data = node; 1882 vp->v_op = zfs_sfsop_p; 1883 vp->v_tag = VT_ZFS; 1884 vp->v_type = VDIR; 1885 uvm_vnp_setsize(vp, 0); 1886 1887 *new_key = &node->sn_key; 1888 1889 return 0; 1890 } 1891 1892 int 1893 zfsctl_vptofh(vnode_t *vp, fid_t *fidp, size_t *fh_size) 1894 { 1895 struct sfs_node *node = VTOSFS(vp); 1896 uint64_t object = node->sn_id; 1897 zfid_short_t *zfid = (zfid_short_t *)fidp; 1898 int i; 1899 1900 SFS_NODE_ASSERT(vp); 1901 1902 if (*fh_size < SHORT_FID_LEN) { 1903 *fh_size = SHORT_FID_LEN; 1904 return SET_ERROR(E2BIG); 1905 } 1906 *fh_size = SHORT_FID_LEN; 1907 1908 zfid->zf_len = SHORT_FID_LEN; 1909 for (i = 0; i < sizeof(zfid->zf_object); i++) 1910 zfid->zf_object[i] = (uint8_t)(object >> (8 * i)); 1911 1912 /* .zfs nodes always have a generation number of 0 */ 1913 for (i = 0; i < sizeof(zfid->zf_gen); i++) 1914 zfid->zf_gen[i] = 0; 1915 1916 return 0; 1917 } 1918 1919 /* 1920 * Return the ".zfs" vnode. 1921 */ 1922 int 1923 zfsctl_root(zfsvfs_t *zfsvfs, vnode_t **vpp) 1924 { 1925 struct sfs_node_key key = { 1926 .parent_id = 0, 1927 .id = ZFSCTL_INO_ROOT 1928 }; 1929 1930 return vcache_get(zfsvfs->z_vfs, &key, sizeof(key), vpp); 1931 } 1932 1933 /* 1934 * Return the ".zfs/snapshot" vnode. 1935 */ 1936 int 1937 zfsctl_snapshot(zfsvfs_t *zfsvfs, vnode_t **vpp) 1938 { 1939 struct sfs_node_key key = { 1940 .parent_id = ZFSCTL_INO_ROOT, 1941 .id = ZFSCTL_INO_SNAPDIR 1942 }; 1943 1944 return vcache_get(zfsvfs->z_vfs, &key, sizeof(key), vpp); 1945 } 1946 1947 void 1948 zfsctl_create(zfsvfs_t *zfsvfs) 1949 { 1950 vnode_t *vp; 1951 struct zfsctl_root *zc; 1952 uint64_t crtime[2]; 1953 1954 zc = kmem_alloc(sizeof(*zc), KM_SLEEP); 1955 1956 VERIFY(0 == VFS_ROOT(zfsvfs->z_vfs, LK_EXCLUSIVE, &vp)); 1957 VERIFY(0 == sa_lookup(VTOZ(vp)->z_sa_hdl, SA_ZPL_CRTIME(zfsvfs), 1958 &crtime, sizeof(crtime))); 1959 vput(vp); 1960 1961 ZFS_TIME_DECODE(&zc->zc_cmtime, crtime); 1962 1963 ASSERT(zfsvfs->z_ctldir == NULL); 1964 zfsvfs->z_ctldir = zc; 1965 } 1966 1967 void 1968 zfsctl_destroy(zfsvfs_t *zfsvfs) 1969 { 1970 struct zfsctl_root *zc = zfsvfs->z_ctldir; 1971 1972 ASSERT(zfsvfs->z_ctldir); 1973 zfsvfs->z_ctldir = NULL; 1974 kmem_free(zc, sizeof(*zc)); 1975 } 1976 1977 int 1978 zfsctl_lookup_objset(vfs_t *vfsp, uint64_t objsetid, zfsvfs_t **zfsvfsp) 1979 { 1980 struct sfs_node_key key = { 1981 .parent_id = ZFSCTL_INO_SNAPDIR, 1982 .id = objsetid 1983 }; 1984 vnode_t *vp; 1985 int error; 1986 1987 *zfsvfsp = NULL; 1988 error = vcache_get(vfsp, &key, sizeof(key), &vp); 1989 if (error == 0) { 1990 if (vp->v_mountedhere) 1991 *zfsvfsp = vp->v_mountedhere->mnt_data; 1992 vrele(vp); 1993 } 1994 if (*zfsvfsp == NULL) 1995 return SET_ERROR(EINVAL); 1996 return 0; 1997 } 1998 1999 int 2000 zfsctl_umount_snapshots(vfs_t *vfsp, int fflags, cred_t *cr) 2001 { 2002 char snapname[ZFS_MAX_DATASET_NAME_LEN]; 2003 zfsvfs_t *zfsvfs = vfsp->vfs_data; 2004 struct mount *mp; 2005 vnode_t *vp; 2006 struct sfs_node_key key; 2007 uint64_t cookie; 2008 int error; 2009 2010 ASSERT(zfsvfs->z_ctldir); 2011 2012 cookie = 0; 2013 key.parent_id = ZFSCTL_INO_SNAPDIR; 2014 for (;;) { 2015 dsl_pool_config_enter(dmu_objset_pool(zfsvfs->z_os), FTAG); 2016 error = dmu_snapshot_list_next(zfsvfs->z_os, sizeof(snapname), 2017 snapname, &key.id, &cookie, NULL); 2018 dsl_pool_config_exit(dmu_objset_pool(zfsvfs->z_os), FTAG); 2019 if (error) { 2020 if (error == ENOENT) 2021 error = 0; 2022 break; 2023 } 2024 2025 error = vcache_get(zfsvfs->z_vfs, &key, sizeof(key), &vp); 2026 if (error == ENOENT) 2027 continue; 2028 else if (error) 2029 break; 2030 2031 mp = vp->v_mountedhere; 2032 if (mp == NULL) { 2033 vrele(vp); 2034 continue; 2035 } 2036 2037 error = dounmount(mp, fflags, curthread); 2038 vrele(vp); 2039 if (error) 2040 break; 2041 } 2042 ASSERT((fflags & MS_FORCE) == 0 || error == 0); 2043 2044 return (error); 2045 } 2046 2047 boolean_t 2048 zfsctl_is_node(vnode_t *vp) 2049 { 2050 2051 return (vp->v_op == zfs_sfsop_p); 2052 } 2053 #endif /* __NetBSD__ */ 2054