On 08/08/2016 08:12 PM, Qu Wenruo wrote:
> 
> 
> At 08/09/2016 09:01 AM, Goldwyn Rodrigues wrote:
>>
>>
>> On 08/08/2016 07:26 PM, Qu Wenruo wrote:
>>>
>>>
>>> At 08/08/2016 10:54 AM, Goldwyn Rodrigues wrote:
>>>>
>>>>
>>>> On 08/07/2016 07:39 PM, Qu Wenruo wrote:
>>>>>
>>>>>
>>>>> At 08/07/2016 01:19 AM, Goldwyn Rodrigues wrote:
>>>>>> Thanks Qu,
>>>>>>
>>>>>> This patch set fixes all the reported problems. However, I have some
>>>>>> minor issues with coding style.
>>>>>>
>>>>>
>>>>> Thanks for the test.
>>>>>
>>>>>>
>>>>>> On 08/04/2016 09:29 PM, Qu Wenruo wrote:
>>>>>>> Refactor btrfs_qgroup_insert_dirty_extent() function, to two
>>>>>>> functions:
>>>>>>> 1. _btrfs_qgroup_insert_dirty_extent()
>>>>>>>    Almost the same with original code.
>>>>>>>    For delayed_ref usage, which has delayed refs locked.
>>>>>>>
>>>>>>>    Change the return value type to int, since caller never needs the
>>>>>>>    pointer, but only needs to know if they need to free the
>>>>>>> allocated
>>>>>>>    memory.
>>>>>>>
>>>>>>> 2. btrfs_qgroup_record_dirty_extent()
>>>>>>>    The more encapsulated version.
>>>>>>>
>>>>>>>    Will do the delayed_refs lock, memory allocation, quota enabled
>>>>>>> check
>>>>>>>    and other misc things.
>>>>>>>
>>>>>>> The original design is to keep exported functions to minimal, but
>>>>>>> since
>>>>>>> more btrfs hacks exposed, like replacing path in balance, needs
>>>>>>> us to
>>>>>>> record dirty extents manually, so we have to add such functions.
>>>>>>>
>>>>>>> Also, add comment for both functions, to info developers how to keep
>>>>>>> qgroup correct when doing hacks.
>>>>>>>
>>>>>>> Cc: Mark Fasheh <mfas...@suse.de>
>>>>>>> Signed-off-by: Qu Wenruo <quwen...@cn.fujitsu.com>
>>>>>>> ---
>>>>>>>  fs/btrfs/delayed-ref.c |  5 +----
>>>>>>>  fs/btrfs/extent-tree.c | 36 +++++-------------------------------
>>>>>>>  fs/btrfs/qgroup.c      | 39 ++++++++++++++++++++++++++++++++++-----
>>>>>>>  fs/btrfs/qgroup.h      | 44
>>>>>>> +++++++++++++++++++++++++++++++++++++++++---
>>>>>>>  4 files changed, 81 insertions(+), 43 deletions(-)
>>>>>>>
>>>>>>> diff --git a/fs/btrfs/delayed-ref.c b/fs/btrfs/delayed-ref.c
>>>>>>> index 430b368..5eed597 100644
>>>>>>> --- a/fs/btrfs/delayed-ref.c
>>>>>>> +++ b/fs/btrfs/delayed-ref.c
>>>>>>> @@ -541,7 +541,6 @@ add_delayed_ref_head(struct btrfs_fs_info
>>>>>>> *fs_info,
>>>>>>>      struct btrfs_delayed_ref_head *existing;
>>>>>>>      struct btrfs_delayed_ref_head *head_ref = NULL;
>>>>>>>      struct btrfs_delayed_ref_root *delayed_refs;
>>>>>>> -    struct btrfs_qgroup_extent_record *qexisting;
>>>>>>>      int count_mod = 1;
>>>>>>>      int must_insert_reserved = 0;
>>>>>>>
>>>>>>> @@ -606,9 +605,7 @@ add_delayed_ref_head(struct btrfs_fs_info
>>>>>>> *fs_info,
>>>>>>>          qrecord->num_bytes = num_bytes;
>>>>>>>          qrecord->old_roots = NULL;
>>>>>>>
>>>>>>> -        qexisting = btrfs_qgroup_insert_dirty_extent(delayed_refs,
>>>>>>> -                                 qrecord);
>>>>>>> -        if (qexisting)
>>>>>>> +        if(_btrfs_qgroup_insert_dirty_extent(delayed_refs,
>>>>>>> qrecord))
>>>>>>>              kfree(qrecord);
>>>>>>>      }
>>>>>>>
>>>>>>> diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
>>>>>>> index 9fcb8c9..47c85ff 100644
>>>>>>> --- a/fs/btrfs/extent-tree.c
>>>>>>> +++ b/fs/btrfs/extent-tree.c
>>>>>>> @@ -8519,34 +8519,6 @@ reada:
>>>>>>>      wc->reada_slot = slot;
>>>>>>>  }
>>>>>>>
>>>>>>> -/*
>>>>>>> - * These may not be seen by the usual inc/dec ref code so we
>>>>>>> have to
>>>>>>> - * add them here.
>>>>>>> - */
>>>>>>> -static int record_one_subtree_extent(struct btrfs_trans_handle
>>>>>>> *trans,
>>>>>>> -                     struct btrfs_root *root, u64 bytenr,
>>>>>>> -                     u64 num_bytes)
>>>>>>> -{
>>>>>>> -    struct btrfs_qgroup_extent_record *qrecord;
>>>>>>> -    struct btrfs_delayed_ref_root *delayed_refs;
>>>>>>> -
>>>>>>> -    qrecord = kmalloc(sizeof(*qrecord), GFP_NOFS);
>>>>>>> -    if (!qrecord)
>>>>>>> -        return -ENOMEM;
>>>>>>> -
>>>>>>> -    qrecord->bytenr = bytenr;
>>>>>>> -    qrecord->num_bytes = num_bytes;
>>>>>>> -    qrecord->old_roots = NULL;
>>>>>>> -
>>>>>>> -    delayed_refs = &trans->transaction->delayed_refs;
>>>>>>> -    spin_lock(&delayed_refs->lock);
>>>>>>> -    if (btrfs_qgroup_insert_dirty_extent(delayed_refs, qrecord))
>>>>>>> -        kfree(qrecord);
>>>>>>> -    spin_unlock(&delayed_refs->lock);
>>>>>>> -
>>>>>>> -    return 0;
>>>>>>> -}
>>>>>>> -
>>>>>>>  static int account_leaf_items(struct btrfs_trans_handle *trans,
>>>>>>>                    struct btrfs_root *root,
>>>>>>>                    struct extent_buffer *eb)
>>>>>>> @@ -8580,7 +8552,8 @@ static int account_leaf_items(struct
>>>>>>> btrfs_trans_handle *trans,
>>>>>>>
>>>>>>>          num_bytes = btrfs_file_extent_disk_num_bytes(eb, fi);
>>>>>>>
>>>>>>> -        ret = record_one_subtree_extent(trans, root, bytenr,
>>>>>>> num_bytes);
>>>>>>> +        ret = btrfs_qgroup_record_dirty_extent(trans,
>>>>>>> root->fs_info,
>>>>>>> +                bytenr, num_bytes, GFP_NOFS);
>>>>>>>          if (ret)
>>>>>>>              return ret;
>>>>>>>      }
>>>>>>> @@ -8729,8 +8702,9 @@ walk_down:
>>>>>>>              btrfs_set_lock_blocking_rw(eb, BTRFS_READ_LOCK);
>>>>>>>              path->locks[level] = BTRFS_READ_LOCK_BLOCKING;
>>>>>>>
>>>>>>> -            ret = record_one_subtree_extent(trans, root,
>>>>>>> child_bytenr,
>>>>>>> -                            root->nodesize);
>>>>>>> +            ret = btrfs_qgroup_record_dirty_extent(trans,
>>>>>>> +                    root->fs_info, child_bytenr,
>>>>>>> +                    root->nodesize, GFP_NOFS);
>>>>>>>              if (ret)
>>>>>>>                  goto out;
>>>>>>>          }
>>>>>>> diff --git a/fs/btrfs/qgroup.c b/fs/btrfs/qgroup.c
>>>>>>> index 9d4c05b..76d4f67 100644
>>>>>>> --- a/fs/btrfs/qgroup.c
>>>>>>> +++ b/fs/btrfs/qgroup.c
>>>>>>> @@ -1453,9 +1453,9 @@ int
>>>>>>> btrfs_qgroup_prepare_account_extents(struct
>>>>>>> btrfs_trans_handle *trans,
>>>>>>>      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)
>>>>>>> +int _btrfs_qgroup_insert_dirty_extent(
>>>>>>> +        struct btrfs_delayed_ref_root *delayed_refs,
>>>>>>> +        struct btrfs_qgroup_extent_record *record)
>>>>>>
>>>>>> Why do you rename the function preceding with an underscore? just
>>>>>> leave
>>>>>> it as it is.
>>>>>
>>>>> Because these two functions have different usage.
>>>>
>>>> Where is the "other" function used? AFAICS, you are replacing the
>>>> function name.
>>>
>>> See 2nd and 3rd patch.
>>> Or be more specific, dirty hack fixes, which is the case where we need
>>> to do manual tracking for qgroup.
>>
>> I still don't see it. Can you be more specific with function names to
>> help me understand?
> 
> _btrfs_qgroup_insert_dirty_extent() is the real function, which inserts
> btrfs_qgroup_extent_record structure into dirty_extent_root.
> 
> btrfs_qgroup_record_dirty_extent() is just the calling above
> _btrfs_qgroup_insert_dirty_extent() with proper lock content.
> 
> _btrfs_qgroup_insert_dirty_extent() should only be called in delayed_ref
> codes, more specifically, add_delayed_ref_head() function.
> 
> In add_delayed_ref_head(), the function already has already hold the
> need lock, so _btrfs_qgroup_insert_dirty_extent() don't need to acquire
> the lock.
> And normally, that's all needed hook for qgroup.
> 
> For special dirty hack routine, like merge_reloc_roots() and log replay
> code, which doesn't go through normal delayed_ref to handle reference
> modification, we need btrfs_qgroup_record_dirty_extent() function to
> manually info qgroup to track specific extents.
> 
> In that case, we need more encapsulated function, so that's
> btrfs_qgroup_record_dirty_extent().
> 
> 
>>
>> All you are doing is adding is btrfs_qgroup_record_dirty_extent() which
>> calls _btrfs_qgroup_insert_dirty_extent() with the locks. Is that what
>> you are referring to?
> 
> Yes.
> 
>>
>>
>>>
>>>>
>>>>>
>>>>> the underscore one are used when caller has already acquired needed
>>>>> lock, which is used by delayed-refs code.
>>>>>
>>>>> And the one without underscore is for other usage.
>>>>
>>>> What/Where is the "other usage"? Please don't say "previous".
>>>>
>>>
>>> See above.
>>>
>>>>>
>>>>> Despite the lock, these two functions are all the same.
>>>>>
>>>>> So I prefer to use underscore.
>>>>
>>>> BTW, you missed include/trace/events/btrfs.h, the reference to
>>>> btrfs_qgroup_insert_dirty_extent in DEFINE_EVENT.
>>>>
>>>
>>> Since btrfs_qgroup_insert_dirty_extent() is just calling the underscore
>>> one with proper lock content, so the trace is not affected.
>>
>> There is NO btrfs_qgroup_insert_dirty_extent(). Your patches REMOVED it
>> and replaced it with _btrfs_qgroup_insert_dirty_extent(). Only
>> btrfs_qgroup_record_dirty_extent() which is not in trace.
> 
> My fault, I should rename the new function to
> btrfs_qgroup_insert_dirty_extent(), or rename the old function to
> _btrfs_qgroup_record_dirty_extent().
> 
> I think that would reduce the confusion.
> 
> Or, do you prefer adding a new 'nolock' parameter to the old
> btrfs_qgroup_insert_dirty_extent()?
> 

Honestly, I don't like the idea of a function name which looks like a
"wrappee" function (as opposed to a wrapper function.. IOW a function
preceded with underscores) to be in the header files.

So, if I would to write it, the functions would be called as
btrfs_qgroup_insert_extent() and btrfs_qgroup_insert_extent_nolock(),
with former calling the latter. How does that sound?


-- 
Goldwyn
--
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

Reply via email to