diff options
author | Alan Somers <asomers@FreeBSD.org> | 2021-04-22 21:09:03 +0000 |
---|---|---|
committer | Alan Somers <asomers@FreeBSD.org> | 2021-06-17 18:39:14 +0000 |
commit | ee3a7246c65ceb2fdcfcf8d337dbdeaa315a332d (patch) | |
tree | f49671820f49e855bd0baeeed56d3a1a29637fcb | |
parent | ea01d2bc1c5cfa2aed195e99dec08d36582121d2 (diff) | |
download | src-ee3a7246c65ceb2fdcfcf8d337dbdeaa315a332d.tar.gz src-ee3a7246c65ceb2fdcfcf8d337dbdeaa315a332d.zip |
gmultipath: make physpath distinct from the underlying providers'
zfsd uses a device's physical path attribute to automatically replace a
missing ZFS disk when a blank disk is inserted into the same physical
slot. Currently gmultipath passes through its underlying providers'
physical path attribute. That may cause zfsd to replace a missing
gmultipath provider with a newly arrived, single-path disk. That would
be bad.
This commit fixes that problem by simply appending "/mp" to the
underlying providers' physical path, in a manner similar to what geli
already does.
Sponsored by: Axcient
Differential Revision: https://reviews.freebsd.org/D29941
(cherry picked from commit 420dbe763f15b076751443edfeeb4f676deb3c44)
-rw-r--r-- | sys/geom/multipath/g_multipath.c | 6 | ||||
-rwxr-xr-x | tests/sys/geom/class/multipath/misc.sh | 4 |
2 files changed, 8 insertions, 2 deletions
diff --git a/sys/geom/multipath/g_multipath.c b/sys/geom/multipath/g_multipath.c index 5972b63e680a..120fced0a8f1 100644 --- a/sys/geom/multipath/g_multipath.c +++ b/sys/geom/multipath/g_multipath.c @@ -394,6 +394,12 @@ g_multipath_done(struct bio *bp) mtx_unlock(&sc->sc_mtx); } else mtx_unlock(&sc->sc_mtx); + if (bp->bio_error == 0 && + bp->bio_cmd == BIO_GETATTR && + !strcmp(bp->bio_attribute, "GEOM::physpath")) + { + strlcat(bp->bio_data, "/mp", bp->bio_length); + } g_std_done(bp); } } diff --git a/tests/sys/geom/class/multipath/misc.sh b/tests/sys/geom/class/multipath/misc.sh index 583434e1cfa5..4da8462588ca 100755 --- a/tests/sys/geom/class/multipath/misc.sh +++ b/tests/sys/geom/class/multipath/misc.sh @@ -198,7 +198,7 @@ fail_on_error_cleanup() atf_test_case physpath cleanup physpath_head() { - atf_set "descr" "gmultipath should pass through the underlying providers' physical path" + atf_set "descr" "gmultipath should append /mp to the underlying providers' physical path" atf_set "require.user" "root" } physpath_body() @@ -217,7 +217,7 @@ physpath_body() atf_check gnop create -z $physpath /dev/${md1} atf_check -s exit:0 gmultipath create "$name" ${md0}.nop ${md1}.nop gmultipath_physpath=$(diskinfo -p multipath/"$name") - atf_check_equal "$physpath" "$gmultipath_physpath" + atf_check_equal "$physpath/mp" "$gmultipath_physpath" } physpath_cleanup() { |