summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src')
-rw-r--r--usr/src/cmd/devfsadm/disk_link.c21
-rw-r--r--usr/src/uts/common/io/blkdev/blkdev.c34
-rw-r--r--usr/src/uts/common/sys/blkdev.h3
-rw-r--r--usr/src/uts/common/sys/sunddi.h2
4 files changed, 52 insertions, 8 deletions
diff --git a/usr/src/cmd/devfsadm/disk_link.c b/usr/src/cmd/devfsadm/disk_link.c
index 0baa608912..3e966ac6bd 100644
--- a/usr/src/cmd/devfsadm/disk_link.c
+++ b/usr/src/cmd/devfsadm/disk_link.c
@@ -20,7 +20,7 @@
*/
/*
* Copyright 2016 Toomas Soome <tsoome@me.com>
- * Copyright 2012 Nexenta Systems, Inc. All rights reserved.
+ * Copyright 2016 Nexenta Systems, Inc. All rights reserved.
* Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -64,6 +64,7 @@ extern int system_labeled;
static int disk_callback_chan(di_minor_t minor, di_node_t node);
static int disk_callback_nchan(di_minor_t minor, di_node_t node);
+static int disk_callback_blkdev(di_minor_t minor, di_node_t node);
static int disk_callback_wwn(di_minor_t minor, di_node_t node);
static int disk_callback_xvmd(di_minor_t minor, di_node_t node);
static int disk_callback_fabric(di_minor_t minor, di_node_t node);
@@ -82,6 +83,9 @@ static devfsadm_create_t disk_cbt[] = {
{ "disk", DDI_NT_BLOCK_CHAN, NULL,
TYPE_EXACT, ILEVEL_0, disk_callback_chan
},
+ { "disk", DDI_NT_BLOCK_BLKDEV, NULL,
+ TYPE_EXACT, ILEVEL_0, disk_callback_blkdev
+ },
{ "disk", DDI_NT_BLOCK_FABRIC, NULL,
TYPE_EXACT, ILEVEL_0, disk_callback_fabric
},
@@ -217,6 +221,21 @@ disk_callback_nchan(di_minor_t minor, di_node_t node)
}
static int
+disk_callback_blkdev(di_minor_t minor, di_node_t node)
+{
+ char *addr;
+ char disk[DISK_SUBPATH_MAX];
+ uint64_t eui64;
+ 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);
+ disk_common(minor, node, disk, RM_STALE);
+ return (DEVFSADM_CONTINUE);
+}
+
+static int
disk_callback_wwn(di_minor_t minor, di_node_t node)
{
char disk[10];
diff --git a/usr/src/uts/common/io/blkdev/blkdev.c b/usr/src/uts/common/io/blkdev/blkdev.c
index a4b7f6adca..e94aeba89d 100644
--- a/usr/src/uts/common/io/blkdev/blkdev.c
+++ b/usr/src/uts/common/io/blkdev/blkdev.c
@@ -108,7 +108,7 @@ struct bd_handle {
void *h_private;
bd_t *h_bd;
char *h_name;
- char h_addr[20]; /* enough for %X,%X */
+ char h_addr[30]; /* enough for w%0.16x,%X */
};
struct bd_xfer_impl {
@@ -585,6 +585,8 @@ bd_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
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,
CMLB_FAKE_LABEL_ONE_PARTITION, bd->d_cmlbh, 0);
if (rv != 0) {
@@ -1778,13 +1780,33 @@ bd_attach_handle(dev_info_t *dip, bd_handle_t hdl)
hdl->h_parent = dip;
hdl->h_name = "blkdev";
- if (drive.d_lun >= 0) {
- (void) snprintf(hdl->h_addr, sizeof (hdl->h_addr), "%X,%X",
- drive.d_target, drive.d_lun);
+ /*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]);
+ }
} else {
- (void) snprintf(hdl->h_addr, sizeof (hdl->h_addr), "%X",
- drive.d_target);
+ 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);
+ }
}
+
if (ndi_devi_alloc(dip, hdl->h_name, (pnode_t)DEVI_SID_NODEID,
&child) != NDI_SUCCESS) {
cmn_err(CE_WARN, "%s%d: unable to allocate node %s@%s",
diff --git a/usr/src/uts/common/sys/blkdev.h b/usr/src/uts/common/sys/blkdev.h
index b686e45d53..cb6a397520 100644
--- a/usr/src/uts/common/sys/blkdev.h
+++ b/usr/src/uts/common/sys/blkdev.h
@@ -20,7 +20,7 @@
*/
/*
* Copyright 2012 DEY Storage Systems, Inc. All rights reserved.
- * Copyright 2015 Nexenta 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.
*/
@@ -114,6 +114,7 @@ struct bd_drive {
char *d_serial;
size_t d_revision_len;
char *d_revision;
+ uint8_t d_eui64[8];
};
struct bd_media {
diff --git a/usr/src/uts/common/sys/sunddi.h b/usr/src/uts/common/sys/sunddi.h
index dd2ad2da91..d5e52dbbfc 100644
--- a/usr/src/uts/common/sys/sunddi.h
+++ b/usr/src/uts/common/sys/sunddi.h
@@ -23,6 +23,7 @@
* Copyright (c) 1990, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright 2012 Garrett D'Amore <garrett@damore.org>. All rights reserved.
* Copyright (c) 2012 by Delphix. All rights reserved.
+ * Copyright 2016 Nexenta Systems, Inc. All rights reserved.
*/
#ifndef _SYS_SUNDDI_H
@@ -174,6 +175,7 @@ extern "C" {
#define DDI_NT_SCSI_ENCLOSURE "ddi_enclosure:scsi"
#define DDI_NT_BLOCK_SAS "ddi_block:sas"
+#define DDI_NT_BLOCK_BLKDEV "ddi_block:blkdev"
/*
* xVM virtual block devices