From 4eeff4c9326878ff58ef6fe68d2bf22ef877e5a2 Mon Sep 17 00:00:00 2001 From: Al Viro Date: Fri, 19 Jun 2015 14:08:16 -0400 Subject: ufs_getfrag_block(): turn following indirects into a loop Signed-off-by: Al Viro diff --git a/fs/ufs/inode.c b/fs/ufs/inode.c index c05cf14..f2d8cc2 100644 --- a/fs/ufs/inode.c +++ b/fs/ufs/inode.c @@ -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) { + } else { + int i; phys64 = ufs_inode_getfrag(inode, offsets[0], fragment, &err, NULL, NULL, bh_result->b_page); - goto get_double; + for (i = 1; i < depth - 1; i++) + phys64 = ufs_inode_getblock(inode, phys64, offsets[i], + fragment, &err, NULL, NULL, NULL); + phys64 = ufs_inode_getblock(inode, phys64, offsets[depth - 1], + fragment, &err, &phys, &new, bh_result->b_page); } - phys64 = ufs_inode_getfrag(inode, offsets[0], fragment, - &err, NULL, NULL, bh_result->b_page); - phys64 = ufs_inode_getblock(inode, phys64, offsets[1], - 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) -- cgit v0.10.2