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>
This commit is contained in:
+7
-2
@@ -136,7 +136,9 @@ int gfs2_unstuff_dinode(struct gfs2_inode *ip, struct page *page)
|
||||
and write it out to disk */
|
||||
|
||||
unsigned int n = 1;
|
||||
block = gfs2_alloc_block(ip, &n);
|
||||
error = gfs2_alloc_block(ip, &block, &n);
|
||||
if (error)
|
||||
goto out_brelse;
|
||||
if (isdir) {
|
||||
gfs2_trans_add_unrevoke(GFS2_SB(&ip->i_inode), block, 1);
|
||||
error = gfs2_dir_get_new_buffer(ip, block, &bh);
|
||||
@@ -476,8 +478,11 @@ static int gfs2_bmap_alloc(struct inode *inode, const sector_t lblock,
|
||||
blks = dblks + iblks;
|
||||
i = sheight;
|
||||
do {
|
||||
int error;
|
||||
n = blks - alloced;
|
||||
bn = gfs2_alloc_block(ip, &n);
|
||||
error = gfs2_alloc_block(ip, &bn, &n);
|
||||
if (error)
|
||||
return error;
|
||||
alloced += n;
|
||||
if (state != ALLOC_DATA || gfs2_is_jdata(ip))
|
||||
gfs2_trans_add_unrevoke(sdp, bn, n);
|
||||
|
||||
Reference in New Issue
Block a user