summaryrefslogtreecommitdiff
path: root/qgroup-verify.c
diff options
context:
space:
mode:
authorQu Wenruo <wqu@suse.com>2018-04-30 14:16:59 +0800
committerDavid Sterba <dsterba@suse.com>2018-06-07 16:37:33 +0200
commit4bd7bbb6f6859583da1a81406cb3c02d613c9b2c (patch)
treee245c9254672712296f3d8d24b69f2688c0b1cfd /qgroup-verify.c
parent9f8316f1c870415383d8761e1455f1375e2e00b0 (diff)
btrfs-progs: check: Make btrfs check return error for qgroup mismatch
Current btrfs-check will check qgroup consistency, but even when it finds something wrong, the return value is still 0. Fix it by allowing report_qgroups() to return int to indicate qgroup mismatch, and also add extra logic to return no error if qgroup repair is successful. Without this patch, fstests can't detect qgroup corruption by its fsck alone. Signed-off-by: Qu Wenruo <wqu@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
Diffstat (limited to 'qgroup-verify.c')
-rw-r--r--qgroup-verify.c20
1 files changed, 17 insertions, 3 deletions
diff --git a/qgroup-verify.c b/qgroup-verify.c
index 571b4d4f..4deb9879 100644
--- a/qgroup-verify.c
+++ b/qgroup-verify.c
@@ -1298,10 +1298,19 @@ static int report_qgroup_difference(struct qgroup_count *count, int verbose)
return is_different;
}
-void report_qgroups(int all)
+/*
+ * Report qgroups errors
+ * Return 0 if nothing wrong.
+ * Return <0 if any qgroup is inconsistent.
+ *
+ * @all: if set, all qgroup will be checked and reported even already
+ * inconsistent or under rescan.
+ */
+int report_qgroups(int all)
{
struct rb_node *node;
struct qgroup_count *c;
+ bool found_err = false;
if (!repair && counts.rescan_running) {
if (all) {
@@ -1310,7 +1319,7 @@ void report_qgroups(int all)
} else {
printf(
"Qgroup rescan is running, qgroups will not be printed.\n");
- return;
+ return 0;
}
}
if (counts.qgroup_inconsist && !counts.rescan_running)
@@ -1319,11 +1328,16 @@ void report_qgroups(int all)
while (node) {
c = rb_entry(node, struct qgroup_count, rb_node);
- if (report_qgroup_difference(c, all))
+ if (report_qgroup_difference(c, all)) {
list_add_tail(&c->bad_list, &bad_qgroups);
+ found_err = true;
+ }
node = rb_next(node);
}
+ if (found_err)
+ return -EUCLEAN;
+ return 0;
}
void free_qgroup_counts(void)