ieee1394: sbp2: offer SAM-conforming target port ID in sysfs
With "modprobe sbp2 long_ieee1394_id=y", the format of /sys/bus/scsi/devices/*:*:*:*/ieee1394_id is changed from e.g. 0001041010004beb:0:0 to 0001041010004beb:00042c:0000. The longer format fully conforms to object identifier sizes as per SAM(-2...4) and reflects what the SAM target port identifier is meant to contain: A Discovery ID allegedly specified by ISO/IEC 13213:1994 --- however there is no such thing; the authors of SAM probably meant Directory ID). Especially target nodes with multiple dynamically added targets may use Directory IDs to persistently identify target ports. The new format is independent of implementation details of nodemgr. Thus the same ieee1394_id attribute format can be implemented in the new firewire stack. The ieee1394_id is typically used to create persistently named links in /dev/disk/by-id. Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
This commit is contained in:
parent
a52938f3e2
commit
d7794c8668
|
@ -977,6 +977,7 @@ static struct unit_directory *nodemgr_process_unit_directory
|
||||||
ud->ne = ne;
|
ud->ne = ne;
|
||||||
ud->ignore_driver = ignore_drivers;
|
ud->ignore_driver = ignore_drivers;
|
||||||
ud->address = ud_kv->offset + CSR1212_REGISTER_SPACE_BASE;
|
ud->address = ud_kv->offset + CSR1212_REGISTER_SPACE_BASE;
|
||||||
|
ud->directory_id = ud->address & 0xffffff;
|
||||||
ud->ud_kv = ud_kv;
|
ud->ud_kv = ud_kv;
|
||||||
ud->id = (*id)++;
|
ud->id = (*id)++;
|
||||||
|
|
||||||
|
@ -1085,6 +1086,10 @@ static struct unit_directory *nodemgr_process_unit_directory
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case CSR1212_KV_ID_DIRECTORY_ID:
|
||||||
|
ud->directory_id = kv->value.immediate;
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -75,6 +75,7 @@ struct unit_directory {
|
||||||
struct csr1212_keyval *model_name_kv;
|
struct csr1212_keyval *model_name_kv;
|
||||||
quadlet_t specifier_id;
|
quadlet_t specifier_id;
|
||||||
quadlet_t version;
|
quadlet_t version;
|
||||||
|
quadlet_t directory_id;
|
||||||
|
|
||||||
unsigned int id;
|
unsigned int id;
|
||||||
|
|
||||||
|
|
|
@ -194,6 +194,27 @@ MODULE_PARM_DESC(workarounds, "Work around device bugs (default = 0"
|
||||||
", override internal blacklist = " __stringify(SBP2_WORKAROUND_OVERRIDE)
|
", override internal blacklist = " __stringify(SBP2_WORKAROUND_OVERRIDE)
|
||||||
", or a combination)");
|
", or a combination)");
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This influences the format of the sysfs attribute
|
||||||
|
* /sys/bus/scsi/devices/.../ieee1394_id.
|
||||||
|
*
|
||||||
|
* The default format is like in older kernels: %016Lx:%d:%d
|
||||||
|
* It contains the target's EUI-64, a number given to the logical unit by
|
||||||
|
* the ieee1394 driver's nodemgr (starting at 0), and the LUN.
|
||||||
|
*
|
||||||
|
* The long format is: %016Lx:%06x:%04x
|
||||||
|
* It contains the target's EUI-64, the unit directory's directory_ID as per
|
||||||
|
* IEEE 1212 clause 7.7.19, and the LUN. This format comes closest to the
|
||||||
|
* format of SBP(-3) target port and logical unit identifier as per SAM (SCSI
|
||||||
|
* Architecture Model) rev.2 to 4 annex A. Therefore and because it is
|
||||||
|
* independent of the implementation of the ieee1394 nodemgr, the longer format
|
||||||
|
* is recommended for future use.
|
||||||
|
*/
|
||||||
|
static int sbp2_long_sysfs_ieee1394_id;
|
||||||
|
module_param_named(long_ieee1394_id, sbp2_long_sysfs_ieee1394_id, bool, 0644);
|
||||||
|
MODULE_PARM_DESC(long_ieee1394_id, "8+3+2 bytes format of ieee1394_id in sysfs "
|
||||||
|
"(default = backwards-compatible = N, SAM-conforming = Y)");
|
||||||
|
|
||||||
|
|
||||||
#define SBP2_INFO(fmt, args...) HPSB_INFO("sbp2: "fmt, ## args)
|
#define SBP2_INFO(fmt, args...) HPSB_INFO("sbp2: "fmt, ## args)
|
||||||
#define SBP2_ERR(fmt, args...) HPSB_ERR("sbp2: "fmt, ## args)
|
#define SBP2_ERR(fmt, args...) HPSB_ERR("sbp2: "fmt, ## args)
|
||||||
|
@ -2100,7 +2121,13 @@ static ssize_t sbp2_sysfs_ieee1394_id_show(struct device *dev,
|
||||||
if (!(lu = (struct sbp2_lu *)sdev->host->hostdata[0]))
|
if (!(lu = (struct sbp2_lu *)sdev->host->hostdata[0]))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
return sprintf(buf, "%016Lx:%d:%d\n", (unsigned long long)lu->ne->guid,
|
if (sbp2_long_sysfs_ieee1394_id)
|
||||||
|
return sprintf(buf, "%016Lx:%06x:%04x\n",
|
||||||
|
(unsigned long long)lu->ne->guid,
|
||||||
|
lu->ud->directory_id, ORB_SET_LUN(lu->lun));
|
||||||
|
else
|
||||||
|
return sprintf(buf, "%016Lx:%d:%d\n",
|
||||||
|
(unsigned long long)lu->ne->guid,
|
||||||
lu->ud->id, ORB_SET_LUN(lu->lun));
|
lu->ud->id, ORB_SET_LUN(lu->lun));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue