@@ -1991,6 +1991,8 @@ static int cmd_scrub_status(const struct cmd_struct *cmd, int argc, char **argv)
int fdres = -1;
int err = 0;
+ const bool json_output = (bconf.output_format == CMD_FORMAT_JSON);
+
unit_mode = get_unit_mode_from_arg(&argc, argv, 0);
optind = 0;
@@ -2069,9 +2071,18 @@ static int cmd_scrub_status(const struct cmd_struct *cmd, int argc, char **argv)
}
in_progress = is_scrub_running_in_kernel(fdmnt, di_args, fi_args.num_devices);
- pr_verbose(LOG_DEFAULT, "UUID: %s\n", fsid);
+
+ if (json_output) {
+ fmt_start(&fctx, scrub_status_rowspec, 1, 0);
+ fmt_print_start_group(&fctx, "scrub-status", JSON_TYPE_MAP);
+ fmt_print(&fctx, "uuid", fsid);
+ } else
+ pr_verbose(LOG_DEFAULT, "UUID: %s\n", fsid);
if (do_stats_per_dev) {
+ if (json_output)
+ fmt_print_start_group(&fctx, "devices", JSON_TYPE_ARRAY);
+
for (i = 0; i < fi_args.num_devices; ++i) {
u64 limit;
@@ -2089,6 +2100,10 @@ static int cmd_scrub_status(const struct cmd_struct *cmd, int argc, char **argv)
"history" : "status",
&last_scrub->stats, limit);
}
+
+ if (json_output)
+ fmt_print_end_group(&fctx, "devices");
+
} else {
u64 total_bytes_used = 0;
struct btrfs_ioctl_space_info *sp = si_args->spaces;
@@ -2116,10 +2131,16 @@ static int cmd_scrub_status(const struct cmd_struct *cmd, int argc, char **argv)
/* This is still slightly off for RAID56 */
total_bytes_used += sp->used_bytes * factor;
}
+
print_fs_stat(&fs_stat, print_raw, total_bytes_used,
fi_args.num_devices, limit);
}
+ if (json_output) {
+ fmt_print_end_group(&fctx, "scrub-status");
+ fmt_end(&fctx);
+ }
+
out:
free_history(past_scrubs);
free(di_args);
@@ -2130,7 +2151,7 @@ out:
return !!err;
}
-static DEFINE_SIMPLE_COMMAND(scrub_status, "status");
+static DEFINE_COMMAND_WITH_FLAGS(scrub_status, "status", CMD_FORMAT_JSON);
static const char * const cmd_scrub_limit_usage[] = {
"btrfs scrub limit [options] <path>",