if (ext2_use_xip(inode->i_sb)) { /* * we need to clear the block */ err = ext2_clear_xip_target (inode, le32_to_cpu(chain[depth-1].key)); if (err) goto cleanup; }  
int ext2_get_block(struct inode *inode, sector_t iblock, struct buffer_head *bh_result, int create){	int err = -EIO;	int offsets[4];	Indirect chain[4];	Indirect *partial;	unsigned long goal;	int left;	int boundary = 0;	int depth = ext2_block_to_path(inode, iblock, offsets, &boundary);	if (depth == 0)		goto out;reread:	partial = ext2_get_branch(inode, depth, offsets, chain, &err);	/* Simplest case - block found, no allocation needed */	if (!partial) {got_it:		map_bh(bh_result, inode->i_sb, le32_to_cpu(chain[depth-1].key));		if (boundary)			set_buffer_boundary(bh_result);		/* Clean up and exit */		partial = chain+depth-1; /* the whole chain */		goto cleanup;	}	/* Next simple case - plain lookup or failed read of indirect block */	if (!create || err == -EIO) {cleanup:		while (partial > chain) {			brelse(partial->bh);			partial--;		}out:		return err;	}	/*	 * Indirect block might be removed by truncate while we were	 * reading it. Handling of that case (forget what we've got and	 * reread) is taken out of the main path.	 */	if (err == -EAGAIN)		goto changed;	goal = 0;	if (ext2_find_goal(inode, iblock, chain, partial, &goal) < 0)		goto changed;	left = (chain + depth) - partial;	err = ext2_alloc_branch(inode, left, goal,					offsets+(partial-chain), partial);	if (err)		goto cleanup;	if (ext2_splice_branch(inode, iblock, chain, partial, left) < 0)		goto changed;	set_buffer_new(bh_result);	goto got_it;changed:	while (partial > chain) {		brelse(partial->bh);		partial--;	}	goto reread;}
10457	/local/tlutelli/issta_data/temp/c/2005_temp/2005/10457/6d79125bba55ee82701f1c7d4ebbc1aa20ecbe4e/inode.c/buggy/fs/ext2/inode.c