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 | |
parent | ecc39deb3ff51afe175edd847dcffb926c47a239 (diff) | |
download | illumos-joyent-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')
-rw-r--r-- | usr/src/cmd/devfsadm/disk_link.c | 8 | ||||
-rw-r--r-- | usr/src/uts/common/io/blkdev/blkdev.c | 74 | ||||
-rw-r--r-- | usr/src/uts/common/sys/blkdev.h | 7 |
3 files changed, 52 insertions, 37 deletions
diff --git a/usr/src/cmd/devfsadm/disk_link.c b/usr/src/cmd/devfsadm/disk_link.c index ade81417c6..5e68c6c67f 100644 --- a/usr/src/cmd/devfsadm/disk_link.c +++ b/usr/src/cmd/devfsadm/disk_link.c @@ -21,7 +21,7 @@ /* * Copyright 2016 Toomas Soome <tsoome@me.com> - * Copyright 2017 Nexenta Systems, Inc. + * Copyright 2022 Tintri by DDN, Inc. All rights reserved. * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -226,12 +226,12 @@ disk_callback_blkdev(di_minor_t minor, di_node_t node) { char *addr; char disk[DISK_SUBPATH_MAX]; - uint64_t eui64; + char guid[50]; uint_t lun = 0; addr = di_bus_addr(node); - (void) sscanf(addr, "w%016"PRIx64",%X", &eui64, &lun); - (void) snprintf(disk, DISK_SUBPATH_MAX, "t%016"PRIX64"d%d", eui64, lun); + (void) sscanf(addr, "w%49[0-9A-F],%X", &guid, &lun); + (void) snprintf(disk, DISK_SUBPATH_MAX, "t%sd%d", guid, lun); disk_common(minor, node, disk, RM_STALE); return (DEVFSADM_CONTINUE); } 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, diff --git a/usr/src/uts/common/sys/blkdev.h b/usr/src/uts/common/sys/blkdev.h index 6407f7b960..7418aaac4c 100644 --- a/usr/src/uts/common/sys/blkdev.h +++ b/usr/src/uts/common/sys/blkdev.h @@ -20,10 +20,9 @@ */ /* * Copyright 2012 DEY Storage Systems, Inc. All rights reserved. - * Copyright 2016 Nexenta Systems, Inc. All rights reserved. * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. - * Copyright 2019 Western Digital Corporation. * Copyright 2020 Joyent, Inc. + * Copyright 2022 Tintri by DDN, Inc. All rights reserved. */ #ifndef _SYS_BLKDEV_H @@ -120,8 +119,10 @@ struct bd_drive { char *d_serial; size_t d_revision_len; char *d_revision; + uint8_t d_eui64[8]; - /* Added at the end to maintain binary compatibility */ + uint8_t d_guid[16]; + uint32_t d_qcount; /* |