Re: [RFC, crash][PATCH] btrfs: allow cross-subvolume file clone
From: David Sterba <hidden>
Date: 2011-08-09 17:50:12
On Thu, Aug 04, 2011 at 09:19:26AM +0800, Miao Xie wrote:
quoted
the patch has been applied on top of current linus which contains patches from both pull requests (ed8f37370d83).I think it is because the caller didn't reserve enough space.Could you try to apply the following patch? It might fix this bug. [PATCH v2] Btrfs: reserve enough space for file clone http://marc.info/?l=linux-btrfs&m=131192686626576&w=2
Thanks! Yes, it does not crash anymore. Trees reflinked succesfully, md5sums verified. david
Thanks Miaoquoted
The filesystem consists of 5 devices 23G each, about 100G of usable space, mkfs.btrfs with defaults. The kernel tree has about 6G: $ btrfs fi df . Data, RAID0: total=10.00GB, used=5.55GB Data: total=8.00MB, used=0.00 System, RAID1: total=8.00MB, used=4.00KB System: total=4.00MB, used=0.00 Metadata, RAID1: total=1.50GB, used=121.75MB Metadata: total=8.00MB, used=0.00 $ df -h . Filesystem Size Used Avail Use% Mounted on /dev/sda5 110G 5.8G 82G 7% /mnt/sda5 ie. plenty of free space. It's possible that I've omitted some important bits in the patch itself, or this exposes a bug of ENOSPC or delayed-inode. david --- From: David Sterba <redacted> Lift the EXDEV condition and allow different root trees for files being cloned, then pass source inode's root when searching for extents. Signed-off-by: David Sterba <redacted> --- fs/btrfs/ioctl.c | 7 ++++--- 1 files changed, 4 insertions(+), 3 deletions(-)diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c index 0b980af..58eb0ef 100644 --- a/fs/btrfs/ioctl.c +++ b/fs/btrfs/ioctl.c@@ -2183,7 +2183,7 @@ static noinline long btrfs_ioctl_clone(struct file *file, unsigned long srcfd, goto out_fput; ret = -EXDEV; - if (src->i_sb != inode->i_sb || BTRFS_I(src)->root != root) + if (src->i_sb != inode->i_sb) goto out_fput; ret = -ENOMEM;@@ -2247,13 +2247,14 @@ static noinline long btrfs_ioctl_clone(struct file *file, unsigned long srcfd, * note the key will change type as we walk through the * tree. */ - ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); + ret = btrfs_search_slot(NULL, BTRFS_I(src)->root, &key, path, + 0, 0); if (ret < 0) goto out; nritems = btrfs_header_nritems(path->nodes[0]); if (path->slots[0] >= nritems) { - ret = btrfs_next_leaf(root, path); + ret = btrfs_next_leaf(BTRFS_I(src)->root, path); if (ret < 0) goto out; if (ret > 0)-- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html