On 9/7/26 11:49, John Garry wrote:
NATIVE SCSI MULTIPATH:


JFYI, this passes a sanity test on mkp scsi 7.4 queue after all the recent sense codes changes, as would be expected.

This series introduces native SCSI multipath support. It is intended as
an alternative to dm-mpath.

This support aims to provide a multipath-enabled SCSI block device/
gendisk.

For a SCSI device to support native multipath, either of the following
conditions must be satisfied:
a. unique ID in VPD page 83 and ALUA support and scsi_multipath modparam
    enabled
b. unique ID in VPD page 83 and scsi_multipath_always modparam enabled

This series relies on reading sdev->access_state to get path information.
This path information would be provided by ALUA. ALUA support which does
not rely on device handlers has already been discussed at
https://lore.kernel.org/linux-scsi/[email protected]/
and support will be added in the next phase.

New classes of devices are added:
- scsi_mpath_device
- scsi_mpath_disk

These are required since a multipath scsi_device has no common scsi host.
An example of the sysfs files and directories for these new classes is as
follows:

$ ls -l /sys/class/scsi_mpath_device/scsi_mpath_device0/
total 0
-rw-r--r--    1 root     root          4096 Feb 25 11:59 iopolicy
drwxr-xr-x    2 root     root             0 Feb 25 11:59 multipath
drwxr-xr-x    2 root     root             0 Feb 25 11:59 power
lrwxrwxrwx    1 root     root             0 Feb 25 11:59 subsystem ->
../../../../class/scsi_mpath_device
-rw-r--r--    1 root     root          4096 Feb 25 11:58 uevent
-r--r--r--    1 root     root          4096 Feb 25 11:59 vpd_id
$ ls -l /sys/class/scsi_mpath_device/scsi_mpath_device0/multipath/
total 0
lrwxrwxrwx    1 root     root             0 Feb 25 11:59 8:0:0:0 ->
../../../../platform/host8/session1/target8:0:0/8:0:0:0
lrwxrwxrwx    1 root     root             0 Feb 25 11:59 9:0:0:0 ->
../../../../platform/host9/session2/target9:0:0/9:0:0:0
$ cat /sys/class/scsi_mpath_device/scsi_mpath_device0/vpd_id
naa.600140505200a986f0043c9afa1fd077
$ cat /sys/class/scsi_mpath_device/scsi_mpath_device0/iopolicy
numa
$

$ ls -l /sys/class/scsi_mpath_disk/scsi_mpath_disk0/
total 0
drwxr-xr-x    2 root     root             0 Feb 25 12:00 power
drwxr-xr-x   11 root     root             0 Feb 25 11:58 sdc
lrwxrwxrwx    1 root     root             0 Feb 25 11:58 subsystem ->
../../../../class/scsi_mpath_disk
-rw-r--r--    1 root     root          4096 Feb 25 11:58 uevent
$ ls -l /sys/class/scsi_mpath_disk/scsi_mpath_disk0/sdc/multipath/
total 0
lrwxrwxrwx    1 root     root             0 Feb 25 12:00 sdc:0 ->
../../../../../platform/host8/session1/target8:0:0/8:0:0:0/block/sdc:0
lrwxrwxrwx    1 root     root             0 Feb 25 12:00 sdc:1 ->
../../../../../platform/host9/session2/target9:0:0/9:0:0:0/block/sdc:1

$ ls -l /dev/sdc
brw-rw----    1 root     disk        8,  32 Feb 25 11:58 /dev/sdc

The scsi_device and scsi_disk classes otherwise remain unmodified.
However, the per-path block device is hidden in /dev/. Furthermore,
multipathed block devices have a new naming scheme, sdX:Y, where
X is the scsi multipath device index and Y is the path index.

No multipath sg support is added. We still have a per-path sg device.
Since the SCSI block device is multipath enabled, we can access
multipathed scsi_ioctl() through that block device.

For failover, we take the approach of cloning bio's and re-submitting them
in full (for failover errors).

LIBMULTIPATH:

This series introduces also libmultipath. It is essentially a refactoring
of NVME multipath support, so we can have a common library to also support
native SCSI multipath.

