Public bug reported:

[Impact]

After including the patch from bug 1642903, NVMe devices that include spaces in 
their model or serial strings result in incorrect symlinks, e.g. if the model 
string is "XYZ Corp NVMe drive" then instead of creating:
/dev/disk/by-id/nvme-XYZ Corp NVMe drive_SERIAL -> ../../nvme0n1
it creates:
/dev/disk/by-id/nvme-XYZ -> ../../nvme0n1
/dev/Corp -> nvme0n1
/dev/NVMe -> nvme0n1
/dev/drive_SERIAL -> nvme0n1

This is because of the way udev handles the SYMLINK value strings; by
default, it does not do any whitespace replacement.  To enable
whitespace replacement of a symlink value, the rule must also include
OPTIONS+="string_escape=replace".  This is done for 'md' and 'dm'
devices in their rules.  However, there are no rules that actually want
to specify multiple symlinks, and defaulting to not replacing whitespace
makes no sense; instead, the default should be to replace all whitespace
in each symlink value, unless the rule explicitly specifies
OPTIONS+="string_escape=none".

[Test Case]

This assumes using udev with the patch from bug 1642903.

Without this patch, when using a NVMe drive that contains spaces in its
model and/or serial strings, check the /dev/disk/by-id/ directory.  It
should contain a partially-correct symlink to the NVMe drive, with the
name up to the first space.  All following space-separated parts of the
mode/serial string should have symlinks in the /dev/ directory.  This is
the incorrect behavior.

With this patch, check the /dev/disk/by-id/ directory.  It should
contain a fully-correct symlink to the NVMe drive, and no part of the
drive's model/serial number string should be a link in the /dev
directory.

An example of the correct/incorrect naming is in the Impact section.

There should be no other changes to any of the symlinks under /dev
before and after this patch.  Typical locations for symlinks are /dev/,
/dev/disk/by-name/, /dev/disk/by-id/, /dev/disk/by-uuid/, /dev/disk/by-
label/

[Regression Potential]

Errors in udev rules can lead to an unbootable or otherwise completely
broken system if they unintentionally break or clobber existing
/dev/disks/ symlinks.

[Other Info]

This is also tracked with upstream systemd (udev) bug 4833:
https://github.com/systemd/systemd/issues/4833

Also note, this can be worked around ONLY for NVMe devices by adding
OPTIONS+="string_escape=none" to each of the NVMe SYMLINK+="..." rules
at the end, e.g.:

KERNEL=="nvme*[0-9]n*[0-9]", ENV{DEVTYPE}=="disk", ATTRS{model}=="?*",
ENV{ID_SERIAL_SHORT}=="?*",
ENV{ID_SERIAL}="$attr{model}_$env{ID_SERIAL_SHORT}", SYMLINK+="disk/by-
id/nvme-$env{ID_SERIAL}", OPTIONS+="string_escape=none"

** Affects: systemd (Ubuntu)
     Importance: Undecided
         Status: New

** Description changed:

  [Impact]
  
  After including the patch from bug 1642903, NVMe devices that include spaces 
in their model or serial strings result in incorrect symlinks, e.g. if the 
model string is "XYZ Corp NVMe drive" then instead of creating:
  /dev/disk/by-id/nvme-XYZ Corp NVMe drive_SERIAL -> ../../nvme0n1
  it creates:
  /dev/disk/by-id/nvme-XYZ -> ../../nvme0n1
  /dev/Corp -> nvme0n1
  /dev/NVMe -> nvme0n1
  /dev/drive_SERIAL -> nvme0n1
  
  This is because of the way udev handles the SYMLINK value strings; by
  default, it does not do any whitespace replacement.  To enable
  whitespace replacement of a symlink value, the rule must also include
  OPTIONS+="string_escape=replace".  This is done for 'md' and 'dm'
  devices in their rules.  However, there are no rules that actually want
  to specify multiple symlinks, and defaulting to not replacing whitespace
  makes no sense; instead, the default should be to replace all whitespace
  in each symlink value, unless the rule explicitly specifies
  OPTIONS+="string_escape=none".
  
  [Test Case]
  
  This assumes using udev with the patch from bug 1642903.
  
  Without this patch, when using a NVMe drive that contains spaces in its
  model and/or serial strings, check the /dev/disk/by-id/ directory.  It
  should contain a partially-correct symlink to the NVMe drive, with the
  name up to the first space.  All following space-separated parts of the
  mode/serial string should have symlinks in the /dev/ directory.  This is
  the incorrect behavior.
  
  With this patch, check the /dev/disk/by-id/ directory.  It should
  contain a fully-correct symlink to the NVMe drive, and no part of the
  drive's model/serial number string should be a link in the /dev
  directory.
  
  An example of the correct/incorrect naming is in the Impact section.
  
  There should be no other changes to any of the symlinks under /dev
  before and after this patch.  Typical locations for symlinks are /dev/,
  /dev/disk/by-name/, /dev/disk/by-id/, /dev/disk/by-uuid/, /dev/disk/by-
  label/
  
  [Regression Potential]
  
  Errors in udev rules can lead to an unbootable or otherwise completely
  broken system if they unintentionally break or clobber existing
  /dev/disks/ symlinks.
  
  [Other Info]
  
  This is also tracked with upstream systemd (udev) bug 4833:
  https://github.com/systemd/systemd/issues/4833
+ 
+ Also note, this can be worked around ONLY for NVMe devices by adding
+ OPTIONS+="string_escape=none" to each of the NVMe SYMLINK+="..." rules
+ at the end, e.g.:
+ 
+ KERNEL=="nvme*[0-9]n*[0-9]", ENV{DEVTYPE}=="disk", ATTRS{model}=="?*",
+ ENV{ID_SERIAL_SHORT}=="?*",
+ ENV{ID_SERIAL}="$attr{model}_$env{ID_SERIAL_SHORT}", SYMLINK+="disk/by-
+ id/nvme-$env{ID_SERIAL}", OPTIONS+="string_escape=none"

-- 
You received this bug notification because you are a member of Ubuntu
Desktop Bugs, which is subscribed to systemd in Ubuntu.
https://bugs.launchpad.net/bugs/1647485

Title:
  NVMe symlinks broken by devices with spaces in model or serial strings

To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/systemd/+bug/1647485/+subscriptions

-- 
desktop-bugs mailing list
desktop-bugs@lists.ubuntu.com
https://lists.ubuntu.com/mailman/listinfo/desktop-bugs

Reply via email to