chiark / gitweb /
scsi_id: export target port group
authorHannes Reinecke <hare@suse.de>
Mon, 6 Sep 2010 09:00:22 +0000 (11:00 +0200)
committerKay Sievers <kay.sievers@vrfy.org>
Tue, 7 Sep 2010 06:22:05 +0000 (08:22 +0200)
For ALUA support it's useful to have the target port group number
of a device.

Signed-off-by: Hannes Reinecke <hare@suse.de>
extras/scsi_id/scsi.h
extras/scsi_id/scsi_id.c
extras/scsi_id/scsi_id.h
extras/scsi_id/scsi_serial.c

index f5aa686f719ba9e7a3c70558b68e95f429d0b98c..8e9ce406b787e90e353cf24698281ef257f2a75f 100644 (file)
@@ -54,6 +54,11 @@ struct scsi_ioctl_command {
 #define SCSI_ID_T10_VENDOR     1
 #define SCSI_ID_EUI_64         2
 #define SCSI_ID_NAA            3
+#define SCSI_ID_RELPORT                4
+#define SCSI_ID_TGTGROUP       5
+#define SCSI_ID_LUNGROUP       6
+#define SCSI_ID_MD5            7
+#define SCSI_ID_NAME           8
 
 /*
  * Supported NAA values. These fit in 4 bits, so the "don't care" value
index 3811ea542d58b533faa1a70def4ee01567316401..6c8826568f38de953122c7bbb065997c30dc5439 100644 (file)
@@ -575,6 +575,9 @@ static int scsi_id(struct udev *udev, char *maj_min_dev)
                                printf("ID_WWN_WITH_EXTENSION=0x%s\n", dev_scsi.wwn);
                        }
                }
+               if (dev_scsi.tgpt_group[0] != '\0') {
+                       printf("ID_TARGET_PORT=%s\n", dev_scsi.tgpt_group);
+               }
                if (dev_scsi.unit_serial_number[0] != '\0') {
                        printf("ID_SCSI_SERIAL=%s\n", dev_scsi.unit_serial_number);
                }
index 4475eaccd124dc2d64316cb15c9d538c3bfed7dd..f6c269fc5912df7da2b7177101a565518f9d3e29 100644 (file)
@@ -53,6 +53,9 @@ struct scsi_id_device {
 
         /* NULs if not set - otherwise hex encoding using lower-case e.g. '0xe00000d80000' */
         char wwn_vendor_extension[17];
+
+       /* NULs if not set - otherwise decimal number */
+       char tgpt_group[8];
 };
 
 extern int scsi_std_inquiry(struct udev *udev, struct scsi_id_device *dev_scsi, const char *devname);
