]> git.proxmox.com Git - mirror_zfs.git/commitdiff
Update vdev devid and physpath if changed between imports
authorAmeer Hamza <ahamza@ixsystems.com>
Fri, 26 Jan 2024 22:24:35 +0000 (03:24 +0500)
committerGitHub <noreply@github.com>
Fri, 26 Jan 2024 22:24:35 +0000 (14:24 -0800)
If devid or physpath for a vdev changes between imports, ensure it is
updated to the new value.

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: Alexander Motin <mav@FreeBSD.org>
Signed-off-by: Ameer Hamza <ahamza@ixsystems.com>
Closes #15816

module/zfs/vdev.c

index c10c78ebf6db8c7278ab328a59bfe12c65393850..d6286dc5920bd8294022f25ab5d29a16c000a5b5 100644 (file)
@@ -2493,22 +2493,36 @@ 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 "
-                           "from '%s' to '%s'", (u_longlong_t)dvd->vdev_guid,
-                           dvd->vdev_path, svd->vdev_path);
-                       spa_strfree(dvd->vdev_path);
-                       dvd->vdev_path = spa_strdup(svd->vdev_path);
+vdev_update_path(const char *prefix, char *svd, char **dvd, uint64_t guid)
+{
+       if (svd != NULL && *dvd != NULL) {
+               if (strcmp(svd, *dvd) != 0) {
+                       zfs_dbgmsg("vdev_copy_path: vdev %llu: %s changed "
+                           "from '%s' to '%s'", (u_longlong_t)guid, prefix,
+                           *dvd, svd);
+                       spa_strfree(*dvd);
+                       *dvd = spa_strdup(svd);
                }
-       } else if (svd->vdev_path != NULL) {
-               dvd->vdev_path = spa_strdup(svd->vdev_path);
+       } else if (svd != NULL) {
+               *dvd = spa_strdup(svd);
                zfs_dbgmsg("vdev_copy_path: vdev %llu: path set to '%s'",
-                   (u_longlong_t)dvd->vdev_guid, dvd->vdev_path);
+                   (u_longlong_t)guid, *dvd);
        }
+}
+
+static void
+vdev_copy_path_impl(vdev_t *svd, vdev_t *dvd)
+{
+       char *old, *new;
+
+       vdev_update_path("vdev_path", svd->vdev_path, &dvd->vdev_path,
+           dvd->vdev_guid);
+
+       vdev_update_path("vdev_devid", svd->vdev_devid, &dvd->vdev_devid,
+           dvd->vdev_guid);
+
+       vdev_update_path("vdev_physpath", svd->vdev_physpath,
+           &dvd->vdev_physpath, dvd->vdev_guid);
 
        /*
         * Our enclosure sysfs path may have changed between imports