On Wed, Jun 27, 2018 at 4:55 PM, Nikolay Borisov <nbori...@suse.com> wrote:
>
>
> On 27.06.2018 18:45, Filipe Manana wrote:
>> On Wed, Jun 27, 2018 at 4:44 PM, Nikolay Borisov <nbori...@suse.com> wrote:
>>>
>>>
>>> On 27.06.2018 02:43, fdman...@kernel.org wrote:
>>>> From: Filipe Manana <fdman...@suse.com>
>>>>
>>>> If a power failure happens while the qgroup rescan kthread is running,
>>>> the next mount operation will always fail. This is because of a recent
>>>> regression that makes qgroup_rescan_init() incorrectly return -EINVAL
>>>> when we are mounting the filesystem (through btrfs_read_qgroup_config()).
>>>> This causes the -EINVAL error to be returned regardless of any qgroup
>>>> flags being set instead of returning the error only when neither of
>>>> the flags BTRFS_QGROUP_STATUS_FLAG_RESCAN nor BTRFS_QGROUP_STATUS_FLAG_ON
>>>> are set.
>>>>
>>>> A test case for fstests follows up soon.
>>>>
>>>> Fixes: 9593bf49675e ("btrfs: qgroup: show more meaningful 
>>>> qgroup_rescan_init error message")
>>>> Signed-off-by: Filipe Manana <fdman...@suse.com>
>>>> ---
>>>>  fs/btrfs/qgroup.c | 13 ++++++++++---
>>>>  1 file changed, 10 insertions(+), 3 deletions(-)
>>>>
>>>> diff --git a/fs/btrfs/qgroup.c b/fs/btrfs/qgroup.c
>>>> index 1874a6d2e6f5..d4171de93087 100644
>>>> --- a/fs/btrfs/qgroup.c
>>>> +++ b/fs/btrfs/qgroup.c
>>>> @@ -2784,13 +2784,20 @@ qgroup_rescan_init(struct btrfs_fs_info *fs_info, 
>>>> u64 progress_objectid,
>>>>
>>>>       if (!init_flags) {
>>>>               /* we're resuming qgroup rescan at mount time */
>>>> -             if (!(fs_info->qgroup_flags & 
>>>> BTRFS_QGROUP_STATUS_FLAG_RESCAN))
>>>> +             if (!(fs_info->qgroup_flags &
>>>> +                   BTRFS_QGROUP_STATUS_FLAG_RESCAN)) {
>>>>                       btrfs_warn(fs_info,
>>>>                       "qgroup rescan init failed, qgroup is not enabled");
>>>> -             else if (!(fs_info->qgroup_flags & 
>>>> BTRFS_QGROUP_STATUS_FLAG_ON))
>>>> +                     ret = -EINVAL;
>>>> +             } else if (!(fs_info->qgroup_flags &
>>>> +                          BTRFS_QGROUP_STATUS_FLAG_ON)) {
>>>>                       btrfs_warn(fs_info,
>>>>                       "qgroup rescan init failed, qgroup rescan is not 
>>>> queued");
>>>> -             return -EINVAL;
>>>> +                     ret = -EINVAL;
>>>> +             }
>>>> +
>>>> +             if (ret)
>>>> +                     return ret;
>>>
>>>
>>> How is this patch functionally different than the old code. In both
>>> cases if either of those 2 is not set a warn is printed and -EINVAL is
>>> returned?
>>
>> It is explained in the changelog:
>
> No need to be snide

No one's being snide. Simply, I can't see how the changelog doesn't
explain (what is already quite easy to notice from the code).

>
>>
>> "This is because of a recent
>> regression that makes qgroup_rescan_init() incorrectly return -EINVAL
>> when we are mounting the filesystem (through btrfs_read_qgroup_config()).
>> This causes the -EINVAL error to be returned regardless of any qgroup
>> flags being set instead of returning the error only when neither of
>> the flags BTRFS_QGROUP_STATUS_FLAG_RESCAN nor BTRFS_QGROUP_STATUS_FLAG_ON
>> are set."
>>
>> If you can't understand it, try the test case...
>
> Ok I see it now, however your description contradicts the code.
> Currently -EINVAL will be returned when either of the 2 flags is unset i.e
>
> !BTRFS_QGROUP_STATUS_FLAG_RESCAN && BTRFS_QGROUP_STATUS_FLAG_ON
> !BTRFS_QGROUP_STATUS_FLAG_ON && BTRFS_QGROUP_STATUS_FLAG_RESCAN
>
> and in your description you refer to neither that is the 2 flags being
> unset. Perhaps those combinations are invalid due to some other reasons
> which are not visible in the code but in this case the changelog should
> be expanded to cover why those 2 combinations are impossible (because if
> they are -EINVAL is still likely ) ?

I don't think the changelog is contradictory.
It says that -EINVAL is always returned, independently of which qgroup
flags are set/missing.
Further it says that the error should be returned only when one of
those 2 qgroup flags is not set (or both are not set).

>
>>
>>
>>>
>>>>       }
>>>>
>>>>       mutex_lock(&fs_info->qgroup_rescan_lock);
>>>>
>>
--
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