index dd5e1fdbf8f1cee7c6df2d9604f44c7d2b449c27..6f5da37f78a8bd802415141c9822ff2903ebe946 100644 (file)
@@ -48,6 +48,7 @@
  * is normally one or some small number of descriptors.
  */
 static const struct scsi_id_search_values id_search_list[] = {
+       { SCSI_ID_TGTGROUP,     SCSI_ID_NAA_DONT_CARE,  SCSI_ID_BINARY },
        { SCSI_ID_NAA,  SCSI_ID_NAA_IEEE_REG_EXTENDED,  SCSI_ID_BINARY },
        { SCSI_ID_NAA,  SCSI_ID_NAA_IEEE_REG_EXTENDED,  SCSI_ID_ASCII },
        { SCSI_ID_NAA,  SCSI_ID_NAA_IEEE_REG,   SCSI_ID_BINARY },
@@ -485,16 +486,20 @@ static int check_fill_0x83_id(struct udev *udev,
                              struct scsi_id_device *dev_scsi,
                              unsigned char *page_83,
                              const struct scsi_id_search_values
-                             *id_search, char *serial, char *serial_short, int max_len,
-                              char *wwn,
-                             char *wwn_vendor_extension)
+                             *id_search, char *serial, char *serial_short,
+                             int max_len, char *wwn,
+                             char *wwn_vendor_extension, char *tgpt_group)
 {
        int i, j, s, len;
 
        /*
         * ASSOCIATION must be with the device (value 0)
+        * or with the target port for SCSI_ID_TGTPORT
         */
-       if ((page_83[1] & 0x30) != 0)
+       if (page_83[1] & 0x30 == 0x10)
+               if (id_search->id_type != SCSI_ID_TGTGROUP)
+                       return 1;
+       else if ((page_83[1] & 0x30) != 0)
                return 1;
 
        if ((page_83[1] & 0x0f) != id_search->id_type)
@@ -536,6 +541,14 @@ static int check_fill_0x83_id(struct udev *udev,
                return 1;
        }
 
+       if (id_search->id_type == SCSI_ID_TGTGROUP && tgpt_group != NULL) {
+               unsigned int group;
+
+               group = ((unsigned int)page_83[6] << 8) | page_83[7];
+               sprintf(tgpt_group,"%x", group);
+               return 1;
+       }
+
        serial[0] = hex_str[id_search->id_type];
 
        /*
@@ -572,12 +585,13 @@ static int check_fill_0x83_id(struct udev *udev,
 
        strcpy(serial_short, &serial[s]);
 
-        if (id_search->id_type == SCSI_ID_NAA && wwn != NULL) {
-                strncpy(wwn, &serial[s], 16);
+       if (id_search->id_type == SCSI_ID_NAA && wwn != NULL) {
+               strncpy(wwn, &serial[s], 16);
                if (wwn_vendor_extension != NULL) {
                        strncpy(wwn_vendor_extension, &serial[s + 16], 16);
                }
-        }
+       }
+
        return 0;
 }
 
@@ -609,14 +623,14 @@ static int check_fill_0x83_prespc3(struct udev *udev,
 static int do_scsi_page83_inquiry(struct udev *udev,
                                  struct scsi_id_device *dev_scsi, int fd,
                                  char *serial, char *serial_short, int len,
-                                  char *unit_serial_number, char *wwn,
-                                 char *wwn_vendor_extension)
+                                 char *unit_serial_number, char *wwn,
+                                 char *wwn_vendor_extension, char *tgpt_group)
 {
        int retval;
        unsigned int id_ind, j;
        unsigned char page_83[SCSI_INQ_BUFF_LEN];
 
-        /* also pick up the page 80 serial number */
+       /* also pick up the page 80 serial number */
         do_scsi_page80_inquiry(udev, dev_scsi, fd, NULL, unit_serial_number, MAX_SERIAL_LEN);
 
        memset(page_83, 0, SCSI_INQ_BUFF_LEN);
@@ -680,8 +694,8 @@ static int do_scsi_page83_inquiry(struct udev *udev,
                                                    dev_scsi, &page_83[j],
                                                    &id_search_list[id_ind],
                                                    serial, serial_short, len,
-                                                    wwn,
-                                                   wwn_vendor_extension);
+                                                   wwn, wwn_vendor_extension,
+                                                   tgpt_group);
                        dbg(udev, "%s id desc %d/%d/%d\n", dev_scsi->kernel,
                                id_search_list[id_ind].id_type,
                                id_search_list[id_ind].naa_type,
@@ -895,7 +909,7 @@ int scsi_get_serial(struct udev *udev,
                        goto completed;
                }
        } else if (page_code == PAGE_83) {
-               if (do_scsi_page83_inquiry(udev, dev_scsi, fd, dev_scsi->serial, dev_scsi->serial_short, len, dev_scsi->unit_serial_number, dev_scsi->wwn, dev_scsi->wwn_vendor_extension)) {
+               if (do_scsi_page83_inquiry(udev, dev_scsi, fd, dev_scsi->serial, dev_scsi->serial_short, len, dev_scsi->unit_serial_number, dev_scsi->wwn, dev_scsi->wwn_vendor_extension, dev_scsi->tgpt_group)) {
                        retval = 1;
                        goto completed;
                } else  {
@@ -911,7 +925,7 @@ int scsi_get_serial(struct udev *udev,
                         * conform to pre-SPC3 expectations.
                         */
                        if (retval == 2) {
-                               if (do_scsi_page83_inquiry(udev, dev_scsi, fd, dev_scsi->serial, dev_scsi->serial_short, len, dev_scsi->unit_serial_number, dev_scsi->wwn, dev_scsi->wwn_vendor_extension)) {
+                               if (do_scsi_page83_inquiry(udev, dev_scsi, fd, dev_scsi->serial, dev_scsi->serial_short, len, dev_scsi->unit_serial_number, dev_scsi->wwn, dev_scsi->wwn_vendor_extension, dev_scsi->tgpt_group)) {
                                        retval = 1;
                                        goto completed;
                                } else  {
@@ -951,7 +965,7 @@ int scsi_get_serial(struct udev *udev,
        for (ind = 4; ind <= page0[3] + 3; ind++)
                if (page0[ind] == PAGE_83)
                        if (!do_scsi_page83_inquiry(udev, dev_scsi, fd,
-                                                   dev_scsi->serial, dev_scsi->serial_short, len, dev_scsi->unit_serial_number, dev_scsi->wwn, dev_scsi->wwn_vendor_extension)) {
+                                                   dev_scsi->serial, dev_scsi->serial_short, len, dev_scsi->unit_serial_number, dev_scsi->wwn, dev_scsi->wwn_vendor_extension, dev_scsi->tgpt_group)) {
                                /*
                                 * Success
                                 */