[Cluster-devel] [GFS2 Patch] GFS2: speed up delete/unlink performance for large files
Steven Whitehouse
swhiteho at redhat.com
Thu Sep 15 16:20:16 UTC 2011
Hi,
Now in the -nmw git tree. Many thanks for this - it looks really good
and will make a big difference to deallocation performance,
Steve.
On Thu, 2011-09-15 at 09:59 -0400, Bob Peterson wrote:
> Hi,
>
> This patch improves the performance of delete/unlink
> operations in a GFS2 file system where the files are large
> by adding a layer of metadata read-ahead for indirect blocks.
> Mileage will vary, but on my system, deleting an 8.6G file
> dropped from 22 seconds to about 4.5 seconds.
>
> Regards,
>
> Bob Peterson
> Red Hat File Systems
>
> Signed-off-by: Bob Peterson <rpeterso at redhat.com>
> --
> fs/gfs2/bmap.c | 26 +++++++++++++++++++++++---
> 1 files changed, 23 insertions(+), 3 deletions(-)
>
> diff --git a/fs/gfs2/bmap.c b/fs/gfs2/bmap.c
> index 7878c47..7efa38c 100644
> --- a/fs/gfs2/bmap.c
> +++ b/fs/gfs2/bmap.c
> @@ -691,7 +691,7 @@ static int recursive_scan(struct gfs2_inode *ip, struct buffer_head *dibh,
> {
> struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
> struct buffer_head *bh = NULL;
> - __be64 *top, *bottom;
> + __be64 *top, *bottom, *t2;
> u64 bn;
> int error;
> int mh_size = sizeof(struct gfs2_meta_header);
> @@ -719,7 +719,27 @@ static int recursive_scan(struct gfs2_inode *ip, struct buffer_head *dibh,
> if (error)
> goto out;
>
> - if (height < ip->i_height - 1)
> + if (height < ip->i_height - 1) {
> + struct buffer_head *rabh;
> +
> + for (t2 = top; t2 < bottom; t2++, first = 0) {
> + if (!*t2)
> + continue;
> +
> + bn = be64_to_cpu(*t2);
> + rabh = gfs2_getbuf(ip->i_gl, bn, CREATE);
> + if (trylock_buffer(rabh)) {
> + if (buffer_uptodate(rabh)) {
> + unlock_buffer(rabh);
> + brelse(rabh);
> + continue;
> + }
> + rabh->b_end_io = end_buffer_read_sync;
> + submit_bh(READA | REQ_META, rabh);
> + continue;
> + }
> + brelse(rabh);
> + }
> for (; top < bottom; top++, first = 0) {
> if (!*top)
> continue;
> @@ -731,7 +751,7 @@ static int recursive_scan(struct gfs2_inode *ip, struct buffer_head *dibh,
> if (error)
> break;
> }
> -
> + }
> out:
> brelse(bh);
> return error;
>
More information about the Cluster-devel
mailing list