diff options
author | Steven Whitehouse <swhiteho@redhat.com> | 2009-05-20 05:48:47 -0400 |
---|---|---|
committer | Steven Whitehouse <swhiteho@redhat.com> | 2009-05-20 05:48:47 -0400 |
commit | 09010978345e8883003bf411bb99753710eb5a3a (patch) | |
tree | c3a7eaf3a775649d11ad01c2be5d3549e90f6581 /fs/gfs2/eattr.c | |
parent | ef9e8b14a5c1d0afbaf12b4c3b271188ddfc52a4 (diff) |
GFS2: Improve resource group error handling
This patch improves the error handling in the case where we
discover that the summary information in the resource group
doesn't match the bitmap information while in the process of
allocating blocks. Originally this resulted in a kernel bug,
but this patch changes that so that we return -EIO and print
some messages explaining what went wrong, and how to fix it.
We also remember locally not to try and allocate from the
same rgrp again, so that a subsequent allocation in a
different rgrp should succeed.
Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
Diffstat (limited to 'fs/gfs2/eattr.c')
-rw-r--r-- | fs/gfs2/eattr.c | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/fs/gfs2/eattr.c b/fs/gfs2/eattr.c index 899763aed217..07ea9529adda 100644 --- a/fs/gfs2/eattr.c +++ b/fs/gfs2/eattr.c | |||
@@ -582,8 +582,11 @@ static int ea_alloc_blk(struct gfs2_inode *ip, struct buffer_head **bhp) | |||
582 | struct gfs2_ea_header *ea; | 582 | struct gfs2_ea_header *ea; |
583 | unsigned int n = 1; | 583 | unsigned int n = 1; |
584 | u64 block; | 584 | u64 block; |
585 | int error; | ||
585 | 586 | ||
586 | block = gfs2_alloc_block(ip, &n); | 587 | error = gfs2_alloc_block(ip, &block, &n); |
588 | if (error) | ||
589 | return error; | ||
587 | gfs2_trans_add_unrevoke(sdp, block, 1); | 590 | gfs2_trans_add_unrevoke(sdp, block, 1); |
588 | *bhp = gfs2_meta_new(ip->i_gl, block); | 591 | *bhp = gfs2_meta_new(ip->i_gl, block); |
589 | gfs2_trans_add_bh(ip->i_gl, *bhp, 1); | 592 | gfs2_trans_add_bh(ip->i_gl, *bhp, 1); |
@@ -617,6 +620,7 @@ static int ea_write(struct gfs2_inode *ip, struct gfs2_ea_header *ea, | |||
617 | struct gfs2_ea_request *er) | 620 | struct gfs2_ea_request *er) |
618 | { | 621 | { |
619 | struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode); | 622 | struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode); |
623 | int error; | ||
620 | 624 | ||
621 | ea->ea_data_len = cpu_to_be32(er->er_data_len); | 625 | ea->ea_data_len = cpu_to_be32(er->er_data_len); |
622 | ea->ea_name_len = er->er_name_len; | 626 | ea->ea_name_len = er->er_name_len; |
@@ -642,7 +646,9 @@ static int ea_write(struct gfs2_inode *ip, struct gfs2_ea_header *ea, | |||
642 | int mh_size = sizeof(struct gfs2_meta_header); | 646 | int mh_size = sizeof(struct gfs2_meta_header); |
643 | unsigned int n = 1; | 647 | unsigned int n = 1; |
644 | 648 | ||
645 | block = gfs2_alloc_block(ip, &n); | 649 | error = gfs2_alloc_block(ip, &block, &n); |
650 | if (error) | ||
651 | return error; | ||
646 | gfs2_trans_add_unrevoke(sdp, block, 1); | 652 | gfs2_trans_add_unrevoke(sdp, block, 1); |
647 | bh = gfs2_meta_new(ip->i_gl, block); | 653 | bh = gfs2_meta_new(ip->i_gl, block); |
648 | gfs2_trans_add_bh(ip->i_gl, bh, 1); | 654 | gfs2_trans_add_bh(ip->i_gl, bh, 1); |
@@ -963,7 +969,9 @@ static int ea_set_block(struct gfs2_inode *ip, struct gfs2_ea_request *er, | |||
963 | } else { | 969 | } else { |
964 | u64 blk; | 970 | u64 blk; |
965 | unsigned int n = 1; | 971 | unsigned int n = 1; |
966 | blk = gfs2_alloc_block(ip, &n); | 972 | error = gfs2_alloc_block(ip, &blk, &n); |
973 | if (error) | ||
974 | return error; | ||
967 | gfs2_trans_add_unrevoke(sdp, blk, 1); | 975 | gfs2_trans_add_unrevoke(sdp, blk, 1); |
968 | indbh = gfs2_meta_new(ip->i_gl, blk); | 976 | indbh = gfs2_meta_new(ip->i_gl, blk); |
969 | gfs2_trans_add_bh(ip->i_gl, indbh, 1); | 977 | gfs2_trans_add_bh(ip->i_gl, indbh, 1); |