b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * This file and its contents are supplied under the terms of the
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * Common Development and Distribution License ("CDDL"), version 1.0.
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * You may only use this file in accordance with the terms of version
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * 1.0 of the CDDL.
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * A full copy of the text of the CDDL should have accompanied this
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * source. A copy of the CDDL is also available via the Internet at
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * Copyright 2014 Nexenta Systems, Inc. All rights reserved.
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * You can dump this AVL tree with mdb, i.e.
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * vncache_avl ::walk avl |::print -s1 vnode_t
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * Vnode cache.
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross/* ARGSUSED */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossvn_cache_constructor(void *buf, void *cdrarg, int kmflags)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross mutex_init(&vp->v_lock, NULL, MUTEX_DEFAULT, NULL);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross/* ARGSUSED */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * Used by file systems when fs-specific nodes (e.g., ufs inodes) are
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * cached by the file system and vnodes remain associated.
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * Used to reset the vnode fields including those that are directly accessible
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * as well as those which require an accessor function.
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * Does not initialize:
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * synchronization objects: v_lock, v_vsd_lock, v_nbllock, v_cv
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * v_data (since FS-nodes and vnodes point to each other and should
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * be updated simultaneously)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * v_op (in case someone needs to make a VOP call on this object)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * Some file systems call vn_free() with v_count of zero,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * some with v_count of 1. In any case, the value should
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * never be anything else.
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross ASSERT((vp->v_count == 0) || (vp->v_count == 1));
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (-1);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (+1);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (-1);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (+1);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossvncache_enter(struct stat *st, vnode_t *dvp, char *name, int fd)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * Fill in v_path
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * Note: fsop_root() calls with dvp=NULL
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross /* add to length for parent path + "/" */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross (void) snprintf(vpath, len, "%s/%s", dvp->v_path, name);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross old_vp = avl_find(&vncache_avl, new_vp, &where);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross /* If we lost the race, free new_vp */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * Called after a successful rename to update v_path
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossvncache_renamed(vnode_t *vp, vnode_t *to_dvp, char *to_name)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross /* add to length for parent path + "/" */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross (void) snprintf(vpath, len, "%s/%s", to_dvp->v_path, to_name);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * Last reference to this vnode is (possibly) going away.
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * This is normally called by vn_rele() when v_count==1.
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * Note that due to lock order concerns, we have to take
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * the vncache_lock (for the avl tree) and then recheck
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * v_count, which might have gained a ref during the time
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * we did not hold vp->v_lock.
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross /* This is (still) the last ref. */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vn_cache = kmem_cache_create("vn_cache", sizeof (struct vnode),
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross VNODE_ALIGN, vn_cache_constructor, vn_cache_destructor, NULL, NULL,