Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4eeff4c9 authored by Al Viro's avatar Al Viro
Browse files

ufs_getfrag_block(): turn following indirects into a loop



Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 5336970b
Loading
Loading
Loading
Loading
+8 −24
Original line number Diff line number Diff line
@@ -444,37 +444,21 @@ static int ufs_getfrag_block(struct inode *inode, sector_t fragment, struct buff
	if (depth == 1) {
		phys64 = ufs_inode_getfrag(inode, offsets[0], fragment,
					   &err, &phys, &new, bh_result->b_page);
		if (phys64) {
			phys64 += frag;
			phys = phys64;
		}
		goto out;
	}
	if (depth == 2) {
		phys64 = ufs_inode_getfrag(inode, offsets[0], fragment,
					   &err, NULL, NULL, bh_result->b_page);
		goto get_indirect;
	}
	if (depth == 3) {
		phys64 = ufs_inode_getfrag(inode, offsets[0], fragment,
					   &err, NULL, NULL, bh_result->b_page);
		goto get_double;
	}
	} else {
		int i;
		phys64 = ufs_inode_getfrag(inode, offsets[0], fragment,
					   &err, NULL, NULL, bh_result->b_page);
	phys64 = ufs_inode_getblock(inode, phys64, offsets[1],
		for (i = 1; i < depth - 1; i++)
			phys64 = ufs_inode_getblock(inode, phys64, offsets[i],
						fragment, &err, NULL, NULL, NULL);
get_double:
	phys64 = ufs_inode_getblock(inode, phys64, offsets[depth - 2],
				fragment, &err, NULL, NULL, NULL);
get_indirect:
		phys64 = ufs_inode_getblock(inode, phys64, offsets[depth - 1],
					fragment, &err, &phys, &new, bh_result->b_page);
	}
out:
	if (phys64) {
		phys64 += frag;
		phys = phys64;
	}
out:
	if (err)
		goto abort;
	if (new)