+
+int jt_lfsck_query(int argc, char **argv)
+{
+ struct obd_ioctl_data data = { 0 };
+ char rawbuf[MAX_IOC_BUFLEN], *buf = rawbuf;
+ char device[MAX_OBD_NAME] = "";
+ struct lfsck_query query = { .lu_types = LFSCK_TYPES_ALL };
+ int opt, index, rc, i;
+ enum lfsck_type type;
+
+ while ((opt = getopt_long(argc, argv, "hM:t:w", long_opt_query,
+ &index)) != EOF) {
+ switch (opt) {
+ case 'h':
+ usage_query();
+ return 0;
+ case 'M':
+ rc = lfsck_pack_dev(&data, device, optarg);
+ if (rc != 0)
+ return rc;
+ break;
+ case 't': {
+ char *typename;
+
+ if (query.lu_types == LFSCK_TYPES_ALL)
+ query.lu_types = 0;
+ while ((typename = strsep(&optarg, ",")) != NULL) {
+ type = lfsck_name2type(typename);
+ if (type == -1)
+ goto bad_type;
+ query.lu_types |= type;
+ }
+ break;
+
+bad_type:
+ fprintf(stderr, "invalid LFSCK type -t '%s'. "
+ "valid types are:\n", typename);
+ for (i = 0; lfsck_types_names[i].ltn_name != NULL; i++)
+ fprintf(stderr, "%s%s", i != 0 ? "," : "",
+ lfsck_types_names[i].ltn_name);
+ fprintf(stderr, "\n");
+ return -EINVAL;
+ }
+ case 'w':
+ query.lu_flags |= LPF_WAIT;
+ break;
+ default:
+ fprintf(stderr, "Invalid option, '-h' for help.\n");
+ usage_query();
+ return -EINVAL;
+ }
+ }
+
+ if (data.ioc_inlbuf4 == NULL) {
+ rc = lfsck_get_dev_name(&data, device, 0, true);
+ if (rc != 0)
+ return rc;
+ }
+
+ data.ioc_inlbuf1 = (char *)&query;
+ data.ioc_inllen1 = sizeof(query);
+ memset(buf, 0, sizeof(rawbuf));
+ rc = llapi_ioctl_pack(&data, &buf, sizeof(rawbuf));
+ if (rc != 0) {
+ fprintf(stderr, "Fail to pack ioctl data: rc = %d.\n", rc);
+ return rc;
+ }
+
+ rc = l_ioctl(OBD_DEV_ID, OBD_IOC_QUERY_LFSCK, buf);
+ if (rc < 0) {
+ perror("Fail to query LFSCK");
+ return rc;
+ }
+
+ llapi_ioctl_unpack(&data, buf, sizeof(rawbuf));
+ for (i = 0, type = 1 << i; i < LFSCK_TYPE_BITS; i++, type = 1 << i) {
+ const char *name;
+ int j;
+
+ if (!(query.lu_types & type))
+ continue;
+
+ name = lfsck_type2name(type);
+ for (j = 0; j <= LS_MAX; j++)
+ printf("%s_mdts_%s: %d\n", name,
+ lfsck_status2name(j), query.lu_mdts_count[i][j]);
+
+ for (j = 0; j <= LS_MAX; j++)
+ printf("%s_osts_%s: %d\n", name,
+ lfsck_status2name(j), query.lu_osts_count[i][j]);
+
+ printf("%s_repaired: %llu\n", name,
+ (unsigned long long)query.lu_repaired[i]);
+ }
+
+ return 0;
+}