summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Forte <John.Forte@Sun.COM>2009-10-12 20:05:55 -0700
committerJohn Forte <John.Forte@Sun.COM>2009-10-12 20:05:55 -0700
commitfdcc480a6215c1e81d58d8e7af8c84fd6f1faa50 (patch)
tree3be9b6a5d4004db5c807eec6df2142bba2c4e696
parent051c7f8a398d8146061ecfd231397df7912c19a9 (diff)
downloadillumos-joyent-fdcc480a6215c1e81d58d8e7af8c84fd6f1faa50.tar.gz
6861519 stmfCreateLu() should allow caller to specify host id
-rw-r--r--usr/src/cmd/stmfadm/stmfadm.c5
-rw-r--r--usr/src/lib/libstmf/common/libstmf.h3
-rw-r--r--usr/src/lib/libstmf/common/libstmf_impl.h2
-rw-r--r--usr/src/lib/libstmf/common/stmf.c33
-rw-r--r--usr/src/uts/common/io/comstar/lu/stmf_sbd/sbd.c5
-rw-r--r--usr/src/uts/common/io/comstar/stmf/stmf.c14
-rw-r--r--usr/src/uts/common/sys/stmf.h2
-rw-r--r--usr/src/uts/common/sys/stmf_sbd_ioctl.h3
8 files changed, 62 insertions, 5 deletions
diff --git a/usr/src/cmd/stmfadm/stmfadm.c b/usr/src/cmd/stmfadm/stmfadm.c
index ab165480aa..92e21c8f59 100644
--- a/usr/src/cmd/stmfadm/stmfadm.c
+++ b/usr/src/cmd/stmfadm/stmfadm.c
@@ -127,6 +127,7 @@ static int convertCharToPropId(char *, uint32_t *);
#define BLOCK_SIZE "BLK"
#define SERIAL_NUMBER "SERIAL"
#define MGMT_URL "MGMT-URL"
+#define HOST_ID "HOST-ID"
#define MODIFY_HELP "\n"\
"Description: Modify properties of a logical unit. \n" \
@@ -145,6 +146,8 @@ static int convertCharToPropId(char *, uint32_t *);
" alias - alias for logical unit (up to 255 chars)\n" \
" blk - block size in bytes in 2^n\n" \
" guid - 32 ascii hex characters in NAA format \n" \
+" host-id - host identifier to be used for GUID generation \n" \
+" 8 ascii hex characters\n" \
" meta - separate meta data file name\n" \
" mgmt-url - Management URL address\n" \
" oui - organizational unique identifier\n" \
@@ -1287,6 +1290,8 @@ convertCharToPropId(char *prop, uint32_t *propId)
*propId = STMF_LU_PROP_META_FILENAME;
} else if (strcasecmp(prop, MGMT_URL) == 0) {
*propId = STMF_LU_PROP_MGMT_URL;
+ } else if (strcasecmp(prop, HOST_ID) == 0) {
+ *propId = STMF_LU_PROP_HOST_ID;
} else {
return (1);
}
diff --git a/usr/src/lib/libstmf/common/libstmf.h b/usr/src/lib/libstmf/common/libstmf.h
index 771227e014..363d01e70e 100644
--- a/usr/src/lib/libstmf/common/libstmf.h
+++ b/usr/src/lib/libstmf/common/libstmf.h
@@ -147,7 +147,8 @@ enum {
STMF_LU_PROP_VID,
STMF_LU_PROP_PID,
STMF_LU_PROP_SERIAL_NUM,
- STMF_LU_PROP_ACCESS_STATE
+ STMF_LU_PROP_ACCESS_STATE,
+ STMF_LU_PROP_HOST_ID
};
diff --git a/usr/src/lib/libstmf/common/libstmf_impl.h b/usr/src/lib/libstmf/common/libstmf_impl.h
index fca9515301..ec02fcd93d 100644
--- a/usr/src/lib/libstmf/common/libstmf_impl.h
+++ b/usr/src/lib/libstmf/common/libstmf_impl.h
@@ -68,6 +68,8 @@ typedef struct _diskResource {
boolean_t writebackCacheDisableValid;
boolean_t writebackCacheDisable;
uint16_t accessState;
+ uint32_t hostId;
+ boolean_t hostIdValid;
} diskResource;
diff --git a/usr/src/lib/libstmf/common/stmf.c b/usr/src/lib/libstmf/common/stmf.c
index 7ab34a3150..760761a29b 100644
--- a/usr/src/lib/libstmf/common/stmf.c
+++ b/usr/src/lib/libstmf/common/stmf.c
@@ -59,7 +59,9 @@
#define LU_ASCII_GUID_SIZE 32
#define LU_GUID_SIZE 16
#define OUI_ASCII_SIZE 6
+#define HOST_ID_ASCII_SIZE 8
#define OUI_SIZE 3
+#define HOST_ID_SIZE 4
#define IDENT_LENGTH_BYTE 3
/* various initial allocation values */
@@ -1241,6 +1243,11 @@ createDiskLu(diskResource *disk, stmfGuid *createdGuid)
sbdLu->slu_company_id = disk->companyId;
}
+ if (disk->hostIdValid) {
+ sbdLu->slu_host_id_valid = 1;
+ sbdLu->slu_host_id = disk->hostId;
+ }
+
if (disk->blkSizeValid) {
sbdLu->slu_blksize_valid = 1;
sbdLu->slu_blksize = disk->blkSize;
@@ -2589,7 +2596,9 @@ setDiskProp(luResourceImpl *hdl, uint32_t resourceProp, const char *propVal)
unsigned long long numericProp = 0;
char guidProp[LU_ASCII_GUID_SIZE + 1];
char ouiProp[OUI_ASCII_SIZE + 1];
+ char hostIdProp[HOST_ID_ASCII_SIZE + 1];
unsigned int oui[OUI_SIZE];
+ unsigned int hostId[HOST_ID_SIZE];
unsigned int guid[LU_GUID_SIZE];
int propSize;
@@ -2630,8 +2639,32 @@ setDiskProp(luResourceImpl *hdl, uint32_t resourceProp, const char *propVal)
diskLu->companyId += oui[0] << 16;
diskLu->companyId += oui[1] << 8;
diskLu->companyId += oui[2];
+ if (diskLu->companyId == 0) {
+ return (STMF_ERROR_INVALID_ARG);
+ }
diskLu->companyIdValid = B_TRUE;
break;
+ case STMF_LU_PROP_HOST_ID:
+ if ((strlcpy(hostIdProp, propVal,
+ sizeof (hostIdProp))) >= sizeof (hostIdProp)) {
+ return (STMF_ERROR_INVALID_ARG);
+ }
+ if (checkHexUpper(hostIdProp) != 0) {
+ return (STMF_ERROR_INVALID_ARG);
+ }
+ (void) sscanf(hostIdProp, "%2X%2X%2X%2X",
+ &hostId[0], &hostId[1], &hostId[2], &hostId[3]);
+
+ diskLu->hostId = 0;
+ diskLu->hostId += hostId[0] << 24;
+ diskLu->hostId += hostId[1] << 16;
+ diskLu->hostId += hostId[2] << 8;
+ diskLu->hostId += hostId[3];
+ if (diskLu->hostId == 0) {
+ return (STMF_ERROR_INVALID_ARG);
+ }
+ diskLu->hostIdValid = B_TRUE;
+ break;
case STMF_LU_PROP_GUID:
if (strlen(propVal) != LU_ASCII_GUID_SIZE) {
return (STMF_ERROR_INVALID_PROPSIZE);
diff --git a/usr/src/uts/common/io/comstar/lu/stmf_sbd/sbd.c b/usr/src/uts/common/io/comstar/lu/stmf_sbd/sbd.c
index 91054cf6dd..00108b1428 100644
--- a/usr/src/uts/common/io/comstar/lu/stmf_sbd/sbd.c
+++ b/usr/src/uts/common/io/comstar/lu/stmf_sbd/sbd.c
@@ -1635,6 +1635,7 @@ sbd_create_register_lu(sbd_create_and_reg_lu_t *slu, int struct_sz,
int ret = EIO;
int flag;
int wcd = 0;
+ uint32_t hid = 0;
enum vtype vt;
sz = struct_sz - sizeof (sbd_create_and_reg_lu_t) + 8 + 1;
@@ -1864,9 +1865,11 @@ over_meta_open:
sl->sl_device_id[2] = 0;
bcopy(slu->slu_guid, sl->sl_device_id + 4, 16);
} else {
+ if (slu->slu_host_id_valid)
+ hid = slu->slu_host_id;
if (!slu->slu_company_id_valid)
slu->slu_company_id = COMPANY_ID_SUN;
- if (stmf_scsilib_uniq_lu_id(slu->slu_company_id,
+ if (stmf_scsilib_uniq_lu_id2(slu->slu_company_id, hid,
(scsi_devid_desc_t *)&sl->sl_device_id[0]) !=
STMF_SUCCESS) {
*err_ret = SBD_RET_META_CREATION_FAILED;
diff --git a/usr/src/uts/common/io/comstar/stmf/stmf.c b/usr/src/uts/common/io/comstar/stmf/stmf.c
index 0876f4d958..4e6dc5c408 100644
--- a/usr/src/uts/common/io/comstar/stmf/stmf.c
+++ b/usr/src/uts/common/io/comstar/stmf/stmf.c
@@ -5223,11 +5223,19 @@ static uint16_t stmf_lu_id_gen_number = 0;
stmf_status_t
stmf_scsilib_uniq_lu_id(uint32_t company_id, scsi_devid_desc_t *lu_id)
{
+ return (stmf_scsilib_uniq_lu_id2(company_id, 0, lu_id));
+}
+
+stmf_status_t
+stmf_scsilib_uniq_lu_id2(uint32_t company_id, uint32_t host_id,
+ scsi_devid_desc_t *lu_id)
+{
uint8_t *p;
struct timeval32 timestamp32;
uint32_t *t = (uint32_t *)&timestamp32;
struct ether_addr mac;
uint8_t *e = (uint8_t *)&mac;
+ int hid = (int)host_id;
if (company_id == COMPANY_ID_NONE)
company_id = COMPANY_ID_SUN;
@@ -5244,8 +5252,10 @@ stmf_scsilib_uniq_lu_id(uint32_t company_id, scsi_devid_desc_t *lu_id)
p[5] = (company_id >> 12) & 0xff;
p[6] = (company_id >> 4) & 0xff;
p[7] = (company_id << 4) & 0xf0;
- if (!localetheraddr((struct ether_addr *)NULL, &mac)) {
- int hid = BE_32((int)zone_get_hostid(NULL));
+ if (hid == 0 && !localetheraddr((struct ether_addr *)NULL, &mac)) {
+ hid = BE_32((int)zone_get_hostid(NULL));
+ }
+ if (hid != 0) {
e[0] = (hid >> 24) & 0xff;
e[1] = (hid >> 16) & 0xff;
e[2] = (hid >> 8) & 0xff;
diff --git a/usr/src/uts/common/sys/stmf.h b/usr/src/uts/common/sys/stmf.h
index 199409fd16..62e763de18 100644
--- a/usr/src/uts/common/sys/stmf.h
+++ b/usr/src/uts/common/sys/stmf.h
@@ -371,6 +371,8 @@ void stmf_wwn_to_devid_desc(struct scsi_devid_desc *sdid, uint8_t *wwn,
uint8_t protocol_id);
stmf_status_t stmf_scsilib_uniq_lu_id(uint32_t company_id,
struct scsi_devid_desc *lu_id);
+stmf_status_t stmf_scsilib_uniq_lu_id2(uint32_t company_id, uint32_t host_id,
+ struct scsi_devid_desc *lu_id);
void stmf_scsilib_send_status(scsi_task_t *task, uint8_t st, uint32_t saa);
uint32_t stmf_scsilib_prepare_vpd_page83(scsi_task_t *task, uint8_t *page,
uint32_t page_len, uint8_t byte0, uint32_t vpd_mask);
diff --git a/usr/src/uts/common/sys/stmf_sbd_ioctl.h b/usr/src/uts/common/sys/stmf_sbd_ioctl.h
index 3567cd3004..97370408a4 100644
--- a/usr/src/uts/common/sys/stmf_sbd_ioctl.h
+++ b/usr/src/uts/common/sys/stmf_sbd_ioctl.h
@@ -88,6 +88,7 @@ typedef struct sbd_create_and_reg_lu {
slu_mgmt_url_valid:1,
slu_guid_valid:1,
slu_company_id_valid:1,
+ slu_host_id_valid:1,
slu_writeback_cache_disable_valid:1,
slu_writeback_cache_disable:1,
slu_write_protected:1;
@@ -101,7 +102,7 @@ typedef struct sbd_create_and_reg_lu {
uint32_t slu_company_id;
uint16_t slu_alias_off;
uint16_t slu_mgmt_url_off;
- uint32_t slu_rsvd1;
+ uint32_t slu_host_id;
char slu_rev[4];
char slu_vid[8];
char slu_pid[16];