Compare commits

...

3 Commits

Author SHA1 Message Date
Bryan Gurney 87e16c21fa
Merge 95bac06010 into 7a7f306b6c 2024-09-17 22:50:39 +02:00
Bryan Gurney 95bac06010 TEST-64-UDEV-STORAGE: remove obsolete NVMe symlinks
Signed-off-by: Bryan Gurney <bgurney@redhat.com>
2024-09-10 10:03:22 -04:00
Bryan Gurney 8f2e74aa3e udev: remove obsolete NVMe symlinks
NVMe devices with namespace management capability can create multiple
namespaces per controller, which can result in a condition where udev
creates "/dev/disk/by-id" symbolic links that may "move around"
between the namespaces of the NVMe storage device.

For an example of an NVMe storage device with five namespaces, this
would be the output of "ls -l /dev/disk/by-id" symlinks:

nvme-MODEL_SERIAL -> ../../nvme1n1
nvme-MODEL_SERIAL_1 -> ../../nvme1n1
nvme-MODEL_SERIAL_2 -> ../../nvme1n2
nvme-MODEL_SERIAL_3 -> ../../nvme1n3
nvme-MODEL_SERIAL_4 -> ../../nvme1n4
nvme-MODEL_SERIAL_5 -> ../../nvme1n5

...and the "nvme-MODEL_SERIAL" symlink would rotate around between
the five namespaces, as writes are performed to the namespaces:

nvme-MODEL_SERIAL -> ../../nvme1n4
...
nvme-MODEL_SERIAL -> ../../nvme1n2
...
nvme-MODEL_SERIAL -> ../../nvme1n5

(The "_1", "_2", etc. symlinks would remain pointing at the correct
block device: the namespace that was identified as part of those
udev rules.)

Therefore, stop creating this by-id namespace symlink.

Signed-off-by: Bryan Gurney <bgurney@redhat.com>
2024-09-10 10:03:21 -04:00
2 changed files with 0 additions and 19 deletions

View File

@ -43,12 +43,6 @@ ATTRS{nsid}=="?*", ENV{ID_NSID}="$attr{nsid}"
ENV{ID_WWN}=="?*", SYMLINK+="disk/by-id/nvme-$env{ID_WWN}$env{.PART_SUFFIX}" ENV{ID_WWN}=="?*", SYMLINK+="disk/by-id/nvme-$env{ID_WWN}$env{.PART_SUFFIX}"
# obsolete symlink with non-escaped characters, kept for backward compatibility
ENV{ID_MODEL}=="?*", ENV{ID_SERIAL_SHORT}=="?*", ENV{ID_MODEL}!="*/*", ENV{ID_SERIAL_SHORT}!="*/*", \
ENV{ID_SERIAL}="$env{ID_MODEL}_$env{ID_SERIAL_SHORT}", SYMLINK+="disk/by-id/nvme-$env{ID_SERIAL}$env{.PART_SUFFIX}"
# obsolete symlink that might get overridden on adding a new nvme controller, kept for backward compatibility
ENV{ID_MODEL}=="?*", ENV{ID_SERIAL_SHORT}=="?*", OPTIONS="string_escape=replace", \
ENV{ID_SERIAL}="$env{ID_MODEL}_$env{ID_SERIAL_SHORT}", SYMLINK+="disk/by-id/nvme-$env{ID_SERIAL}$env{.PART_SUFFIX}"
ENV{ID_MODEL}=="?*", ENV{ID_SERIAL_SHORT}=="?*", ENV{ID_NSID}=="?*", OPTIONS="string_escape=replace", \ ENV{ID_MODEL}=="?*", ENV{ID_SERIAL_SHORT}=="?*", ENV{ID_NSID}=="?*", OPTIONS="string_escape=replace", \
ENV{ID_SERIAL}="$env{ID_MODEL}_$env{ID_SERIAL_SHORT}_$env{ID_NSID}", SYMLINK+="disk/by-id/nvme-$env{ID_SERIAL}$env{.PART_SUFFIX}" ENV{ID_SERIAL}="$env{ID_MODEL}_$env{ID_SERIAL_SHORT}_$env{ID_NSID}", SYMLINK+="disk/by-id/nvme-$env{ID_SERIAL}$env{.PART_SUFFIX}"

View File

@ -179,36 +179,24 @@ testcase_nvme_basic() {
for (( i = 0; i < 5; i++ )); do for (( i = 0; i < 5; i++ )); do
expected_symlinks+=( expected_symlinks+=(
# both replace mode provides the same devlink
/dev/disk/by-id/nvme-QEMU_NVMe_Ctrl_deadbeef"$i"
# with nsid # with nsid
/dev/disk/by-id/nvme-QEMU_NVMe_Ctrl_deadbeef"$i"_1 /dev/disk/by-id/nvme-QEMU_NVMe_Ctrl_deadbeef"$i"_1
) )
done done
for (( i = 5; i < 10; i++ )); do for (( i = 5; i < 10; i++ )); do
expected_symlinks+=( expected_symlinks+=(
# old replace mode
/dev/disk/by-id/nvme-QEMU_NVMe_Ctrl__deadbeef_"$i"
# newer replace mode
/dev/disk/by-id/nvme-QEMU_NVMe_Ctrl_____deadbeef__"$i"
# with nsid # with nsid
/dev/disk/by-id/nvme-QEMU_NVMe_Ctrl_____deadbeef__"$i"_1 /dev/disk/by-id/nvme-QEMU_NVMe_Ctrl_____deadbeef__"$i"_1
) )
done done
for (( i = 10; i < 15; i++ )); do for (( i = 10; i < 15; i++ )); do
expected_symlinks+=( expected_symlinks+=(
# old replace mode does not provide devlink, as serial contains "/"
# newer replace mode
/dev/disk/by-id/nvme-QEMU_NVMe_Ctrl_____dead_beef_"$i"
# with nsid # with nsid
/dev/disk/by-id/nvme-QEMU_NVMe_Ctrl_____dead_beef_"$i"_1 /dev/disk/by-id/nvme-QEMU_NVMe_Ctrl_____dead_beef_"$i"_1
) )
done done
for (( i = 15; i < 20; i++ )); do for (( i = 15; i < 20; i++ )); do
expected_symlinks+=( expected_symlinks+=(
# old replace mode does not provide devlink, as serial contains "/"
# newer replace mode
/dev/disk/by-id/nvme-QEMU_NVMe_Ctrl_dead_.._.._beef_"$i"
# with nsid # with nsid
/dev/disk/by-id/nvme-QEMU_NVMe_Ctrl_dead_.._.._beef_"$i"_1 /dev/disk/by-id/nvme-QEMU_NVMe_Ctrl_dead_.._.._beef_"$i"_1
) )
@ -227,7 +215,6 @@ testcase_nvme_basic() {
testcase_nvme_subsystem() { testcase_nvme_subsystem() {
local expected_symlinks=( local expected_symlinks=(
# Controller(s) # Controller(s)
/dev/disk/by-id/nvme-QEMU_NVMe_Ctrl_deadbeef
/dev/disk/by-id/nvme-QEMU_NVMe_Ctrl_deadbeef_16 /dev/disk/by-id/nvme-QEMU_NVMe_Ctrl_deadbeef_16
/dev/disk/by-id/nvme-QEMU_NVMe_Ctrl_deadbeef_17 /dev/disk/by-id/nvme-QEMU_NVMe_Ctrl_deadbeef_17
# Shared namespaces # Shared namespaces