long iNodeTableBlock  = groupDescriptors[group].getInodeTable(); INodeTable iNodeTable = new INodeTable(this, (int)iNodeTableBlock); INode result = new INode(this, new INodeDescriptor(iNodeTable, iNodeNr, group, index)); result.read(iNodeTable.getInodeData(index));
int group = (int) ((iNodeNr - 1) / superblock.getINodesPerGroup()); int index = (int) ((iNodeNr - 1) % superblock.getINodesPerGroup());   INodeTable iNodeTable = iNodeTables[group]; INode result = new INode(this, new INodeDescriptor(iNodeTable, iNodeNr, group, index)); result.read(iNodeTable.getInodeData(index));
	public INode getINode(int iNodeNr) throws IOException, FileSystemException{		if((iNodeNr<1)||(iNodeNr>superblock.getINodesCount()))			throw new FileSystemException("INode number ("+iNodeNr+") out of range (0-"+superblock.getINodesCount()+")");					Integer key=new Integer(iNodeNr);				//log.debug("iNodeCache size: "+inodeCache.size());				synchronized(inodeCache) {			//check if the inode is already in the cache			if(inodeCache.containsKey(key)) 				return (INode)inodeCache.get(key);			else{				int group = (int) ((iNodeNr - 1) / superblock.getINodesPerGroup());				int index = (int) ((iNodeNr - 1) % superblock.getINodesPerGroup());						//get the part of the inode table that contains the inode				long iNodeTableBlock  = groupDescriptors[group].getInodeTable();	//the first block of the inode table				INodeTable iNodeTable = new INodeTable(this, (int)iNodeTableBlock);				INode result = new INode(this, new INodeDescriptor(iNodeTable, iNodeNr, group, index));				result.read(iNodeTable.getInodeData(index));										inodeCache.put(key, result);								return result;			}		}	}