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
MFC after:	3 weeks
Differential Revision: https://reviews.freebsd.org/D29941
This commit is contained in:
Alan Somers 2021-04-22 15:09:03 -06:00
parent be578b67b5
commit 420dbe763f
2 changed files with 8 additions and 2 deletions

View File

@ -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);
}
}

View File

@ -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()
{