@@ -403,32 +403,61 @@ static void _print_scrub_ss(struct scrub_stats *ss)
struct tm tm;
time_t seconds;
unsigned hours;
+ char *status;
+
+ const bool json_output = (bconf.output_format == CMD_FORMAT_JSON);
if (!ss || !ss->t_start) {
- pr_verbose(LOG_DEFAULT, "\tno stats available\n");
+ if (!json_output)
+ pr_verbose(LOG_DEFAULT, "\tno stats available\n");
+
return;
}
+
+ if (json_output)
+ fmt_print_start_group(&fctx, "info", JSON_TYPE_MAP);
+
if (ss->t_resumed) {
- localtime_r(&ss->t_resumed, &tm);
- strftime(t, sizeof(t), "%c", &tm);
- t[sizeof(t) - 1] = '\0';
- pr_verbose(LOG_DEFAULT, "Scrub resumed: %s\n", t);
+ if (json_output)
+ fmt_print(&fctx, "resumed-at", ss->t_resumed);
+ else {
+ localtime_r(&ss->t_resumed, &tm);
+ strftime(t, sizeof(t), "%c", &tm);
+ t[sizeof(t) - 1] = '\0';
+
+ pr_verbose(LOG_DEFAULT, "Scrub resumed: %s\n", t);
+ }
} else {
- localtime_r(&ss->t_start, &tm);
- strftime(t, sizeof(t), "%c", &tm);
- t[sizeof(t) - 1] = '\0';
- pr_verbose(LOG_DEFAULT, "Scrub started: %s\n", t);
- }
-
- seconds = ss->duration;
- hours = ss->duration / (60 * 60);
- gmtime_r(&seconds, &tm);
- strftime(t, sizeof(t), "%M:%S", &tm);
- pr_verbose(LOG_DEFAULT, "Status: %s\n",
- (ss->in_progress ? "running" :
+ if (json_output)
+ fmt_print(&fctx, "started-at", ss->t_start);
+ else {
+ localtime_r(&ss->t_start, &tm);
+ strftime(t, sizeof(t), "%c", &tm);
+ t[sizeof(t) - 1] = '\0';
+
+ pr_verbose(LOG_DEFAULT, "Scrub started: %s\n", t);
+ }
+ }
+
+ status = (ss->in_progress ? "running" :
(ss->canceled ? "aborted" :
- (ss->finished ? "finished" : "interrupted"))));
- pr_verbose(LOG_DEFAULT, "Duration: %u:%s\n", hours, t);
+ (ss->finished ? "finished" : "interrupted")));
+
+
+ if (json_output) {
+ fmt_print(&fctx, "status", status);
+ fmt_print(&fctx, "duration", ss->duration);
+ fmt_print_end_group(&fctx, "info");
+ } else {
+ seconds = ss->duration;
+ hours = ss->duration / (60 * 60);
+ gmtime_r(&seconds, &tm);
+ strftime(t, sizeof(t), "%M:%S", &tm);
+
+ pr_verbose(LOG_DEFAULT, "Status: %s\n", status);
+ pr_verbose(LOG_DEFAULT, "Duration: %u:%s\n", hours, t);
+ }
+
}
static void print_scrub_dev(struct btrfs_ioctl_dev_info_args *di,
@@ -436,7 +465,14 @@ static void print_scrub_dev(struct btrfs_ioctl_dev_info_args *di,
const char *append, struct scrub_stats *ss,
u64 limit)
{
- pr_verbose(LOG_DEFAULT, "\nScrub device %s (id %llu) %s\n", di->path, di->devid,
+ const bool json_output = (bconf.output_format == CMD_FORMAT_JSON);
+
+ if (json_output) {
+ fmt_print_start_group(&fctx, "device", JSON_TYPE_MAP);
+ fmt_print(&fctx, "dev", di->path);
+ fmt_print(&fctx, "id", di->devid);
+ } else
+ pr_verbose(LOG_DEFAULT, "\nScrub device %s (id %llu) %s\n", di->path, di->devid,
append ? append : "");
_print_scrub_ss(ss);
@@ -461,6 +497,9 @@ static void print_scrub_dev(struct btrfs_ioctl_dev_info_args *di,
print_scrub_summary(p, ss, di->bytes_used, limit);
}
}
+
+ if (json_output)
+ fmt_print_end_group(&fctx, "device");
}
/*