Lines Matching +full:multiple +full:- +full:amp

1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
78 vp = ap->a_vp; in autofs_getattr()
79 anp = vp->v_data; in autofs_getattr()
80 mp = vp->v_mount; in autofs_getattr()
81 vap = ap->a_vap; in autofs_getattr()
83 KASSERT(ap->a_vp->v_type == VDIR, ("!VDIR")); in autofs_getattr()
86 * The reason we must do this is that some tree-walking software, in autofs_getattr()
98 error = VOP_GETATTR(newvp, ap->a_vap, in autofs_getattr()
99 ap->a_cred); in autofs_getattr()
105 vap->va_type = VDIR; in autofs_getattr()
106 vap->va_mode = 0755; in autofs_getattr()
107 vap->va_nlink = 3; /* XXX */ in autofs_getattr()
108 vap->va_uid = 0; in autofs_getattr()
109 vap->va_gid = 0; in autofs_getattr()
110 vap->va_rdev = NODEV; in autofs_getattr()
111 vap->va_fsid = mp->mnt_stat.f_fsid.val[0]; in autofs_getattr()
112 vap->va_fileid = anp->an_fileno; in autofs_getattr()
113 vap->va_size = S_BLKSIZE; in autofs_getattr()
114 vap->va_blocksize = S_BLKSIZE; in autofs_getattr()
115 vap->va_mtime = anp->an_ctime; in autofs_getattr()
116 vap->va_atime = anp->an_ctime; in autofs_getattr()
117 vap->va_ctime = anp->an_ctime; in autofs_getattr()
118 vap->va_birthtime = anp->an_ctime; in autofs_getattr()
119 vap->va_gen = 0; in autofs_getattr()
120 vap->va_flags = 0; in autofs_getattr()
121 vap->va_rdev = 0; in autofs_getattr()
122 vap->va_bytes = S_BLKSIZE; in autofs_getattr()
123 vap->va_filerev = 0; in autofs_getattr()
124 vap->va_spare = 0; in autofs_getattr()
141 anp = vp->v_data; in autofs_trigger_vn()
153 sx_xlock(&autofs_softc->sc_lock); in autofs_trigger_vn()
156 * XXX: Workaround for mounting the same thing multiple times; revisit. in autofs_trigger_vn()
158 if (vp->v_mountedhere != NULL) { in autofs_trigger_vn()
165 sx_xunlock(&autofs_softc->sc_lock); in autofs_trigger_vn()
176 if (vp->v_mountedhere == NULL) { in autofs_trigger_vn()
182 * the node as non-cached. Otherwise, if someone unmounts in autofs_trigger_vn()
186 anp->an_cached = false; in autofs_trigger_vn()
189 error = VFS_ROOT(vp->v_mountedhere, lock_flags, newvp); in autofs_trigger_vn()
211 struct autofs_mount *amp; in autofs_lookup() local
216 dvp = ap->a_dvp; in autofs_lookup()
217 vpp = ap->a_vpp; in autofs_lookup()
218 mp = dvp->v_mount; in autofs_lookup()
219 amp = VFSTOAUTOFS(mp); in autofs_lookup()
220 anp = dvp->v_data; in autofs_lookup()
221 cnp = ap->a_cnp; in autofs_lookup()
223 if (cnp->cn_flags & ISDOTDOT) { in autofs_lookup()
224 KASSERT(anp->an_parent != NULL, ("NULL parent")); in autofs_lookup()
227 * are looking up the parent vnode - exactly reverse from in autofs_lookup()
233 anp->an_parent, cnp->cn_lkflags, vpp); in autofs_lookup()
242 if (cnp->cn_namelen == 1 && cnp->cn_nameptr[0] == '.') { in autofs_lookup()
249 if (autofs_cached(anp, cnp->cn_nameptr, cnp->cn_namelen) == false && in autofs_lookup()
252 cnp->cn_nameptr, cnp->cn_namelen, &newvp); in autofs_lookup()
267 AUTOFS_SLOCK(amp); in autofs_lookup()
268 error = autofs_node_find(anp, cnp->cn_nameptr, cnp->cn_namelen, &child); in autofs_lookup()
270 if ((cnp->cn_flags & ISLASTCN) && cnp->cn_nameiop == CREATE) { in autofs_lookup()
271 AUTOFS_SUNLOCK(amp); in autofs_lookup()
275 AUTOFS_SUNLOCK(amp); in autofs_lookup()
282 AUTOFS_SUNLOCK(amp); in autofs_lookup()
284 error = autofs_node_vn(child, mp, cnp->cn_lkflags, vpp); in autofs_lookup()
286 if ((cnp->cn_flags & ISLASTCN) && cnp->cn_nameiop == CREATE) in autofs_lookup()
300 struct autofs_mount *amp; in autofs_mkdir() local
304 vp = ap->a_dvp; in autofs_mkdir()
305 anp = vp->v_data; in autofs_mkdir()
306 amp = VFSTOAUTOFS(vp->v_mount); in autofs_mkdir()
315 AUTOFS_XLOCK(amp); in autofs_mkdir()
316 error = autofs_node_new(anp, amp, ap->a_cnp->cn_nameptr, in autofs_mkdir()
317 ap->a_cnp->cn_namelen, &child); in autofs_mkdir()
319 AUTOFS_XUNLOCK(amp); in autofs_mkdir()
322 AUTOFS_XUNLOCK(amp); in autofs_mkdir()
324 error = autofs_node_vn(child, vp->v_mount, LK_EXCLUSIVE, ap->a_vpp); in autofs_mkdir()
335 vp = ap->a_vp; in autofs_print()
336 anp = vp->v_data; in autofs_print()
339 anp->an_name, anp->an_fileno, anp->an_cached, anp->an_wildcards); in autofs_print()
363 if (uio->uio_resid < reclen) in autofs_readdir_one()
367 dirent.d_off = uio->uio_offset + reclen; in autofs_readdir_one()
383 (void)autofs_readdir_one(NULL, name, -1, &reclen); in autofs_dirent_reclen()
392 struct autofs_mount *amp; in autofs_readdir() local
399 vp = ap->a_vp; in autofs_readdir()
400 amp = VFSTOAUTOFS(vp->v_mount); in autofs_readdir()
401 anp = vp->v_data; in autofs_readdir()
402 uio = ap->a_uio; in autofs_readdir()
403 initial_resid = ap->a_uio->uio_resid; in autofs_readdir()
405 KASSERT(vp->v_type == VDIR, ("!VDIR")); in autofs_readdir()
414 error = VOP_READDIR(newvp, ap->a_uio, ap->a_cred, in autofs_readdir()
415 ap->a_eofflag, ap->a_ncookies, ap->a_cookies); in autofs_readdir()
421 if (uio->uio_offset < 0) in autofs_readdir()
424 if (ap->a_eofflag != NULL) in autofs_readdir()
425 *ap->a_eofflag = FALSE; in autofs_readdir()
432 if (uio->uio_offset == 0) { in autofs_readdir()
433 error = autofs_readdir_one(uio, ".", anp->an_fileno, &reclen); in autofs_readdir()
442 if (uio->uio_offset <= reclens) { in autofs_readdir()
443 if (uio->uio_offset != reclens) in autofs_readdir()
445 if (anp->an_parent == NULL) { in autofs_readdir()
447 anp->an_fileno, &reclen); in autofs_readdir()
450 anp->an_parent->an_fileno, &reclen); in autofs_readdir()
461 AUTOFS_SLOCK(amp); in autofs_readdir()
462 RB_FOREACH(child, autofs_node_tree, &anp->an_children) { in autofs_readdir()
467 if (uio->uio_offset > reclens) { in autofs_readdir()
468 reclens += autofs_dirent_reclen(child->an_name); in autofs_readdir()
475 if (uio->uio_offset != reclens) { in autofs_readdir()
476 AUTOFS_SUNLOCK(amp); in autofs_readdir()
480 error = autofs_readdir_one(uio, child->an_name, in autofs_readdir()
481 child->an_fileno, &reclen); in autofs_readdir()
484 AUTOFS_SUNLOCK(amp); in autofs_readdir()
488 AUTOFS_SUNLOCK(amp); in autofs_readdir()
490 if (ap->a_eofflag != NULL) in autofs_readdir()
491 *ap->a_eofflag = TRUE; in autofs_readdir()
499 if (uio->uio_resid == initial_resid) in autofs_readdir()
505 if (uio->uio_resid < reclen) in autofs_readdir()
517 vp = ap->a_vp; in autofs_reclaim()
518 anp = vp->v_data; in autofs_reclaim()
524 sx_xlock(&anp->an_vnode_lock); in autofs_reclaim()
525 anp->an_vnode = NULL; in autofs_reclaim()
526 vp->v_data = NULL; in autofs_reclaim()
527 sx_xunlock(&anp->an_vnode_lock); in autofs_reclaim()
556 autofs_node_new(struct autofs_node *parent, struct autofs_mount *amp, in autofs_node_new() argument
562 AUTOFS_ASSERT_XLOCKED(parent->an_mount); in autofs_node_new()
570 anp->an_name = strndup(name, namelen, M_AUTOFS); in autofs_node_new()
572 anp->an_name = strdup(name, M_AUTOFS); in autofs_node_new()
573 anp->an_fileno = atomic_fetchadd_int(&amp->am_last_fileno, 1); in autofs_node_new()
574 callout_init(&anp->an_callout, 1); in autofs_node_new()
580 * vnode lock A -> autofsvlk B -> vnode lock B in autofs_node_new()
584 sx_init_flags(&anp->an_vnode_lock, "autofsvlk", SX_NOWITNESS); in autofs_node_new()
585 getnanotime(&anp->an_ctime); in autofs_node_new()
586 anp->an_parent = parent; in autofs_node_new()
587 anp->an_mount = amp; in autofs_node_new()
589 RB_INSERT(autofs_node_tree, &parent->an_children, anp); in autofs_node_new()
590 RB_INIT(&anp->an_children); in autofs_node_new()
603 AUTOFS_ASSERT_LOCKED(parent->an_mount); in autofs_node_find()
610 anp = RB_FIND(autofs_node_tree, &parent->an_children, &find); in autofs_node_find()
629 AUTOFS_ASSERT_XLOCKED(anp->an_mount); in autofs_node_delete()
630 KASSERT(RB_EMPTY(&anp->an_children), ("have children")); in autofs_node_delete()
632 callout_drain(&anp->an_callout); in autofs_node_delete()
634 parent = anp->an_parent; in autofs_node_delete()
636 RB_REMOVE(autofs_node_tree, &parent->an_children, anp); in autofs_node_delete()
637 sx_destroy(&anp->an_vnode_lock); in autofs_node_delete()
638 free(anp->an_name, M_AUTOFS); in autofs_node_delete()
649 AUTOFS_ASSERT_UNLOCKED(anp->an_mount); in autofs_node_vn()
651 sx_xlock(&anp->an_vnode_lock); in autofs_node_vn()
653 vp = anp->an_vnode; in autofs_node_vn()
658 sx_xunlock(&anp->an_vnode_lock); in autofs_node_vn()
666 sx_xunlock(&anp->an_vnode_lock); in autofs_node_vn()
673 sx_xunlock(&anp->an_vnode_lock); in autofs_node_vn()
679 sx_xunlock(&anp->an_vnode_lock); in autofs_node_vn()
685 vp->v_type = VDIR; in autofs_node_vn()
686 if (anp->an_parent == NULL) in autofs_node_vn()
687 vp->v_vflag |= VV_ROOT; in autofs_node_vn()
688 vp->v_data = anp; in autofs_node_vn()
695 sx_xunlock(&anp->an_vnode_lock); in autofs_node_vn()
699 KASSERT(anp->an_vnode == NULL, ("lost race")); in autofs_node_vn()
700 anp->an_vnode = vp; in autofs_node_vn()
702 sx_xunlock(&anp->an_vnode_lock); in autofs_node_vn()