GFS2: Call do_strip() directly from recursive_scan()
The recursive_scan() function only ever takes a single "bc" argument, so we might as well just call do_strip() directly from resource_scan() rather than pass it in as an argument. Also the "data" argument is always a struct strip_mine, so we can pass that in, rather than using a void pointer. This also moves do_strip() ahead of recursive_scan() so that we don't need to add a prototype. Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
This commit is contained in:
parent
534029e2fd
commit
d56fa8a1c1
1 changed files with 71 additions and 78 deletions
149
fs/gfs2/bmap.c
149
fs/gfs2/bmap.c
|
@ -36,11 +36,6 @@ struct metapath {
|
||||||
__u16 mp_list[GFS2_MAX_META_HEIGHT];
|
__u16 mp_list[GFS2_MAX_META_HEIGHT];
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef int (*block_call_t) (struct gfs2_inode *ip, struct buffer_head *dibh,
|
|
||||||
struct buffer_head *bh, __be64 *top,
|
|
||||||
__be64 *bottom, unsigned int height,
|
|
||||||
void *data);
|
|
||||||
|
|
||||||
struct strip_mine {
|
struct strip_mine {
|
||||||
int sm_first;
|
int sm_first;
|
||||||
unsigned int sm_height;
|
unsigned int sm_height;
|
||||||
|
@ -667,76 +662,6 @@ int gfs2_extent_map(struct inode *inode, u64 lblock, int *new, u64 *dblock, unsi
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* recursive_scan - recursively scan through the end of a file
|
|
||||||
* @ip: the inode
|
|
||||||
* @dibh: the dinode buffer
|
|
||||||
* @mp: the path through the metadata to the point to start
|
|
||||||
* @height: the height the recursion is at
|
|
||||||
* @block: the indirect block to look at
|
|
||||||
* @first: 1 if this is the first block
|
|
||||||
* @bc: the call to make for each piece of metadata
|
|
||||||
* @data: data opaque to this function to pass to @bc
|
|
||||||
*
|
|
||||||
* When this is first called @height and @block should be zero and
|
|
||||||
* @first should be 1.
|
|
||||||
*
|
|
||||||
* Returns: errno
|
|
||||||
*/
|
|
||||||
|
|
||||||
static int recursive_scan(struct gfs2_inode *ip, struct buffer_head *dibh,
|
|
||||||
struct metapath *mp, unsigned int height,
|
|
||||||
u64 block, int first, block_call_t bc,
|
|
||||||
void *data)
|
|
||||||
{
|
|
||||||
struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
|
|
||||||
struct buffer_head *bh = NULL;
|
|
||||||
__be64 *top, *bottom;
|
|
||||||
u64 bn;
|
|
||||||
int error;
|
|
||||||
int mh_size = sizeof(struct gfs2_meta_header);
|
|
||||||
|
|
||||||
if (!height) {
|
|
||||||
error = gfs2_meta_inode_buffer(ip, &bh);
|
|
||||||
if (error)
|
|
||||||
return error;
|
|
||||||
dibh = bh;
|
|
||||||
|
|
||||||
top = (__be64 *)(bh->b_data + sizeof(struct gfs2_dinode)) + mp->mp_list[0];
|
|
||||||
bottom = (__be64 *)(bh->b_data + sizeof(struct gfs2_dinode)) + sdp->sd_diptrs;
|
|
||||||
} else {
|
|
||||||
error = gfs2_meta_indirect_buffer(ip, height, block, 0, &bh);
|
|
||||||
if (error)
|
|
||||||
return error;
|
|
||||||
|
|
||||||
top = (__be64 *)(bh->b_data + mh_size) +
|
|
||||||
(first ? mp->mp_list[height] : 0);
|
|
||||||
|
|
||||||
bottom = (__be64 *)(bh->b_data + mh_size) + sdp->sd_inptrs;
|
|
||||||
}
|
|
||||||
|
|
||||||
error = bc(ip, dibh, bh, top, bottom, height, data);
|
|
||||||
if (error)
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
if (height < ip->i_height - 1)
|
|
||||||
for (; top < bottom; top++, first = 0) {
|
|
||||||
if (!*top)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
bn = be64_to_cpu(*top);
|
|
||||||
|
|
||||||
error = recursive_scan(ip, dibh, mp, height + 1, bn,
|
|
||||||
first, bc, data);
|
|
||||||
if (error)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
out:
|
|
||||||
brelse(bh);
|
|
||||||
return error;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* do_strip - Look for a layer a particular layer of the file and strip it off
|
* do_strip - Look for a layer a particular layer of the file and strip it off
|
||||||
* @ip: the inode
|
* @ip: the inode
|
||||||
|
@ -752,9 +677,8 @@ out:
|
||||||
|
|
||||||
static int do_strip(struct gfs2_inode *ip, struct buffer_head *dibh,
|
static int do_strip(struct gfs2_inode *ip, struct buffer_head *dibh,
|
||||||
struct buffer_head *bh, __be64 *top, __be64 *bottom,
|
struct buffer_head *bh, __be64 *top, __be64 *bottom,
|
||||||
unsigned int height, void *data)
|
unsigned int height, struct strip_mine *sm)
|
||||||
{
|
{
|
||||||
struct strip_mine *sm = data;
|
|
||||||
struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
|
struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
|
||||||
struct gfs2_rgrp_list rlist;
|
struct gfs2_rgrp_list rlist;
|
||||||
u64 bn, bstart;
|
u64 bn, bstart;
|
||||||
|
@ -885,6 +809,75 @@ out:
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* recursive_scan - recursively scan through the end of a file
|
||||||
|
* @ip: the inode
|
||||||
|
* @dibh: the dinode buffer
|
||||||
|
* @mp: the path through the metadata to the point to start
|
||||||
|
* @height: the height the recursion is at
|
||||||
|
* @block: the indirect block to look at
|
||||||
|
* @first: 1 if this is the first block
|
||||||
|
* @sm: data opaque to this function to pass to @bc
|
||||||
|
*
|
||||||
|
* When this is first called @height and @block should be zero and
|
||||||
|
* @first should be 1.
|
||||||
|
*
|
||||||
|
* Returns: errno
|
||||||
|
*/
|
||||||
|
|
||||||
|
static int recursive_scan(struct gfs2_inode *ip, struct buffer_head *dibh,
|
||||||
|
struct metapath *mp, unsigned int height,
|
||||||
|
u64 block, int first, struct strip_mine *sm)
|
||||||
|
{
|
||||||
|
struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
|
||||||
|
struct buffer_head *bh = NULL;
|
||||||
|
__be64 *top, *bottom;
|
||||||
|
u64 bn;
|
||||||
|
int error;
|
||||||
|
int mh_size = sizeof(struct gfs2_meta_header);
|
||||||
|
|
||||||
|
if (!height) {
|
||||||
|
error = gfs2_meta_inode_buffer(ip, &bh);
|
||||||
|
if (error)
|
||||||
|
return error;
|
||||||
|
dibh = bh;
|
||||||
|
|
||||||
|
top = (__be64 *)(bh->b_data + sizeof(struct gfs2_dinode)) + mp->mp_list[0];
|
||||||
|
bottom = (__be64 *)(bh->b_data + sizeof(struct gfs2_dinode)) + sdp->sd_diptrs;
|
||||||
|
} else {
|
||||||
|
error = gfs2_meta_indirect_buffer(ip, height, block, 0, &bh);
|
||||||
|
if (error)
|
||||||
|
return error;
|
||||||
|
|
||||||
|
top = (__be64 *)(bh->b_data + mh_size) +
|
||||||
|
(first ? mp->mp_list[height] : 0);
|
||||||
|
|
||||||
|
bottom = (__be64 *)(bh->b_data + mh_size) + sdp->sd_inptrs;
|
||||||
|
}
|
||||||
|
|
||||||
|
error = do_strip(ip, dibh, bh, top, bottom, height, sm);
|
||||||
|
if (error)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
if (height < ip->i_height - 1)
|
||||||
|
for (; top < bottom; top++, first = 0) {
|
||||||
|
if (!*top)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
bn = be64_to_cpu(*top);
|
||||||
|
|
||||||
|
error = recursive_scan(ip, dibh, mp, height + 1, bn,
|
||||||
|
first, sm);
|
||||||
|
if (error)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
out:
|
||||||
|
brelse(bh);
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* gfs2_block_truncate_page - Deal with zeroing out data for truncate
|
* gfs2_block_truncate_page - Deal with zeroing out data for truncate
|
||||||
*
|
*
|
||||||
|
@ -1024,7 +1017,7 @@ static int trunc_dealloc(struct gfs2_inode *ip, u64 size)
|
||||||
sm.sm_first = !!size;
|
sm.sm_first = !!size;
|
||||||
sm.sm_height = height;
|
sm.sm_height = height;
|
||||||
|
|
||||||
error = recursive_scan(ip, NULL, &mp, 0, 0, 1, do_strip, &sm);
|
error = recursive_scan(ip, NULL, &mp, 0, 0, 1, &sm);
|
||||||
if (error)
|
if (error)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue