an alternative way of mounting multiple-device filesystem without the need for
prior scanning. See the mount option 'device'.
-*stats* [-z] <path>|<device>::
+*stats* [-zs] <path>|<device>::
Read and print the device IO error statistics for all devices of the given
filesystem identified by <path> or for a single <device>. See section *DEVICE
STATS* for more information.
-z::::
Print the stats and reset the values to zero afterwards.
+-s::::
+Set bit 6 of the return-code if any error statistics are non-zero.
+
*usage* [options] <path> [<path>...]::
Show detailed information about internal allocations in devices.
+
*btrfs device* returns a zero exit status if it succeeds. Non zero is
returned in case of failure.
+If the '-s' option is used, *btrfs device stats* will add 64 to the
+exit status if any of the error counters is non-zero.
+
AVAILABILITY
------------
*btrfs* is part of btrfs-progs.
"Show current device IO stats.",
"",
"-z show current stats and reset values to zero",
+ "-s return non-zero if any stat counter is not zero",
NULL
};
int i;
int c;
int err = 0;
+ int status = 0;
__u64 flags = 0;
DIR *dirstream = NULL;
- while ((c = getopt(argc, argv, "z")) != -1) {
+ while ((c = getopt(argc, argv, "zs")) != -1) {
switch (c) {
case 'z':
flags = BTRFS_DEV_STATS_RESET;
break;
+ case 's':
+ status = 1;
+ break;
case '?':
default:
usage(cmd_device_stats_usage);
if (ioctl(fdmnt, BTRFS_IOC_GET_DEV_STATS, &args) < 0) {
error("DEV_STATS ioctl failed on %s: %s",
path, strerror(errno));
- err = 1;
+ err |= 1;
} else {
char *canonical_path;
"devid:%llu", args.devid);
}
- if (args.nr_items >= BTRFS_DEV_STAT_WRITE_ERRS + 1)
+ if (args.nr_items >= BTRFS_DEV_STAT_WRITE_ERRS + 1) {
printf("[%s].write_io_errs %llu\n",
canonical_path,
(unsigned long long) args.values[
BTRFS_DEV_STAT_WRITE_ERRS]);
- if (args.nr_items >= BTRFS_DEV_STAT_READ_ERRS + 1)
+ if ((status == 1) && (args.values[BTRFS_DEV_STAT_WRITE_ERRS] > 0)) {
+ err |= 64;
+ }
+ }
+ if (args.nr_items >= BTRFS_DEV_STAT_READ_ERRS + 1) {
printf("[%s].read_io_errs %llu\n",
canonical_path,
(unsigned long long) args.values[
BTRFS_DEV_STAT_READ_ERRS]);
- if (args.nr_items >= BTRFS_DEV_STAT_FLUSH_ERRS + 1)
+ if ((status == 1) && (args.values[BTRFS_DEV_STAT_READ_ERRS] > 0)) {
+ err |= 64;
+ }
+ }
+ if (args.nr_items >= BTRFS_DEV_STAT_FLUSH_ERRS + 1) {
printf("[%s].flush_io_errs %llu\n",
canonical_path,
(unsigned long long) args.values[
BTRFS_DEV_STAT_FLUSH_ERRS]);
- if (args.nr_items >= BTRFS_DEV_STAT_CORRUPTION_ERRS + 1)
+ if ((status == 1) && (args.values[BTRFS_DEV_STAT_FLUSH_ERRS] > 0)) {
+ err |= 64;
+ }
+ }
+ if (args.nr_items >= BTRFS_DEV_STAT_CORRUPTION_ERRS + 1) {
printf("[%s].corruption_errs %llu\n",
canonical_path,
(unsigned long long) args.values[
BTRFS_DEV_STAT_CORRUPTION_ERRS]);
- if (args.nr_items >= BTRFS_DEV_STAT_GENERATION_ERRS + 1)
+ if ((status == 1) && (args.values[BTRFS_DEV_STAT_CORRUPTION_ERRS] > 0)) {
+ err |= 64;
+ }
+ }
+ if (args.nr_items >= BTRFS_DEV_STAT_GENERATION_ERRS + 1) {
printf("[%s].generation_errs %llu\n",
canonical_path,
(unsigned long long) args.values[
BTRFS_DEV_STAT_GENERATION_ERRS]);
+ if ((status == 1) && (args.values[BTRFS_DEV_STAT_GENERATION_ERRS] > 0)) {
+ err |= 64;
+ }
+ }
free(canonical_path);
}