Lines Matching +full:multi +full:- +full:layer
1 /*-
2 * SPDX-License-Identifier: BSD-3-Clause
8 * Jan-Simon Pendry.
36 * Null Layer
75 * Mount null layer
95 if (mp->mnt_flag & MNT_ROOTFS) in nullfs_mount()
99 * Update is a no-op in nullfs_mount()
101 if (mp->mnt_flag & MNT_UPDATE) { in nullfs_mount()
105 if (vfs_flagopt(mp->mnt_optnew, "export", NULL, 0)) in nullfs_mount()
114 error = vfs_getopt(mp->mnt_optnew, "from", (void **)&target, &len); in nullfs_mount()
116 error = vfs_getopt(mp->mnt_optnew, "target", (void **)&target, &len); in nullfs_mount()
117 if (error || target[len - 1] != '\0') in nullfs_mount()
123 if (null_is_nullfs_vnode(mp->mnt_vnodecovered) && in nullfs_mount()
124 VOP_ISLOCKED(mp->mnt_vnodecovered) == LK_EXCLUSIVE) { in nullfs_mount()
125 VOP_UNLOCK(mp->mnt_vnodecovered); in nullfs_mount()
139 * Re-lock vnode. in nullfs_mount()
140 * XXXKIB This is deadlock-prone as well. in nullfs_mount()
143 vn_lock(mp->mnt_vnodecovered, LK_EXCLUSIVE | LK_RETRY); in nullfs_mount()
152 lowerrootvp = ndp->ni_vp; in nullfs_mount()
155 * Check multi null mount to avoid `lock against myself' panic. in nullfs_mount()
157 if (null_is_nullfs_vnode(mp->mnt_vnodecovered)) { in nullfs_mount()
158 nn = VTONULL(mp->mnt_vnodecovered); in nullfs_mount()
159 if (nn == NULL || lowerrootvp == nn->null_lowervp) { in nullfs_mount()
160 NULLFSDEBUG("nullfs_mount: multi null mount?\n"); in nullfs_mount()
167 * Lower vnode must be the same type as the covered vnode - we in nullfs_mount()
170 if ((lowerrootvp->v_type != VDIR && lowerrootvp->v_type != VREG) || in nullfs_mount()
171 lowerrootvp->v_type != mp->mnt_vnodecovered->v_type) { in nullfs_mount()
184 xmp->nullm_vfs = vfs_register_upper_from_vp(lowerrootvp, mp, in nullfs_mount()
185 &xmp->upper_node); in nullfs_mount()
186 if (xmp->nullm_vfs == NULL) { in nullfs_mount()
192 xmp->nullm_lowerrootvp = lowerrootvp; in nullfs_mount()
193 mp->mnt_data = xmp; in nullfs_mount()
200 vfs_unregister_upper(xmp->nullm_vfs, &xmp->upper_node); in nullfs_mount()
206 if (NULLVPTOLOWERVP(nullm_rootvp)->v_mount->mnt_flag & MNT_LOCAL) { in nullfs_mount()
208 mp->mnt_flag |= MNT_LOCAL; in nullfs_mount()
212 if (vfs_getopt(mp->mnt_optnew, cache_opt_name, NULL, NULL) == 0) { in nullfs_mount()
213 xmp->nullm_flags |= NULLM_CACHE; in nullfs_mount()
214 } else if (vfs_getopt(mp->mnt_optnew, nocache_opt_name, NULL, in nullfs_mount()
218 (xmp->nullm_vfs->mnt_kern_flag & MNTK_NULL_NOCACHE) == 0) { in nullfs_mount()
219 xmp->nullm_flags |= NULLM_CACHE; in nullfs_mount()
222 if ((xmp->nullm_flags & NULLM_CACHE) != 0) { in nullfs_mount()
223 vfs_register_for_notification(xmp->nullm_vfs, mp, in nullfs_mount()
224 &xmp->notify_node); in nullfs_mount()
227 if (vfs_getopt(mp->mnt_optnew, unixbypass_opt_name, NULL, NULL) == 0) { in nullfs_mount()
229 } else if (vfs_getopt(mp->mnt_optnew, nounixbypass_opt_name, NULL, in nullfs_mount()
231 xmp->nullm_flags |= NULLM_NOUNPBYPASS; in nullfs_mount()
234 if (lowerrootvp == mp->mnt_vnodecovered) { in nullfs_mount()
236 lowerrootvp->v_vflag |= VV_CROSSLOCK; in nullfs_mount()
241 if ((xmp->nullm_flags & NULLM_CACHE) != 0) { in nullfs_mount()
242 mp->mnt_kern_flag |= lowerrootvp->v_mount->mnt_kern_flag & in nullfs_mount()
246 mp->mnt_kern_flag |= MNTK_NOMSYNC | MNTK_UNLOCKED_INSMNTQUE; in nullfs_mount()
247 mp->mnt_kern_flag |= lowerrootvp->v_mount->mnt_kern_flag & in nullfs_mount()
255 mp->mnt_stat.f_mntfromname, mp->mnt_stat.f_mntonname); in nullfs_mount()
260 * Free reference to null layer
281 if (mp->mnt_nvnodelistsize == 0) { in nullfs_unmount()
293 mntdata = mp->mnt_data; in nullfs_unmount()
294 if ((mntdata->nullm_flags & NULLM_CACHE) != 0) { in nullfs_unmount()
295 vfs_unregister_for_notification(mntdata->nullm_vfs, in nullfs_unmount()
296 &mntdata->notify_node); in nullfs_unmount()
298 if (mntdata->nullm_lowerrootvp == mp->mnt_vnodecovered) { in nullfs_unmount()
299 vn_lock(mp->mnt_vnodecovered, LK_EXCLUSIVE | LK_RETRY | LK_CANRECURSE); in nullfs_unmount()
300 mp->mnt_vnodecovered->v_vflag &= ~VV_CROSSLOCK; in nullfs_unmount()
301 VOP_UNLOCK(mp->mnt_vnodecovered); in nullfs_unmount()
303 vfs_unregister_upper(mntdata->nullm_vfs, &mntdata->upper_node); in nullfs_unmount()
304 vrele(mntdata->nullm_lowerrootvp); in nullfs_unmount()
305 mp->mnt_data = NULL; in nullfs_unmount()
319 mntdata->nullm_lowerrootvp); in nullfs_root()
321 error = vget(mntdata->nullm_lowerrootvp, flags); in nullfs_root()
323 error = null_nodeget(mp, mntdata->nullm_lowerrootvp, &vp); in nullfs_root()
340 lowermp = atomic_load_ptr(&mntdata->nullm_vfs); in nullfs_quotactl()
368 NULLFSDEBUG("nullfs_statfs(mp = %p, vp = %p->%p)\n", (void *)mp, in nullfs_statfs()
369 (void *)MOUNTTONULLMOUNT(mp)->nullm_rootvp, in nullfs_statfs()
370 (void *)NULLVPTOLOWERVP(MOUNTTONULLMOUNT(mp)->nullm_rootvp)); in nullfs_statfs()
374 error = VFS_STATFS(MOUNTTONULLMOUNT(mp)->nullm_vfs, mstat); in nullfs_statfs()
380 sbp->f_type = mstat->f_type; in nullfs_statfs()
381 sbp->f_bsize = mstat->f_bsize; in nullfs_statfs()
382 sbp->f_iosize = mstat->f_iosize; in nullfs_statfs()
383 sbp->f_blocks = mstat->f_blocks; in nullfs_statfs()
384 sbp->f_bfree = mstat->f_bfree; in nullfs_statfs()
385 sbp->f_bavail = mstat->f_bavail; in nullfs_statfs()
386 sbp->f_files = mstat->f_files; in nullfs_statfs()
387 sbp->f_ffree = mstat->f_ffree; in nullfs_statfs()
397 * XXX - Assumes no data cached at null layer. in nullfs_sync()
410 error = VFS_VGET(MOUNTTONULLMOUNT(mp)->nullm_vfs, ino, flags, vpp); in nullfs_vget()
421 error = VFS_FHTOVP(MOUNTTONULLMOUNT(mp)->nullm_vfs, fidp, flags, in nullfs_fhtovp()
433 return (VFS_EXTATTRCTL(MOUNTTONULLMOUNT(mp)->nullm_vfs, cmd, in nullfs_extattrctl()
445 VTONULL(vp)->null_flags |= NULLV_NOUNLOCK; in nullfs_reclaim_lowervp()
460 xp->null_flags |= NULLV_DROP | NULLV_NOUNLOCK; in nullfs_unlink_lowervp()
464 if (vp->v_usecount == 0) { in nullfs_unlink_lowervp()
485 xp->null_flags &= ~NULLV_NOUNLOCK; in nullfs_unlink_lowervp()