GFS2: Fix bmap allocation corner-case bug
authorSteven Whitehouse <swhiteho@redhat.com>
Fri, 12 Feb 2010 10:10:55 +0000 (10:10 +0000)
committerSteven Whitehouse <swhiteho@redhat.com>
Fri, 12 Feb 2010 10:16:14 +0000 (10:16 +0000)
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>
fs/gfs2/bmap.c

index 6d47379e794bc4a6b8a9f665aa3546da36dde441..583e823307ae7a17cd58b34027f11cea4e3f6437 100644 (file)
@@ -541,7 +541,7 @@ static int gfs2_bmap_alloc(struct inode *inode, const sector_t lblock,
                                *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);