| From 07ccb7bf2c928fef4fea2cda69ba2e23479578db Mon Sep 17 00:00:00 2001 |
| From: Steven Whitehouse <swhiteho@redhat.com> |
| Date: Fri, 12 Feb 2010 10:10:55 +0000 |
| Subject: GFS2: Fix bmap allocation corner-case bug |
| |
| From: Steven Whitehouse <swhiteho@redhat.com> |
| |
| commit 07ccb7bf2c928fef4fea2cda69ba2e23479578db upstream. |
| |
| This patch solves a corner case during allocation which occurs if both |
| metadata (indirect) and data blocks are required but there is an |
| obstacle in the filesystem (e.g. a resource group header or another |
| allocated block) such that when the allocation is requested only |
| enough blocks for the metadata are returned. |
| |
| By changing the exit condition of this loop, we ensure that a |
| minimum of one data block will always be returned. |
| |
| Signed-off-by: Steven Whitehouse <swhiteho@redhat.com> |
| Cc: maximilian attems <max@stro.at> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| fs/gfs2/bmap.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| --- a/fs/gfs2/bmap.c |
| +++ b/fs/gfs2/bmap.c |
| @@ -541,7 +541,7 @@ static int gfs2_bmap_alloc(struct inode |
| *ptr++ = cpu_to_be64(bn++); |
| break; |
| } |
| - } while (state != ALLOC_DATA); |
| + } while ((state != ALLOC_DATA) || !dblock); |
| |
| ip->i_height = height; |
| gfs2_add_inode_blocks(&ip->i_inode, alloced); |