rem: FUNCTION(("get_vnode: mountid %ld vnid 0x%Lx %p\n", mountID, vnodeID, _vnode));
add: struct vnode *vnode;
context: get_vnode(mount_id mountID, vnode_id vnodeID, struct vnode **_vnode, int reenter){	FUNCTION(("get_vnode: mountid %ld vnid 0x%Lx %p\n", mountID, vnodeID, _vnode));	mutex_lock(&sVnodeMutex);restart:	struct vnode *vnode = lookup_vnode(mountID, vnodeID);	if (vnode && vnode->busy) {		// ToDo: this is an endless loop if the vnode is not		//	becoming unbusy anymore (for whatever reason)		mutex_unlock(&sVnodeMutex);		snooze(10000); // 10 ms		mutex_lock(&sVnodeMutex);		goto restart;	}	PRINT(("get_vnode: tried to lookup vnode, got %p\n", vnode));	status_t status;	if (vnode) {		inc_vnode_ref_count(vnode);	} else {		// we need to create a new vnode and read it in		status = create_new_vnode(&vnode, mountID, vnodeID);		if (status < B_OK)			goto err;		vnode->busy = true;		mutex_unlock(&sVnodeMutex);		status = FS_CALL(vnode, get_vnode)(vnode->mount->cookie, vnodeID, &vnode->private_node, reenter);		if (status < B_OK || vnode->private_node == NULL) {			remove_vnode_from_mount_list(vnode, vnode->mount);			if (status == B_NO_ERROR)				status = B_BAD_VALUE;		}		mutex_lock(&sVnodeMutex);		if (status < B_OK)			goto err1;		vnode->busy = false;	}	mutex_unlock(&sVnodeMutex);	PRINT(("get_vnode: returning %p\n", vnode));	*_vnode = vnode;	return B_OK;err1:	hash_remove(sVnodeTable, vnode);	remove_vnode_from_mount_list(vnode, vnode->mount);err:	mutex_unlock(&sVnodeMutex);	if (vnode)		free(vnode);	return status;}