Lines Matching defs:un
127 struct union_node *un;
139 while ((un = LIST_FIRST(&oldhash[i])) != NULL) {
140 LIST_REMOVE(un, un_cache);
141 val = UNION_HASH(un->un_uppervp, un->un_lowervp);
142 LIST_INSERT_HEAD(&hash[val], un, un_cache);
164 union_newlower(struct union_node *un, struct vnode *lowervp)
166 int ohash = UNION_HASH(un->un_uppervp, un->un_lowervp);
167 int nhash = UNION_HASH(un->un_uppervp, lowervp);
169 if (un->un_lowervp == lowervp)
172 KASSERT(VOP_ISLOCKED(UNIONTOV(un)) == LK_EXCLUSIVE);
173 KASSERT(un->un_lowervp == NULL);
177 if (ohash != nhash && (un->un_cflags & UN_CACHED)) {
178 un->un_cflags &= ~UN_CACHED;
179 LIST_REMOVE(un, un_cache);
181 mutex_enter(&un->un_lock);
182 un->un_lowervp = lowervp;
183 un->un_lowersz = VNOVAL;
184 mutex_exit(&un->un_lock);
186 LIST_INSERT_HEAD(&uhashtbl[nhash], un, un_cache);
187 un->un_cflags |= UN_CACHED;
194 union_newupper(struct union_node *un, struct vnode *uppervp)
196 int ohash = UNION_HASH(un->un_uppervp, un->un_lowervp);
197 int nhash = UNION_HASH(uppervp, un->un_lowervp);
202 if (un->un_uppervp == uppervp)
205 KASSERT(VOP_ISLOCKED(UNIONTOV(un)) == LK_EXCLUSIVE);
206 KASSERT(un->un_uppervp == NULL);
221 if (ohash != nhash && (un->un_cflags & UN_CACHED)) {
222 un->un_cflags &= ~UN_CACHED;
223 LIST_REMOVE(un, un_cache);
225 mutex_enter(&un->un_lock);
226 un->un_uppervp = uppervp;
227 un->un_uppersz = VNOVAL;
233 unlock_ap.a_vp = UNIONTOV(un);
236 vshareilock(UNIONTOV(un), uppervp);
238 uvm_obj_setlock(&UNIONTOV(un)->v_uobj, uppervp->v_uobj.vmobjlock);
239 vshareklist(UNIONTOV(un), uppervp);
240 mutex_exit(&un->un_lock);
242 LIST_INSERT_HEAD(&uhashtbl[nhash], un, un_cache);
243 un->un_cflags |= UN_CACHED;
259 struct union_node *un = VTOUNION(vp);
262 KASSERT(mutex_owned(&un->un_lock));
265 mutex_exit(&un->un_lock);
272 if ((uppersz != VNOVAL) && (un->un_uppersz != uppersz)) {
273 un->un_uppersz = uppersz;
275 sz = un->un_uppersz;
278 if ((lowersz != VNOVAL) && (un->un_lowersz != lowersz)) {
279 un->un_lowersz = lowersz;
281 sz = un->un_lowersz;
283 mutex_exit(&un->un_lock);
295 union_ref(struct union_node *un)
299 un->un_refs++;
303 union_rele(struct union_node *un)
307 un->un_refs--;
308 if (un->un_refs > 0) {
312 if (un->un_cflags & UN_CACHED) {
313 un->un_cflags &= ~UN_CACHED;
314 LIST_REMOVE(un, un_cache);
318 if (un->un_pvp != NULLVP)
319 vrele(un->un_pvp);
320 if (un->un_uppervp != NULLVP)
321 vrele(un->un_uppervp);
322 if (un->un_lowervp != NULLVP)
323 vrele(un->un_lowervp);
324 if (un->un_dirvp != NULLVP)
325 vrele(un->un_dirvp);
326 if (un->un_path)
327 free(un->un_path, M_TEMP);
328 mutex_destroy(&un->un_lock);
330 free(un, M_TEMP);
366 struct union_node *un = NULL, *un1;
395 un = NULL;
405 LIST_FOREACH(un, &uhashtbl[hash[try]], un_cache) {
406 if ((un->un_lowervp && un->un_lowervp != lowervp) ||
407 (un->un_uppervp && un->un_uppervp != uppervp) ||
408 un->un_mount != mp)
411 union_ref(un);
413 error = vcache_get(mp, &un, sizeof(un), &vp);
414 KASSERT(error != 0 || UNIONTOV(un) == vp);
415 union_rele(un);
427 if (un) {
431 vn_lock(UNIONTOV(un), LK_EXCLUSIVE | LK_RETRY);
438 if (uppervp != un->un_uppervp) {
439 union_newupper(un, uppervp);
450 if (lowervp != un->un_lowervp) {
451 union_newlower(un, lowervp);
453 un->un_path = malloc(cnp->cn_namelen+1,
455 memcpy(un->un_path, cnp->cn_nameptr,
457 un->un_path[cnp->cn_namelen] = '\0';
459 un->un_dirvp = dvp;
464 *vpp = UNIONTOV(un);
471 un = malloc(sizeof(struct union_node), M_TEMP, M_WAITOK);
472 mutex_init(&un->un_lock, MUTEX_DEFAULT, IPL_NONE);
473 un->un_refs = 1;
474 un->un_mount = mp;
475 un->un_vnode = NULL;
476 un->un_uppervp = uppervp;
477 un->un_lowervp = lowervp;
478 un->un_pvp = undvp;
481 un->un_dircache = 0;
482 un->un_openl = 0;
483 un->un_cflags = 0;
484 un->un_hooknode = false;
486 un->un_uppersz = VNOVAL;
487 un->un_lowersz = VNOVAL;
490 un->un_path = malloc(cnp->cn_namelen+1, M_TEMP, M_WAITOK);
491 memcpy(un->un_path, cnp->cn_nameptr, cnp->cn_namelen);
492 un->un_path[cnp->cn_namelen] = '\0';
494 un->un_dirvp = dvp;
496 un->un_path = 0;
497 un->un_dirvp = 0;
511 union_rele(un);
515 LIST_INSERT_HEAD(&uhashtbl[hash[0]], un, un_cache);
516 un->un_cflags |= UN_CACHED;
520 error = vcache_get(mp, &un, sizeof(un), vpp);
521 KASSERT(error != 0 || UNIONTOV(un) == *vpp);
522 union_rele(un);
536 struct union_node *un = VTOUNION(vp);
539 un->un_vnode = NULL;
540 un->un_uppersz = VNOVAL;
541 un->un_lowersz = VNOVAL;
548 union_rele(un);
559 struct union_node *un;
563 KASSERT(key_len == sizeof(un));
564 memcpy(&un, key, key_len);
567 svp = (un->un_uppervp != NULLVP) ? un->un_uppervp : un->un_lowervp;
571 vp->v_data = un;
572 un->un_vnode = vp;
584 if ((un->un_uppervp == um->um_uppervp) &&
585 ((un->un_lowervp == NULLVP) || un->un_lowervp == um->um_lowervp)) {
586 if (un->un_lowervp == NULLVP) {
587 un->un_lowervp = um->um_lowervp;
588 if (un->un_lowervp != NULLVP)
589 vref(un->un_lowervp);
595 if (un->un_uppervp != NULLVP) {
596 if (vn_lock(un->un_uppervp, LK_SHARED) == 0) {
597 if (VOP_GETATTR(un->un_uppervp, &va, FSCRED) == 0)
599 VOP_UNLOCK(un->un_uppervp);
602 if (un->un_lowervp != NULLVP) {
603 if (vn_lock(un->un_lowervp, LK_SHARED) == 0) {
604 if (VOP_GETATTR(un->un_lowervp, &va, FSCRED) == 0)
606 VOP_UNLOCK(un->un_lowervp);
610 mutex_enter(&un->un_lock);
614 union_ref(un);
685 * (un) is assumed to be locked on entry and remains
689 union_copyup(struct union_node *un, int docopy, kauth_cred_t cred,
696 error = union_vn_create(&uvp, un, l);
700 union_newupper(un, uvp);
702 lvp = un->un_lowervp;
728 uprintf("union: copied up %s\n", un->un_path);
746 for (i = 0; i < un->un_openl; i++) {
750 un->un_openl = 0;
860 * (un) holds the path and its hash to be created.
864 struct componentname *cnp, struct union_node *un)
871 un->un_path);
888 union_vn_create(struct vnode **vpp, struct union_node *un, struct lwp *l)
901 vn_lock(un->un_dirvp, LK_EXCLUSIVE | LK_RETRY);
903 error = union_do_lookup(un->un_dirvp, &cn, l->l_cred,
904 un->un_path);
906 VOP_UNLOCK(un->un_dirvp);
924 error = VOP_CREATE(un->un_dirvp, &vp, &cn, vap);
926 VOP_UNLOCK(un->un_dirvp);
931 VOP_UNLOCK(un->un_dirvp);
954 union_removed_upper(struct union_node *un)
956 struct vnode *vp = UNIONTOV(un);
969 union_diruncache(un);
971 union_newupper(un, NULLVP);
977 if (un->un_cflags & UN_CACHED) {
978 un->un_cflags &= ~UN_CACHED;
979 LIST_REMOVE(un, un_cache);
988 struct union_node *un = VTOUNION(vp);
990 if ((un->un_lowervp != NULLVP) &&
991 (vp->v_type == un->un_lowervp->v_type)) {
992 if (vget(un->un_lowervp, 0, true /* wait */) == 0)
993 return (un->un_lowervp);
1005 union_dowhiteout(struct union_node *un, kauth_cred_t cred)
1009 if (un->un_lowervp != NULLVP)
1012 if (VOP_GETATTR(un->un_uppervp, &va, cred) == 0 &&
1022 struct union_node *un;
1037 un = VTOUNION(vp);
1038 if (un->un_uppervp != NULLVP)
1039 union_dircache_r(un->un_uppervp, vppp, cntp);
1040 if (un->un_lowervp != NULLVP)
1041 union_dircache_r(un->un_lowervp, vppp, cntp);
1097 union_diruncache(struct union_node *un)
1101 KASSERT(VOP_ISLOCKED(UNIONTOV(un)) == LK_EXCLUSIVE);
1102 if (un->un_dircache != 0) {
1103 for (vpp = un->un_dircache; *vpp != NULLVP; vpp++)
1105 free(un->un_dircache, M_TEMP);
1106 un->un_dircache = 0;
1114 union_check_rmdir(struct union_node *un, kauth_cred_t cred)
1125 KASSERT(un->un_uppervp != NULL);
1128 KASSERT(VOP_ISLOCKED(un->un_uppervp));
1129 error = VOP_GETATTR(un->un_uppervp, &va, cred);
1133 if (un->un_lowervp == NULL)
1137 vn_lock(un->un_lowervp, LK_SHARED | LK_RETRY);
1138 error = VOP_GETATTR(un->un_lowervp, &va, cred);
1140 VOP_UNLOCK(un->un_lowervp);
1156 error = VOP_READDIR(un->un_lowervp, &auio, cred, &eofflag,
1178 error = VOP_LOOKUP(un->un_uppervp, &tvp, &cn);
1189 VOP_UNLOCK(un->un_lowervp);