}
else if (fileOffset < SINGLE_INDIRECT_MAX) {
long indAddr = readLong(inode, inodeOffset + (DIRECT_BLOCKS + 1) * 8);
if (indAddr == 0) {
Block block = store.allocateBlock();
indAddr = block.getBlockId();
block.free();
writeLong(inode, inodeOffset + (DIRECT_BLOCKS + 1) * 8, indAddr);
}
int blockOffset = 8 * (blockCount - DIRECT_BLOCKS);
Block writeBlock = store.writeBlockLong(indAddr, blockOffset, blockAddr);
xa.addUpdateBlock(writeBlock);
}
else if (fileOffset < DOUBLE_INDIRECT_MAX) {
long indAddr = readLong(inode, inodeOffset + (DIRECT_BLOCKS + 1) * 8);
if (indAddr == 0) {
store.setCorrupted(true);
throw new IllegalStateException(L.l("{0} null block id", store));
}
blockCount = blockCount - DIRECT_BLOCKS - SINGLE_INDIRECT_BLOCKS;
int dblBlockCount = blockCount / INDIRECT_BLOCKS;
int dblBlockIndex = 8 * (SINGLE_INDIRECT_BLOCKS + dblBlockCount);
long dblIndAddr = store.readBlockLong(indAddr, dblBlockIndex);
if (dblIndAddr == 0) {
Block block = store.allocateBlock();
dblIndAddr = BlockStore.blockIdToAddress(block.getBlockId());
block.free();
Block writeBlock = store.writeBlockLong(indAddr, dblBlockIndex, dblIndAddr);
xa.addUpdateBlock(writeBlock);
}
int blockOffset = 8 * (blockCount % INDIRECT_BLOCKS);
Block writeBlock = store.writeBlockLong(dblIndAddr, blockOffset, blockAddr);
xa.addUpdateBlock(writeBlock);
}
else {
store.setCorrupted(true);