Much of the code is taken directly from the NVMe multipath code. However,
NVMe specifics are removed. A template structure is provided so the driver
-may provide callbacks for driver specifics, like ANA support for NVMe.

Important new structures introduced include:

- mpath_head
These contain much of the multipath-specific functionality from
nvme_ns_head, including a pointer to the gendisk structure and
a path SRCU-based array.

- mpath_device
This is the per-path structure, and contains much the same
multipath-specific functionality in nvme_ns

libmultipath provides functionality for path management, path selection,
data path, and failover handling.

Full series also available at
https://github.com/johnpgarry/linux/commits/scsi-multipath-v7.3-v8/

Differences to v7:
- rebase
- simplify scsi_mpath_clone_end_io() (sashiko)
- rename bio_list_add_clone() -> bio_list_add_master()
- rework checks in mpath_alloc_disk_head() (sashiko)

Differences to v6:
- rebase
- add scsi_mpath_get_head()

Differences to v5:
- deal with issues sashiko found in libmultipath:
  - include wait_bit.h
  - don't store error in mpath_head->disk
  - use check_mul_overflow() in mpath_can_remove_head()
  - use -ENOTTY in mpath_bdev_ioctl()
- deal with issues sashiko found in scsi mpath support:
  - check 0 returned from scsi_vpd_lun_id()
  - call flush_work() in scsi_mpath_device_iopolicy_store()
  - clear SCMD_MPATH_IO_STATS for !bio in scsi_mpath_start_request()
  - add checks for calling scsi_mpath_{start,end}_request()
  - tweak sd_mpath_dev_show()

John Garry (27):
   libmultipath: Add initial framework
   libmultipath: Add basic gendisk support
   libmultipath: Add path selection support
   libmultipath: Add bio handling
   libmultipath: Add support for mpath_device management
   libmultipath: Add delayed removal support
   libmultipath: Add sysfs helpers
   libmultipath: Add support for block device IOCTL
   libmultipath: Add mpath_bdev_getgeo()
   libmultipath: Add mpath_bdev_get_unique_id()
   scsi-multipath: introduce basic SCSI device support
   scsi-multipath: introduce scsi_device head structure
   scsi-multipath: provide sysfs link from to scsi_device
   scsi-multipath: support iopolicy
   scsi-multipath: clone each bio
   scsi-multipath: clear path when device is blocked
   scsi-multipath: revalidate paths upon device unblock
   scsi-multipath: failover handling
   scsi-multipath: provide callbacks for path state
   scsi-multipath: add scsi_mpath_{start,end}_request()
   scsi-multipath: add delayed disk removal support
   scsi: sd: add multipath disk class
   scsi: sd: add multipath disk attr groups
   scsi: sd: support multipath disk
   scsi: sd: add mpath_dev file
   scsi: sd: add mpath_numa_nodes dev attribute
   scsi: sd: add mpath_queue_depth dev attribute

  drivers/scsi/Kconfig          |  10 +
  drivers/scsi/Makefile         |   1 +
  drivers/scsi/scsi.c           |   8 +-
  drivers/scsi/scsi_lib.c       |  13 +-
  drivers/scsi/scsi_multipath.c | 664 ++++++++++++++++++++++++
  drivers/scsi/scsi_scan.c      |   4 +
  drivers/scsi/scsi_sysfs.c     |  10 +
  drivers/scsi/sd.c             | 611 +++++++++++++++++++++-
  drivers/scsi/sd.h             |   3 +
  include/linux/multipath.h     | 156 ++++++
  include/scsi/scsi_cmnd.h      |   9 +-
  include/scsi/scsi_device.h    |   2 +
  include/scsi/scsi_driver.h    |   4 +
  include/scsi/scsi_host.h      |   4 +
  include/scsi/scsi_multipath.h | 124 +++++
  lib/Kconfig                   |   6 +
  lib/Makefile                  |   2 +
  lib/multipath.c               | 947 ++++++++++++++++++++++++++++++++++
  18 files changed, 2554 insertions(+), 24 deletions(-)
  create mode 100644 drivers/scsi/scsi_multipath.c
  create mode 100644 include/linux/multipath.h
  create mode 100644 include/scsi/scsi_multipath.h
  create mode 100644 lib/multipath.c



Reply via email to