Skip to content

Commit

Permalink
gfs2: Clean up {lookup,fillup}_metapath
Browse files Browse the repository at this point in the history
Split out the entire lookup loop from lookup_metapath and
fillup_metapath.  Make both functions return the actual height in
mp->mp_aheight, and return 0 on success.  Handle lookup errors properly
in trunc_dealloc.

Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com>
Signed-off-by: Bob Peterson <rpeterso@redhat.com>
  • Loading branch information
Andreas Gruenbacher authored and Bob Peterson committed Jan 17, 2018
1 parent e7fdf00 commit e8b43fe
Showing 1 changed file with 30 additions and 44 deletions.
74 changes: 30 additions & 44 deletions fs/gfs2/bmap.c
Original file line number Diff line number Diff line change
Expand Up @@ -305,21 +305,22 @@ static void gfs2_metapath_ra(struct gfs2_glock *gl,
}
}

/**
* lookup_mp_height - helper function for lookup_metapath
* @ip: the inode
* @mp: the metapath
* @h: the height which needs looking up
*/
static int lookup_mp_height(struct gfs2_inode *ip, struct metapath *mp, int h)
static int __fillup_metapath(struct gfs2_inode *ip, struct metapath *mp,
unsigned int x, unsigned int h)
{
__be64 *ptr = metapointer(h, mp);
u64 dblock = be64_to_cpu(*ptr);
for (; x < h; x++) {
__be64 *ptr = metapointer(x, mp);
u64 dblock = be64_to_cpu(*ptr);
int ret;

if (!dblock)
return h + 1;

return gfs2_meta_indirect_buffer(ip, h + 1, dblock, &mp->mp_bh[h + 1]);
if (!dblock)
break;
ret = gfs2_meta_indirect_buffer(ip, x + 1, dblock, &mp->mp_bh[x + 1]);
if (ret)
return ret;
}
mp->mp_aheight = x + 1;
return 0;
}

/**
Expand All @@ -336,25 +337,12 @@ static int lookup_mp_height(struct gfs2_inode *ip, struct metapath *mp, int h)
* at which it found the unallocated block. Blocks which are found are
* added to the mp->mp_bh[] list.
*
* Returns: error or height of metadata tree
* Returns: error
*/

static int lookup_metapath(struct gfs2_inode *ip, struct metapath *mp)
{
unsigned int end_of_metadata = ip->i_height - 1;
unsigned int x;
int ret;

for (x = 0; x < end_of_metadata; x++) {
ret = lookup_mp_height(ip, mp, x);
if (ret)
goto out;
}

ret = ip->i_height;
out:
mp->mp_aheight = ret;
return ret;
return __fillup_metapath(ip, mp, 0, ip->i_height - 1);
}

/**
Expand All @@ -365,25 +353,21 @@ static int lookup_metapath(struct gfs2_inode *ip, struct metapath *mp)
*
* Similar to lookup_metapath, but does lookups for a range of heights
*
* Returns: error or height of metadata tree
* Returns: error
*/

static int fillup_metapath(struct gfs2_inode *ip, struct metapath *mp, int h)
{
unsigned int start_h = h - 1;
int ret;
unsigned int x = 0;

if (h) {
/* find the first buffer we need to look up. */
while (start_h > 0 && mp->mp_bh[start_h] == NULL)
start_h--;
for (; start_h < h; start_h++) {
ret = lookup_mp_height(ip, mp, start_h);
if (ret)
return ret;
for (x = h - 1; x > 0; x--) {
if (mp->mp_bh[x])
break;
}
}
return ip->i_height;
return __fillup_metapath(ip, mp, x, h);
}

static inline void release_metapath(struct metapath *mp)
Expand Down Expand Up @@ -788,7 +772,7 @@ int gfs2_iomap_begin(struct inode *inode, loff_t pos, loff_t length,
goto do_alloc;

ret = lookup_metapath(ip, &mp);
if (ret < 0)
if (ret)
goto out_release;

if (mp.mp_aheight != ip->i_height)
Expand Down Expand Up @@ -1345,7 +1329,9 @@ static int trunc_dealloc(struct gfs2_inode *ip, u64 newsize)

mp.mp_bh[0] = dibh;
ret = lookup_metapath(ip, &mp);
if (ret == ip->i_height)
if (ret)
goto out_metapath;
if (mp.mp_aheight == ip->i_height)
state = DEALLOC_MP_FULL; /* We have a complete metapath */
else
state = DEALLOC_FILL_MP; /* deal with partial metapath */
Expand Down Expand Up @@ -1441,16 +1427,16 @@ static int trunc_dealloc(struct gfs2_inode *ip, u64 newsize)
case DEALLOC_FILL_MP:
/* Fill the buffers out to the current height. */
ret = fillup_metapath(ip, &mp, mp_h);
if (ret < 0)
if (ret)
goto out;

/* If buffers found for the entire strip height */
if ((ret == ip->i_height) && (mp_h == strip_h)) {
if (mp.mp_aheight - 1 == strip_h) {
state = DEALLOC_MP_FULL;
break;
}
if (ret < ip->i_height) /* We have a partial height */
mp_h = ret - 1;
if (mp.mp_aheight < ip->i_height) /* We have a partial height */
mp_h = mp.mp_aheight - 1;

/* If we find a non-null block pointer, crawl a bit
higher up in the metapath and try again, otherwise
Expand Down

0 comments on commit e8b43fe

Please sign in to comment.