mirror of
https://github.com/systemd/systemd-stable.git
synced 2024-10-27 01:55:32 +03:00
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 <davidz@redhat.com>
This commit is contained in:
parent
07fb7fce66
commit
7f4954d040
@ -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
|
* ata_id - reads product/serial number from ATA drives
|
||||||
*
|
*
|
||||||
* Copyright (C) 2005-2008 Kay Sievers <kay.sievers@vrfy.org>
|
* Copyright (C) 2005-2008 Kay Sievers <kay.sievers@vrfy.org>
|
||||||
@ -520,6 +521,8 @@ int main(int argc, char *argv[])
|
|||||||
wwwn <<= 16;
|
wwwn <<= 16;
|
||||||
wwwn |= *((uint16_t *) identify + 111);
|
wwwn |= *((uint16_t *) identify + 111);
|
||||||
printf("ID_WWN=0x%llx\n", (unsigned long long int) wwwn);
|
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 {
|
} else {
|
||||||
if (serial[0] != '\0')
|
if (serial[0] != '\0')
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
/*
|
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
|
||||||
|
*
|
||||||
* scsi_id.c
|
* scsi_id.c
|
||||||
*
|
*
|
||||||
* Main section of the scsi_id program
|
* 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') {
|
if (dev_scsi.wwn[0] != '\0') {
|
||||||
printf("ID_WWN=0x%s\n", dev_scsi.wwn);
|
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') {
|
if (dev_scsi.unit_serial_number[0] != '\0') {
|
||||||
printf("ID_SCSI_SERIAL=%s\n", dev_scsi.unit_serial_number);
|
printf("ID_SCSI_SERIAL=%s\n", dev_scsi.unit_serial_number);
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
/*
|
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
|
||||||
|
*
|
||||||
* scsi_id.h
|
* scsi_id.h
|
||||||
*
|
*
|
||||||
* General defines and such for scsi_id
|
* 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' */
|
/* NULs if not set - otherwise hex encoding using lower-case e.g. '50014ee0016eb572' */
|
||||||
char wwn[17];
|
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);
|
extern int scsi_std_inquiry(struct udev *udev, struct scsi_id_device *dev_scsi, const char *devname);
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
/*
|
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
|
||||||
|
*
|
||||||
* scsi_serial.c
|
* scsi_serial.c
|
||||||
*
|
*
|
||||||
* Code related to requesting and getting an id from a scsi device
|
* 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,
|
unsigned char *page_83,
|
||||||
const struct scsi_id_search_values
|
const struct scsi_id_search_values
|
||||||
*id_search, char *serial, char *serial_short, int max_len,
|
*id_search, char *serial, char *serial_short, int max_len,
|
||||||
char *wwn)
|
char *wwn,
|
||||||
|
char *wwn_vendor_extension)
|
||||||
{
|
{
|
||||||
int i, j, s, len;
|
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) {
|
if (id_search->id_type == SCSI_ID_NAA && wwn != NULL) {
|
||||||
strncpy(wwn, &serial[s], 16);
|
strncpy(wwn, &serial[s], 16);
|
||||||
|
if (wwn_vendor_extension != NULL) {
|
||||||
|
strncpy(wwn_vendor_extension, &serial[s + 16], 16);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -601,7 +606,8 @@ static int check_fill_0x83_prespc3(struct udev *udev,
|
|||||||
static int do_scsi_page83_inquiry(struct udev *udev,
|
static int do_scsi_page83_inquiry(struct udev *udev,
|
||||||
struct scsi_id_device *dev_scsi, int fd,
|
struct scsi_id_device *dev_scsi, int fd,
|
||||||
char *serial, char *serial_short, int len,
|
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;
|
int retval;
|
||||||
unsigned int id_ind, j;
|
unsigned int id_ind, j;
|
||||||
@ -671,7 +677,8 @@ static int do_scsi_page83_inquiry(struct udev *udev,
|
|||||||
dev_scsi, &page_83[j],
|
dev_scsi, &page_83[j],
|
||||||
&id_search_list[id_ind],
|
&id_search_list[id_ind],
|
||||||
serial, serial_short, len,
|
serial, serial_short, len,
|
||||||
wwn);
|
wwn,
|
||||||
|
wwn_vendor_extension);
|
||||||
dbg(udev, "%s id desc %d/%d/%d\n", dev_scsi->kernel,
|
dbg(udev, "%s id desc %d/%d/%d\n", dev_scsi->kernel,
|
||||||
id_search_list[id_ind].id_type,
|
id_search_list[id_ind].id_type,
|
||||||
id_search_list[id_ind].naa_type,
|
id_search_list[id_ind].naa_type,
|
||||||
@ -885,7 +892,7 @@ int scsi_get_serial(struct udev *udev,
|
|||||||
goto completed;
|
goto completed;
|
||||||
}
|
}
|
||||||
} else if (page_code == PAGE_83) {
|
} 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;
|
retval = 1;
|
||||||
goto completed;
|
goto completed;
|
||||||
} else {
|
} else {
|
||||||
@ -901,7 +908,7 @@ int scsi_get_serial(struct udev *udev,
|
|||||||
* conform to pre-SPC3 expectations.
|
* conform to pre-SPC3 expectations.
|
||||||
*/
|
*/
|
||||||
if (retval == 2) {
|
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;
|
retval = 1;
|
||||||
goto completed;
|
goto completed;
|
||||||
} else {
|
} else {
|
||||||
@ -941,7 +948,7 @@ int scsi_get_serial(struct udev *udev,
|
|||||||
for (ind = 4; ind <= page0[3] + 3; ind++)
|
for (ind = 4; ind <= page0[3] + 3; ind++)
|
||||||
if (page0[ind] == PAGE_83)
|
if (page0[ind] == PAGE_83)
|
||||||
if (!do_scsi_page83_inquiry(udev, dev_scsi, fd,
|
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
|
* Success
|
||||||
*/
|
*/
|
||||||
|
@ -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}"
|
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)
|
# by-id (World Wide Name)
|
||||||
ENV{DEVTYPE}=="disk", ENV{ID_WWN}=="?*", SYMLINK+="disk/by-id/wwn-$env{ID_WWN}"
|
ENV{DEVTYPE}=="disk", ENV{ID_WWN_WITH_EXTENSION}=="?*", SYMLINK+="disk/by-id/wwn-$env{ID_WWN_WITH_EXTENSION}"
|
||||||
ENV{DEVTYPE}=="partition", ENV{ID_WWN}=="?*", SYMLINK+="disk/by-id/wwn-$env{ID_WWN}-part%n"
|
ENV{DEVTYPE}=="partition", ENV{ID_WWN_WITH_EXTENSION}=="?*", SYMLINK+="disk/by-id/wwn-$env{ID_WWN_WITH_EXTENSION}-part%n"
|
||||||
|
|
||||||
LABEL="persistent_storage_end"
|
LABEL="persistent_storage_end"
|
||||||
|
Loading…
Reference in New Issue
Block a user