diff options
Diffstat (limited to 'usr/src')
-rw-r--r-- | usr/src/cmd/devfsadm/disk_link.c | 21 | ||||
-rw-r--r-- | usr/src/uts/common/io/blkdev/blkdev.c | 34 | ||||
-rw-r--r-- | usr/src/uts/common/sys/blkdev.h | 3 | ||||
-rw-r--r-- | usr/src/uts/common/sys/sunddi.h | 2 |
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 |