btrfs: qgroup: Add new function to record old_roots.
authorQu Wenruo <quwenruo@cn.fujitsu.com>
Thu, 16 Apr 2015 08:40:39 +0000 (16:40 +0800)
committerChris Mason <clm@fb.com>
Wed, 10 Jun 2015 16:25:39 +0000 (09:25 -0700)
Add function btrfs_qgroup_prepare_account_extents() to get old_roots
which are needed for qgroup.

We do it in commit_transaction() and before switch_roots(), and only
search commit_root, so it gives a quite accurate view for previous
transaction.

With old_roots from previous transaction, we can use it to do accurate
account with current transaction.

Signed-off-by: Qu Wenruo <quwenruo@cn.fujitsu.com>
Signed-off-by: Chris Mason <clm@fb.com>
fs/btrfs/qgroup.c
fs/btrfs/qgroup.h

index 55465d5d788e7b82d064033f8cf81e0f912b0ea9..7b18fff558ca22b90c14aa626f1ac0cbaff1555e 100644 (file)
@@ -1553,6 +1553,33 @@ int btrfs_qgroup_record_ref(struct btrfs_trans_handle *trans,
        return 0;
 }
 
+int btrfs_qgroup_prepare_account_extents(struct btrfs_trans_handle *trans,
+                                        struct btrfs_fs_info *fs_info)
+{
+       struct btrfs_qgroup_extent_record *record;
+       struct btrfs_delayed_ref_root *delayed_refs;
+       struct rb_node *node;
+       int ret = 0;
+
+       delayed_refs = &trans->transaction->delayed_refs;
+
+       /*
+        * No need to do lock, since this function will only be called in
+        * btrfs_commmit_transaction().
+        */
+       node = rb_first(&delayed_refs->dirty_extent_root);
+       while (node) {
+               record = rb_entry(node, struct btrfs_qgroup_extent_record,
+                                 node);
+               ret = btrfs_find_all_roots(NULL, fs_info, record->bytenr, 0,
+                                          &record->old_roots);
+               if (ret < 0)
+                       break;
+               node = rb_next(node);
+       }
+       return ret;
+}
+
 struct btrfs_qgroup_extent_record
 *btrfs_qgroup_insert_dirty_extent(struct btrfs_delayed_ref_root *delayed_refs,
                                  struct btrfs_qgroup_extent_record *record)
index e58155d0390caae88af9d13dd7d40bd308fa1570..6fe249f078ac7520e1d57278707d446365e3da38 100644 (file)
@@ -98,6 +98,8 @@ int btrfs_qgroup_record_ref(struct btrfs_trans_handle *trans,
                            u64 bytenr, u64 num_bytes,
                            enum btrfs_qgroup_operation_type type,
                            int mod_seq);
+int btrfs_qgroup_prepare_account_extents(struct btrfs_trans_handle *trans,
+                                        struct btrfs_fs_info *fs_info);
 struct btrfs_qgroup_extent_record
 *btrfs_qgroup_insert_dirty_extent(struct btrfs_delayed_ref_root *delayed_refs,
                                  struct btrfs_qgroup_extent_record *record);