On 2017年10月25日 00:22, Edmund Nadolski wrote:
> 
> 
> On 10/24/2017 06:05 AM, Qu Wenruo wrote:
>>
>>
>> On 2017年10月24日 19:07, Nikolay Borisov wrote:
>>>
>>>
>>> On 24.10.2017 11:39, Qu Wenruo wrote:
>>>> Introduce helpers to:
>>>>
>>>> 1) Get total reserved space
>>>>    For limit calculation
>>>>
>>>> 2) Increase reserved space for given type
>>>> 2) Decrease reserved space for given type
>>>>
>>>> Signed-off-by: Qu Wenruo <w...@suse.com>
>>>> ---
>>>>  fs/btrfs/qgroup.c | 66 
>>>> +++++++++++++++++++++++++++++++++++++++++++++++++++++++
>>>>  1 file changed, 66 insertions(+)
>>>>
>>>> diff --git a/fs/btrfs/qgroup.c b/fs/btrfs/qgroup.c
>>>> index fe3adb996883..04fd145516ad 100644
>>>> --- a/fs/btrfs/qgroup.c
>>>> +++ b/fs/btrfs/qgroup.c
>>>> @@ -47,6 +47,72 @@
>>>>   *  - check all ioctl parameters
>>>>   */
>>>>  
>>>> +/*
>>>> + * Helpers to access qgroup reservation
>>>> + *
>>>> + * Callers should ensure the lock context and type are valid
>>>> + */
>>>> +
>>>> +static u64 qgroup_rsv_total(const struct btrfs_qgroup *qgroup)
>>>> +{
>>>> +  u64 ret = 0;
>>>> +  int i;
>>>> +
>>>> +  for (i = 0; i <= BTRFS_QGROUP_RSV_TYPES; i++)
>>>
>>> So if you actually take up on my idea of having an explicit value which
>>> denotes the end, the loop here would be just < *_END rather than the <=
>>> which instantly looks suspicious of an off-by-one error.
>>
>> Yeah, I really like to do it, as mentioned in previous mail.
>>
>> But to follow the schema used elsewhere, I had no choice.
>>
>>>
>>>> +          ret += qgroup->rsv.values[i];
>>>> +
>>>> +  return ret;
>>>> +}
>>>> +
>>>> +static const char *qgroup_rsv_type_str(enum btrfs_qgroup_rsv_type type)
>>>> +{
>>>> +  if (type == BTRFS_QGROUP_RSV_DATA)
>>>> +          return "data";
>>>> +  if (type == BTRFS_QGROUP_RSV_META)
>>>> +          return "meta";
>>>> +  return NULL;
>>>> +}
>>>> +
>>>> +static void qgroup_rsv_increase(struct btrfs_qgroup *qgroup, u64 
>>>> num_bytes,
>>>> +                          enum btrfs_qgroup_rsv_type type)
>>>> +{
>>>> +  qgroup->rsv.values[type] += num_bytes;
>>>> +}
>>>> +
>>>> +static void qgroup_rsv_decrease(struct btrfs_qgroup *qgroup, u64 
>>>> num_bytes,
>>>> +                          enum btrfs_qgroup_rsv_type type)
>>>> +{
>>>> +  if (qgroup->rsv.values[type] >= num_bytes) {
>>>> +          qgroup->rsv.values[type] -= num_bytes;
>>>> +          return;
>>>> +  }
>>>> +#ifdef CONFIG_BTRFS_DEBUG
>>>> +  WARN_RATELIMIT(1,
>>>> +          "qgroup %llu %s reserved space underflow, have %llu to free 
>>>> %llu",
>>>> +          qgroup->qgroupid, qgroup_rsv_type_str(type),
>>>> +          qgroup->rsv.values[type], num_bytes);
>>>> +#endif
>>>> +  qgroup->rsv.values[type] = 0;
>>>> +}
>>>
>>>
>>> Perhaps these could be modelled after
>>> block_rsv_use_bytes/block_rsv_add_bytes ? I'm not entirely sure of what
>>> increasing the value actually does - reserving bytes or using already
>>> reserved bytes, I guess it should be reserving. In this case what about
>>> qgroup_bytes_reserve/qgroup_bytes_(free|unreserve) ?
>>
>> I'm really bad at naming functions.
>> My original idea is qgroup_rsv_add() and qgroup_rsv_rename(), but
>> "rename" is 3 characters longer than "add", which makes me quite
>> uncomfortable.
>> (Maybe 'add' and 'sub' better?)
>>
>> For the "reserve|free", it can be easily confused with
>> btrfs_qgroup_reserve|release_data().
>>
>> But in fact, this qgroup_rsv_* functions are only used to maintain
>> qgroup->rsv, so it's less meaningful compared to other functions, like
>> btrfs_qgroup_reserve|release_data().
>>
>> The value itself represents how many bytes it has already reserved for
>> later operation.
>> So qgroup_rsv_increase() normally means qgroup is reserving more space,
>> while qgroup_rsv_decrease() means qgroup reserved space is decreasing,
>> either released or freed.
>>
>> Hopes above explanation could inspire you about better naming ideas.
>> (Because I really have no idea how to name it better while keeping the
>> name the same length)
> 
> I'm not sure I understand the concern about the length.  These names do
> not seem excessive to me, so a few extra characters for the sake of
> clarity would be well worth it.

What about qgroup_rsv_add/remove()?

These functions are just designed to increase/decrease the value(s) of
btrfs_qgroup_rsv structure, and should not be accessed outside of
qgroup_reserve() and some special call sides.

Maybe __qgroup_rsv_add/remove() will be better considering it's only
used internally.

Thanks,
Qu

> 
> Ed
> 
>>>> +
>>>> +static void qgroup_rsv_increase_by_qgroup(struct btrfs_qgroup *dest,
>>>> +                                    struct btrfs_qgroup *src)
>>>> +{
>>>> +  int i;
>>>> +
>>>> +  for (i = 0; i <= BTRFS_QGROUP_RSV_TYPES; i++)
>>>> +          qgroup_rsv_increase(dest, src->rsv.values[i], i);
>>>> +}
>>>> +
>>>> +static void qgroup_rsv_decrease_by_qgroup(struct btrfs_qgroup *dest,
>>>> +                                    struct btrfs_qgroup *src)
>>>> +{
>>>> +  int i;
>>>> +
>>>> +  for (i = 0; i <= BTRFS_QGROUP_RSV_TYPES; i++)
>>>> +          qgroup_rsv_decrease(dest, src->rsv.values[i], i);
>>>> +}
>>>
>>> Why don't you model these similar to what we already have for the block
>>> rsv. In this case I believe those would correspond to the
>>> btrfs_block_rsv_migrate. Admittedly we don't have a counterpart to
>>> rsv_decrease_by_qgroup.
>>
>> Not sure about 'migrate', I think it's more like 'inherit', since @src
>> is not modified at all.
>>
>> 'increase' and 'decrease' are preferred mainly because they are the same
>> length, and represents the value change obviously enough.
>>
>> I'm completely open to better naming schema.
>> (But it's better to have same length, I'm kind of paranoid about this)
>>
>> Thanks,
>> Qu
>>
>>>
>>>
>>>> +
>>>>  static void btrfs_qgroup_update_old_refcnt(struct btrfs_qgroup *qg, u64 
>>>> seq,
>>>>                                       int mod)
>>>>  {
>>>>
>>> --
>>> 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
>>>
>>
> --
> 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