rem: FUNCTION_START(("vnode_id = %Ld\n", id));
context: bfs_read_vnode(void *_ns, vnode_id id, void **_node, bool reenter){	FUNCTION_START(("vnode_id = %Ld\n", id));	Volume *volume = (Volume *)_ns;	if (id < 0 || id > volume->NumBlocks()) {		FATAL(("inode at %Ld requested!\n", id));		return B_ERROR;	}	CachedBlock cached(volume, id);	bfs_inode *node = (bfs_inode *)cached.Block();	Inode *inode = NULL;	int32 tries = 0;restartIfBusy:	status_t status = node->InitCheck(volume);	if (status == B_BUSY) {		inode = (Inode *)node->etc;			// We have to use the "etc" field to get the inode object			// (the inode is currently being constructed)			// We would need to call something like get_vnode() again here			// to get rid of the "etc" field - which would be nice, especially			// for other file systems which don't have this messy field.		// let us wait a bit and try again later		if (tries++ < 200) {			// wait for one second at maximum			snooze(5000);			goto restartIfBusy;		}		FATAL(("inode is not becoming unbusy (id = %Ld)\n", id));		return status;	} else if (status < B_OK) {		FATAL(("inode at %Ld is corrupt!\n", id));		return status;	}	// If the inode is currently being constructed, we already have an inode	// pointer (taken from the node's etc field).	// If not, we create a new one here	if (inode == NULL) {		inode = new Inode(volume, id);		if (inode == NULL)			return B_NO_MEMORY;		status = inode->InitCheck(false);		if (status < B_OK)			delete inode;	} else		status = inode->InitCheck(false);	if (status == B_OK)		*_node = inode;	return status;}