summaryrefslogtreecommitdiff
path: root/usr
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
parentecc39deb3ff51afe175edd847dcffb926c47a239 (diff)
downloadillumos-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.c8
-rw-r--r--usr/src/uts/common/io/blkdev/blkdev.c74
-rw-r--r--usr/src/uts/common/sys/blkdev.h7
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;
/*