Thread (6 messages) 6 messages, 3 authors, 2018-06-27

Re: [PATCH] Btrfs: fix mount failure when qgroup rescan is in progress

From: Filipe Manana <fdmanana@kernel.org>
Date: 2018-06-27 15:45:32

On Wed, Jun 27, 2018 at 4:44 PM, Nikolay Borisov [off-list ref] wrote:

On 27.06.2018 02:43, fdmanana@kernel.org wrote:
quoted
From: Filipe Manana <redacted>

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 <redacted>
---
 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...

quoted
      }

      mutex_lock(&fs_info->qgroup_rescan_lock);
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help