Merge commit 'refs/top-bases/top' into top
This commit is contained in:
commit
1dd29537e4
|
@ -192,7 +192,7 @@ check_slice(const char *path, blkid_cache cache, int force, boolean_t isspare)
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
if (stat64(path, &statbuf) != 0) {
|
if (stat64(path, &statbuf) != 0) {
|
||||||
vdev_error(gettext("cannot open %s: %s\n"),
|
vdev_error(gettext("cannot stat %s: %s\n"),
|
||||||
path, strerror(errno));
|
path, strerror(errno));
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
|
@ -295,7 +295,15 @@ check_disk(const char *path, blkid_cache cache, int force,
|
||||||
uuid_is_null((uchar_t *)&vtoc->efi_parts[i].p_guid))
|
uuid_is_null((uchar_t *)&vtoc->efi_parts[i].p_guid))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
sprintf(slice_path, "%s%d", path, i+1);
|
/* Resolve possible symlink to safely append partition */
|
||||||
|
if (realpath(path, slice_path) == NULL) {
|
||||||
|
(void) fprintf(stderr,
|
||||||
|
gettext("cannot resolve path '%s'\n"), slice_path);
|
||||||
|
err = errno;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
sprintf(slice_path, "%s%d", slice_path, i+1);
|
||||||
err = check_slice(slice_path, cache, force, isspare);
|
err = check_slice(slice_path, cache, force, isspare);
|
||||||
if (err)
|
if (err)
|
||||||
break;
|
break;
|
||||||
|
@ -400,7 +408,9 @@ make_leaf_vdev(const char *arg, uint64_t is_log)
|
||||||
* Complete device or file path. Exact type is determined by
|
* Complete device or file path. Exact type is determined by
|
||||||
* examining the file descriptor afterwards. Symbolic links
|
* examining the file descriptor afterwards. Symbolic links
|
||||||
* are resolved to their real paths for the is_whole_disk()
|
* are resolved to their real paths for the is_whole_disk()
|
||||||
* and S_ISBLK/S_ISREG type checks.
|
* and S_ISBLK/S_ISREG type checks. However, we are careful
|
||||||
|
* to store the given path as ZPOOL_CONFIG_PATH to ensure we
|
||||||
|
* can leverage udev's persistent device labels.
|
||||||
*/
|
*/
|
||||||
if (realpath(arg, path) == NULL) {
|
if (realpath(arg, path) == NULL) {
|
||||||
(void) fprintf(stderr,
|
(void) fprintf(stderr,
|
||||||
|
@ -415,6 +425,9 @@ make_leaf_vdev(const char *arg, uint64_t is_log)
|
||||||
path, strerror(errno));
|
path, strerror(errno));
|
||||||
return (NULL);
|
return (NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* After is_whole_disk() check restore original passed path */
|
||||||
|
strlcpy(path, arg, MAXPATHLEN);
|
||||||
} else {
|
} else {
|
||||||
/*
|
/*
|
||||||
* This may be a short path for a device, or it could be total
|
* This may be a short path for a device, or it could be total
|
||||||
|
@ -476,6 +489,7 @@ make_leaf_vdev(const char *arg, uint64_t is_log)
|
||||||
verify(nvlist_add_uint64(vdev, ZPOOL_CONFIG_WHOLE_DISK,
|
verify(nvlist_add_uint64(vdev, ZPOOL_CONFIG_WHOLE_DISK,
|
||||||
(uint64_t)wholedisk) == 0);
|
(uint64_t)wholedisk) == 0);
|
||||||
|
|
||||||
|
#if defined(__sun__) || defined(__sun)
|
||||||
/*
|
/*
|
||||||
* For a whole disk, defer getting its devid until after labeling it.
|
* For a whole disk, defer getting its devid until after labeling it.
|
||||||
*/
|
*/
|
||||||
|
@ -510,6 +524,7 @@ make_leaf_vdev(const char *arg, uint64_t is_log)
|
||||||
|
|
||||||
(void) close(fd);
|
(void) close(fd);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
return (vdev);
|
return (vdev);
|
||||||
}
|
}
|
||||||
|
@ -954,21 +969,36 @@ make_disks(zpool_handle_t *zhp, nvlist_t *nv)
|
||||||
return (ret);
|
return (ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
diskname = strrchr(path, '/');
|
if (realpath(path, buf) == NULL) {
|
||||||
|
ret = errno;
|
||||||
|
(void) fprintf(stderr,
|
||||||
|
gettext("cannot resolve path '%s'\n"), path);
|
||||||
|
return (ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
diskname = strrchr(buf, '/');
|
||||||
assert(diskname != NULL);
|
assert(diskname != NULL);
|
||||||
diskname++;
|
diskname++;
|
||||||
if (zpool_label_disk(g_zfs, zhp, diskname) == -1)
|
if (zpool_label_disk(g_zfs, zhp, diskname) == -1)
|
||||||
return (-1);
|
return (-1);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Fill in the devid, now that we've labeled the disk.
|
* Fill in the devid, now that we've labeled the disk. We
|
||||||
|
* attempt to open the new zfs slice first by appending the
|
||||||
|
* slice number. If that fails this may be a Linux udev
|
||||||
|
* path in which case the -part# convention is tried.
|
||||||
*/
|
*/
|
||||||
(void) snprintf(buf, sizeof (buf), "%s%s", path, FIRST_SLICE);
|
(void) snprintf(buf, sizeof (buf), "%s%s", path, FIRST_SLICE);
|
||||||
if ((fd = open(buf, O_RDONLY)) < 0) {
|
if ((fd = open(buf, O_RDONLY)) < 0) {
|
||||||
(void) fprintf(stderr,
|
|
||||||
gettext("cannot open '%s': %s\n"),
|
(void) snprintf(buf, sizeof (buf), "%s%s%s",
|
||||||
buf, strerror(errno));
|
path, "-part", FIRST_SLICE);
|
||||||
return (-1);
|
if ((fd = open(buf, O_RDONLY)) < 0) {
|
||||||
|
(void) fprintf(stderr,
|
||||||
|
gettext("cannot open '%s': %s\n"),
|
||||||
|
buf, strerror(errno));
|
||||||
|
return (-1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(__sun__) || defined(__sun)
|
#if defined(__sun__) || defined(__sun)
|
||||||
|
|
|
@ -2619,12 +2619,11 @@ set_path(zpool_handle_t *zhp, nvlist_t *nv, const char *path)
|
||||||
char *
|
char *
|
||||||
zpool_vdev_name(libzfs_handle_t *hdl, zpool_handle_t *zhp, nvlist_t *nv)
|
zpool_vdev_name(libzfs_handle_t *hdl, zpool_handle_t *zhp, nvlist_t *nv)
|
||||||
{
|
{
|
||||||
char *path, *devid;
|
char *path, *devid, *type;
|
||||||
uint64_t value;
|
uint64_t value;
|
||||||
char buf[64];
|
char buf[64];
|
||||||
vdev_stat_t *vs;
|
vdev_stat_t *vs;
|
||||||
uint_t vsc;
|
uint_t vsc;
|
||||||
size_t droot_len = strlen(DISK_ROOT) + 1;
|
|
||||||
|
|
||||||
if (nvlist_lookup_uint64(nv, ZPOOL_CONFIG_NOT_PRESENT,
|
if (nvlist_lookup_uint64(nv, ZPOOL_CONFIG_NOT_PRESENT,
|
||||||
&value) == 0) {
|
&value) == 0) {
|
||||||
|
@ -2634,7 +2633,6 @@ zpool_vdev_name(libzfs_handle_t *hdl, zpool_handle_t *zhp, nvlist_t *nv)
|
||||||
(u_longlong_t)value);
|
(u_longlong_t)value);
|
||||||
path = buf;
|
path = buf;
|
||||||
} else if (nvlist_lookup_string(nv, ZPOOL_CONFIG_PATH, &path) == 0) {
|
} else if (nvlist_lookup_string(nv, ZPOOL_CONFIG_PATH, &path) == 0) {
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If the device is dead (faulted, offline, etc) then don't
|
* If the device is dead (faulted, offline, etc) then don't
|
||||||
* bother opening it. Otherwise we may be forcing the user to
|
* bother opening it. Otherwise we may be forcing the user to
|
||||||
|
@ -2673,13 +2671,18 @@ zpool_vdev_name(libzfs_handle_t *hdl, zpool_handle_t *zhp, nvlist_t *nv)
|
||||||
devid_str_free(newdevid);
|
devid_str_free(newdevid);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strncmp(path, DISK_ROOT "/", droot_len) == 0)
|
/*
|
||||||
path += droot_len;
|
* For a block device only use the name.
|
||||||
|
*/
|
||||||
|
verify(nvlist_lookup_string(nv, ZPOOL_CONFIG_TYPE, &type) == 0);
|
||||||
|
if (strcmp(type, VDEV_TYPE_DISK) == 0) {
|
||||||
|
path = strrchr(path, '/');
|
||||||
|
path++;
|
||||||
|
}
|
||||||
|
|
||||||
#if defined(__sun__) || defined(__sun)
|
#if defined(__sun__) || defined(__sun)
|
||||||
/*
|
/*
|
||||||
* The following code strips the slice from the device path.
|
* The following code strips the slice from the device path.
|
||||||
* This is only meaningful in Solaris.
|
|
||||||
*/
|
*/
|
||||||
if (nvlist_lookup_uint64(nv, ZPOOL_CONFIG_WHOLE_DISK,
|
if (nvlist_lookup_uint64(nv, ZPOOL_CONFIG_WHOLE_DISK,
|
||||||
&value) == 0 && value) {
|
&value) == 0 && value) {
|
||||||
|
|
Loading…
Reference in New Issue