On 2017年10月26日 22:00, Nikolay Borisov wrote:
> 
> 
> On 25.10.2017 05:54, Qu Wenruo wrote:
>> When modifying qgroup relationship, for qgroup which only owns exclusive
>> extents, we will go through quick update path.
>>
>> In quick update path, we will adding/substracting exclusive and reference
>> number for parent qgroup, since the source (child) qgroup only have
>> exclusive extents, destination (parent) qgroup will also own or lose these
>                                                                 ^ what
> does own or lose mean how is it decided whether it's losing them or
> owning them ??

Adding a child qgroup to parent, then the parent qgroup *owns* all these
extents of the child groups.
And vice verse (lose).

Of course, only for "exclusive-only" child qgroup, whose extents are all
exclusive.

>> extents exclusively.
>>
>> So should be the same for reservation, since later reservation
> What does the 'same' refer to here - the "will also own or lose these
> extents exclusively" ? It's a bit ambiguous given the surrounding context.
>> adding/releasing will also affect parent qgroup, without the servation
> 
> nit: s/servation/reservation
> 
>> carried from child, parent will underflow reservation or have dead
>> reservation which will never be freed.
>>
>> However original code doesn't do the same thing for reservation.
> 
> what does "the same" refer to here?

"The same" here means, the old code doesn't carry the reservation from
child, unlike it carries all rfer/excl from child.

> 
>> It handles qgroup reservation quite differently:
>>
>> It removes qgroup reservation, as it's allocating space from the
>> reserved qgroup for relationship adding.
>> But does nothing for qgroup reservation if we're removing a qgroup
>> relationship.
>>
>> According to the original code, it looks just like because we're adding
>> qgroup->rfer, the code assumes we're writing new data, so it's follows
> 
> nit:s/it's/it/
> 
> It might not be worth it doing a resend of the series with those fixes,
> I guess David could fix them up while committing them but just answering
> my question might help in fleshing out e clearer commit message.

No problem,

And answering your question can also help me to refine not only the
commit message the term used and the logic.

Thanks,
Qu
> 
>> the normal write routine, by reducing qgroup->reserved and adding
>> qgroup->rfer/excl.
>>
>> This old behavior is wrong, and should be fixed to follow the same
>> excl/rfer behavior.
>>
>> Just fix it by using the correct behavior described above.
>>
>> Fixes: 31193213f1f9 ("Btrfs: qgroup: Introduce a may_use to account 
>> space_info->bytes_may_use.")
>> Signed-off-by: Qu Wenruo <w...@suse.com>
>> ---
>>  fs/btrfs/qgroup.c | 44 +++++++++++++++++++++++---------------------
>>  1 file changed, 23 insertions(+), 21 deletions(-)
>>
>> diff --git a/fs/btrfs/qgroup.c b/fs/btrfs/qgroup.c
>> index 2c690aa19d84..cbc31cfabf44 100644
>> --- a/fs/btrfs/qgroup.c
>> +++ b/fs/btrfs/qgroup.c
>> @@ -1071,21 +1071,30 @@ static void report_reserved_underflow(struct 
>> btrfs_fs_info *fs_info,
>>  #endif
>>      qgroup->reserved = 0;
>>  }
>> +
>>  /*
>> - * The easy accounting, if we are adding/removing the only ref for an extent
>> - * then this qgroup and all of the parent qgroups get their reference and
>> - * exclusive counts adjusted.
>> + * The easy accounting, we're updating qgroup relationship whose child 
>> qgroup
>> + * only has exclusive extents.
>> + *
>> + * In this case, all exclsuive extents will also be exlusive for parent, so
>> + * excl/rfer just get added/removed.
>> + *
>> + * So is qgroup reservation space, which should also be added/removed to
>> + * parent.
>> + * Or when child tries to release reservation space, parent will underflow 
>> its
>> + * reservation (for relationship adding case).
>>   *
>>   * Caller should hold fs_info->qgroup_lock.
>>   */
>>  static int __qgroup_excl_accounting(struct btrfs_fs_info *fs_info,
>>                                  struct ulist *tmp, u64 ref_root,
>> -                                u64 num_bytes, int sign)
>> +                                struct btrfs_qgroup *src, int sign)
>>  {
>>      struct btrfs_qgroup *qgroup;
>>      struct btrfs_qgroup_list *glist;
>>      struct ulist_node *unode;
>>      struct ulist_iterator uiter;
>> +    u64 num_bytes = src->excl;
>>      int ret = 0;
>>  
>>      qgroup = find_qgroup_rb(fs_info, ref_root);
>> @@ -1098,13 +1107,11 @@ static int __qgroup_excl_accounting(struct 
>> btrfs_fs_info *fs_info,
>>      WARN_ON(sign < 0 && qgroup->excl < num_bytes);
>>      qgroup->excl += sign * num_bytes;
>>      qgroup->excl_cmpr += sign * num_bytes;
>> -    if (sign > 0) {
>> -            trace_qgroup_update_reserve(fs_info, qgroup, -(s64)num_bytes);
>> -            if (qgroup->reserved < num_bytes)
>> -                    report_reserved_underflow(fs_info, qgroup, num_bytes);
>> -            else
>> -                    qgroup->reserved -= num_bytes;
>> -    }
>> +
>> +    if (sign > 0)
>> +            qgroup_rsv_add_by_qgroup(qgroup, src);
>> +    else
>> +            qgroup_rsv_release_by_qgroup(qgroup, src);
>>  
>>      qgroup_dirty(fs_info, qgroup);
>>  
>> @@ -1124,15 +1131,10 @@ static int __qgroup_excl_accounting(struct 
>> btrfs_fs_info *fs_info,
>>              qgroup->rfer_cmpr += sign * num_bytes;
>>              WARN_ON(sign < 0 && qgroup->excl < num_bytes);
>>              qgroup->excl += sign * num_bytes;
>> -            if (sign > 0) {
>> -                    trace_qgroup_update_reserve(fs_info, qgroup,
>> -                                                -(s64)num_bytes);
>> -                    if (qgroup->reserved < num_bytes)
>> -                            report_reserved_underflow(fs_info, qgroup,
>> -                                                      num_bytes);
>> -                    else
>> -                            qgroup->reserved -= num_bytes;
>> -            }
>> +            if (sign > 0)
>> +                    qgroup_rsv_add_by_qgroup(qgroup, src);
>> +            else
>> +                    qgroup_rsv_release_by_qgroup(qgroup, src);
>>              qgroup->excl_cmpr += sign * num_bytes;
>>              qgroup_dirty(fs_info, qgroup);
>>  
>> @@ -1175,7 +1177,7 @@ static int quick_update_accounting(struct 
>> btrfs_fs_info *fs_info,
>>      if (qgroup->excl == qgroup->rfer) {
>>              ret = 0;
>>              err = __qgroup_excl_accounting(fs_info, tmp, dst,
>> -                                           qgroup->excl, sign);
>> +                                           qgroup, sign);
>>              if (err < 0) {
>>                      ret = err;
>>                      goto out;
>>
> --
> 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
> 

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to