On Wed, Jun 27, 2018 at 4:44 PM, Nikolay Borisov <[email protected]> wrote: > > > On 27.06.2018 02:43, [email protected] wrote: >> From: Filipe Manana <[email protected]> >> >> 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 <[email protected]> >> --- >> 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: "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... > >> } >> >> 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 [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
