diff options
author | John Forte <John.Forte@Sun.COM> | 2009-10-12 20:05:55 -0700 |
---|---|---|
committer | John Forte <John.Forte@Sun.COM> | 2009-10-12 20:05:55 -0700 |
commit | fdcc480a6215c1e81d58d8e7af8c84fd6f1faa50 (patch) | |
tree | 3be9b6a5d4004db5c807eec6df2142bba2c4e696 /usr/src/lib | |
parent | 051c7f8a398d8146061ecfd231397df7912c19a9 (diff) | |
download | illumos-gate-fdcc480a6215c1e81d58d8e7af8c84fd6f1faa50.tar.gz |
6861519 stmfCreateLu() should allow caller to specify host id
Diffstat (limited to 'usr/src/lib')
-rw-r--r-- | usr/src/lib/libstmf/common/libstmf.h | 3 | ||||
-rw-r--r-- | usr/src/lib/libstmf/common/libstmf_impl.h | 2 | ||||
-rw-r--r-- | usr/src/lib/libstmf/common/stmf.c | 33 |
3 files changed, 37 insertions, 1 deletions
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); |