rem: do {
add: while (true) {
context: get_vnode(mount_id mountID, vnode_id vnodeID, struct vnode **_vnode, int reenter){	struct vnode *vnode;	int err;	FUNCTION(("get_vnode: mountid %ld vnid 0x%Lx %p\n", mountID, vnodeID, _vnode));	mutex_lock(&gVnodeMutex);	do {		vnode = lookup_vnode(mountID, vnodeID);		if (vnode) {			if (vnode->busy) {				mutex_unlock(&gVnodeMutex);				snooze(10000); // 10 ms				mutex_lock(&gVnodeMutex);				continue;			}		}	} while (0);	PRINT(("get_vnode: tried to lookup vnode, got 0x%p\n", vnode));	if (vnode) {		inc_vnode_ref_count(vnode);	} else {		// we need to create a new vnode and read it in		vnode = create_new_vnode();check_wall(__LINE__, vnode);		if (!vnode) {			err = B_NO_MEMORY;			goto err;		}		vnode->mount_id = mountID;		vnode->id = vnodeID;check_wall(__LINE__, vnode);				mutex_lock(&gMountMutex);			vnode->mount = find_mount(mountID);		if (!vnode->mount) {			mutex_unlock(&gMountMutex);			err = ERR_INVALID_HANDLE;			goto err;		}check_wall(__LINE__, vnode);		vnode->busy = true;		hash_insert(gVnodeTable, vnode);		mutex_unlock(&gVnodeMutex);		add_vnode_to_mount_list(vnode, vnode->mount);		mutex_unlock(&gMountMutex);check_wall(__LINE__, vnode);		err = FS_CALL(vnode, get_vnode)(vnode->mount->cookie, vnodeID, &vnode->private_node, reenter);		if (err < 0 && vnode->private_node == NULL) {			remove_vnode_from_mount_list(vnode, vnode->mount);			if (vnode->private_node == NULL)				err = EINVAL;		}		mutex_lock(&gVnodeMutex);		if (err < 0)			goto err1;		vnode->busy = false;		vnode->ref_count = 1;check_wall(__LINE__, vnode);	}	mutex_unlock(&gVnodeMutex);	PRINT(("get_vnode: returning 0x%p\n", vnode));	*_vnode = vnode;	return B_OK;err1:	hash_remove(gVnodeTable, vnode);err:	mutex_unlock(&gVnodeMutex);	if (vnode)		kfree(vnode);	return err;}