X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=cmds-device.c;h=86459d1b956430585c5649986dbd346a16cb6409;hb=cda595afa3cfabae2be30af9b8b08f2af3c31437;hp=aeaaa1d9eab5db9806f1c7baa8131ee2d751b5fc;hpb=9468d9285ad5542855ae2963995f31036b9f943e;p=platform%2Fupstream%2Fbtrfs-progs.git diff --git a/cmds-device.c b/cmds-device.c index aeaaa1d..86459d1 100644 --- a/cmds-device.c +++ b/cmds-device.c @@ -32,6 +32,8 @@ #include "cmds-fi-usage.h" #include "commands.h" +#include "help.h" +#include "mkfs/common.h" static const char * const device_cmd_group_usage[] = { "btrfs device []", @@ -118,8 +120,8 @@ static int cmd_device_add(int argc, char **argv) path = canonicalize_path(argv[i]); if (!path) { - error("could not canonicalize pathname '%s': %s", - argv[i], strerror(errno)); + error("could not canonicalize pathname '%s': %m", + argv[i]); ret++; goto error_out; } @@ -128,8 +130,7 @@ static int cmd_device_add(int argc, char **argv) strncpy_null(ioctl_args.name, path); res = ioctl(fdmnt, BTRFS_IOC_ADD_DEV, &ioctl_args); if (res < 0) { - error("error adding device '%s': %s", - path, strerror(errno)); + error("error adding device '%s': %m", path); ret++; } free(path); @@ -190,8 +191,7 @@ static int _cmd_device_remove(int argc, char **argv, */ if (res < 0 && (errno == ENOTTY || errno == EOPNOTSUPP)) { if (is_devid) { - error("device delete by id failed: %s", - strerror(errno)); + error("device delete by id failed: %m"); ret++; continue; } @@ -222,9 +222,16 @@ static int _cmd_device_remove(int argc, char **argv, return !!ret; } +#define COMMON_USAGE_REMOVE_DELETE \ + "If 'missing' is specified for , the first device that is", \ + "described by the filesystem metadata, but not present at the mount", \ + "time will be removed. (only in degraded mode)" + static const char * const cmd_device_remove_usage[] = { "btrfs device remove | [|...] ", "Remove a device from a filesystem", + "", + COMMON_USAGE_REMOVE_DELETE, NULL }; @@ -235,7 +242,9 @@ static int cmd_device_remove(int argc, char **argv) static const char * const cmd_device_delete_usage[] = { "btrfs device delete | [|...] ", - "Remove a device from a filesystem", + "Remove a device from a filesystem (alias of \"btrfs device remove\")", + "", + COMMON_USAGE_REMOVE_DELETE, NULL }; @@ -300,8 +309,7 @@ static int cmd_device_scan(int argc, char **argv) } path = canonicalize_path(argv[i]); if (!path) { - error("could not canonicalize path '%s': %s", - argv[i], strerror(errno)); + error("could not canonicalize path '%s': %m", argv[i]); ret = 1; goto out; } @@ -344,8 +352,8 @@ static int cmd_device_ready(int argc, char **argv) path = canonicalize_path(argv[optind]); if (!path) { - error("could not canonicalize pathname '%s': %s", - argv[optind], strerror(errno)); + error("could not canonicalize pathname '%s': %m", + argv[optind]); ret = 1; goto out; } @@ -360,8 +368,8 @@ static int cmd_device_ready(int argc, char **argv) strncpy_null(args.name, path); ret = ioctl(fd, BTRFS_IOC_DEVICES_READY, &args); if (ret < 0) { - error("unable to determine if device '%s' is ready for mount: %s", - path, strerror(errno)); + error("unable to determine if device '%s' is ready for mount: %m", + path); ret = 1; } @@ -372,11 +380,13 @@ out: } static const char * const cmd_device_stats_usage[] = { - "btrfs device stats [-z] |", - "Show current device IO stats.", + "btrfs device stats [options] |", + "Show device IO error statistics", + "Show device IO error statistics for all devices of the given filesystem", + "identified by PATH or DEVICE. The filesystem must be mounted.", "", - "-z show current stats and reset values to zero", - "-s return non-zero if any stat counter is not zero", + "-c|--check return non-zero if any stat counter is not zero", + "-z|--reset show current stats and reset values to zero", NULL }; @@ -388,20 +398,30 @@ static int cmd_device_stats(int argc, char **argv) int ret; int fdmnt; int i; - int c; int err = 0; - int status = 0; + int check = 0; __u64 flags = 0; DIR *dirstream = NULL; - while ((c = getopt(argc, argv, "zs")) != -1) { + while (1) { + int c; + static const struct option long_options[] = { + {"check", no_argument, NULL, 'c'}, + {"reset", no_argument, NULL, 'z'}, + {NULL, 0, NULL, 0} + }; + + c = getopt_long(argc, argv, "cz", long_options, NULL); + if (c < 0) + break; + switch (c) { + case 'c': + check = 1; + break; case 'z': flags = BTRFS_DEV_STATS_RESET; break; - case 's': - status = 1; - break; case '?': default: usage(cmd_device_stats_usage); @@ -443,8 +463,8 @@ static int cmd_device_stats(int argc, char **argv) args.flags = flags; if (ioctl(fdmnt, BTRFS_IOC_GET_DEV_STATS, &args) < 0) { - error("device stats ioctl failed on %s: %s", - path, strerror(errno)); + error("device stats ioctl failed on %s: %m", + path); err |= 1; } else { char *canonical_path; @@ -483,7 +503,7 @@ static int cmd_device_stats(int argc, char **argv) dev_stats[j].name, (unsigned long long) args.values[dev_stats[j].num]); - if ((status == 1) + if ((check == 1) && (args.values[dev_stats[j].num] > 0)) err |= 64; } @@ -522,8 +542,8 @@ static int _cmd_device_usage(int fd, char *path, unsigned unit_mode) for (i = 0; i < devcount; i++) { printf("%s, ID: %llu\n", devinfo[i].path, devinfo[i].devid); - print_device_sizes(fd, &devinfo[i], unit_mode); - print_device_chunks(fd, &devinfo[i], chunkinfo, chunkcount, + print_device_sizes(&devinfo[i], unit_mode); + print_device_chunks(&devinfo[i], chunkinfo, chunkcount, unit_mode); printf("\n"); }