Btrfs: fix wrong size for the reservation when doing, file pre-allocation.
authorMiao Xie <miaox@cn.fujitsu.com>
Thu, 6 Sep 2012 10:04:57 +0000 (04:04 -0600)
committerChris Mason <chris.mason@fusionio.com>
Mon, 1 Oct 2012 19:19:14 +0000 (15:19 -0400)
When we ran fsstress(a program in xfstests), the filesystem hung up when it
is full. It was because the space reserved in btrfs_fallocate() was wrong,
btrfs_fallocate() just used the size of the pre-allocation to reserve the
space, didn't took the block size aligning into account, so the size of
the reserved space was less than the allocated space, it caused the over
reserve problem and made the filesystem hung up when invoking cow_file_range().
Fix it.

Signed-off-by: Miao Xie <miaox@cn.fujitsu.com>
fs/btrfs/file.c

index 793bc89c660ff86aee1cfda47d1e5d7bdaf200fd..00279c9a7f35b8cfe605e32e48be5299794deb11 100644 (file)
@@ -2000,7 +2000,7 @@ static long btrfs_fallocate(struct file *file, int mode,
         * Make sure we have enough space before we do the
         * allocation.
         */
-       ret = btrfs_check_data_free_space(inode, len);
+       ret = btrfs_check_data_free_space(inode, alloc_end - alloc_start + 1);
        if (ret)
                return ret;
 
@@ -2107,7 +2107,7 @@ static long btrfs_fallocate(struct file *file, int mode,
 out:
        mutex_unlock(&inode->i_mutex);
        /* Let go of our reservation. */
-       btrfs_free_reserved_data_space(inode, len);
+       btrfs_free_reserved_data_space(inode, alloc_end - alloc_start + 1);
        return ret;
 }