Message ID | 20171003150604.19596-5-nefelim4ag@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Tue, Oct 03, 2017 at 06:06:04PM +0300, Timofey Titovets wrote: > At now btrfs_dedupe_file_range() restricted to 16MiB range for > limit locking time and memory requirement for dedup ioctl() > > For too big input rage code silently set range to 16MiB > > Let's remove that restriction by do iterating over dedup range. > That's backward compatible and will not change anything for request > less then 16MiB. This would make the ioctl more pleasant to use. So far I haven't found any problems to do the iteration. One possible speedup could be done to avoid the repeated allocations in btrfs_extent_same if we're going to iterate more than once. As this would mean the 16MiB length restriction is gone, this needs to bubble up to the documentation (http://man7.org/linux/man-pages/man2/ioctl_fideduperange.2.html) Have you tested the behaviour with larger ranges? -- 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
Sorry, i just thinking that i can test that and send you some feedback, But for now, no time. I will check that later and try adds memory reusing. So, just ignore patches for now. Thanks 2017-10-10 20:36 GMT+03:00 David Sterba <dsterba@suse.cz>: > On Tue, Oct 03, 2017 at 06:06:04PM +0300, Timofey Titovets wrote: >> At now btrfs_dedupe_file_range() restricted to 16MiB range for >> limit locking time and memory requirement for dedup ioctl() >> >> For too big input rage code silently set range to 16MiB >> >> Let's remove that restriction by do iterating over dedup range. >> That's backward compatible and will not change anything for request >> less then 16MiB. > > This would make the ioctl more pleasant to use. So far I haven't found > any problems to do the iteration. One possible speedup could be done to > avoid the repeated allocations in btrfs_extent_same if we're going to > iterate more than once. > > As this would mean the 16MiB length restriction is gone, this needs to > bubble up to the documentation > (http://man7.org/linux/man-pages/man2/ioctl_fideduperange.2.html) > > Have you tested the behaviour with larger ranges?
diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c index 31407c62da63..4b468e5dfa11 100644 --- a/fs/btrfs/ioctl.c +++ b/fs/btrfs/ioctl.c @@ -3200,11 +3200,9 @@ ssize_t btrfs_dedupe_file_range(struct file *src_file, u64 loff, u64 olen, struct inode *src = file_inode(src_file); struct inode *dst = file_inode(dst_file); u64 bs = BTRFS_I(src)->root->fs_info->sb->s_blocksize; + u64 i, tail_len, chunk_count; ssize_t res; - if (olen > BTRFS_MAX_DEDUPE_LEN) - olen = BTRFS_MAX_DEDUPE_LEN; - if (WARN_ON_ONCE(bs < PAGE_SIZE)) { /* * Btrfs does not support blocksize < page_size. As a @@ -3214,7 +3212,23 @@ ssize_t btrfs_dedupe_file_range(struct file *src_file, u64 loff, u64 olen, return -EINVAL; } - res = btrfs_extent_same(src, loff, olen, dst, dst_loff); + tail_len = olen % BTRFS_MAX_DEDUPE_LEN; + chunk_count = div_u64(olen, BTRFS_MAX_DEDUPE_LEN); + + for (i = 0; i < chunk_count; i++) { + res = btrfs_extent_same(src, loff, BTRFS_MAX_DEDUPE_LEN, + dst, dst_loff); + if (res) + return res; + + loff += BTRFS_MAX_DEDUPE_LEN; + dst_loff += BTRFS_MAX_DEDUPE_LEN; + } + + if (tail_len > 0) + res = btrfs_extent_same(src, loff, tail_len, + dst, dst_loff); + if (res) return res; return olen;