+ /* swab structure fields of interest */
+ lsd.lsd_feature_compat = __le32_to_cpu(lsd.lsd_feature_compat);
+ lsd.lsd_feature_incompat = __le32_to_cpu(lsd.lsd_feature_incompat);
+ lsd.lsd_feature_rocompat = __le32_to_cpu(lsd.lsd_feature_rocompat);
+ lsd.lsd_last_transno = __le64_to_cpu(lsd.lsd_last_transno);
+ lsd.lsd_osd_index = __le32_to_cpu(lsd.lsd_osd_index);
+ lsd.lsd_mount_count = __le64_to_cpu(lsd.lsd_mount_count);
+
+ /* display */
+ printf(" uuid: %.40s\n", lsd.lsd_uuid);
+ printf(" feature_compat: %#x\n", lsd.lsd_feature_compat);
+ printf(" feature_incompat: %#x\n", lsd.lsd_feature_incompat);
+ printf(" feature_rocompat: %#x\n", lsd.lsd_feature_rocompat);
+ printf(" last_transaction: %llu\n",
+ (unsigned long long)lsd.lsd_last_transno);
+ printf(" target_index: %u\n", lsd.lsd_osd_index);
+ printf(" mount_count: %llu\n",
+ (unsigned long long)lsd.lsd_mount_count);
+
+ if (!opt_client || rc)
+ return rc;
+
+ /* read client information */
+ lsd.lsd_client_start = __le32_to_cpu(lsd.lsd_client_start);
+ lsd.lsd_client_size = __le16_to_cpu(lsd.lsd_client_size);
+ printf(" client_area_start: %u\n", lsd.lsd_client_start);
+ printf(" client_area_size: %hu\n", lsd.lsd_client_size);
+
+ /* seek to per-client data area */
+ rc = fseek(fp, lsd.lsd_client_start, SEEK_SET);
+ if (rc) {
+ fprintf(stderr, "%s: seek failed. %s\n",
+ progname, strerror(errno));
+ return errno;
+ }
+
+ /* walk throuh the per-client data area */
+ while (true) {
+ struct lsd_client_data lcd;
+
+ /* read a per-client data area */
+ n = fread(&lcd, 1, sizeof(lcd), fp);
+ if (n < sizeof(lcd)) {
+ if (feof(fp))
+ break;
+ fprintf(stderr, "%s: Short read (%d of %d)\n",
+ progname, n, (int)sizeof(lcd));
+ return ferror(fp) ? EIO : EINVAL;
+ }
+
+ if (lcd.lcd_uuid[0] == '\0')
+ continue;
+
+ /* swab structure fields */
+ lcd.lcd_last_transno =
+ __le64_to_cpu(lcd.lcd_last_transno);
+ lcd.lcd_last_xid = __le64_to_cpu(lcd.lcd_last_xid);
+ lcd.lcd_last_result = __le32_to_cpu(lcd.lcd_last_result);
+ lcd.lcd_last_data = __le32_to_cpu(lcd.lcd_last_data);
+ lcd.lcd_generation = __le32_to_cpu(lcd.lcd_generation);
+
+ /* display per-client data area */
+ printf("\n %.40s:\n", lcd.lcd_uuid);
+ printf(" generation: %u\n", lcd.lcd_generation);
+ printf(" last_transaction: %llu\n",
+ (unsigned long long)lcd.lcd_last_transno);
+ printf(" last_xid: %llu\n",
+ (unsigned long long)lcd.lcd_last_xid);
+ printf(" last_result: %u\n", lcd.lcd_last_result);
+ printf(" last_data: %u\n", lcd.lcd_last_data);
+
+ if (lcd.lcd_last_close_transno != 0 &&
+ lcd.lcd_last_close_xid != 0) {
+ lcd.lcd_last_close_transno =
+ __le64_to_cpu(lcd.lcd_last_close_transno);
+ lcd.lcd_last_close_xid =
+ __le64_to_cpu(lcd.lcd_last_close_xid);
+ lcd.lcd_last_close_result =
+ __le32_to_cpu(lcd.lcd_last_close_result);
+ lcd.lcd_last_close_data =
+ __le32_to_cpu(lcd.lcd_last_close_data);
+ printf(" last_close_transation: %llu\n",
+ (unsigned long long)lcd.lcd_last_close_transno);
+ printf(" last_close_xid: %llu\n",
+ (unsigned long long)lcd.lcd_last_close_xid);
+ printf(" last_close_result: %u\n",
+ lcd.lcd_last_close_result);
+ printf(" last_close_data: %u\n",
+ lcd.lcd_last_close_data);