diff options
| author | Hans Rosenfeld <rosenfeld@grumpf.hope-2000.org> | 2022-05-03 12:15:06 +0200 |
|---|---|---|
| committer | Hans Rosenfeld <rosenfeld@grumpf.hope-2000.org> | 2022-05-18 17:53:55 +0200 |
| commit | ca0df52a1ec24f9498f363369c65d0e408d579b1 (patch) | |
| tree | 9e2cd38591e85a9f9412dfed79a80fc3d89d59a7 /usr/src/uts/common/io/blkdev/blkdev.c | |
| parent | ecc39deb3ff51afe175edd847dcffb926c47a239 (diff) | |
| download | illumos-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.c | 74 |
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, |
