Update vendor-sys/illumos/dist to illumos-gate 13992:313c3db67359
Illumos ZFS issues: 3639 zpool.cache should skip over readonly pools 3640 want automatic devid updates
This commit is contained in:
parent
817f65dcb7
commit
fb097b6165
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/vendor-sys/illumos/dist/; revision=249186
@ -222,7 +222,15 @@ spa_config_sync(spa_t *target, boolean_t removing, boolean_t postsysevent)
|
|||||||
*/
|
*/
|
||||||
nvl = NULL;
|
nvl = NULL;
|
||||||
while ((spa = spa_next(spa)) != NULL) {
|
while ((spa = spa_next(spa)) != NULL) {
|
||||||
if (spa == target && removing)
|
/*
|
||||||
|
* Skip over our own pool if we're about to remove
|
||||||
|
* ourselves from the spa namespace or any pool that
|
||||||
|
* is readonly. Since we cannot guarantee that a
|
||||||
|
* readonly pool would successfully import upon reboot,
|
||||||
|
* we don't allow them to be written to the cache file.
|
||||||
|
*/
|
||||||
|
if ((spa == target && removing) ||
|
||||||
|
!spa_writeable(spa))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
mutex_enter(&spa->spa_props_lock);
|
mutex_enter(&spa->spa_props_lock);
|
||||||
|
@ -139,6 +139,8 @@ vdev_disk_open(vdev_t *vd, uint64_t *psize, uint64_t *max_psize,
|
|||||||
int error;
|
int error;
|
||||||
dev_t dev;
|
dev_t dev;
|
||||||
int otyp;
|
int otyp;
|
||||||
|
boolean_t validate_devid = B_FALSE;
|
||||||
|
ddi_devid_t devid;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We must have a pathname, and it must be absolute.
|
* We must have a pathname, and it must be absolute.
|
||||||
@ -187,7 +189,6 @@ vdev_disk_open(vdev_t *vd, uint64_t *psize, uint64_t *max_psize,
|
|||||||
error = EINVAL; /* presume failure */
|
error = EINVAL; /* presume failure */
|
||||||
|
|
||||||
if (vd->vdev_path != NULL) {
|
if (vd->vdev_path != NULL) {
|
||||||
ddi_devid_t devid;
|
|
||||||
|
|
||||||
if (vd->vdev_wholedisk == -1ULL) {
|
if (vd->vdev_wholedisk == -1ULL) {
|
||||||
size_t len = strlen(vd->vdev_path) + 3;
|
size_t len = strlen(vd->vdev_path) + 3;
|
||||||
@ -236,9 +237,10 @@ vdev_disk_open(vdev_t *vd, uint64_t *psize, uint64_t *max_psize,
|
|||||||
* If we were unable to open by path, or the devid check fails, open by
|
* If we were unable to open by path, or the devid check fails, open by
|
||||||
* devid instead.
|
* devid instead.
|
||||||
*/
|
*/
|
||||||
if (error != 0 && vd->vdev_devid != NULL)
|
if (error != 0 && vd->vdev_devid != NULL) {
|
||||||
error = ldi_open_by_devid(dvd->vd_devid, dvd->vd_minor,
|
error = ldi_open_by_devid(dvd->vd_devid, dvd->vd_minor,
|
||||||
spa_mode(spa), kcred, &dvd->vd_lh, zfs_li);
|
spa_mode(spa), kcred, &dvd->vd_lh, zfs_li);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If all else fails, then try opening by physical path (if available)
|
* If all else fails, then try opening by physical path (if available)
|
||||||
@ -247,6 +249,9 @@ vdev_disk_open(vdev_t *vd, uint64_t *psize, uint64_t *max_psize,
|
|||||||
* level vdev validation will prevent us from opening the wrong device.
|
* level vdev validation will prevent us from opening the wrong device.
|
||||||
*/
|
*/
|
||||||
if (error) {
|
if (error) {
|
||||||
|
if (vd->vdev_devid != NULL)
|
||||||
|
validate_devid = B_TRUE;
|
||||||
|
|
||||||
if (vd->vdev_physpath != NULL &&
|
if (vd->vdev_physpath != NULL &&
|
||||||
(dev = ddi_pathname_to_dev_t(vd->vdev_physpath)) != NODEV)
|
(dev = ddi_pathname_to_dev_t(vd->vdev_physpath)) != NODEV)
|
||||||
error = ldi_open_by_dev(&dev, OTYP_BLK, spa_mode(spa),
|
error = ldi_open_by_dev(&dev, OTYP_BLK, spa_mode(spa),
|
||||||
@ -267,6 +272,25 @@ vdev_disk_open(vdev_t *vd, uint64_t *psize, uint64_t *max_psize,
|
|||||||
return (error);
|
return (error);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Now that the device has been successfully opened, update the devid
|
||||||
|
* if necessary.
|
||||||
|
*/
|
||||||
|
if (validate_devid && spa_writeable(spa) &&
|
||||||
|
ldi_get_devid(dvd->vd_lh, &devid) == 0) {
|
||||||
|
if (ddi_devid_compare(devid, dvd->vd_devid) != 0) {
|
||||||
|
char *vd_devid;
|
||||||
|
|
||||||
|
vd_devid = ddi_devid_str_encode(devid, dvd->vd_minor);
|
||||||
|
zfs_dbgmsg("vdev %s: update devid from %s, "
|
||||||
|
"to %s", vd->vdev_path, vd->vdev_devid, vd_devid);
|
||||||
|
spa_strfree(vd->vdev_devid);
|
||||||
|
vd->vdev_devid = spa_strdup(vd_devid);
|
||||||
|
ddi_devid_str_free(vd_devid);
|
||||||
|
}
|
||||||
|
ddi_devid_free(devid);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Once a device is opened, verify that the physical device path (if
|
* Once a device is opened, verify that the physical device path (if
|
||||||
* available) is up to date.
|
* available) is up to date.
|
||||||
|
Loading…
Reference in New Issue
Block a user