]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
Btrfs: make sure fallocate properly starts a transaction
authorChris Mason <chris.mason@oracle.com>
Thu, 17 Dec 2009 20:47:17 +0000 (15:47 -0500)
committerChris Mason <chris.mason@oracle.com>
Thu, 17 Dec 2009 20:47:17 +0000 (15:47 -0500)
The recent patch to make fallocate enospc friendly would send
down a NULL trans handle to the allocator.  This moves the
transaction start to properly fix things.

Signed-off-by: Chris Mason <chris.mason@oracle.com>
fs/btrfs/inode.c

index da76cad92ecf385e7202d823c3d50463307d05fa..5440bab2363565e5c50399eb32b9f6e8ed103728 100644 (file)
@@ -5802,23 +5802,23 @@ static int prealloc_file_range(struct inode *inode, u64 start, u64 end,
        while (num_bytes > 0) {
                alloc_size = min(num_bytes, root->fs_info->max_extent);
 
+               trans = btrfs_start_transaction(root, 1);
+
                ret = btrfs_reserve_extent(trans, root, alloc_size,
                                           root->sectorsize, 0, alloc_hint,
                                           (u64)-1, &ins, 1);
                if (ret) {
                        WARN_ON(1);
-                       break;
+                       goto stop_trans;
                }
 
                ret = btrfs_reserve_metadata_space(root, 3);
                if (ret) {
                        btrfs_free_reserved_extent(root, ins.objectid,
                                                   ins.offset);
-                       break;
+                       goto stop_trans;
                }
 
-               trans = btrfs_start_transaction(root, 1);
-
                ret = insert_reserved_file_extent(trans, inode,
                                                  cur_offset, ins.objectid,
                                                  ins.offset, ins.offset,
@@ -5847,6 +5847,11 @@ static int prealloc_file_range(struct inode *inode, u64 start, u64 end,
                btrfs_unreserve_metadata_space(root, 3);
        }
        return ret;
+
+stop_trans:
+       btrfs_end_transaction(trans, root);
+       return ret;
+
 }
 
 static long btrfs_fallocate(struct inode *inode, int mode,