From 7f4954d04026f28b0ebe65a514f06fefad8efaca Mon Sep 17 00:00:00 2001 From: David Zeuthen Date: Fri, 4 Dec 2009 11:25:09 -0500 Subject: [PATCH] Export ID_WWN_VENDOR_EXTENSION and ID_WWN_WITH_EXTENSION Some SCSI devices use the same WWN and have a WWN extension that we need to take into account when creating the /dev/disk/by-id/wwn symlinks. Thus, introduce ID_WWN_WITH_EXTENSION. This property will contain either the WWN (if no extension is present) or the WWN with the vendor extension appended. Example: # /lib/udev/ata_id/ata_id --export /dev/sda |grep WWN ID_WWN=0x5001517387d61905 ID_WWN_WITH_EXTENSION=0x5001517387d61905 # /lib/udev/scsi_id --whitelisted --export -d /dev/sdb |grep WWN ID_WWN=0x600508b400105df7 ID_WWN_VENDOR_EXTENSION=0x0000e00000d80000 ID_WWN_WITH_EXTENSION=0x600508b400105df70000e00000d80000 # /lib/udev/scsi_id --whitelisted --export -d /dev/sdc |grep WWN ID_WWN=0x600508b400105df7 ID_WWN_VENDOR_EXTENSION=0x0000e00000db0000 ID_WWN_WITH_EXTENSION=0x600508b400105df70000e00000db0000 Signed-off-by: David Zeuthen --- extras/ata_id/ata_id.c | 5 ++++- extras/scsi_id/scsi_id.c | 9 ++++++++- extras/scsi_id/scsi_id.h | 6 +++++- extras/scsi_id/scsi_serial.c | 21 ++++++++++++++------- rules/rules.d/60-persistent-storage.rules | 4 ++-- 5 files changed, 33 insertions(+), 12 deletions(-) diff --git a/extras/ata_id/ata_id.c b/extras/ata_id/ata_id.c index cbd3b5b8d..25c771012 100644 --- a/extras/ata_id/ata_id.c +++ b/extras/ata_id/ata_id.c @@ -1,4 +1,5 @@ -/* +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * * ata_id - reads product/serial number from ATA drives * * Copyright (C) 2005-2008 Kay Sievers @@ -520,6 +521,8 @@ int main(int argc, char *argv[]) wwwn <<= 16; wwwn |= *((uint16_t *) identify + 111); printf("ID_WWN=0x%llx\n", (unsigned long long int) wwwn); + /* ATA devices have no vendor extension */ + printf("ID_WWN_WITH_EXTENSION=0x%llx\n", (unsigned long long int) wwwn); } } else { if (serial[0] != '\0') diff --git a/extras/scsi_id/scsi_id.c b/extras/scsi_id/scsi_id.c index 9c5b2c3a3..5c4065855 100644 --- a/extras/scsi_id/scsi_id.c +++ b/extras/scsi_id/scsi_id.c @@ -1,4 +1,5 @@ -/* +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * * scsi_id.c * * Main section of the scsi_id program @@ -566,6 +567,12 @@ static int scsi_id(struct udev *udev, char *maj_min_dev) } if (dev_scsi.wwn[0] != '\0') { printf("ID_WWN=0x%s\n", dev_scsi.wwn); + if (dev_scsi.wwn_vendor_extension[0] != '\0') { + printf("ID_WWN_VENDOR_EXTENSION=0x%s\n", dev_scsi.wwn_vendor_extension); + printf("ID_WWN_WITH_EXTENSION=0x%s%s\n", dev_scsi.wwn, dev_scsi.wwn_vendor_extension); + } else { + printf("ID_WWN_WITH_EXTENSION=0x%s\n", dev_scsi.wwn); + } } if (dev_scsi.unit_serial_number[0] != '\0') { printf("ID_SCSI_SERIAL=%s\n", dev_scsi.unit_serial_number); diff --git a/extras/scsi_id/scsi_id.h b/extras/scsi_id/scsi_id.h index 4536cfd4f..3b8b23636 100644 --- a/extras/scsi_id/scsi_id.h +++ b/extras/scsi_id/scsi_id.h @@ -1,4 +1,5 @@ -/* +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * * scsi_id.h * * General defines and such for scsi_id @@ -45,6 +46,9 @@ struct scsi_id_device { /* NULs if not set - otherwise hex encoding using lower-case e.g. '50014ee0016eb572' */ char wwn[17]; + + /* NULs if not set - otherwise hex encoding using lower-case e.g. '0xe00000d80000' */ + char wwn_vendor_extension[17]; }; extern int scsi_std_inquiry(struct udev *udev, struct scsi_id_device *dev_scsi, const char *devname); diff --git a/extras/scsi_id/scsi_serial.c b/extras/scsi_id/scsi_serial.c index 5b18b225a..0c9d9c309 100644 --- a/extras/scsi_id/scsi_serial.c +++ b/extras/scsi_id/scsi_serial.c @@ -1,4 +1,5 @@ -/* +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * * scsi_serial.c * * Code related to requesting and getting an id from a scsi device @@ -482,7 +483,8 @@ static int check_fill_0x83_id(struct udev *udev, unsigned char *page_83, const struct scsi_id_search_values *id_search, char *serial, char *serial_short, int max_len, - char *wwn) + char *wwn, + char *wwn_vendor_extension) { int i, j, s, len; @@ -569,6 +571,9 @@ static int check_fill_0x83_id(struct udev *udev, 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; } @@ -601,7 +606,8 @@ 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 *unit_serial_number, char *wwn, + char *wwn_vendor_extension) { int retval; unsigned int id_ind, j; @@ -671,7 +677,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, + wwn_vendor_extension); 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, @@ -885,7 +892,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)) { + 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)) { retval = 1; goto completed; } else { @@ -901,7 +908,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)) { + 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)) { retval = 1; goto completed; } else { @@ -941,7 +948,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->serial, dev_scsi->serial_short, len, dev_scsi->unit_serial_number, dev_scsi->wwn, dev_scsi->wwn_vendor_extension)) { /* * Success */ diff --git a/rules/rules.d/60-persistent-storage.rules b/rules/rules.d/60-persistent-storage.rules index c839f3bc0..89041a950 100644 --- a/rules/rules.d/60-persistent-storage.rules +++ b/rules/rules.d/60-persistent-storage.rules @@ -67,7 +67,7 @@ ENV{ID_FS_USAGE}=="filesystem|other|crypto", ENV{ID_FS_UUID_ENC}=="?*", SYMLINK+ ENV{ID_FS_USAGE}=="filesystem|other", ENV{ID_FS_LABEL_ENC}=="?*", SYMLINK+="disk/by-label/$env{ID_FS_LABEL_ENC}" # by-id (World Wide Name) -ENV{DEVTYPE}=="disk", ENV{ID_WWN}=="?*", SYMLINK+="disk/by-id/wwn-$env{ID_WWN}" -ENV{DEVTYPE}=="partition", ENV{ID_WWN}=="?*", SYMLINK+="disk/by-id/wwn-$env{ID_WWN}-part%n" +ENV{DEVTYPE}=="disk", ENV{ID_WWN_WITH_EXTENSION}=="?*", SYMLINK+="disk/by-id/wwn-$env{ID_WWN_WITH_EXTENSION}" +ENV{DEVTYPE}=="partition", ENV{ID_WWN_WITH_EXTENSION}=="?*", SYMLINK+="disk/by-id/wwn-$env{ID_WWN_WITH_EXTENSION}-part%n" LABEL="persistent_storage_end" -- 2.30.2