On 9/29/20 1:14 AM, Brian Bunker wrote:
For LUNs between 0 and 255 peripheral addressing is used. For LUNs higher than 
255 the LUN addressing
should switch to flat according to the specification. Instead of printing out 
the LUN number without regard to
the shifting of address method, display the LUN as it was intended to be the 
user connecting the LUN. The
current display leaves a non-obvious 16384 offset.

In short, a LUN connected as 258 will show up in multipath output as 16642. 
Instead display it as the
expected 258. This is for display only and doesn’t change the actual contents 
of the LUN variable.

[this is kind of a continuation of the discussion that started with the 1st version of the path in https://www.redhat.com/archives/dm-devel/2020-September/msg00592.html]

Users and tools such as https://github.com/ibm-s390-tools/s390-tools/blob/master/ziomon/ziomon parse the hcil output of multipath(d) to find the corresponding Linux SCSI device by its well-defined name.
I think this change would break those.

IIRC, tools such as rescan-scsi-bus.sh [sg3_utils] were intentionally changed from decoding the LUN format to working with an opaque 64-bit LUN.
[https://lore.kernel.org/linux-scsi/[email protected]/T/#maba954fc50efa24e4c0544506d4c4025269d6c60]

Using target-internal volume "names", such as the pure LUN number, for communication between initiator (Linux admin) and target (storage admin) can indeed be confusing. The target decides how it exports a volume using a T10 SAM 64-bit LUN that both initator and target understand (report luns etc.). That's what Linux encodes in the scsi lun part of a SCSI device name [with a bijective mapping swapping the order of T10 SAM LUN levels].

Here's a real-life example making use of the SCSI device name to map different related objects [similar to what the above-mentioned ziomon tool does]:

# multipathd -k'show topo'
36005076309ffd43000000000000015f8 dm-1 IBM,2107900
size=10G features='1 queue_if_no_path' hwhandler='1 alua' wp=rw
`-+- policy='service-time 0' prio=50 status=active
  |- 0:0:0:1090011157 sdh 8:112 active ready running
  `- 1:0:0:1090011157 sda 8:0   active ready running

E.g. find the correspondig SCSI generic device:
# lsscsi -g 0:0:0:1090011157
[0:0:0:1090011157] disk    IBM      2107900          2.88  /dev/sdh    /dev/sg7

Decode the LUN format:
# lsscsi -x -g 0:0:0:1090011157
[0:0:0:0x4015] disk IBM 2107900 2.88 /dev/sdh /dev/sg7

Just use the full 64-bit LUN as an opaque value:
# lsscsi -xx -g 0:0:0:1090011157
[0:0:0:0x401540f800000000] disk IBM 2107900 2.88 /dev/sdh /dev/sg7


Signed-off-by: Brian Bunker <[email protected]>
___
diff -Naur a/multipath-tools-0.8.3/libmultipath/print.c 
b/multipath-tools-0.8.3/libmultipath/print.c
--- a/libmultipath/print.c      2020-09-24 13:52:18.661828011 -0600
+++ b/libmultipath/print.c      2020-09-28 16:57:37.956222258 -0600
@@ -29,6 +29,7 @@
  #include "uevent.h"
  #include "debug.h"
  #include "discovery.h"
+#include "util.h"
#define MAX(x,y) (((x) > (y)) ? (x) : (y))
  #define MIN(x,y) (((x) > (y)) ? (y) : (x))
@@ -390,11 +391,12 @@
         if (!pp || pp->sg_id.host_no < 0)
                 return snprintf(buff, len, "#:#:#:#");
+ int display_lun = extract_lun_number(pp->sg_id.lun);
         return snprintf(buff, len, "%i:%i:%i:%i",
                         pp->sg_id.host_no,
                         pp->sg_id.channel,
                         pp->sg_id.scsi_id,
-                       pp->sg_id.lun);
+                       display_lun);
  }
static int
diff -Naur a/multipath-tools-0.8.3/libmultipath/util.c 
b/multipath-tools-0.8.3/libmultipath/util.c
--- a/multipath-tools-0.8.3/libmultipath/util.c 2019-10-02 01:15:03.000000000 
-0600
+++ b/multipath-tools-0.8.3/libmultipath/util.c 2020-09-28 16:56:00.851169070 
-0600
@@ -470,3 +470,25 @@
  {
         close((long)arg);
  }
+
+/* Extracts the LUN number from the addressing method for
+   peripheral, flat, and LUN addressing methods.
+ */
+int extract_lun_number(int lun)
+{
+       if (lun > UINT16_MAX)
+               return lun;
+
+       uint8_t address_method = ((lun >> 8) & 0xC0) >> 6; /* first two bits of 
the 16 byte LUN */
+       switch (address_method) {
+               case 1: /* Flat Addressing method (01b) */
+                       return lun - 0x4000;
+               case 2: /* Logical unit addressing (02b) */
+                       return lun & 0x001F;
+               case 0: /* Peripheral addressing method (00b) */
+                       if (lun > 255)
+                               condlog(3, "Peripheral addressing supports up to 256 
LUNs");
+               default:
+                       return lun;
+       }
+}
diff -Naur a/multipath-tools-0.8.3/libmultipath/util.h 
b/multipath-tools-0.8.3/libmultipath/util.h
--- a/multipath-tools-0.8.3/libmultipath/util.h 2019-10-02 01:15:03.000000000 
-0600
+++ b/multipath-tools-0.8.3/libmultipath/util.h 2020-09-28 16:43:32.632879763 
-0600
@@ -22,6 +22,7 @@
  int parse_prkey_flags(char *ptr, uint64_t *prkey, uint8_t *flags);
  int safe_write(int fd, const void *buf, size_t count);
  void set_max_fds(int max_fds);
+int extract_lun_number(int lun);
#define KERNEL_VERSION(maj, min, ptc) ((((maj) * 256) + (min)) * 256 + (ptc))
  #define ARRAY_SIZE(x) (sizeof(x)/sizeof((x)[0]))

Brian Bunker
SW Eng
[email protected]




--
dm-devel mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/dm-devel



--
Mit freundlichen Gruessen / Kind regards
Steffen Maier

Linux on IBM Z Development

https://www.ibm.com/privacy/us/en/
IBM Deutschland Research & Development GmbH
Vorsitzender des Aufsichtsrats: Matthias Hartmann
Geschaeftsfuehrung: Dirk Wittkopp
Sitz der Gesellschaft: Boeblingen
Registergericht: Amtsgericht Stuttgart, HRB 243294


--
dm-devel mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/dm-devel

Reply via email to