Page MenuHomeFreeBSD

Fix non-printable characters in NVMe model and serial numbers.
ClosedPublic

Authored by ken on Jan 20 2022, 8:18 PM.
Tags
None
Referenced Files
Unknown Object (File)
Fri, Oct 18, 9:02 AM
Unknown Object (File)
Thu, Oct 17, 8:55 AM
Unknown Object (File)
Wed, Oct 16, 11:49 PM
Unknown Object (File)
Tue, Oct 15, 8:37 AM
Unknown Object (File)
Tue, Oct 15, 8:37 AM
Unknown Object (File)
Sun, Oct 13, 11:00 AM
Unknown Object (File)
Sat, Oct 12, 1:35 PM
Unknown Object (File)
Fri, Oct 11, 5:52 AM
Subscribers

Details

Summary
The NVMe 1.4 spec simply says that Model and Serial numbers are
ASCII strings.  Unlike SCSI, it doesn't prohibit non-printable
characters or say that the strings should be padded with spaces.

Since 2014, we have had cam_strvis_sbuf(), which gives additional
options for handling non-ASCII characters.  That behavior hasn't
been available for non-sbuf consumers, so users of cam_strvis()
were left with having octal ASCII codes inserted.

So, to avoid having garbage or octal chracters in the strings, use
cam_strvis_sbuf() to create a new function, cam_strvis_flag(), and
re-implement cam_strvis() using cam_strvis_flag().

Now, for the NVMe drives, we can use cam_strvis_flag with the
CAM_STRVIS_FLAG_NONASCII_SPC flag.  This transforms non-printable
characters into spaces.

sys/cam/cam.c:
        Add a new function, cam_strvis_flag(), that creates an sbuf
        on the stack with the user's destination buffer, and calls
        cam_strvis_sbuf() with the given flag argument.

        Re-implement cam_strvis() to call cam_strvis_flag with the
        CAM_STRVIS_FLAG_NONASCII_ESC argument.  This should be the
        equivalent of the old cam_strvis() function, except for the
        overhead of creating the sbuf and calling sbuf_putc/printf.

sys/cam/cam.h:
        Declaration for cam_strvis_flag.

sys/cam/nvme/nvme_all.c:
        In nvme_print_ident, use the NONASCII_SPC flag with
        cam_strvis_flag().

sys/cam/nvme/nvme_da.c:
        In ndaregister(), use cam_strvis_flag() with the
        NONASCII_SPC flag for the disk description and serial
        number we report to GEOM.

sys/cam/nvme/nvme_xpt.c:
        In nvme_probe_done(), use cam_strvis_flag with the
        NONASCII_SPC flag when storing the drive serial number
        in the CAM EDT.

MFC after: 1 week
Sponsored by: Spectra Logic

Test Plan

Get a NVMe drive with bogus characters in the Model or Serial number.
Try it out (diskinfo -v, dmesg, camcontrol devlist, etc.) with and
without these changes.

Diff Detail

Repository
rS FreeBSD src repository - subversion
Lint
Lint Passed
Unit
No Test Coverage
Build Status
Buildable 44069
Build 40957: arc lint + arc unit

Event Timeline

ken requested review of this revision.Jan 20 2022, 8:18 PM
sys/cam/nvme/nvme_da.c
933–938

These three statements are repeated 3 times. Please make it a function since it would also save at least one declarations of sb.

Create a cam_strvis_flag() function and use it in the NVMe code.

This allows specifying alternate handling modes for cam_strvis,
but doesn't require the caller to instantiate an sbuf.

Also, re-implement cam_strvis() using cam_strvis_flag().

This revision is now accepted and ready to land.Jan 25 2022, 6:40 PM

Thanks for the updates. This looks good now.