diff options
author | Tony Hutter <hutter2@llnl.gov> | 2021-10-04 19:32:16 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-10-04 19:32:16 +0000 |
commit | 2a8430a260595a8f01f34bb695e455517cc0ae11 (patch) | |
tree | 4452f11043180bd29b474e3adf4fbc3c1cc4d02b /module/zfs/vdev.c | |
parent | aad91df0752580e3e67b72f3e6dc391da69c830f (diff) | |
download | src-2a8430a260595a8f01f34bb695e455517cc0ae11.tar.gz src-2a8430a260595a8f01f34bb695e455517cc0ae11.zip |
Rescan enclosure sysfs path on import
When you create a pool, zfs writes vd->vdev_enc_sysfs_path with the
enclosure sysfs path to the fault LEDs, like:
vdev_enc_sysfs_path = /sys/class/enclosure/0:0:1:0/SLOT8
However, this enclosure path doesn't get updated on successive imports
even if enclosure path to the disk changes. This patch fixes the issue.
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Tony Hutter <hutter2@llnl.gov>
Closes #11950
Closes #12095
Diffstat (limited to 'module/zfs/vdev.c')
-rw-r--r-- | module/zfs/vdev.c | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/module/zfs/vdev.c b/module/zfs/vdev.c index 2763bd8de1c4..0ba76f6b88d9 100644 --- a/module/zfs/vdev.c +++ b/module/zfs/vdev.c @@ -2373,6 +2373,7 @@ vdev_validate(vdev_t *vd) static void vdev_copy_path_impl(vdev_t *svd, vdev_t *dvd) { + char *old, *new; if (svd->vdev_path != NULL && dvd->vdev_path != NULL) { if (strcmp(svd->vdev_path, dvd->vdev_path) != 0) { zfs_dbgmsg("vdev_copy_path: vdev %llu: path changed " @@ -2386,6 +2387,29 @@ vdev_copy_path_impl(vdev_t *svd, vdev_t *dvd) zfs_dbgmsg("vdev_copy_path: vdev %llu: path set to '%s'", (u_longlong_t)dvd->vdev_guid, dvd->vdev_path); } + + /* + * Our enclosure sysfs path may have changed between imports + */ + old = dvd->vdev_enc_sysfs_path; + new = svd->vdev_enc_sysfs_path; + if ((old != NULL && new == NULL) || + (old == NULL && new != NULL) || + ((old != NULL && new != NULL) && strcmp(new, old) != 0)) { + zfs_dbgmsg("vdev_copy_path: vdev %llu: vdev_enc_sysfs_path " + "changed from '%s' to '%s'", (u_longlong_t)dvd->vdev_guid, + old, new); + + if (dvd->vdev_enc_sysfs_path) + spa_strfree(dvd->vdev_enc_sysfs_path); + + if (svd->vdev_enc_sysfs_path) { + dvd->vdev_enc_sysfs_path = spa_strdup( + svd->vdev_enc_sysfs_path); + } else { + dvd->vdev_enc_sysfs_path = NULL; + } + } } /* |