diff options
author | Ned Bass <[email protected]> | 2010-10-13 16:16:25 -0700 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2010-10-22 12:25:30 -0700 |
commit | 79e7242a91c17f50c857b53d2a7313cf363ea535 (patch) | |
tree | 946f37ab6d0135ca69e5dff07bc249b73b1b2a96 /cmd | |
parent | 0ee8118bd31d1c160123d0aac9c55455706d5975 (diff) |
Add helper functions for manipulating device names
This change adds two helper functions for working with vdev names and paths.
zfs_resolve_shortname() resolves a shorthand vdev name to an absolute path
of a file in /dev, /dev/disk/by-id, /dev/disk/by-label, /dev/disk/by-path,
/dev/disk/by-uuid, /dev/disk/zpool. This was previously done only in the
function is_shorthand_path(), but we need a general helper function to
implement shorthand names for additional zpool subcommands like remove.
is_shorthand_path() is accordingly updated to call the helper function.
There is a minor change in the way zfs_resolve_shortname() tests if a file
exists. is_shorthand_path() effectively used open() and stat64() to test for
file existence, since its scope includes testing if a device is a whole disk
and collecting file status information. zfs_resolve_shortname(), on the other
hand, only uses access() to test for existence and leaves it to the caller to
perform any additional file operations. This seemed like the most general and
lightweight approach, and still preserves the semantics of is_shorthand_path().
zfs_append_partition() appends a partition suffix to a device path. This
should be used to generate the name of a whole disk as it is stored in the vdev
label. The user-visible names of whole disks do not contain the partition
information, while the name in the vdev label does. The code was lifted from
the function make_disks(), which now just calls the helper function. Again,
having a helper function to do this supports general handling of shorthand
names in the user interface.
Signed-off-by: Brian Behlendorf <[email protected]>
Diffstat (limited to 'cmd')
-rw-r--r-- | cmd/zpool/zpool_vdev.c | 26 |
1 files changed, 3 insertions, 23 deletions
diff --git a/cmd/zpool/zpool_vdev.c b/cmd/zpool/zpool_vdev.c index d4838ad2d..0c4c97075 100644 --- a/cmd/zpool/zpool_vdev.c +++ b/cmd/zpool/zpool_vdev.c @@ -384,23 +384,9 @@ static int is_shorthand_path(const char *arg, char *path, struct stat64 *statbuf, boolean_t *wholedisk) { - char dirs[5][9] = {"by-id", "by-label", "by-path", "by-uuid", "zpool"}; - int i, err; - - /* /dev/<name> */ - (void) snprintf(path, MAXPATHLEN, "%s/%s", DISK_ROOT, arg); - *wholedisk = is_whole_disk(path); - err = stat64(path, statbuf); - if (*wholedisk || err == 0) - return (0); - - /* /dev/disk/<dirs>/<name> */ - for (i = 0; i < 5; i++) { - (void) snprintf(path, MAXPATHLEN, "%s/%s/%s", - UDISK_ROOT, dirs[i], arg); + if (zfs_resolve_shortname(arg, path, MAXPATHLEN) == 0) { *wholedisk = is_whole_disk(path); - err = stat64(path, statbuf); - if (*wholedisk || err == 0) + if (*wholedisk || (stat64(path, statbuf) == 0)) return (0); } @@ -1009,13 +995,7 @@ make_disks(zpool_handle_t *zhp, nvlist_t *nv) * for *-part# to be created. Otherwise just use the normal * syntax for devices in /dev. */ - if (strncmp(path, UDISK_ROOT, strlen(UDISK_ROOT)) == 0) - (void) snprintf(buf, sizeof (buf), - "%s%s%s", path, "-part", FIRST_SLICE); - else - (void) snprintf(buf, sizeof (buf), - "%s%s%s", path, isdigit(path[strlen(path)-1]) ? - "p" : "", FIRST_SLICE); + zfs_append_partition(path, buf, sizeof (buf)); if ((ret = zpool_label_disk_wait(buf, 1000)) != 0) { (void) fprintf(stderr, |