summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/io/blkdev/blkdev.c
diff options
context:
space:
mode:
authorHans Rosenfeld <rosenfeld@grumpf.hope-2000.org>2022-05-03 12:15:06 +0200
committerHans Rosenfeld <rosenfeld@grumpf.hope-2000.org>2022-05-18 17:53:55 +0200
commitca0df52a1ec24f9498f363369c65d0e408d579b1 (patch)
tree9e2cd38591e85a9f9412dfed79a80fc3d89d59a7 /usr/src/uts/common/io/blkdev/blkdev.c
parentecc39deb3ff51afe175edd847dcffb926c47a239 (diff)
downloadillumos-gate-ca0df52a1ec24f9498f363369c65d0e408d579b1.tar.gz
14689 blkdev GUID support
Reviewed by: Andrew Giles <agiles@tintri.com> Reviewed by: Guy Morrogh <gmorrogh@tintri.com> Reviewed by: Robert Mustacchi <rm+illumos@fingolfin.org> Reviewed by: Jason King <jason.brian.king+illumos@gmail.com> Approved by: Dan McDonald <danmcd@mnx.io>
Diffstat (limited to 'usr/src/uts/common/io/blkdev/blkdev.c')
-rw-r--r--usr/src/uts/common/io/blkdev/blkdev.c74
1 files changed, 44 insertions, 30 deletions
diff --git a/usr/src/uts/common/io/blkdev/blkdev.c b/usr/src/uts/common/io/blkdev/blkdev.c
index 7e5e5716e2..2587d51799 100644
--- a/usr/src/uts/common/io/blkdev/blkdev.c
+++ b/usr/src/uts/common/io/blkdev/blkdev.c
@@ -207,7 +207,7 @@ struct bd_handle {
void *h_private;
bd_t *h_bd;
char *h_name;
- char h_addr[30]; /* enough for w%0.16x,%X */
+ char h_addr[50]; /* enough for w%0.32x,%X */
};
struct bd_xfer_impl {
@@ -651,6 +651,7 @@ bd_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
int rv;
char name[16];
char kcache[32];
+ char *node_type;
switch (cmd) {
case DDI_ATTACH:
@@ -823,11 +824,17 @@ bd_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
offsetof(struct bd_xfer_impl, i_linkage));
}
+ if (*(uint64_t *)drive.d_eui64 != 0 ||
+ *(uint64_t *)drive.d_guid != 0 ||
+ *((uint64_t *)drive.d_guid + 1) != 0)
+ node_type = DDI_NT_BLOCK_BLKDEV;
+ else if (drive.d_lun >= 0)
+ node_type = DDI_NT_BLOCK_CHAN;
+ else
+ node_type = DDI_NT_BLOCK;
+
rv = cmlb_attach(dip, &bd_tg_ops, DTYPE_DIRECT,
- bd->d_removable, bd->d_hotpluggable,
- /*LINTED: E_BAD_PTR_CAST_ALIGN*/
- *(uint64_t *)drive.d_eui64 != 0 ? DDI_NT_BLOCK_BLKDEV :
- drive.d_lun >= 0 ? DDI_NT_BLOCK_CHAN : DDI_NT_BLOCK,
+ bd->d_removable, bd->d_hotpluggable, node_type,
CMLB_FAKE_LABEL_ONE_PARTITION, bd->d_cmlbh, 0);
if (rv != 0) {
goto fail_cmlb_attach;
@@ -2325,8 +2332,9 @@ bd_free_handle(bd_handle_t hdl)
int
bd_attach_handle(dev_info_t *dip, bd_handle_t hdl)
{
- dev_info_t *child;
bd_drive_t drive = { 0 };
+ dev_info_t *child;
+ size_t len;
/*
* It's not an error if bd_attach_handle() is called on a handle that
@@ -2345,31 +2353,37 @@ bd_attach_handle(dev_info_t *dip, bd_handle_t hdl)
hdl->h_parent = dip;
hdl->h_name = "blkdev";
- /*LINTED: E_BAD_PTR_CAST_ALIGN*/
- if (*(uint64_t *)drive.d_eui64 != 0) {
- if (drive.d_lun >= 0) {
- (void) snprintf(hdl->h_addr, sizeof (hdl->h_addr),
- "w%02X%02X%02X%02X%02X%02X%02X%02X,%X",
- drive.d_eui64[0], drive.d_eui64[1],
- drive.d_eui64[2], drive.d_eui64[3],
- drive.d_eui64[4], drive.d_eui64[5],
- drive.d_eui64[6], drive.d_eui64[7], drive.d_lun);
- } else {
- (void) snprintf(hdl->h_addr, sizeof (hdl->h_addr),
- "w%02X%02X%02X%02X%02X%02X%02X%02X",
- drive.d_eui64[0], drive.d_eui64[1],
- drive.d_eui64[2], drive.d_eui64[3],
- drive.d_eui64[4], drive.d_eui64[5],
- drive.d_eui64[6], drive.d_eui64[7]);
- }
+ /*
+ * Prefer the GUID over the EUI64.
+ */
+ if (*(uint64_t *)drive.d_guid != 0 ||
+ *((uint64_t *)drive.d_guid + 1) != 0) {
+ len = snprintf(hdl->h_addr, sizeof (hdl->h_addr),
+ "w%02X%02X%02X%02X%02X%02X%02X%02X"
+ "%02X%02X%02X%02X%02X%02X%02X%02X",
+ drive.d_guid[0], drive.d_guid[1], drive.d_guid[2],
+ drive.d_guid[3], drive.d_guid[4], drive.d_guid[5],
+ drive.d_guid[6], drive.d_guid[7], drive.d_guid[8],
+ drive.d_guid[9], drive.d_guid[10], drive.d_guid[11],
+ drive.d_guid[12], drive.d_guid[13], drive.d_guid[14],
+ drive.d_guid[15]);
+ } else if (*(uint64_t *)drive.d_eui64 != 0) {
+ len = snprintf(hdl->h_addr, sizeof (hdl->h_addr),
+ "w%02X%02X%02X%02X%02X%02X%02X%02X",
+ drive.d_eui64[0], drive.d_eui64[1],
+ drive.d_eui64[2], drive.d_eui64[3],
+ drive.d_eui64[4], drive.d_eui64[5],
+ drive.d_eui64[6], drive.d_eui64[7]);
} else {
- if (drive.d_lun >= 0) {
- (void) snprintf(hdl->h_addr, sizeof (hdl->h_addr),
- "%X,%X", drive.d_target, drive.d_lun);
- } else {
- (void) snprintf(hdl->h_addr, sizeof (hdl->h_addr),
- "%X", drive.d_target);
- }
+ len = snprintf(hdl->h_addr, sizeof (hdl->h_addr),
+ "%X", drive.d_target);
+ }
+
+ VERIFY(len <= sizeof (hdl->h_addr));
+
+ if (drive.d_lun >= 0) {
+ (void) snprintf(hdl->h_addr + len, sizeof (hdl->h_addr) - len,
+ ",%X", drive.d_lun);
}
if (ndi_devi_alloc(dip, hdl->h_name, (pnode_t)DEVI_SID_NODEID,