On Fri, Apr 01, 2016 at 02:35:00PM +0800, Qu Wenruo wrote: > Core implement for inband de-duplication. > It reuse the async_cow_start() facility to do the calculate dedupe hash. > And use dedupe hash to do inband de-duplication at extent level. > > The work flow is as below: > 1) Run delalloc range for an inode > 2) Calculate hash for the delalloc range at the unit of dedupe_bs > 3) For hash match(duplicated) case, just increase source extent ref > and insert file extent. > For hash mismatch case, go through the normal cow_file_range() > fallback, and add hash into dedupe_tree. > Compress for hash miss case is not supported yet. > > Current implement restore all dedupe hash in memory rb-tree, with LRU > behavior to control the limit. > > Signed-off-by: Wang Xiaoguang <wangxg.f...@cn.fujitsu.com> > Signed-off-by: Qu Wenruo <quwen...@cn.fujitsu.com> > --- > fs/btrfs/extent-tree.c | 18 ++++ > fs/btrfs/inode.c | 235 > ++++++++++++++++++++++++++++++++++++++++++------- > fs/btrfs/relocation.c | 16 ++++ > 3 files changed, 236 insertions(+), 33 deletions(-) > > diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c > index 53e1297..dabd721 100644 > --- a/fs/btrfs/extent-tree.c > +++ b/fs/btrfs/extent-tree.c > @@ -37,6 +37,7 @@ > #include "math.h" > #include "sysfs.h" > #include "qgroup.h" > +#include "dedupe.h" > > #undef SCRAMBLE_DELAYED_REFS > > @@ -2399,6 +2400,8 @@ static int run_one_delayed_ref(struct > btrfs_trans_handle *trans, > > if (btrfs_delayed_ref_is_head(node)) { > struct btrfs_delayed_ref_head *head; > + struct btrfs_fs_info *fs_info = root->fs_info; > + > /* > * we've hit the end of the chain and we were supposed > * to insert this extent into the tree. But, it got > @@ -2413,6 +2416,15 @@ static int run_one_delayed_ref(struct > btrfs_trans_handle *trans, > btrfs_pin_extent(root, node->bytenr, > node->num_bytes, 1); > if (head->is_data) { > + /* > + * If insert_reserved is given, it means > + * a new extent is revered, then deleted > + * in one tran, and inc/dec get merged to 0. > + * > + * In this case, we need to remove its dedup > + * hash. > + */ > + btrfs_dedupe_del(trans, fs_info, node->bytenr); > ret = btrfs_del_csums(trans, root, > node->bytenr, > node->num_bytes); > @@ -6713,6 +6725,12 @@ static int __btrfs_free_extent(struct > btrfs_trans_handle *trans, > btrfs_release_path(path); > > if (is_data) { > + ret = btrfs_dedupe_del(trans, info, bytenr); > + if (ret < 0) { > + btrfs_abort_transaction(trans, extent_root, > + ret);
I don't see why an error here should lead to a readonly fs. --Mark -- Mark Fasheh -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html