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);
}
verify(nvlist_add_uint64(vdev, ZPOOL_CONFIG_WHOLE_DISK,
(uint64_t)wholedisk) == 0);
-#if defined(__sun__) || defined(__sun)
- /*
- * For a whole disk, defer getting its devid until after labeling it.
- */
- if (S_ISBLK(statbuf.st_mode) && !wholedisk) {
- /*
- * Get the devid for the device.
- */
- int fd;
- ddi_devid_t devid;
- char *minor = NULL, *devid_str = NULL;
-
- if ((fd = open(path, O_RDONLY|O_EXCL)) < 0) {
- (void) fprintf(stderr, gettext("cannot open '%s': "
- "%s\n"), path, strerror(errno));
- nvlist_free(vdev);
- return (NULL);
- }
-
- if (devid_get(fd, &devid) == 0) {
- if (devid_get_minor_name(fd, &minor) == 0 &&
- (devid_str = devid_str_encode(devid, minor)) !=
- NULL) {
- verify(nvlist_add_string(vdev,
- ZPOOL_CONFIG_DEVID, devid_str) == 0);
- }
- if (devid_str != NULL)
- devid_str_free(devid_str);
- if (minor != NULL)
- devid_str_free(minor);
- devid_free(devid);
- }
-
- (void) close(fd);
- }
-#endif
-
return (vdev);
}
* 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,