summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSage Weil <sage@newdream.net>2011-09-20 20:48:51 +0200
committerChris Mason <chris.mason@oracle.com>2011-09-20 20:48:51 +0200
commitb6f3409b2197e8fcedb43e6600e37b7cfbe0715b (patch)
treef4001140db592992982a323bc18553cb9d7c5682
parentBtrfs: don't change inode flag of the dest clone file (diff)
downloadlinux-b6f3409b2197e8fcedb43e6600e37b7cfbe0715b.tar.xz
linux-b6f3409b2197e8fcedb43e6600e37b7cfbe0715b.zip
Btrfs: reserve sufficient space for ioctl clone
Fix a crash/BUG_ON in the clone ioctl due to insufficient reservation. We need to reserve space for: - adjusting the old extent (possibly splitting it) - adding the new extent - updating the inode Signed-off-by: Sage Weil <sage@newdream.net> Signed-off-by: Chris Mason <chris.mason@oracle.com>
-rw-r--r--fs/btrfs/ioctl.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c
index 9947a0ac7bd5..6f89bcc4e555 100644
--- a/fs/btrfs/ioctl.c
+++ b/fs/btrfs/ioctl.c
@@ -2336,7 +2336,12 @@ static noinline long btrfs_ioctl_clone(struct file *file, unsigned long srcfd,
else
new_key.offset = destoff;
- trans = btrfs_start_transaction(root, 1);
+ /*
+ * 1 - adjusting old extent (we may have to split it)
+ * 1 - add new extent
+ * 1 - inode update
+ */
+ trans = btrfs_start_transaction(root, 3);
if (IS_ERR(trans)) {
ret = PTR_ERR(trans);
goto out;