1fcf3ce44SJohn Forte /* 2fcf3ce44SJohn Forte * CDDL HEADER START 3fcf3ce44SJohn Forte * 4fcf3ce44SJohn Forte * The contents of this file are subject to the terms of the 5fcf3ce44SJohn Forte * Common Development and Distribution License (the "License"). 6fcf3ce44SJohn Forte * You may not use this file except in compliance with the License. 7fcf3ce44SJohn Forte * 8fcf3ce44SJohn Forte * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9fcf3ce44SJohn Forte * or http://www.opensolaris.org/os/licensing. 10fcf3ce44SJohn Forte * See the License for the specific language governing permissions 11fcf3ce44SJohn Forte * and limitations under the License. 12fcf3ce44SJohn Forte * 13fcf3ce44SJohn Forte * When distributing Covered Code, include this CDDL HEADER in each 14fcf3ce44SJohn Forte * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15fcf3ce44SJohn Forte * If applicable, add the following below this CDDL HEADER, with the 16fcf3ce44SJohn Forte * fields enclosed by brackets "[]" replaced with your own identifying 17fcf3ce44SJohn Forte * information: Portions Copyright [yyyy] [name of copyright owner] 18fcf3ce44SJohn Forte * 19fcf3ce44SJohn Forte * CDDL HEADER END 20fcf3ce44SJohn Forte */ 21fcf3ce44SJohn Forte /* 22a1837c6dSsrivijitha dugganapalli * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. 23fcf3ce44SJohn Forte */ 24fcf3ce44SJohn Forte 25fcf3ce44SJohn Forte #include <stdlib.h> 26fcf3ce44SJohn Forte #include <stdio.h> 27fcf3ce44SJohn Forte #include <wchar.h> 28fcf3ce44SJohn Forte #include <strings.h> 29fcf3ce44SJohn Forte #include <sys/types.h> 30fcf3ce44SJohn Forte #include <sys/stat.h> 31fcf3ce44SJohn Forte #include <fcntl.h> 32fcf3ce44SJohn Forte #include <unistd.h> 33fcf3ce44SJohn Forte #include <libintl.h> 34fcf3ce44SJohn Forte #include <errno.h> 35fcf3ce44SJohn Forte #include <string.h> 36fcf3ce44SJohn Forte #include <assert.h> 37fcf3ce44SJohn Forte #include <libnvpair.h> 38fcf3ce44SJohn Forte #include <pthread.h> 39fcf3ce44SJohn Forte #include <syslog.h> 40fcf3ce44SJohn Forte #include <libstmf.h> 41fcf3ce44SJohn Forte #include <netinet/in.h> 42fcf3ce44SJohn Forte #include <inttypes.h> 43fcf3ce44SJohn Forte #include <store.h> 44fcf3ce44SJohn Forte #include <locale.h> 458fe96085Stim szeto #include <math.h> 468fe96085Stim szeto #include <libstmf_impl.h> 47fcf3ce44SJohn Forte #include <sys/stmf_ioctl.h> 488fe96085Stim szeto #include <sys/stmf_sbd_ioctl.h> 4945039663SJohn Forte #include <sys/pppt_ioctl.h> 507beff157SJohn Forte #include <macros.h> 51fcf3ce44SJohn Forte 52fcf3ce44SJohn Forte #define STMF_PATH "/devices/pseudo/stmf@0:admin" 538fe96085Stim szeto #define SBD_PATH "/devices/pseudo/stmf_sbd@0:admin" 5445039663SJohn Forte #define PPPT_PATH "/devices/pseudo/pppt@0:pppt" 55fcf3ce44SJohn Forte 56fcf3ce44SJohn Forte #define EUI "eui." 57fcf3ce44SJohn Forte #define WWN "wwn." 58fcf3ce44SJohn Forte #define IQN "iqn." 598fe96085Stim szeto #define LU_ASCII_GUID_SIZE 32 608fe96085Stim szeto #define LU_GUID_SIZE 16 618fe96085Stim szeto #define OUI_ASCII_SIZE 6 62fdcc480aSJohn Forte #define HOST_ID_ASCII_SIZE 8 638fe96085Stim szeto #define OUI_SIZE 3 64fdcc480aSJohn Forte #define HOST_ID_SIZE 4 65fcf3ce44SJohn Forte #define IDENT_LENGTH_BYTE 3 66fcf3ce44SJohn Forte 678fe96085Stim szeto /* various initial allocation values */ 688fe96085Stim szeto #define ALLOC_LU 8192 698fe96085Stim szeto #define ALLOC_TARGET_PORT 2048 708fe96085Stim szeto #define ALLOC_PROVIDER 64 718fe96085Stim szeto #define ALLOC_GROUP 2048 728fe96085Stim szeto #define ALLOC_SESSION 2048 738fe96085Stim szeto #define ALLOC_VE 256 748fe96085Stim szeto #define ALLOC_PP_DATA_SIZE 128*1024 758fe96085Stim szeto #define ALLOC_GRP_MEMBER 256 768fe96085Stim szeto 77fcf3ce44SJohn Forte #define MAX_ISCSI_NAME 223 788fe96085Stim szeto #define MAX_SERIAL_SIZE 252 + 1 798fe96085Stim szeto #define MAX_LU_ALIAS_SIZE 256 808fe96085Stim szeto #define MAX_SBD_PROPS MAXPATHLEN + MAX_SERIAL_SIZE + MAX_LU_ALIAS_SIZE 81fcf3ce44SJohn Forte 82fcf3ce44SJohn Forte #define OPEN_STMF 0 83fcf3ce44SJohn Forte #define OPEN_EXCL_STMF O_EXCL 84fcf3ce44SJohn Forte 858fe96085Stim szeto #define OPEN_SBD 0 868fe96085Stim szeto #define OPEN_EXCL_SBD O_EXCL 878fe96085Stim szeto 8845039663SJohn Forte #define OPEN_PPPT 0 8945039663SJohn Forte #define OPEN_EXCL_PPPT O_EXCL 9045039663SJohn Forte 91fcf3ce44SJohn Forte #define LOGICAL_UNIT_TYPE 0 92fcf3ce44SJohn Forte #define TARGET_TYPE 1 93fcf3ce44SJohn Forte #define STMF_SERVICE_TYPE 2 94fcf3ce44SJohn Forte 958fe96085Stim szeto #define HOST_GROUP 1 968fe96085Stim szeto #define TARGET_GROUP 2 978fe96085Stim szeto 988fe96085Stim szeto /* set default persistence here */ 998fe96085Stim szeto #define STMF_DEFAULT_PERSIST STMF_PERSIST_SMF 1008fe96085Stim szeto 1018fe96085Stim szeto #define MAX_PROVIDER_RETRY 30 1028fe96085Stim szeto 103fcf3ce44SJohn Forte static int openStmf(int, int *fd); 1048fe96085Stim szeto static int openSbd(int, int *fd); 10545039663SJohn Forte static int openPppt(int, int *fd); 106fcf3ce44SJohn Forte static int groupIoctl(int fd, int cmd, stmfGroupName *); 107fcf3ce44SJohn Forte static int loadStore(int fd); 108fcf3ce44SJohn Forte static int initializeConfig(); 109fcf3ce44SJohn Forte static int groupMemberIoctl(int fd, int cmd, stmfGroupName *, stmfDevid *); 110fcf3ce44SJohn Forte static int guidCompare(const void *, const void *); 111fcf3ce44SJohn Forte static int addViewEntryIoctl(int fd, stmfGuid *, stmfViewEntry *); 112fcf3ce44SJohn Forte static int loadHostGroups(int fd, stmfGroupList *); 113fcf3ce44SJohn Forte static int loadTargetGroups(int fd, stmfGroupList *); 114fcf3ce44SJohn Forte static int getStmfState(stmf_state_desc_t *); 115fcf3ce44SJohn Forte static int setStmfState(int fd, stmf_state_desc_t *, int); 1168fe96085Stim szeto static int setProviderData(int fd, char *, nvlist_t *, int, uint64_t *); 1178fe96085Stim szeto static int createDiskResource(luResourceImpl *); 1188fe96085Stim szeto static int createDiskLu(diskResource *, stmfGuid *); 1198fe96085Stim szeto static int deleteDiskLu(stmfGuid *luGuid); 1208fe96085Stim szeto static int getDiskProp(luResourceImpl *, uint32_t, char *, size_t *); 1218fe96085Stim szeto static int getDiskAllProps(stmfGuid *luGuid, luResource *hdl); 1228fe96085Stim szeto static int loadDiskPropsFromDriver(luResourceImpl *, sbd_lu_props_t *); 1238fe96085Stim szeto static int removeGuidFromDiskStore(stmfGuid *); 1248fe96085Stim szeto static int addGuidToDiskStore(stmfGuid *, char *); 1258fe96085Stim szeto static int persistDiskGuid(stmfGuid *, char *, boolean_t); 1268fe96085Stim szeto static int setDiskProp(luResourceImpl *, uint32_t, const char *); 1277beff157SJohn Forte static int getDiskGlobalProp(uint32_t prop, char *propVal, size_t *propLen); 1288fe96085Stim szeto static int checkHexUpper(char *); 1298fe96085Stim szeto static int strToShift(const char *); 1308fe96085Stim szeto static int niceStrToNum(const char *, uint64_t *); 1318fe96085Stim szeto static void diskError(uint32_t, int *); 1328fe96085Stim szeto static int importDiskLu(char *fname, stmfGuid *); 1338fe96085Stim szeto static int modifyDiskLu(diskResource *, stmfGuid *, const char *); 1348fe96085Stim szeto static int modifyDiskLuProp(stmfGuid *, const char *, uint32_t, const char *); 1358fe96085Stim szeto static int validateModifyDiskProp(uint32_t); 1368fe96085Stim szeto static uint8_t iGetPersistMethod(); 1378fe96085Stim szeto static int groupListIoctl(stmfGroupList **, int); 1388fe96085Stim szeto static int iLoadGroupFromPs(stmfGroupList **, int); 1398fe96085Stim szeto static int groupMemberListIoctl(stmfGroupName *, stmfGroupProperties **, int); 1408fe96085Stim szeto static int getProviderData(char *, nvlist_t **, int, uint64_t *); 14145039663SJohn Forte static int setDiskStandby(stmfGuid *luGuid); 1427beff157SJohn Forte static int setDiskGlobalProp(uint32_t, const char *); 1438fe96085Stim szeto static int viewEntryCompare(const void *, const void *); 14445039663SJohn Forte static void deleteNonActiveLus(); 145*4b31676fSsrivijitha dugganapalli static int loadStmfProp(int fd); 1468fe96085Stim szeto 1478fe96085Stim szeto static pthread_mutex_t persistenceTypeLock = PTHREAD_MUTEX_INITIALIZER; 1488fe96085Stim szeto static int iPersistType = 0; 1498fe96085Stim szeto /* when B_TRUE, no need to access SMF anymore. Just use iPersistType */ 1508fe96085Stim szeto static boolean_t iLibSetPersist = B_FALSE; 151fcf3ce44SJohn Forte 152fcf3ce44SJohn Forte /* 153fcf3ce44SJohn Forte * Open for stmf module 154fcf3ce44SJohn Forte * 155fcf3ce44SJohn Forte * flag - open flag (OPEN_STMF, OPEN_EXCL_STMF) 156fcf3ce44SJohn Forte * fd - pointer to integer. On success, contains the stmf file descriptor 157fcf3ce44SJohn Forte */ 158fcf3ce44SJohn Forte static int 159fcf3ce44SJohn Forte openStmf(int flag, int *fd) 160fcf3ce44SJohn Forte { 161fcf3ce44SJohn Forte int ret = STMF_STATUS_ERROR; 162fcf3ce44SJohn Forte 163fcf3ce44SJohn Forte if ((*fd = open(STMF_PATH, O_NDELAY | O_RDONLY | flag)) != -1) { 164fcf3ce44SJohn Forte ret = STMF_STATUS_SUCCESS; 165fcf3ce44SJohn Forte } else { 166fcf3ce44SJohn Forte if (errno == EBUSY) { 167fcf3ce44SJohn Forte ret = STMF_ERROR_BUSY; 1688fe96085Stim szeto } else if (errno == EACCES) { 1698fe96085Stim szeto ret = STMF_ERROR_PERM; 170fcf3ce44SJohn Forte } else { 171fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR; 172fcf3ce44SJohn Forte } 173fcf3ce44SJohn Forte syslog(LOG_DEBUG, "openStmf:open failure:%s:errno(%d)", 174fcf3ce44SJohn Forte STMF_PATH, errno); 175fcf3ce44SJohn Forte } 176fcf3ce44SJohn Forte 177fcf3ce44SJohn Forte return (ret); 178fcf3ce44SJohn Forte } 179fcf3ce44SJohn Forte 180fcf3ce44SJohn Forte /* 1818fe96085Stim szeto * Open for sbd module 1828fe96085Stim szeto * 18345039663SJohn Forte * flag - open flag (OPEN_SBD, OPEN_EXCL_SBD) 1848fe96085Stim szeto * fd - pointer to integer. On success, contains the stmf file descriptor 1858fe96085Stim szeto */ 1868fe96085Stim szeto static int 1878fe96085Stim szeto openSbd(int flag, int *fd) 1888fe96085Stim szeto { 1898fe96085Stim szeto int ret = STMF_STATUS_ERROR; 1908fe96085Stim szeto 1918fe96085Stim szeto if ((*fd = open(SBD_PATH, O_NDELAY | O_RDONLY | flag)) != -1) { 1928fe96085Stim szeto ret = STMF_STATUS_SUCCESS; 1938fe96085Stim szeto } else { 1948fe96085Stim szeto if (errno == EBUSY) { 1958fe96085Stim szeto ret = STMF_ERROR_BUSY; 1968fe96085Stim szeto } else if (errno == EACCES) { 1978fe96085Stim szeto ret = STMF_ERROR_PERM; 1988fe96085Stim szeto } else { 1998fe96085Stim szeto ret = STMF_STATUS_ERROR; 2008fe96085Stim szeto } 2018fe96085Stim szeto syslog(LOG_DEBUG, "openSbd:open failure:%s:errno(%d)", 2028fe96085Stim szeto SBD_PATH, errno); 2038fe96085Stim szeto } 2048fe96085Stim szeto 2058fe96085Stim szeto return (ret); 2068fe96085Stim szeto } 2078fe96085Stim szeto 2088fe96085Stim szeto /* 20945039663SJohn Forte * Open for pppt module 21045039663SJohn Forte * 21145039663SJohn Forte * flag - open flag (OPEN_PPPT, OPEN_EXCL_PPPT) 21245039663SJohn Forte * fd - pointer to integer. On success, contains the stmf file descriptor 21345039663SJohn Forte */ 21445039663SJohn Forte static int 21545039663SJohn Forte openPppt(int flag, int *fd) 21645039663SJohn Forte { 21745039663SJohn Forte int ret = STMF_STATUS_ERROR; 21845039663SJohn Forte 21945039663SJohn Forte if ((*fd = open(PPPT_PATH, O_RDONLY | flag)) != -1) { 22045039663SJohn Forte ret = STMF_STATUS_SUCCESS; 22145039663SJohn Forte } else { 22245039663SJohn Forte if (errno == EBUSY) { 22345039663SJohn Forte ret = STMF_ERROR_BUSY; 22445039663SJohn Forte } else if (errno == EACCES) { 22545039663SJohn Forte ret = STMF_ERROR_PERM; 22645039663SJohn Forte } else { 22745039663SJohn Forte ret = STMF_STATUS_ERROR; 22845039663SJohn Forte } 22945039663SJohn Forte syslog(LOG_DEBUG, "openPppt:open failure:%s:errno(%d)", 23045039663SJohn Forte PPPT_PATH, errno); 23145039663SJohn Forte } 23245039663SJohn Forte 23345039663SJohn Forte return (ret); 23445039663SJohn Forte } 23545039663SJohn Forte 23645039663SJohn Forte /* 237fcf3ce44SJohn Forte * initializeConfig 238fcf3ce44SJohn Forte * 239fcf3ce44SJohn Forte * This routine should be called before any ioctl requiring initialization 240fcf3ce44SJohn Forte * which is basically everything except stmfGetState(), setStmfState() and 241fcf3ce44SJohn Forte * stmfLoadConfig(). 242fcf3ce44SJohn Forte */ 243fcf3ce44SJohn Forte static int 244fcf3ce44SJohn Forte initializeConfig() 245fcf3ce44SJohn Forte { 246fcf3ce44SJohn Forte int ret; 247fcf3ce44SJohn Forte stmfState state; 248fcf3ce44SJohn Forte 249fcf3ce44SJohn Forte 250fcf3ce44SJohn Forte ret = stmfGetState(&state); 251fcf3ce44SJohn Forte if (ret != STMF_STATUS_SUCCESS) { 252fcf3ce44SJohn Forte return (ret); 253fcf3ce44SJohn Forte } 254fcf3ce44SJohn Forte 255fcf3ce44SJohn Forte /* if we've already initialized or in the process, return success */ 256fcf3ce44SJohn Forte if (state.configState == STMF_CONFIG_STATE_INIT_DONE || 257fcf3ce44SJohn Forte state.configState == STMF_CONFIG_STATE_INIT) { 258fcf3ce44SJohn Forte return (STMF_STATUS_SUCCESS); 259fcf3ce44SJohn Forte } 260fcf3ce44SJohn Forte 261fcf3ce44SJohn Forte ret = stmfLoadConfig(); 262fcf3ce44SJohn Forte if (ret != STMF_STATUS_SUCCESS) { 263fcf3ce44SJohn Forte syslog(LOG_DEBUG, 264fcf3ce44SJohn Forte "initializeConfig:stmfLoadConfig:error(%d)", ret); 265fcf3ce44SJohn Forte return (ret); 266fcf3ce44SJohn Forte } 267fcf3ce44SJohn Forte 268fcf3ce44SJohn Forte ret = stmfGetState(&state); 269fcf3ce44SJohn Forte if (ret != STMF_STATUS_SUCCESS) { 270fcf3ce44SJohn Forte syslog(LOG_DEBUG, 271fcf3ce44SJohn Forte "initializeConfig:stmfGetState:error(%d)", ret); 272fcf3ce44SJohn Forte return (ret); 273fcf3ce44SJohn Forte } 274fcf3ce44SJohn Forte 275fcf3ce44SJohn Forte if (state.configState != STMF_CONFIG_STATE_INIT_DONE) { 276fcf3ce44SJohn Forte syslog(LOG_DEBUG, "initializeConfig:state.configState(%d)", 277fcf3ce44SJohn Forte state.configState); 278fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR; 279fcf3ce44SJohn Forte } 280fcf3ce44SJohn Forte 281fcf3ce44SJohn Forte return (ret); 282fcf3ce44SJohn Forte } 283fcf3ce44SJohn Forte 284fcf3ce44SJohn Forte 285fcf3ce44SJohn Forte /* 286fcf3ce44SJohn Forte * groupIoctl 287fcf3ce44SJohn Forte * 288fcf3ce44SJohn Forte * Purpose: issue ioctl for create/delete on group 289fcf3ce44SJohn Forte * 290fcf3ce44SJohn Forte * cmd - valid STMF ioctl group cmd 291fcf3ce44SJohn Forte * groupName - groupName to create or delete 292fcf3ce44SJohn Forte */ 293fcf3ce44SJohn Forte static int 294fcf3ce44SJohn Forte groupIoctl(int fd, int cmd, stmfGroupName *groupName) 295fcf3ce44SJohn Forte { 296fcf3ce44SJohn Forte int ret = STMF_STATUS_SUCCESS; 297fcf3ce44SJohn Forte int ioctlRet; 298fcf3ce44SJohn Forte stmf_iocdata_t stmfIoctl; 299fcf3ce44SJohn Forte stmf_group_name_t iGroupName; 300fcf3ce44SJohn Forte 301fcf3ce44SJohn Forte bzero(&iGroupName, sizeof (iGroupName)); 302fcf3ce44SJohn Forte 303fcf3ce44SJohn Forte bcopy(groupName, &iGroupName.name, strlen((char *)groupName)); 304fcf3ce44SJohn Forte 305fcf3ce44SJohn Forte iGroupName.name_size = strlen((char *)groupName); 306fcf3ce44SJohn Forte 307fcf3ce44SJohn Forte bzero(&stmfIoctl, sizeof (stmfIoctl)); 308fcf3ce44SJohn Forte /* 309fcf3ce44SJohn Forte * Issue ioctl to create the host group 310fcf3ce44SJohn Forte */ 311fcf3ce44SJohn Forte stmfIoctl.stmf_version = STMF_VERSION_1; 312fcf3ce44SJohn Forte stmfIoctl.stmf_ibuf_size = sizeof (iGroupName); 313fcf3ce44SJohn Forte stmfIoctl.stmf_ibuf = (uint64_t)(unsigned long)&iGroupName; 314fcf3ce44SJohn Forte ioctlRet = ioctl(fd, cmd, &stmfIoctl); 315fcf3ce44SJohn Forte if (ioctlRet != 0) { 316fcf3ce44SJohn Forte switch (errno) { 3178fe96085Stim szeto case EPERM: 318fcf3ce44SJohn Forte case EACCES: 319fcf3ce44SJohn Forte ret = STMF_ERROR_PERM; 320fcf3ce44SJohn Forte break; 321fcf3ce44SJohn Forte default: 322fcf3ce44SJohn Forte switch (stmfIoctl.stmf_error) { 323fcf3ce44SJohn Forte case STMF_IOCERR_TG_EXISTS: 324fcf3ce44SJohn Forte case STMF_IOCERR_HG_EXISTS: 325fcf3ce44SJohn Forte ret = STMF_ERROR_EXISTS; 326fcf3ce44SJohn Forte break; 327fcf3ce44SJohn Forte case STMF_IOCERR_TG_IN_USE: 328fcf3ce44SJohn Forte case STMF_IOCERR_HG_IN_USE: 329fcf3ce44SJohn Forte ret = STMF_ERROR_GROUP_IN_USE; 330fcf3ce44SJohn Forte break; 331fcf3ce44SJohn Forte case STMF_IOCERR_INVALID_HG: 332fcf3ce44SJohn Forte case STMF_IOCERR_INVALID_TG: 333fcf3ce44SJohn Forte ret = STMF_ERROR_NOT_FOUND; 334fcf3ce44SJohn Forte break; 335fcf3ce44SJohn Forte default: 336fcf3ce44SJohn Forte syslog(LOG_DEBUG, 337fcf3ce44SJohn Forte "groupIoctl:error(%d)", 338fcf3ce44SJohn Forte stmfIoctl.stmf_error); 339fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR; 340fcf3ce44SJohn Forte break; 341fcf3ce44SJohn Forte } 342fcf3ce44SJohn Forte break; 343fcf3ce44SJohn Forte } 344fcf3ce44SJohn Forte } 345fcf3ce44SJohn Forte done: 346fcf3ce44SJohn Forte return (ret); 347fcf3ce44SJohn Forte } 348fcf3ce44SJohn Forte 349fcf3ce44SJohn Forte /* 3508fe96085Stim szeto * groupMemberIoctl 351fcf3ce44SJohn Forte * 352fcf3ce44SJohn Forte * Purpose: issue ioctl for add/remove member on group 353fcf3ce44SJohn Forte * 354fcf3ce44SJohn Forte * cmd - valid STMF ioctl group member cmd 355fcf3ce44SJohn Forte * groupName - groupName to add to or remove from 356fcf3ce44SJohn Forte * devid - group member to add or remove 357fcf3ce44SJohn Forte */ 358fcf3ce44SJohn Forte static int 359fcf3ce44SJohn Forte groupMemberIoctl(int fd, int cmd, stmfGroupName *groupName, stmfDevid *devid) 360fcf3ce44SJohn Forte { 361fcf3ce44SJohn Forte int ret = STMF_STATUS_SUCCESS; 362fcf3ce44SJohn Forte int ioctlRet; 363fcf3ce44SJohn Forte stmf_iocdata_t stmfIoctl; 364fcf3ce44SJohn Forte stmf_group_op_data_t stmfGroupData; 365fcf3ce44SJohn Forte 366fcf3ce44SJohn Forte bzero(&stmfGroupData, sizeof (stmfGroupData)); 367fcf3ce44SJohn Forte 368fcf3ce44SJohn Forte bcopy(groupName, &stmfGroupData.group.name, strlen((char *)groupName)); 369fcf3ce44SJohn Forte 370fcf3ce44SJohn Forte stmfGroupData.group.name_size = strlen((char *)groupName); 371fcf3ce44SJohn Forte stmfGroupData.ident[IDENT_LENGTH_BYTE] = devid->identLength; 372fcf3ce44SJohn Forte bcopy(&(devid->ident), &stmfGroupData.ident[IDENT_LENGTH_BYTE + 1], 373fcf3ce44SJohn Forte devid->identLength); 374fcf3ce44SJohn Forte 375fcf3ce44SJohn Forte bzero(&stmfIoctl, sizeof (stmfIoctl)); 376fcf3ce44SJohn Forte /* 377fcf3ce44SJohn Forte * Issue ioctl to add to the host group 378fcf3ce44SJohn Forte */ 379fcf3ce44SJohn Forte stmfIoctl.stmf_version = STMF_VERSION_1; 380fcf3ce44SJohn Forte stmfIoctl.stmf_ibuf_size = sizeof (stmfGroupData); 381fcf3ce44SJohn Forte stmfIoctl.stmf_ibuf = (uint64_t)(unsigned long)&stmfGroupData; 382fcf3ce44SJohn Forte ioctlRet = ioctl(fd, cmd, &stmfIoctl); 383fcf3ce44SJohn Forte if (ioctlRet != 0) { 384fcf3ce44SJohn Forte switch (errno) { 385fcf3ce44SJohn Forte case EBUSY: 3865c8cac22Stim szeto switch (stmfIoctl.stmf_error) { 3875c8cac22Stim szeto case STMF_IOCERR_TG_NEED_TG_OFFLINE: 3885c8cac22Stim szeto ret = STMF_ERROR_TG_ONLINE; 3895c8cac22Stim szeto break; 3905c8cac22Stim szeto default: 391fcf3ce44SJohn Forte ret = STMF_ERROR_BUSY; 392fcf3ce44SJohn Forte break; 3935c8cac22Stim szeto } 3945c8cac22Stim szeto break; 3958fe96085Stim szeto case EPERM: 396fcf3ce44SJohn Forte case EACCES: 397fcf3ce44SJohn Forte ret = STMF_ERROR_PERM; 398fcf3ce44SJohn Forte break; 399fcf3ce44SJohn Forte default: 400fcf3ce44SJohn Forte switch (stmfIoctl.stmf_error) { 401fcf3ce44SJohn Forte case STMF_IOCERR_TG_ENTRY_EXISTS: 402fcf3ce44SJohn Forte case STMF_IOCERR_HG_ENTRY_EXISTS: 403fcf3ce44SJohn Forte ret = STMF_ERROR_EXISTS; 404fcf3ce44SJohn Forte break; 405fcf3ce44SJohn Forte case STMF_IOCERR_INVALID_TG_ENTRY: 406fcf3ce44SJohn Forte case STMF_IOCERR_INVALID_HG_ENTRY: 407fcf3ce44SJohn Forte ret = 408fcf3ce44SJohn Forte STMF_ERROR_MEMBER_NOT_FOUND; 409fcf3ce44SJohn Forte break; 410fcf3ce44SJohn Forte case STMF_IOCERR_INVALID_TG: 411fcf3ce44SJohn Forte case STMF_IOCERR_INVALID_HG: 412fcf3ce44SJohn Forte ret = 413fcf3ce44SJohn Forte STMF_ERROR_GROUP_NOT_FOUND; 414fcf3ce44SJohn Forte break; 415fcf3ce44SJohn Forte default: 416fcf3ce44SJohn Forte syslog(LOG_DEBUG, 417fcf3ce44SJohn Forte "groupMemberIoctl:error" 418fcf3ce44SJohn Forte "(%d)", 419fcf3ce44SJohn Forte stmfIoctl.stmf_error); 420fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR; 421fcf3ce44SJohn Forte break; 422fcf3ce44SJohn Forte } 423fcf3ce44SJohn Forte break; 424fcf3ce44SJohn Forte } 425fcf3ce44SJohn Forte } 426fcf3ce44SJohn Forte done: 427fcf3ce44SJohn Forte return (ret); 428fcf3ce44SJohn Forte } 429fcf3ce44SJohn Forte 430fcf3ce44SJohn Forte /* 4318fe96085Stim szeto * qsort function 4328fe96085Stim szeto * sort on veIndex 4338fe96085Stim szeto */ 4348fe96085Stim szeto static int 4358fe96085Stim szeto viewEntryCompare(const void *p1, const void *p2) 4368fe96085Stim szeto { 4378fe96085Stim szeto 4388fe96085Stim szeto stmfViewEntry *v1 = (stmfViewEntry *)p1, *v2 = (stmfViewEntry *)p2; 4398fe96085Stim szeto if (v1->veIndex > v2->veIndex) 4408fe96085Stim szeto return (1); 4418fe96085Stim szeto if (v1->veIndex < v2->veIndex) 4428fe96085Stim szeto return (-1); 4438fe96085Stim szeto return (0); 4448fe96085Stim szeto } 4458fe96085Stim szeto 4468fe96085Stim szeto /* 447fcf3ce44SJohn Forte * guidCompare 448fcf3ce44SJohn Forte * 449fcf3ce44SJohn Forte * qsort function 450fcf3ce44SJohn Forte * sort on guid 451fcf3ce44SJohn Forte */ 452fcf3ce44SJohn Forte static int 453fcf3ce44SJohn Forte guidCompare(const void *p1, const void *p2) 454fcf3ce44SJohn Forte { 455fcf3ce44SJohn Forte 456fcf3ce44SJohn Forte stmfGuid *g1 = (stmfGuid *)p1, *g2 = (stmfGuid *)p2; 457fcf3ce44SJohn Forte int i; 458fcf3ce44SJohn Forte 459fcf3ce44SJohn Forte for (i = 0; i < sizeof (stmfGuid); i++) { 460fcf3ce44SJohn Forte if (g1->guid[i] > g2->guid[i]) 461fcf3ce44SJohn Forte return (1); 462fcf3ce44SJohn Forte if (g1->guid[i] < g2->guid[i]) 463fcf3ce44SJohn Forte return (-1); 464fcf3ce44SJohn Forte } 465fcf3ce44SJohn Forte 466fcf3ce44SJohn Forte return (0); 467fcf3ce44SJohn Forte } 468fcf3ce44SJohn Forte 469fcf3ce44SJohn Forte /* 470fcf3ce44SJohn Forte * stmfAddToHostGroup 471fcf3ce44SJohn Forte * 472fcf3ce44SJohn Forte * Purpose: Adds an initiator to an existing host group 473fcf3ce44SJohn Forte * 474fcf3ce44SJohn Forte * hostGroupName - name of an existing host group 475fcf3ce44SJohn Forte * hostName - name of initiator to add 476fcf3ce44SJohn Forte */ 477fcf3ce44SJohn Forte int 478fcf3ce44SJohn Forte stmfAddToHostGroup(stmfGroupName *hostGroupName, stmfDevid *hostName) 479fcf3ce44SJohn Forte { 480fcf3ce44SJohn Forte int ret; 481fcf3ce44SJohn Forte int fd; 482fcf3ce44SJohn Forte 483fcf3ce44SJohn Forte if (hostGroupName == NULL || 484fcf3ce44SJohn Forte (strnlen((char *)hostGroupName, sizeof (stmfGroupName)) 485fcf3ce44SJohn Forte == sizeof (stmfGroupName)) || hostName == NULL) { 486fcf3ce44SJohn Forte return (STMF_ERROR_INVALID_ARG); 487fcf3ce44SJohn Forte } 488fcf3ce44SJohn Forte 489fcf3ce44SJohn Forte /* call init */ 490fcf3ce44SJohn Forte ret = initializeConfig(); 491fcf3ce44SJohn Forte if (ret != STMF_STATUS_SUCCESS) { 492fcf3ce44SJohn Forte return (ret); 493fcf3ce44SJohn Forte } 494fcf3ce44SJohn Forte 495fcf3ce44SJohn Forte /* 496fcf3ce44SJohn Forte * Open control node for stmf 497fcf3ce44SJohn Forte */ 498fcf3ce44SJohn Forte if ((ret = openStmf(OPEN_STMF, &fd)) != STMF_STATUS_SUCCESS) 499fcf3ce44SJohn Forte return (ret); 500fcf3ce44SJohn Forte 501fcf3ce44SJohn Forte if ((ret = groupMemberIoctl(fd, STMF_IOCTL_ADD_HG_ENTRY, hostGroupName, 502fcf3ce44SJohn Forte hostName)) != STMF_STATUS_SUCCESS) { 503fcf3ce44SJohn Forte goto done; 504fcf3ce44SJohn Forte } 505fcf3ce44SJohn Forte 5068fe96085Stim szeto if (iGetPersistMethod() == STMF_PERSIST_NONE) { 5078fe96085Stim szeto goto done; 5088fe96085Stim szeto } 5098fe96085Stim szeto 510fcf3ce44SJohn Forte ret = psAddHostGroupMember((char *)hostGroupName, 511fcf3ce44SJohn Forte (char *)hostName->ident); 512fcf3ce44SJohn Forte switch (ret) { 513fcf3ce44SJohn Forte case STMF_PS_SUCCESS: 514fcf3ce44SJohn Forte ret = STMF_STATUS_SUCCESS; 515fcf3ce44SJohn Forte break; 516fcf3ce44SJohn Forte case STMF_PS_ERROR_EXISTS: 517fcf3ce44SJohn Forte ret = STMF_ERROR_EXISTS; 518fcf3ce44SJohn Forte break; 519fcf3ce44SJohn Forte case STMF_PS_ERROR_GROUP_NOT_FOUND: 520fcf3ce44SJohn Forte ret = STMF_ERROR_GROUP_NOT_FOUND; 521fcf3ce44SJohn Forte break; 522fcf3ce44SJohn Forte case STMF_PS_ERROR_BUSY: 523fcf3ce44SJohn Forte ret = STMF_ERROR_BUSY; 524fcf3ce44SJohn Forte break; 525fcf3ce44SJohn Forte case STMF_PS_ERROR_SERVICE_NOT_FOUND: 526fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_NOT_FOUND; 527fcf3ce44SJohn Forte break; 528fcf3ce44SJohn Forte case STMF_PS_ERROR_VERSION_MISMATCH: 529fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_DATA_VERSION; 530fcf3ce44SJohn Forte break; 531fcf3ce44SJohn Forte default: 532fcf3ce44SJohn Forte syslog(LOG_DEBUG, 533fcf3ce44SJohn Forte "stmfAddToHostGroup:psAddHostGroupMember:error(%d)", 534fcf3ce44SJohn Forte ret); 535fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR; 536fcf3ce44SJohn Forte break; 537fcf3ce44SJohn Forte } 538fcf3ce44SJohn Forte 539fcf3ce44SJohn Forte done: 540fcf3ce44SJohn Forte (void) close(fd); 541fcf3ce44SJohn Forte return (ret); 542fcf3ce44SJohn Forte } 543fcf3ce44SJohn Forte 544fcf3ce44SJohn Forte /* 545fcf3ce44SJohn Forte * stmfAddToTargetGroup 546fcf3ce44SJohn Forte * 547fcf3ce44SJohn Forte * Purpose: Adds a local port to an existing target group 548fcf3ce44SJohn Forte * 549fcf3ce44SJohn Forte * targetGroupName - name of an existing target group 550fcf3ce44SJohn Forte * targetName - name of target to add 551fcf3ce44SJohn Forte */ 552fcf3ce44SJohn Forte int 553fcf3ce44SJohn Forte stmfAddToTargetGroup(stmfGroupName *targetGroupName, stmfDevid *targetName) 554fcf3ce44SJohn Forte { 555fcf3ce44SJohn Forte int ret; 556fcf3ce44SJohn Forte int fd; 557fcf3ce44SJohn Forte 558fcf3ce44SJohn Forte if (targetGroupName == NULL || 559fcf3ce44SJohn Forte (strnlen((char *)targetGroupName, sizeof (stmfGroupName)) 560fcf3ce44SJohn Forte == sizeof (stmfGroupName)) || targetName == NULL) { 561fcf3ce44SJohn Forte return (STMF_ERROR_INVALID_ARG); 562fcf3ce44SJohn Forte } 563fcf3ce44SJohn Forte 564fcf3ce44SJohn Forte /* call init */ 565fcf3ce44SJohn Forte ret = initializeConfig(); 566fcf3ce44SJohn Forte if (ret != STMF_STATUS_SUCCESS) { 567fcf3ce44SJohn Forte return (ret); 568fcf3ce44SJohn Forte } 569fcf3ce44SJohn Forte 570fcf3ce44SJohn Forte /* 571fcf3ce44SJohn Forte * Open control node for stmf 572fcf3ce44SJohn Forte */ 573fcf3ce44SJohn Forte if ((ret = openStmf(OPEN_STMF, &fd)) != STMF_STATUS_SUCCESS) 574fcf3ce44SJohn Forte return (ret); 575fcf3ce44SJohn Forte 576fcf3ce44SJohn Forte if ((ret = groupMemberIoctl(fd, STMF_IOCTL_ADD_TG_ENTRY, 577fcf3ce44SJohn Forte targetGroupName, targetName)) != STMF_STATUS_SUCCESS) { 578fcf3ce44SJohn Forte goto done; 579fcf3ce44SJohn Forte } 580fcf3ce44SJohn Forte 5818fe96085Stim szeto if (iGetPersistMethod() == STMF_PERSIST_NONE) { 5828fe96085Stim szeto goto done; 5838fe96085Stim szeto } 5848fe96085Stim szeto 585fcf3ce44SJohn Forte ret = psAddTargetGroupMember((char *)targetGroupName, 586fcf3ce44SJohn Forte (char *)targetName->ident); 587fcf3ce44SJohn Forte switch (ret) { 588fcf3ce44SJohn Forte case STMF_PS_SUCCESS: 589fcf3ce44SJohn Forte ret = STMF_STATUS_SUCCESS; 590fcf3ce44SJohn Forte break; 591fcf3ce44SJohn Forte case STMF_PS_ERROR_EXISTS: 592fcf3ce44SJohn Forte ret = STMF_ERROR_EXISTS; 593fcf3ce44SJohn Forte break; 594fcf3ce44SJohn Forte case STMF_PS_ERROR_GROUP_NOT_FOUND: 595fcf3ce44SJohn Forte ret = STMF_ERROR_GROUP_NOT_FOUND; 596fcf3ce44SJohn Forte break; 597fcf3ce44SJohn Forte case STMF_PS_ERROR_BUSY: 598fcf3ce44SJohn Forte ret = STMF_ERROR_BUSY; 599fcf3ce44SJohn Forte break; 600fcf3ce44SJohn Forte case STMF_PS_ERROR_SERVICE_NOT_FOUND: 601fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_NOT_FOUND; 602fcf3ce44SJohn Forte break; 603fcf3ce44SJohn Forte case STMF_PS_ERROR_VERSION_MISMATCH: 604fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_DATA_VERSION; 605fcf3ce44SJohn Forte break; 606fcf3ce44SJohn Forte default: 607fcf3ce44SJohn Forte syslog(LOG_DEBUG, 608fcf3ce44SJohn Forte "stmfAddToTargetGroup:psAddTargetGroupMember:" 609fcf3ce44SJohn Forte "error(%d)", ret); 610fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR; 611fcf3ce44SJohn Forte break; 612fcf3ce44SJohn Forte } 613fcf3ce44SJohn Forte 614fcf3ce44SJohn Forte done: 615fcf3ce44SJohn Forte (void) close(fd); 616fcf3ce44SJohn Forte return (ret); 617fcf3ce44SJohn Forte } 618fcf3ce44SJohn Forte 619fcf3ce44SJohn Forte /* 620fcf3ce44SJohn Forte * addViewEntryIoctl 621fcf3ce44SJohn Forte * 622fcf3ce44SJohn Forte * Purpose: Issues ioctl to add a view entry 623fcf3ce44SJohn Forte * 624fcf3ce44SJohn Forte * lu - Logical Unit identifier to which the view entry is added 625fcf3ce44SJohn Forte * viewEntry - view entry to add 626fcf3ce44SJohn Forte * init - When set to B_TRUE, we are in the init state, i.e. don't call open 627fcf3ce44SJohn Forte */ 628fcf3ce44SJohn Forte static int 629fcf3ce44SJohn Forte addViewEntryIoctl(int fd, stmfGuid *lu, stmfViewEntry *viewEntry) 630fcf3ce44SJohn Forte { 631fcf3ce44SJohn Forte int ret = STMF_STATUS_SUCCESS; 632fcf3ce44SJohn Forte int ioctlRet; 633fcf3ce44SJohn Forte stmf_iocdata_t stmfIoctl; 634fcf3ce44SJohn Forte stmf_view_op_entry_t ioctlViewEntry; 635fcf3ce44SJohn Forte 636fcf3ce44SJohn Forte bzero(&ioctlViewEntry, sizeof (ioctlViewEntry)); 637fcf3ce44SJohn Forte /* 638fcf3ce44SJohn Forte * don't set ve_ndx or ve_ndx_valid as ve_ndx_valid should be 639fcf3ce44SJohn Forte * false on input 640fcf3ce44SJohn Forte */ 641fcf3ce44SJohn Forte ioctlViewEntry.ve_lu_number_valid = viewEntry->luNbrValid; 642fcf3ce44SJohn Forte ioctlViewEntry.ve_all_hosts = viewEntry->allHosts; 643fcf3ce44SJohn Forte ioctlViewEntry.ve_all_targets = viewEntry->allTargets; 644fcf3ce44SJohn Forte 645fcf3ce44SJohn Forte if (viewEntry->allHosts == B_FALSE) { 646fcf3ce44SJohn Forte bcopy(viewEntry->hostGroup, &ioctlViewEntry.ve_host_group.name, 647fcf3ce44SJohn Forte sizeof (stmfGroupName)); 648fcf3ce44SJohn Forte ioctlViewEntry.ve_host_group.name_size = 649fcf3ce44SJohn Forte strlen((char *)viewEntry->hostGroup); 650fcf3ce44SJohn Forte } 651fcf3ce44SJohn Forte if (viewEntry->allTargets == B_FALSE) { 652fcf3ce44SJohn Forte bcopy(viewEntry->targetGroup, 653fcf3ce44SJohn Forte &ioctlViewEntry.ve_target_group.name, 654fcf3ce44SJohn Forte sizeof (stmfGroupName)); 655fcf3ce44SJohn Forte ioctlViewEntry.ve_target_group.name_size = 656fcf3ce44SJohn Forte strlen((char *)viewEntry->targetGroup); 657fcf3ce44SJohn Forte } 658fcf3ce44SJohn Forte if (viewEntry->luNbrValid) { 659fcf3ce44SJohn Forte bcopy(viewEntry->luNbr, &ioctlViewEntry.ve_lu_nbr, 660fcf3ce44SJohn Forte sizeof (ioctlViewEntry.ve_lu_nbr)); 661fcf3ce44SJohn Forte } 662fcf3ce44SJohn Forte bcopy(lu, &ioctlViewEntry.ve_guid, sizeof (stmfGuid)); 663fcf3ce44SJohn Forte 664fcf3ce44SJohn Forte bzero(&stmfIoctl, sizeof (stmfIoctl)); 665fcf3ce44SJohn Forte /* 666fcf3ce44SJohn Forte * Issue ioctl to add to the view entry 667fcf3ce44SJohn Forte */ 668fcf3ce44SJohn Forte stmfIoctl.stmf_version = STMF_VERSION_1; 669fcf3ce44SJohn Forte stmfIoctl.stmf_ibuf_size = sizeof (ioctlViewEntry); 670fcf3ce44SJohn Forte stmfIoctl.stmf_ibuf = (uint64_t)(unsigned long)&ioctlViewEntry; 671fcf3ce44SJohn Forte stmfIoctl.stmf_obuf_size = sizeof (ioctlViewEntry); 672fcf3ce44SJohn Forte stmfIoctl.stmf_obuf = (uint64_t)(unsigned long)&ioctlViewEntry; 673fcf3ce44SJohn Forte ioctlRet = ioctl(fd, STMF_IOCTL_ADD_VIEW_ENTRY, &stmfIoctl); 674fcf3ce44SJohn Forte if (ioctlRet != 0) { 675fcf3ce44SJohn Forte switch (errno) { 676fcf3ce44SJohn Forte case EBUSY: 677fcf3ce44SJohn Forte ret = STMF_ERROR_BUSY; 678fcf3ce44SJohn Forte break; 6798fe96085Stim szeto case EPERM: 6808fe96085Stim szeto ret = STMF_ERROR_PERM; 6818fe96085Stim szeto break; 682fcf3ce44SJohn Forte case EACCES: 683fcf3ce44SJohn Forte switch (stmfIoctl.stmf_error) { 684fcf3ce44SJohn Forte case STMF_IOCERR_UPDATE_NEED_CFG_INIT: 685fcf3ce44SJohn Forte ret = STMF_ERROR_CONFIG_NONE; 686fcf3ce44SJohn Forte break; 687fcf3ce44SJohn Forte default: 688fcf3ce44SJohn Forte ret = STMF_ERROR_PERM; 689fcf3ce44SJohn Forte break; 690fcf3ce44SJohn Forte } 691fcf3ce44SJohn Forte break; 692fcf3ce44SJohn Forte default: 693fcf3ce44SJohn Forte switch (stmfIoctl.stmf_error) { 694fcf3ce44SJohn Forte case STMF_IOCERR_LU_NUMBER_IN_USE: 695fcf3ce44SJohn Forte ret = STMF_ERROR_LUN_IN_USE; 696fcf3ce44SJohn Forte break; 697fcf3ce44SJohn Forte case STMF_IOCERR_VIEW_ENTRY_CONFLICT: 698fcf3ce44SJohn Forte ret = STMF_ERROR_VE_CONFLICT; 699fcf3ce44SJohn Forte break; 700fcf3ce44SJohn Forte case STMF_IOCERR_UPDATE_NEED_CFG_INIT: 701fcf3ce44SJohn Forte ret = STMF_ERROR_CONFIG_NONE; 702fcf3ce44SJohn Forte break; 703fcf3ce44SJohn Forte case STMF_IOCERR_INVALID_HG: 704fcf3ce44SJohn Forte ret = STMF_ERROR_INVALID_HG; 705fcf3ce44SJohn Forte break; 706fcf3ce44SJohn Forte case STMF_IOCERR_INVALID_TG: 707fcf3ce44SJohn Forte ret = STMF_ERROR_INVALID_TG; 708fcf3ce44SJohn Forte break; 709fcf3ce44SJohn Forte default: 710fcf3ce44SJohn Forte syslog(LOG_DEBUG, 711fcf3ce44SJohn Forte "addViewEntryIoctl" 712fcf3ce44SJohn Forte ":error(%d)", 713fcf3ce44SJohn Forte stmfIoctl.stmf_error); 714fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR; 715fcf3ce44SJohn Forte break; 716fcf3ce44SJohn Forte } 717fcf3ce44SJohn Forte break; 718fcf3ce44SJohn Forte } 719fcf3ce44SJohn Forte goto done; 720fcf3ce44SJohn Forte } 721fcf3ce44SJohn Forte 722fcf3ce44SJohn Forte /* copy lu nbr back to caller's view entry on success */ 723fcf3ce44SJohn Forte viewEntry->veIndex = ioctlViewEntry.ve_ndx; 724fcf3ce44SJohn Forte if (ioctlViewEntry.ve_lu_number_valid) { 725fcf3ce44SJohn Forte bcopy(&ioctlViewEntry.ve_lu_nbr, viewEntry->luNbr, 726fcf3ce44SJohn Forte sizeof (ioctlViewEntry.ve_lu_nbr)); 727fcf3ce44SJohn Forte } 728fcf3ce44SJohn Forte viewEntry->luNbrValid = B_TRUE; 729fcf3ce44SJohn Forte 730fcf3ce44SJohn Forte done: 731fcf3ce44SJohn Forte return (ret); 732fcf3ce44SJohn Forte } 733fcf3ce44SJohn Forte 734fcf3ce44SJohn Forte /* 735fcf3ce44SJohn Forte * stmfAddViewEntry 736fcf3ce44SJohn Forte * 737fcf3ce44SJohn Forte * Purpose: Adds a view entry to a logical unit 738fcf3ce44SJohn Forte * 739fcf3ce44SJohn Forte * lu - guid of the logical unit to which the view entry is added 740fcf3ce44SJohn Forte * viewEntry - view entry structure to add 741fcf3ce44SJohn Forte */ 742fcf3ce44SJohn Forte int 743fcf3ce44SJohn Forte stmfAddViewEntry(stmfGuid *lu, stmfViewEntry *viewEntry) 744fcf3ce44SJohn Forte { 745fcf3ce44SJohn Forte int ret; 746fcf3ce44SJohn Forte int fd; 747fcf3ce44SJohn Forte stmfViewEntry iViewEntry; 748fcf3ce44SJohn Forte 749fcf3ce44SJohn Forte if (lu == NULL || viewEntry == NULL) { 750fcf3ce44SJohn Forte return (STMF_ERROR_INVALID_ARG); 751fcf3ce44SJohn Forte } 752fcf3ce44SJohn Forte 753fcf3ce44SJohn Forte /* initialize and set internal view entry */ 754fcf3ce44SJohn Forte bzero(&iViewEntry, sizeof (iViewEntry)); 755fcf3ce44SJohn Forte 756fcf3ce44SJohn Forte if (!viewEntry->allHosts) { 757fcf3ce44SJohn Forte bcopy(viewEntry->hostGroup, iViewEntry.hostGroup, 758fcf3ce44SJohn Forte sizeof (iViewEntry.hostGroup)); 759fcf3ce44SJohn Forte } else { 760fcf3ce44SJohn Forte iViewEntry.allHosts = B_TRUE; 761fcf3ce44SJohn Forte } 762fcf3ce44SJohn Forte 763fcf3ce44SJohn Forte if (!viewEntry->allTargets) { 764fcf3ce44SJohn Forte bcopy(viewEntry->targetGroup, iViewEntry.targetGroup, 765fcf3ce44SJohn Forte sizeof (iViewEntry.targetGroup)); 766fcf3ce44SJohn Forte } else { 767fcf3ce44SJohn Forte iViewEntry.allTargets = B_TRUE; 768fcf3ce44SJohn Forte } 769fcf3ce44SJohn Forte 770fcf3ce44SJohn Forte if (viewEntry->luNbrValid) { 771fcf3ce44SJohn Forte iViewEntry.luNbrValid = B_TRUE; 772fcf3ce44SJohn Forte bcopy(viewEntry->luNbr, iViewEntry.luNbr, 773fcf3ce44SJohn Forte sizeof (iViewEntry.luNbr)); 774fcf3ce44SJohn Forte } 775fcf3ce44SJohn Forte 776fcf3ce44SJohn Forte /* 777fcf3ce44SJohn Forte * set users return view entry index valid flag to false 778fcf3ce44SJohn Forte * in case of failure 779fcf3ce44SJohn Forte */ 780fcf3ce44SJohn Forte viewEntry->veIndexValid = B_FALSE; 781fcf3ce44SJohn Forte 782fcf3ce44SJohn Forte /* Check to ensure service exists */ 783fcf3ce44SJohn Forte if (psCheckService() != STMF_STATUS_SUCCESS) { 784fcf3ce44SJohn Forte return (STMF_ERROR_SERVICE_NOT_FOUND); 785fcf3ce44SJohn Forte } 786fcf3ce44SJohn Forte 787fcf3ce44SJohn Forte /* call init */ 788fcf3ce44SJohn Forte ret = initializeConfig(); 789fcf3ce44SJohn Forte if (ret != STMF_STATUS_SUCCESS) { 790fcf3ce44SJohn Forte return (ret); 791fcf3ce44SJohn Forte } 792fcf3ce44SJohn Forte 793fcf3ce44SJohn Forte /* 794fcf3ce44SJohn Forte * Open control node for stmf 795fcf3ce44SJohn Forte */ 796fcf3ce44SJohn Forte if ((ret = openStmf(OPEN_STMF, &fd)) != STMF_STATUS_SUCCESS) 797fcf3ce44SJohn Forte return (ret); 798fcf3ce44SJohn Forte 799fcf3ce44SJohn Forte /* 800fcf3ce44SJohn Forte * First add the view entry to the driver 801fcf3ce44SJohn Forte */ 802fcf3ce44SJohn Forte ret = addViewEntryIoctl(fd, lu, &iViewEntry); 803fcf3ce44SJohn Forte if (ret != STMF_STATUS_SUCCESS) { 804fcf3ce44SJohn Forte goto done; 805fcf3ce44SJohn Forte } 806fcf3ce44SJohn Forte 8078fe96085Stim szeto if (iGetPersistMethod() == STMF_PERSIST_NONE) { 8088fe96085Stim szeto goto done; 8098fe96085Stim szeto } 8108fe96085Stim szeto 811fcf3ce44SJohn Forte /* 812fcf3ce44SJohn Forte * If the add to driver was successful, add it to the persistent 813fcf3ce44SJohn Forte * store. 814fcf3ce44SJohn Forte */ 815fcf3ce44SJohn Forte ret = psAddViewEntry(lu, &iViewEntry); 816fcf3ce44SJohn Forte switch (ret) { 817fcf3ce44SJohn Forte case STMF_PS_SUCCESS: 818fcf3ce44SJohn Forte ret = STMF_STATUS_SUCCESS; 819fcf3ce44SJohn Forte break; 820fcf3ce44SJohn Forte case STMF_PS_ERROR_NOT_FOUND: 821fcf3ce44SJohn Forte ret = STMF_ERROR_NOT_FOUND; 822fcf3ce44SJohn Forte break; 823fcf3ce44SJohn Forte case STMF_PS_ERROR_BUSY: 824fcf3ce44SJohn Forte ret = STMF_ERROR_BUSY; 825fcf3ce44SJohn Forte break; 826fcf3ce44SJohn Forte case STMF_PS_ERROR_SERVICE_NOT_FOUND: 827fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_NOT_FOUND; 828fcf3ce44SJohn Forte break; 829fcf3ce44SJohn Forte case STMF_PS_ERROR_VERSION_MISMATCH: 830fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_DATA_VERSION; 831fcf3ce44SJohn Forte break; 832fcf3ce44SJohn Forte default: 833fcf3ce44SJohn Forte syslog(LOG_DEBUG, 834fcf3ce44SJohn Forte "stmfAddViewEntry:psAddViewEntry:error(%d)", ret); 835fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR; 836fcf3ce44SJohn Forte break; 837fcf3ce44SJohn Forte } 838fcf3ce44SJohn Forte 839fcf3ce44SJohn Forte done: 840fcf3ce44SJohn Forte (void) close(fd); 841fcf3ce44SJohn Forte 842fcf3ce44SJohn Forte if (ret == STMF_STATUS_SUCCESS) { 843fcf3ce44SJohn Forte /* set caller's view entry on success */ 844fcf3ce44SJohn Forte viewEntry->veIndexValid = iViewEntry.veIndexValid; 845fcf3ce44SJohn Forte viewEntry->veIndex = iViewEntry.veIndex; 846fcf3ce44SJohn Forte viewEntry->luNbrValid = B_TRUE; 847fcf3ce44SJohn Forte bcopy(iViewEntry.luNbr, viewEntry->luNbr, 848fcf3ce44SJohn Forte sizeof (iViewEntry.luNbr)); 849fcf3ce44SJohn Forte } 850fcf3ce44SJohn Forte return (ret); 851fcf3ce44SJohn Forte } 852fcf3ce44SJohn Forte 853fcf3ce44SJohn Forte /* 854fcf3ce44SJohn Forte * stmfClearProviderData 855fcf3ce44SJohn Forte * 856fcf3ce44SJohn Forte * Purpose: delete all provider data for specified provider 857fcf3ce44SJohn Forte * 858fcf3ce44SJohn Forte * providerName - name of provider for which data should be deleted 859fcf3ce44SJohn Forte */ 860fcf3ce44SJohn Forte int 861fcf3ce44SJohn Forte stmfClearProviderData(char *providerName, int providerType) 862fcf3ce44SJohn Forte { 863fcf3ce44SJohn Forte int ret; 864fcf3ce44SJohn Forte int fd; 865fcf3ce44SJohn Forte int ioctlRet; 866fcf3ce44SJohn Forte int savedErrno; 867fcf3ce44SJohn Forte stmf_iocdata_t stmfIoctl; 868fcf3ce44SJohn Forte stmf_ppioctl_data_t ppi; 869fcf3ce44SJohn Forte 870fcf3ce44SJohn Forte /* call init */ 871fcf3ce44SJohn Forte ret = initializeConfig(); 872fcf3ce44SJohn Forte if (ret != STMF_STATUS_SUCCESS) { 873fcf3ce44SJohn Forte return (ret); 874fcf3ce44SJohn Forte } 875fcf3ce44SJohn Forte 876fcf3ce44SJohn Forte if (providerName == NULL) { 877fcf3ce44SJohn Forte return (STMF_ERROR_INVALID_ARG); 878fcf3ce44SJohn Forte } 879fcf3ce44SJohn Forte 880fcf3ce44SJohn Forte if (providerType != STMF_LU_PROVIDER_TYPE && 881fcf3ce44SJohn Forte providerType != STMF_PORT_PROVIDER_TYPE) { 882fcf3ce44SJohn Forte return (STMF_ERROR_INVALID_ARG); 883fcf3ce44SJohn Forte } 884fcf3ce44SJohn Forte 885fcf3ce44SJohn Forte /* 886fcf3ce44SJohn Forte * Open control node for stmf 887fcf3ce44SJohn Forte */ 888fcf3ce44SJohn Forte if ((ret = openStmf(OPEN_STMF, &fd)) != STMF_STATUS_SUCCESS) 889fcf3ce44SJohn Forte return (ret); 890fcf3ce44SJohn Forte 891fcf3ce44SJohn Forte bzero(&ppi, sizeof (ppi)); 892fcf3ce44SJohn Forte 893fcf3ce44SJohn Forte (void) strncpy(ppi.ppi_name, providerName, sizeof (ppi.ppi_name)); 894fcf3ce44SJohn Forte 895fcf3ce44SJohn Forte switch (providerType) { 896fcf3ce44SJohn Forte case STMF_LU_PROVIDER_TYPE: 897fcf3ce44SJohn Forte ppi.ppi_lu_provider = 1; 898fcf3ce44SJohn Forte break; 899fcf3ce44SJohn Forte case STMF_PORT_PROVIDER_TYPE: 900fcf3ce44SJohn Forte ppi.ppi_port_provider = 1; 901fcf3ce44SJohn Forte break; 902fcf3ce44SJohn Forte default: 903fcf3ce44SJohn Forte ret = STMF_ERROR_INVALID_ARG; 904fcf3ce44SJohn Forte goto done; 905fcf3ce44SJohn Forte } 906fcf3ce44SJohn Forte 907fcf3ce44SJohn Forte bzero(&stmfIoctl, sizeof (stmfIoctl)); 908fcf3ce44SJohn Forte 909fcf3ce44SJohn Forte stmfIoctl.stmf_version = STMF_VERSION_1; 910fcf3ce44SJohn Forte stmfIoctl.stmf_ibuf_size = sizeof (stmf_ppioctl_data_t); 911fcf3ce44SJohn Forte stmfIoctl.stmf_ibuf = (uint64_t)(unsigned long)&ppi; 912fcf3ce44SJohn Forte 913fcf3ce44SJohn Forte ioctlRet = ioctl(fd, STMF_IOCTL_CLEAR_PP_DATA, &stmfIoctl); 914fcf3ce44SJohn Forte if (ioctlRet != 0) { 915fcf3ce44SJohn Forte savedErrno = errno; 916fcf3ce44SJohn Forte switch (savedErrno) { 917fcf3ce44SJohn Forte case EBUSY: 918fcf3ce44SJohn Forte ret = STMF_ERROR_BUSY; 919fcf3ce44SJohn Forte break; 9208fe96085Stim szeto case EPERM: 921fcf3ce44SJohn Forte case EACCES: 922fcf3ce44SJohn Forte ret = STMF_ERROR_PERM; 923fcf3ce44SJohn Forte break; 924fcf3ce44SJohn Forte default: 925fcf3ce44SJohn Forte syslog(LOG_DEBUG, 926fcf3ce44SJohn Forte "stmfClearProviderData:ioctl error(%d)", 927fcf3ce44SJohn Forte ioctlRet); 928fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR; 929fcf3ce44SJohn Forte break; 930fcf3ce44SJohn Forte } 931fcf3ce44SJohn Forte if (savedErrno != ENOENT) { 932fcf3ce44SJohn Forte goto done; 933fcf3ce44SJohn Forte } 934fcf3ce44SJohn Forte } 935fcf3ce44SJohn Forte 9368fe96085Stim szeto if (iGetPersistMethod() == STMF_PERSIST_NONE) { 9378fe96085Stim szeto goto done; 9388fe96085Stim szeto } 9398fe96085Stim szeto 940fcf3ce44SJohn Forte ret = psClearProviderData(providerName, providerType); 941fcf3ce44SJohn Forte switch (ret) { 942fcf3ce44SJohn Forte case STMF_PS_SUCCESS: 943fcf3ce44SJohn Forte ret = STMF_STATUS_SUCCESS; 944fcf3ce44SJohn Forte break; 945fcf3ce44SJohn Forte case STMF_PS_ERROR_NOT_FOUND: 946fcf3ce44SJohn Forte ret = STMF_ERROR_NOT_FOUND; 947fcf3ce44SJohn Forte break; 948fcf3ce44SJohn Forte case STMF_PS_ERROR_BUSY: 949fcf3ce44SJohn Forte ret = STMF_ERROR_BUSY; 950fcf3ce44SJohn Forte break; 951fcf3ce44SJohn Forte case STMF_PS_ERROR_SERVICE_NOT_FOUND: 952fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_NOT_FOUND; 953fcf3ce44SJohn Forte break; 954fcf3ce44SJohn Forte case STMF_PS_ERROR_VERSION_MISMATCH: 955fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_DATA_VERSION; 956fcf3ce44SJohn Forte break; 957fcf3ce44SJohn Forte default: 958fcf3ce44SJohn Forte syslog(LOG_DEBUG, 959fcf3ce44SJohn Forte "stmfClearProviderData:psClearProviderData" 960fcf3ce44SJohn Forte ":error(%d)", ret); 961fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR; 962fcf3ce44SJohn Forte break; 963fcf3ce44SJohn Forte } 964fcf3ce44SJohn Forte 965fcf3ce44SJohn Forte done: 966fcf3ce44SJohn Forte (void) close(fd); 967fcf3ce44SJohn Forte return (ret); 968fcf3ce44SJohn Forte } 969fcf3ce44SJohn Forte 970fcf3ce44SJohn Forte /* 971fcf3ce44SJohn Forte * stmfCreateHostGroup 972fcf3ce44SJohn Forte * 973fcf3ce44SJohn Forte * Purpose: Create a new initiator group 974fcf3ce44SJohn Forte * 975fcf3ce44SJohn Forte * hostGroupName - name of host group to create 976fcf3ce44SJohn Forte */ 977fcf3ce44SJohn Forte int 978fcf3ce44SJohn Forte stmfCreateHostGroup(stmfGroupName *hostGroupName) 979fcf3ce44SJohn Forte { 980fcf3ce44SJohn Forte int ret; 981fcf3ce44SJohn Forte int fd; 982fcf3ce44SJohn Forte 983fcf3ce44SJohn Forte if (hostGroupName == NULL || 984fcf3ce44SJohn Forte (strnlen((char *)hostGroupName, sizeof (stmfGroupName)) 985fcf3ce44SJohn Forte == sizeof (stmfGroupName))) { 986fcf3ce44SJohn Forte return (STMF_ERROR_INVALID_ARG); 987fcf3ce44SJohn Forte } 988fcf3ce44SJohn Forte 989fcf3ce44SJohn Forte /* Check to ensure service exists */ 990fcf3ce44SJohn Forte if (psCheckService() != STMF_STATUS_SUCCESS) { 991fcf3ce44SJohn Forte return (STMF_ERROR_SERVICE_NOT_FOUND); 992fcf3ce44SJohn Forte } 993fcf3ce44SJohn Forte 994fcf3ce44SJohn Forte /* call init */ 995fcf3ce44SJohn Forte ret = initializeConfig(); 996fcf3ce44SJohn Forte if (ret != STMF_STATUS_SUCCESS) { 997fcf3ce44SJohn Forte return (ret); 998fcf3ce44SJohn Forte } 999fcf3ce44SJohn Forte 1000fcf3ce44SJohn Forte /* 1001fcf3ce44SJohn Forte * Open control node for stmf 1002fcf3ce44SJohn Forte */ 1003fcf3ce44SJohn Forte if ((ret = openStmf(OPEN_STMF, &fd)) != STMF_STATUS_SUCCESS) 1004fcf3ce44SJohn Forte return (ret); 1005fcf3ce44SJohn Forte 1006fcf3ce44SJohn Forte if ((ret = groupIoctl(fd, STMF_IOCTL_CREATE_HOST_GROUP, 1007fcf3ce44SJohn Forte hostGroupName)) != STMF_STATUS_SUCCESS) { 1008fcf3ce44SJohn Forte goto done; 1009fcf3ce44SJohn Forte } 1010fcf3ce44SJohn Forte 10118fe96085Stim szeto if (iGetPersistMethod() == STMF_PERSIST_NONE) { 10128fe96085Stim szeto goto done; 10138fe96085Stim szeto } 10148fe96085Stim szeto 1015fcf3ce44SJohn Forte ret = psCreateHostGroup((char *)hostGroupName); 1016fcf3ce44SJohn Forte switch (ret) { 1017fcf3ce44SJohn Forte case STMF_PS_SUCCESS: 1018fcf3ce44SJohn Forte ret = STMF_STATUS_SUCCESS; 1019fcf3ce44SJohn Forte break; 1020fcf3ce44SJohn Forte case STMF_PS_ERROR_EXISTS: 1021fcf3ce44SJohn Forte ret = STMF_ERROR_EXISTS; 1022fcf3ce44SJohn Forte break; 1023fcf3ce44SJohn Forte case STMF_PS_ERROR_BUSY: 1024fcf3ce44SJohn Forte ret = STMF_ERROR_BUSY; 1025fcf3ce44SJohn Forte break; 1026fcf3ce44SJohn Forte case STMF_PS_ERROR_SERVICE_NOT_FOUND: 1027fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_NOT_FOUND; 1028fcf3ce44SJohn Forte break; 1029fcf3ce44SJohn Forte case STMF_PS_ERROR_VERSION_MISMATCH: 1030fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_DATA_VERSION; 1031fcf3ce44SJohn Forte break; 1032fcf3ce44SJohn Forte default: 1033fcf3ce44SJohn Forte syslog(LOG_DEBUG, 1034fcf3ce44SJohn Forte "stmfCreateHostGroup:psCreateHostGroup:error(%d)", 1035fcf3ce44SJohn Forte ret); 1036fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR; 1037fcf3ce44SJohn Forte break; 1038fcf3ce44SJohn Forte } 1039fcf3ce44SJohn Forte 1040fcf3ce44SJohn Forte done: 1041fcf3ce44SJohn Forte (void) close(fd); 1042fcf3ce44SJohn Forte return (ret); 1043fcf3ce44SJohn Forte } 1044fcf3ce44SJohn Forte 1045fcf3ce44SJohn Forte /* 10468fe96085Stim szeto * stmfCreateLu 10478fe96085Stim szeto * 10488fe96085Stim szeto * Purpose: Create a logical unit 10498fe96085Stim szeto * 10508fe96085Stim szeto * hdl - handle to logical unit resource created via stmfCreateLuResource 10518fe96085Stim szeto * 10528fe96085Stim szeto * luGuid - If non-NULL, on success, contains the guid of the created logical 10538fe96085Stim szeto * unit 10548fe96085Stim szeto */ 10558fe96085Stim szeto int 10568fe96085Stim szeto stmfCreateLu(luResource hdl, stmfGuid *luGuid) 10578fe96085Stim szeto { 10588fe96085Stim szeto int ret = STMF_STATUS_SUCCESS; 10598fe96085Stim szeto luResourceImpl *luPropsHdl = hdl; 10608fe96085Stim szeto 10618fe96085Stim szeto if (hdl == NULL) { 10628fe96085Stim szeto return (STMF_ERROR_INVALID_ARG); 10638fe96085Stim szeto } 10648fe96085Stim szeto 10658fe96085Stim szeto if (luPropsHdl->type == STMF_DISK) { 10668fe96085Stim szeto ret = createDiskLu((diskResource *)luPropsHdl->resource, 10678fe96085Stim szeto luGuid); 10688fe96085Stim szeto } else { 10698fe96085Stim szeto return (STMF_ERROR_INVALID_ARG); 10708fe96085Stim szeto } 10718fe96085Stim szeto 10728fe96085Stim szeto return (ret); 10738fe96085Stim szeto } 10748fe96085Stim szeto 10758fe96085Stim szeto /* 10768fe96085Stim szeto * stmfCreateLuResource 10778fe96085Stim szeto * 10788fe96085Stim szeto * Purpose: Create resource handle for a logical unit 10798fe96085Stim szeto * 10808fe96085Stim szeto * dType - Type of logical unit resource to create 10818fe96085Stim szeto * Can be: STMF_DISK 10828fe96085Stim szeto * 10838fe96085Stim szeto * hdl - pointer to luResource 10848fe96085Stim szeto */ 10858fe96085Stim szeto int 10868fe96085Stim szeto stmfCreateLuResource(uint16_t dType, luResource *hdl) 10878fe96085Stim szeto { 10888fe96085Stim szeto int ret = STMF_STATUS_SUCCESS; 10898fe96085Stim szeto 10908fe96085Stim szeto if (dType != STMF_DISK || hdl == NULL) { 10918fe96085Stim szeto return (STMF_ERROR_INVALID_ARG); 10928fe96085Stim szeto } 10938fe96085Stim szeto 10948fe96085Stim szeto *hdl = calloc(1, sizeof (luResourceImpl)); 10958fe96085Stim szeto if (*hdl == NULL) { 10968fe96085Stim szeto return (STMF_ERROR_NOMEM); 10978fe96085Stim szeto } 10988fe96085Stim szeto 10998fe96085Stim szeto ret = createDiskResource((luResourceImpl *)*hdl); 11008fe96085Stim szeto if (ret != STMF_STATUS_SUCCESS) { 11018fe96085Stim szeto free(*hdl); 11028fe96085Stim szeto return (ret); 11038fe96085Stim szeto } 11048fe96085Stim szeto 11058fe96085Stim szeto return (STMF_STATUS_SUCCESS); 11068fe96085Stim szeto } 11078fe96085Stim szeto 11088fe96085Stim szeto /* 11098fe96085Stim szeto * Creates a disk logical unit 11108fe96085Stim szeto * 11118fe96085Stim szeto * disk - pointer to diskResource structure that represents the properties 11128fe96085Stim szeto * for the disk logical unit to be created. 11138fe96085Stim szeto */ 11148fe96085Stim szeto static int 11158fe96085Stim szeto createDiskLu(diskResource *disk, stmfGuid *createdGuid) 11168fe96085Stim szeto { 11178fe96085Stim szeto int ret = STMF_STATUS_SUCCESS; 11188fe96085Stim szeto int dataFileNameLen = 0; 11198fe96085Stim szeto int metaFileNameLen = 0; 11208fe96085Stim szeto int serialNumLen = 0; 11218fe96085Stim szeto int luAliasLen = 0; 11222f624233SNattuvetty Bhavyan int luMgmtUrlLen = 0; 11238fe96085Stim szeto int sluBufSize = 0; 11248fe96085Stim szeto int bufOffset = 0; 11258fe96085Stim szeto int fd = 0; 11268fe96085Stim szeto int ioctlRet; 11278fe96085Stim szeto int savedErrno; 11288fe96085Stim szeto stmfGuid guid; 11298fe96085Stim szeto stmf_iocdata_t sbdIoctl = {0}; 11308fe96085Stim szeto 11318fe96085Stim szeto sbd_create_and_reg_lu_t *sbdLu = NULL; 11328fe96085Stim szeto 11338fe96085Stim szeto /* 11348fe96085Stim szeto * Open control node for sbd 11358fe96085Stim szeto */ 11368fe96085Stim szeto if ((ret = openSbd(OPEN_SBD, &fd)) != STMF_STATUS_SUCCESS) 11378fe96085Stim szeto return (ret); 11388fe96085Stim szeto 11398fe96085Stim szeto /* data file name must be specified */ 11408fe96085Stim szeto if (disk->luDataFileNameValid) { 11418fe96085Stim szeto dataFileNameLen = strlen(disk->luDataFileName); 11428fe96085Stim szeto } else { 11438fe96085Stim szeto (void) close(fd); 11448fe96085Stim szeto return (STMF_ERROR_MISSING_PROP_VAL); 11458fe96085Stim szeto } 11468fe96085Stim szeto 11478fe96085Stim szeto sluBufSize += dataFileNameLen + 1; 11488fe96085Stim szeto 11498fe96085Stim szeto if (disk->luMetaFileNameValid) { 11508fe96085Stim szeto metaFileNameLen = strlen(disk->luMetaFileName); 11518fe96085Stim szeto sluBufSize += metaFileNameLen + 1; 11528fe96085Stim szeto } 11538fe96085Stim szeto 11548fe96085Stim szeto serialNumLen = strlen(disk->serialNum); 11558fe96085Stim szeto sluBufSize += serialNumLen; 11568fe96085Stim szeto 11578fe96085Stim szeto if (disk->luAliasValid) { 11588fe96085Stim szeto luAliasLen = strlen(disk->luAlias); 11598fe96085Stim szeto sluBufSize += luAliasLen + 1; 11608fe96085Stim szeto } 11618fe96085Stim szeto 11622f624233SNattuvetty Bhavyan if (disk->luMgmtUrlValid) { 11632f624233SNattuvetty Bhavyan luMgmtUrlLen = strlen(disk->luMgmtUrl); 11642f624233SNattuvetty Bhavyan sluBufSize += luMgmtUrlLen + 1; 11652f624233SNattuvetty Bhavyan } 11662f624233SNattuvetty Bhavyan 11678fe96085Stim szeto /* 11688fe96085Stim szeto * 8 is the size of the buffer set aside for 11698fe96085Stim szeto * concatenation of variable length fields 11708fe96085Stim szeto */ 11718fe96085Stim szeto sbdLu = (sbd_create_and_reg_lu_t *)calloc(1, 11728fe96085Stim szeto sizeof (sbd_create_and_reg_lu_t) + sluBufSize - 8); 11738fe96085Stim szeto if (sbdLu == NULL) { 11748fe96085Stim szeto return (STMF_ERROR_NOMEM); 11758fe96085Stim szeto } 11768fe96085Stim szeto 11778fe96085Stim szeto sbdLu->slu_struct_size = sizeof (sbd_create_and_reg_lu_t) + 11788fe96085Stim szeto sluBufSize - 8; 11798fe96085Stim szeto 11808fe96085Stim szeto if (metaFileNameLen) { 11818fe96085Stim szeto sbdLu->slu_meta_fname_valid = 1; 11828fe96085Stim szeto sbdLu->slu_meta_fname_off = bufOffset; 11838fe96085Stim szeto bcopy(disk->luMetaFileName, &(sbdLu->slu_buf[bufOffset]), 11848fe96085Stim szeto metaFileNameLen + 1); 11858fe96085Stim szeto bufOffset += metaFileNameLen + 1; 11868fe96085Stim szeto } 11878fe96085Stim szeto 11888fe96085Stim szeto bcopy(disk->luDataFileName, &(sbdLu->slu_buf[bufOffset]), 11898fe96085Stim szeto dataFileNameLen + 1); 11908fe96085Stim szeto sbdLu->slu_data_fname_off = bufOffset; 11918fe96085Stim szeto bufOffset += dataFileNameLen + 1; 11928fe96085Stim szeto 11938fe96085Stim szeto /* currently, serial # is not passed null terminated to the driver */ 11948fe96085Stim szeto if (disk->serialNumValid) { 11958fe96085Stim szeto sbdLu->slu_serial_valid = 1; 11968fe96085Stim szeto sbdLu->slu_serial_off = bufOffset; 11978fe96085Stim szeto sbdLu->slu_serial_size = serialNumLen; 11988fe96085Stim szeto bcopy(disk->serialNum, &(sbdLu->slu_buf[bufOffset]), 11998fe96085Stim szeto serialNumLen); 12008fe96085Stim szeto bufOffset += serialNumLen; 12018fe96085Stim szeto } 12028fe96085Stim szeto 12038fe96085Stim szeto if (disk->luAliasValid) { 12048fe96085Stim szeto sbdLu->slu_alias_valid = 1; 12058fe96085Stim szeto sbdLu->slu_alias_off = bufOffset; 12068fe96085Stim szeto bcopy(disk->luAlias, &(sbdLu->slu_buf[bufOffset]), 12078fe96085Stim szeto luAliasLen + 1); 12088fe96085Stim szeto bufOffset += luAliasLen + 1; 12098fe96085Stim szeto } 12108fe96085Stim szeto 12112f624233SNattuvetty Bhavyan if (disk->luMgmtUrlValid) { 12122f624233SNattuvetty Bhavyan sbdLu->slu_mgmt_url_valid = 1; 12132f624233SNattuvetty Bhavyan sbdLu->slu_mgmt_url_off = bufOffset; 12142f624233SNattuvetty Bhavyan bcopy(disk->luMgmtUrl, &(sbdLu->slu_buf[bufOffset]), 12152f624233SNattuvetty Bhavyan luMgmtUrlLen + 1); 12162f624233SNattuvetty Bhavyan bufOffset += luMgmtUrlLen + 1; 12172f624233SNattuvetty Bhavyan } 12182f624233SNattuvetty Bhavyan 12198fe96085Stim szeto if (disk->luSizeValid) { 12208fe96085Stim szeto sbdLu->slu_lu_size_valid = 1; 12218fe96085Stim szeto sbdLu->slu_lu_size = disk->luSize; 12228fe96085Stim szeto } 12238fe96085Stim szeto 12248fe96085Stim szeto if (disk->luGuidValid) { 12258fe96085Stim szeto sbdLu->slu_guid_valid = 1; 12268fe96085Stim szeto bcopy(disk->luGuid, sbdLu->slu_guid, sizeof (disk->luGuid)); 12278fe96085Stim szeto } 12288fe96085Stim szeto 12298fe96085Stim szeto if (disk->vidValid) { 12308fe96085Stim szeto sbdLu->slu_vid_valid = 1; 12318fe96085Stim szeto bcopy(disk->vid, sbdLu->slu_vid, sizeof (disk->vid)); 12328fe96085Stim szeto } 12338fe96085Stim szeto 12348fe96085Stim szeto if (disk->pidValid) { 12358fe96085Stim szeto sbdLu->slu_pid_valid = 1; 12368fe96085Stim szeto bcopy(disk->pid, sbdLu->slu_pid, sizeof (disk->pid)); 12378fe96085Stim szeto } 12388fe96085Stim szeto 12398fe96085Stim szeto if (disk->revValid) { 12408fe96085Stim szeto sbdLu->slu_rev_valid = 1; 12418fe96085Stim szeto bcopy(disk->rev, sbdLu->slu_rev, sizeof (disk->rev)); 12428fe96085Stim szeto } 12438fe96085Stim szeto 12448fe96085Stim szeto if (disk->companyIdValid) { 12458fe96085Stim szeto sbdLu->slu_company_id_valid = 1; 12468fe96085Stim szeto sbdLu->slu_company_id = disk->companyId; 12478fe96085Stim szeto } 12488fe96085Stim szeto 1249fdcc480aSJohn Forte if (disk->hostIdValid) { 1250fdcc480aSJohn Forte sbdLu->slu_host_id_valid = 1; 1251fdcc480aSJohn Forte sbdLu->slu_host_id = disk->hostId; 1252fdcc480aSJohn Forte } 1253fdcc480aSJohn Forte 12548fe96085Stim szeto if (disk->blkSizeValid) { 12558fe96085Stim szeto sbdLu->slu_blksize_valid = 1; 12568fe96085Stim szeto sbdLu->slu_blksize = disk->blkSize; 12578fe96085Stim szeto } 12588fe96085Stim szeto 12598fe96085Stim szeto if (disk->writeProtectEnableValid) { 12608fe96085Stim szeto if (disk->writeProtectEnable) { 12618fe96085Stim szeto sbdLu->slu_write_protected = 1; 12628fe96085Stim szeto } 12638fe96085Stim szeto } 12648fe96085Stim szeto 12658fe96085Stim szeto if (disk->writebackCacheDisableValid) { 12668fe96085Stim szeto sbdLu->slu_writeback_cache_disable_valid = 1; 12678fe96085Stim szeto if (disk->writebackCacheDisable) { 12688fe96085Stim szeto sbdLu->slu_writeback_cache_disable = 1; 12698fe96085Stim szeto } 12708fe96085Stim szeto } 12718fe96085Stim szeto 12728fe96085Stim szeto sbdIoctl.stmf_version = STMF_VERSION_1; 12738fe96085Stim szeto sbdIoctl.stmf_ibuf_size = sbdLu->slu_struct_size; 12748fe96085Stim szeto sbdIoctl.stmf_ibuf = (uint64_t)(unsigned long)sbdLu; 12758fe96085Stim szeto sbdIoctl.stmf_obuf_size = sbdLu->slu_struct_size; 12768fe96085Stim szeto sbdIoctl.stmf_obuf = (uint64_t)(unsigned long)sbdLu; 12778fe96085Stim szeto 12788fe96085Stim szeto ioctlRet = ioctl(fd, SBD_IOCTL_CREATE_AND_REGISTER_LU, &sbdIoctl); 12798fe96085Stim szeto if (ioctlRet != 0) { 12808fe96085Stim szeto savedErrno = errno; 12818fe96085Stim szeto switch (savedErrno) { 12828fe96085Stim szeto case EBUSY: 12838fe96085Stim szeto ret = STMF_ERROR_BUSY; 12848fe96085Stim szeto break; 12858fe96085Stim szeto case EPERM: 12868fe96085Stim szeto case EACCES: 12878fe96085Stim szeto ret = STMF_ERROR_PERM; 12888fe96085Stim szeto break; 12898fe96085Stim szeto default: 12908fe96085Stim szeto diskError(sbdIoctl.stmf_error, &ret); 12918fe96085Stim szeto if (ret == STMF_STATUS_ERROR) { 12928fe96085Stim szeto syslog(LOG_DEBUG, 12938fe96085Stim szeto "createDiskLu:ioctl " 12948fe96085Stim szeto "error(%d) (%d) (%d)", ioctlRet, 12958fe96085Stim szeto sbdIoctl.stmf_error, savedErrno); 12968fe96085Stim szeto } 12978fe96085Stim szeto break; 12988fe96085Stim szeto } 12998fe96085Stim szeto } 13008fe96085Stim szeto 13018fe96085Stim szeto if (ret != STMF_STATUS_SUCCESS) { 13028fe96085Stim szeto goto done; 13038fe96085Stim szeto } 13048fe96085Stim szeto 13058fe96085Stim szeto /* 13068fe96085Stim szeto * on success, copy the resulting guid into the caller's guid if not 13078fe96085Stim szeto * NULL 13088fe96085Stim szeto */ 13098fe96085Stim szeto if (createdGuid) { 13108fe96085Stim szeto bcopy(sbdLu->slu_guid, createdGuid->guid, 13118fe96085Stim szeto sizeof (sbdLu->slu_guid)); 13128fe96085Stim szeto } 13138fe96085Stim szeto 13148fe96085Stim szeto bcopy(sbdLu->slu_guid, guid.guid, sizeof (sbdLu->slu_guid)); 13158fe96085Stim szeto if (disk->luMetaFileNameValid) { 13168fe96085Stim szeto ret = addGuidToDiskStore(&guid, disk->luMetaFileName); 13178fe96085Stim szeto } else { 13188fe96085Stim szeto ret = addGuidToDiskStore(&guid, disk->luDataFileName); 13198fe96085Stim szeto } 13208fe96085Stim szeto done: 13218fe96085Stim szeto free(sbdLu); 13228fe96085Stim szeto (void) close(fd); 13238fe96085Stim szeto return (ret); 13248fe96085Stim szeto } 13258fe96085Stim szeto 13268fe96085Stim szeto 13278fe96085Stim szeto /* 13288fe96085Stim szeto * stmfImportLu 13298fe96085Stim szeto * 13308fe96085Stim szeto * Purpose: Import a previously created logical unit 13318fe96085Stim szeto * 13328fe96085Stim szeto * dType - Type of logical unit 13338fe96085Stim szeto * Can be: STMF_DISK 13348fe96085Stim szeto * 13358fe96085Stim szeto * luGuid - If non-NULL, on success, contains the guid of the imported logical 13368fe96085Stim szeto * unit 13378fe96085Stim szeto * 13388fe96085Stim szeto * fname - A file name where the metadata resides 13398fe96085Stim szeto * 13408fe96085Stim szeto */ 13418fe96085Stim szeto int 13428fe96085Stim szeto stmfImportLu(uint16_t dType, char *fname, stmfGuid *luGuid) 13438fe96085Stim szeto { 13448fe96085Stim szeto int ret = STMF_STATUS_SUCCESS; 13458fe96085Stim szeto 13468fe96085Stim szeto if (dType == STMF_DISK) { 13478fe96085Stim szeto ret = importDiskLu(fname, luGuid); 13488fe96085Stim szeto } else { 13498fe96085Stim szeto return (STMF_ERROR_INVALID_ARG); 13508fe96085Stim szeto } 13518fe96085Stim szeto 13528fe96085Stim szeto return (ret); 13538fe96085Stim szeto } 13548fe96085Stim szeto 13558fe96085Stim szeto /* 13568fe96085Stim szeto * importDiskLu 13578fe96085Stim szeto * 13588fe96085Stim szeto * filename - filename to import 13598fe96085Stim szeto * createdGuid - if not NULL, on success contains the imported guid 13608fe96085Stim szeto * 13618fe96085Stim szeto */ 13628fe96085Stim szeto static int 13638fe96085Stim szeto importDiskLu(char *fname, stmfGuid *createdGuid) 13648fe96085Stim szeto { 13658fe96085Stim szeto int ret = STMF_STATUS_SUCCESS; 13668fe96085Stim szeto int fd = 0; 13678fe96085Stim szeto int ioctlRet; 13688fe96085Stim szeto int savedErrno; 13698fe96085Stim szeto int metaFileNameLen; 13708fe96085Stim szeto stmfGuid iGuid; 13718fe96085Stim szeto int iluBufSize = 0; 13728fe96085Stim szeto sbd_import_lu_t *sbdLu = NULL; 13738fe96085Stim szeto stmf_iocdata_t sbdIoctl = {0}; 13748fe96085Stim szeto 13758fe96085Stim szeto if (fname == NULL) { 13768fe96085Stim szeto return (STMF_ERROR_INVALID_ARG); 13778fe96085Stim szeto } 13788fe96085Stim szeto 13798fe96085Stim szeto /* 13808fe96085Stim szeto * Open control node for sbd 13818fe96085Stim szeto */ 13828fe96085Stim szeto if ((ret = openSbd(OPEN_SBD, &fd)) != STMF_STATUS_SUCCESS) 13838fe96085Stim szeto return (ret); 13848fe96085Stim szeto 13858fe96085Stim szeto metaFileNameLen = strlen(fname); 13868fe96085Stim szeto iluBufSize += metaFileNameLen + 1; 13878fe96085Stim szeto 13888fe96085Stim szeto /* 13898fe96085Stim szeto * 8 is the size of the buffer set aside for 13908fe96085Stim szeto * concatenation of variable length fields 13918fe96085Stim szeto */ 13928fe96085Stim szeto sbdLu = (sbd_import_lu_t *)calloc(1, 13938fe96085Stim szeto sizeof (sbd_import_lu_t) + iluBufSize - 8); 13948fe96085Stim szeto if (sbdLu == NULL) { 13958fe96085Stim szeto (void) close(fd); 13968fe96085Stim szeto return (STMF_ERROR_NOMEM); 13978fe96085Stim szeto } 13988fe96085Stim szeto 13998fe96085Stim szeto /* 14008fe96085Stim szeto * Accept either a data file or meta data file. 14018fe96085Stim szeto * sbd will do the right thing here either way. 14028fe96085Stim szeto * i.e. if it's a data file, it assumes that the 14038fe96085Stim szeto * meta data is shared with the data. 14048fe96085Stim szeto */ 14058fe96085Stim szeto (void) strncpy(sbdLu->ilu_meta_fname, fname, metaFileNameLen); 14068fe96085Stim szeto 14078fe96085Stim szeto sbdLu->ilu_struct_size = sizeof (sbd_import_lu_t) + iluBufSize - 8; 14088fe96085Stim szeto 14098fe96085Stim szeto sbdIoctl.stmf_version = STMF_VERSION_1; 14108fe96085Stim szeto sbdIoctl.stmf_ibuf_size = sbdLu->ilu_struct_size; 14118fe96085Stim szeto sbdIoctl.stmf_ibuf = (uint64_t)(unsigned long)sbdLu; 14128fe96085Stim szeto sbdIoctl.stmf_obuf_size = sbdLu->ilu_struct_size; 14138fe96085Stim szeto sbdIoctl.stmf_obuf = (uint64_t)(unsigned long)sbdLu; 14148fe96085Stim szeto 14158fe96085Stim szeto ioctlRet = ioctl(fd, SBD_IOCTL_IMPORT_LU, &sbdIoctl); 14168fe96085Stim szeto if (ioctlRet != 0) { 1417a1837c6dSsrivijitha dugganapalli 1418a1837c6dSsrivijitha dugganapalli if (createdGuid && sbdIoctl.stmf_error == 1419a1837c6dSsrivijitha dugganapalli SBD_RET_FILE_ALREADY_REGISTERED) { 1420a1837c6dSsrivijitha dugganapalli bcopy(sbdLu->ilu_ret_guid, createdGuid->guid, 1421a1837c6dSsrivijitha dugganapalli sizeof (sbdLu->ilu_ret_guid)); 1422a1837c6dSsrivijitha dugganapalli } 1423a1837c6dSsrivijitha dugganapalli 14248fe96085Stim szeto savedErrno = errno; 14258fe96085Stim szeto switch (savedErrno) { 14268fe96085Stim szeto case EBUSY: 14278fe96085Stim szeto ret = STMF_ERROR_BUSY; 14288fe96085Stim szeto break; 14298fe96085Stim szeto case EPERM: 14308fe96085Stim szeto case EACCES: 14318fe96085Stim szeto ret = STMF_ERROR_PERM; 14328fe96085Stim szeto break; 14338fe96085Stim szeto default: 14348fe96085Stim szeto diskError(sbdIoctl.stmf_error, &ret); 14358fe96085Stim szeto if (ret == STMF_STATUS_ERROR) { 14368fe96085Stim szeto syslog(LOG_DEBUG, 14378fe96085Stim szeto "importDiskLu:ioctl " 14388fe96085Stim szeto "error(%d) (%d) (%d)", ioctlRet, 14398fe96085Stim szeto sbdIoctl.stmf_error, savedErrno); 14408fe96085Stim szeto } 14418fe96085Stim szeto break; 14428fe96085Stim szeto } 14438fe96085Stim szeto } 14448fe96085Stim szeto 1445a1837c6dSsrivijitha dugganapalli 14468fe96085Stim szeto if (ret != STMF_STATUS_SUCCESS) { 14478fe96085Stim szeto goto done; 14488fe96085Stim szeto } 14498fe96085Stim szeto 14508fe96085Stim szeto /* 14518fe96085Stim szeto * on success, copy the resulting guid into the caller's guid if not 14528fe96085Stim szeto * NULL and add it to the persistent store for sbd 14538fe96085Stim szeto */ 14548fe96085Stim szeto if (createdGuid) { 14558fe96085Stim szeto bcopy(sbdLu->ilu_ret_guid, createdGuid->guid, 14568fe96085Stim szeto sizeof (sbdLu->ilu_ret_guid)); 14578fe96085Stim szeto ret = addGuidToDiskStore(createdGuid, fname); 14588fe96085Stim szeto } else { 14598fe96085Stim szeto bcopy(sbdLu->ilu_ret_guid, iGuid.guid, 14608fe96085Stim szeto sizeof (sbdLu->ilu_ret_guid)); 14618fe96085Stim szeto ret = addGuidToDiskStore(&iGuid, fname); 14628fe96085Stim szeto } 14638fe96085Stim szeto done: 14648fe96085Stim szeto free(sbdLu); 14658fe96085Stim szeto (void) close(fd); 14668fe96085Stim szeto return (ret); 14678fe96085Stim szeto } 14688fe96085Stim szeto 14698fe96085Stim szeto /* 14708fe96085Stim szeto * diskError 14718fe96085Stim szeto * 14728fe96085Stim szeto * Purpose: Translate sbd driver error 14738fe96085Stim szeto */ 14748fe96085Stim szeto static void 14758fe96085Stim szeto diskError(uint32_t stmfError, int *ret) 14768fe96085Stim szeto { 14778fe96085Stim szeto switch (stmfError) { 14788fe96085Stim szeto case SBD_RET_META_CREATION_FAILED: 14798fe96085Stim szeto case SBD_RET_ZFS_META_CREATE_FAILED: 14808fe96085Stim szeto *ret = STMF_ERROR_META_CREATION; 14818fe96085Stim szeto break; 14828fe96085Stim szeto case SBD_RET_INVALID_BLKSIZE: 14838fe96085Stim szeto *ret = STMF_ERROR_INVALID_BLKSIZE; 14848fe96085Stim szeto break; 14858fe96085Stim szeto case SBD_RET_FILE_ALREADY_REGISTERED: 14868fe96085Stim szeto *ret = STMF_ERROR_FILE_IN_USE; 14878fe96085Stim szeto break; 14888fe96085Stim szeto case SBD_RET_GUID_ALREADY_REGISTERED: 14898fe96085Stim szeto *ret = STMF_ERROR_GUID_IN_USE; 14908fe96085Stim szeto break; 14918fe96085Stim szeto case SBD_RET_META_PATH_NOT_ABSOLUTE: 14928fe96085Stim szeto case SBD_RET_META_FILE_LOOKUP_FAILED: 14938fe96085Stim szeto case SBD_RET_META_FILE_OPEN_FAILED: 14948fe96085Stim szeto case SBD_RET_META_FILE_GETATTR_FAILED: 14958fe96085Stim szeto case SBD_RET_NO_META: 14968fe96085Stim szeto *ret = STMF_ERROR_META_FILE_NAME; 14978fe96085Stim szeto break; 14988fe96085Stim szeto case SBD_RET_DATA_PATH_NOT_ABSOLUTE: 14998fe96085Stim szeto case SBD_RET_DATA_FILE_LOOKUP_FAILED: 15008fe96085Stim szeto case SBD_RET_DATA_FILE_OPEN_FAILED: 15018fe96085Stim szeto case SBD_RET_DATA_FILE_GETATTR_FAILED: 15028fe96085Stim szeto *ret = STMF_ERROR_DATA_FILE_NAME; 15038fe96085Stim szeto break; 15048fe96085Stim szeto case SBD_RET_FILE_SIZE_ERROR: 15058fe96085Stim szeto *ret = STMF_ERROR_FILE_SIZE_INVALID; 15068fe96085Stim szeto break; 15078fe96085Stim szeto case SBD_RET_SIZE_OUT_OF_RANGE: 15088fe96085Stim szeto *ret = STMF_ERROR_SIZE_OUT_OF_RANGE; 15098fe96085Stim szeto break; 15108fe96085Stim szeto case SBD_RET_LU_BUSY: 15118fe96085Stim szeto *ret = STMF_ERROR_LU_BUSY; 15128fe96085Stim szeto break; 15138fe96085Stim szeto case SBD_RET_WRITE_CACHE_SET_FAILED: 15148fe96085Stim szeto *ret = STMF_ERROR_WRITE_CACHE_SET; 15158fe96085Stim szeto break; 151645039663SJohn Forte case SBD_RET_ACCESS_STATE_FAILED: 151745039663SJohn Forte *ret = STMF_ERROR_ACCESS_STATE_SET; 151845039663SJohn Forte break; 15198fe96085Stim szeto default: 15208fe96085Stim szeto *ret = STMF_STATUS_ERROR; 15218fe96085Stim szeto break; 15228fe96085Stim szeto } 15238fe96085Stim szeto } 15248fe96085Stim szeto 15258fe96085Stim szeto /* 15268fe96085Stim szeto * Creates a logical unit resource of type STMF_DISK. 15278fe96085Stim szeto * 15288fe96085Stim szeto * No defaults should be set here as all defaults are derived from the 15298fe96085Stim szeto * driver's default settings. 15308fe96085Stim szeto */ 15318fe96085Stim szeto static int 15328fe96085Stim szeto createDiskResource(luResourceImpl *hdl) 15338fe96085Stim szeto { 15348fe96085Stim szeto hdl->type = STMF_DISK; 15358fe96085Stim szeto 15368fe96085Stim szeto hdl->resource = calloc(1, sizeof (diskResource)); 15378fe96085Stim szeto if (hdl->resource == NULL) { 15388fe96085Stim szeto return (STMF_ERROR_NOMEM); 15398fe96085Stim szeto } 15408fe96085Stim szeto 15418fe96085Stim szeto return (STMF_STATUS_SUCCESS); 15428fe96085Stim szeto } 15438fe96085Stim szeto 15448fe96085Stim szeto /* 15458fe96085Stim szeto * stmfDeleteLu 15468fe96085Stim szeto * 15478fe96085Stim szeto * Purpose: Delete a logical unit 15488fe96085Stim szeto * 15498fe96085Stim szeto * hdl - handle to logical unit resource created via stmfCreateLuResource 15508fe96085Stim szeto * 15518fe96085Stim szeto * luGuid - If non-NULL, on success, contains the guid of the created logical 15528fe96085Stim szeto * unit 15538fe96085Stim szeto */ 15548fe96085Stim szeto int 15558fe96085Stim szeto stmfDeleteLu(stmfGuid *luGuid) 15568fe96085Stim szeto { 15578fe96085Stim szeto int ret = STMF_STATUS_SUCCESS; 15588fe96085Stim szeto stmfLogicalUnitProperties luProps; 15598fe96085Stim szeto 15608fe96085Stim szeto if (luGuid == NULL) { 15618fe96085Stim szeto return (STMF_ERROR_INVALID_ARG); 15628fe96085Stim szeto } 15638fe96085Stim szeto 15648fe96085Stim szeto /* Check logical unit provider name to call correct dtype function */ 15658fe96085Stim szeto if ((ret = stmfGetLogicalUnitProperties(luGuid, &luProps)) 15668fe96085Stim szeto != STMF_STATUS_SUCCESS) { 15678fe96085Stim szeto return (ret); 15688fe96085Stim szeto } else { 15698fe96085Stim szeto if (strcmp(luProps.providerName, "sbd") == 0) { 15708fe96085Stim szeto ret = deleteDiskLu(luGuid); 15718fe96085Stim szeto } else if (luProps.status == STMF_LOGICAL_UNIT_UNREGISTERED) { 15728fe96085Stim szeto return (STMF_ERROR_NOT_FOUND); 15738fe96085Stim szeto } else { 15748fe96085Stim szeto return (STMF_ERROR_INVALID_ARG); 15758fe96085Stim szeto } 15768fe96085Stim szeto } 15778fe96085Stim szeto 15788fe96085Stim szeto return (ret); 15798fe96085Stim szeto } 15808fe96085Stim szeto 15818fe96085Stim szeto static int 15828fe96085Stim szeto deleteDiskLu(stmfGuid *luGuid) 15838fe96085Stim szeto { 15848fe96085Stim szeto int ret = STMF_STATUS_SUCCESS; 15858fe96085Stim szeto int fd; 15868fe96085Stim szeto int savedErrno; 15878fe96085Stim szeto int ioctlRet; 15888fe96085Stim szeto sbd_delete_lu_t deleteLu = {0}; 15898fe96085Stim szeto 15908fe96085Stim szeto stmf_iocdata_t sbdIoctl = {0}; 15918fe96085Stim szeto 15928fe96085Stim szeto /* 15938fe96085Stim szeto * Open control node for sbd 15948fe96085Stim szeto */ 15958fe96085Stim szeto if ((ret = openSbd(OPEN_SBD, &fd)) != STMF_STATUS_SUCCESS) 15968fe96085Stim szeto return (ret); 15978fe96085Stim szeto 15988fe96085Stim szeto ret = removeGuidFromDiskStore(luGuid); 15998fe96085Stim szeto if (ret != STMF_STATUS_SUCCESS) { 16008fe96085Stim szeto goto done; 16018fe96085Stim szeto } 16028fe96085Stim szeto 16038fe96085Stim szeto bcopy(luGuid, deleteLu.dlu_guid, sizeof (deleteLu.dlu_guid)); 16048fe96085Stim szeto deleteLu.dlu_by_guid = 1; 16058fe96085Stim szeto 16068fe96085Stim szeto sbdIoctl.stmf_version = STMF_VERSION_1; 16078fe96085Stim szeto sbdIoctl.stmf_ibuf_size = sizeof (deleteLu); 16088fe96085Stim szeto sbdIoctl.stmf_ibuf = (uint64_t)(unsigned long)&deleteLu; 16098fe96085Stim szeto ioctlRet = ioctl(fd, SBD_IOCTL_DELETE_LU, &sbdIoctl); 16108fe96085Stim szeto if (ioctlRet != 0) { 16118fe96085Stim szeto savedErrno = errno; 16128fe96085Stim szeto switch (savedErrno) { 16138fe96085Stim szeto case EBUSY: 16148fe96085Stim szeto ret = STMF_ERROR_BUSY; 16158fe96085Stim szeto break; 16168fe96085Stim szeto case EPERM: 16178fe96085Stim szeto case EACCES: 16188fe96085Stim szeto ret = STMF_ERROR_PERM; 16198fe96085Stim szeto break; 16208fe96085Stim szeto case ENOENT: 16218fe96085Stim szeto ret = STMF_ERROR_NOT_FOUND; 16228fe96085Stim szeto break; 16238fe96085Stim szeto default: 16248fe96085Stim szeto syslog(LOG_DEBUG, 16258fe96085Stim szeto "deleteDiskLu:ioctl error(%d) (%d) (%d)", 16268fe96085Stim szeto ioctlRet, sbdIoctl.stmf_error, savedErrno); 16278fe96085Stim szeto ret = STMF_STATUS_ERROR; 16288fe96085Stim szeto break; 16298fe96085Stim szeto } 16308fe96085Stim szeto } 16318fe96085Stim szeto 16328fe96085Stim szeto done: 16338fe96085Stim szeto (void) close(fd); 16348fe96085Stim szeto return (ret); 16358fe96085Stim szeto } 16368fe96085Stim szeto 16378fe96085Stim szeto /* 163845039663SJohn Forte * stmfLuStandby 163945039663SJohn Forte * 164045039663SJohn Forte * Purpose: Sets access state to standby 164145039663SJohn Forte * 164245039663SJohn Forte * luGuid - guid of registered logical unit 164345039663SJohn Forte * 164445039663SJohn Forte */ 164545039663SJohn Forte int 164645039663SJohn Forte stmfLuStandby(stmfGuid *luGuid) 164745039663SJohn Forte { 164845039663SJohn Forte int ret = STMF_STATUS_SUCCESS; 164945039663SJohn Forte stmfLogicalUnitProperties luProps; 165045039663SJohn Forte 165145039663SJohn Forte if (luGuid == NULL) { 165245039663SJohn Forte return (STMF_ERROR_INVALID_ARG); 165345039663SJohn Forte } 165445039663SJohn Forte 165545039663SJohn Forte /* Check logical unit provider name to call correct dtype function */ 165645039663SJohn Forte if ((ret = stmfGetLogicalUnitProperties(luGuid, &luProps)) 165745039663SJohn Forte != STMF_STATUS_SUCCESS) { 165845039663SJohn Forte return (ret); 165945039663SJohn Forte } else { 166045039663SJohn Forte if (strcmp(luProps.providerName, "sbd") == 0) { 166145039663SJohn Forte ret = setDiskStandby(luGuid); 166245039663SJohn Forte } else if (luProps.status == STMF_LOGICAL_UNIT_UNREGISTERED) { 166345039663SJohn Forte return (STMF_ERROR_NOT_FOUND); 166445039663SJohn Forte } else { 166545039663SJohn Forte return (STMF_ERROR_INVALID_ARG); 166645039663SJohn Forte } 166745039663SJohn Forte } 166845039663SJohn Forte 166945039663SJohn Forte return (ret); 167045039663SJohn Forte } 167145039663SJohn Forte 167245039663SJohn Forte static int 167345039663SJohn Forte setDiskStandby(stmfGuid *luGuid) 167445039663SJohn Forte { 167545039663SJohn Forte int ret = STMF_STATUS_SUCCESS; 167645039663SJohn Forte stmf_iocdata_t sbdIoctl = {0}; 167745039663SJohn Forte sbd_set_lu_standby_t sbdLu = {0}; 167845039663SJohn Forte int ioctlRet; 167945039663SJohn Forte int savedErrno; 168045039663SJohn Forte int fd = 0; 168145039663SJohn Forte 168245039663SJohn Forte /* 168345039663SJohn Forte * Open control node for sbd 168445039663SJohn Forte */ 168545039663SJohn Forte if ((ret = openSbd(OPEN_SBD, &fd)) != STMF_STATUS_SUCCESS) 168645039663SJohn Forte return (ret); 168745039663SJohn Forte 168845039663SJohn Forte bcopy(luGuid, &sbdLu.stlu_guid, sizeof (stmfGuid)); 168945039663SJohn Forte 169045039663SJohn Forte sbdIoctl.stmf_version = STMF_VERSION_1; 169145039663SJohn Forte sbdIoctl.stmf_ibuf_size = sizeof (sbd_set_lu_standby_t); 169245039663SJohn Forte sbdIoctl.stmf_ibuf = (uint64_t)(unsigned long)&sbdLu; 169345039663SJohn Forte 169445039663SJohn Forte ioctlRet = ioctl(fd, SBD_IOCTL_SET_LU_STANDBY, &sbdIoctl); 169545039663SJohn Forte if (ioctlRet != 0) { 169645039663SJohn Forte savedErrno = errno; 169745039663SJohn Forte switch (savedErrno) { 169845039663SJohn Forte case EBUSY: 169945039663SJohn Forte ret = STMF_ERROR_BUSY; 170045039663SJohn Forte break; 170145039663SJohn Forte case EPERM: 170245039663SJohn Forte case EACCES: 170345039663SJohn Forte ret = STMF_ERROR_PERM; 170445039663SJohn Forte break; 170545039663SJohn Forte default: 170645039663SJohn Forte diskError(sbdIoctl.stmf_error, &ret); 170745039663SJohn Forte if (ret == STMF_STATUS_ERROR) { 170845039663SJohn Forte syslog(LOG_DEBUG, 170945039663SJohn Forte "setDiskStandby:ioctl " 171045039663SJohn Forte "error(%d) (%d) (%d)", ioctlRet, 171145039663SJohn Forte sbdIoctl.stmf_error, savedErrno); 171245039663SJohn Forte } 171345039663SJohn Forte break; 171445039663SJohn Forte } 171545039663SJohn Forte } 171645039663SJohn Forte return (ret); 171745039663SJohn Forte } 171845039663SJohn Forte 171945039663SJohn Forte /* 17208fe96085Stim szeto * stmfModifyLu 17218fe96085Stim szeto * 17228fe96085Stim szeto * Purpose: Modify properties of a logical unit 17238fe96085Stim szeto * 17248fe96085Stim szeto * luGuid - guid of registered logical unit 17258fe96085Stim szeto * prop - property to modify 17268fe96085Stim szeto * propVal - property value to set 17278fe96085Stim szeto * 17288fe96085Stim szeto */ 17298fe96085Stim szeto int 17308fe96085Stim szeto stmfModifyLu(stmfGuid *luGuid, uint32_t prop, const char *propVal) 17318fe96085Stim szeto { 17328fe96085Stim szeto int ret = STMF_STATUS_SUCCESS; 17338fe96085Stim szeto stmfLogicalUnitProperties luProps; 17348fe96085Stim szeto 17358fe96085Stim szeto if (luGuid == NULL) { 17368fe96085Stim szeto return (STMF_ERROR_INVALID_ARG); 17378fe96085Stim szeto } 17388fe96085Stim szeto 17398fe96085Stim szeto /* Check logical unit provider name to call correct dtype function */ 17408fe96085Stim szeto if ((ret = stmfGetLogicalUnitProperties(luGuid, &luProps)) 17418fe96085Stim szeto != STMF_STATUS_SUCCESS) { 17428fe96085Stim szeto return (ret); 17438fe96085Stim szeto } else { 17448fe96085Stim szeto if (strcmp(luProps.providerName, "sbd") == 0) { 17458fe96085Stim szeto ret = modifyDiskLuProp(luGuid, NULL, prop, propVal); 17468fe96085Stim szeto } else if (luProps.status == STMF_LOGICAL_UNIT_UNREGISTERED) { 17478fe96085Stim szeto return (STMF_ERROR_NOT_FOUND); 17488fe96085Stim szeto } else { 17498fe96085Stim szeto return (STMF_ERROR_INVALID_ARG); 17508fe96085Stim szeto } 17518fe96085Stim szeto } 17528fe96085Stim szeto 17538fe96085Stim szeto return (ret); 17548fe96085Stim szeto } 17558fe96085Stim szeto 17568fe96085Stim szeto /* 17578fe96085Stim szeto * stmfModifyLuByFname 17588fe96085Stim szeto * 17598fe96085Stim szeto * Purpose: Modify a device by filename. Device does not need to be registered. 17608fe96085Stim szeto * 17618fe96085Stim szeto * dType - type of device to modify 17628fe96085Stim szeto * STMF_DISK 17638fe96085Stim szeto * 17648fe96085Stim szeto * fname - filename or meta filename 17658fe96085Stim szeto * prop - valid property identifier 17668fe96085Stim szeto * propVal - property value 17678fe96085Stim szeto * 17688fe96085Stim szeto */ 17698fe96085Stim szeto int 17708fe96085Stim szeto stmfModifyLuByFname(uint16_t dType, const char *fname, uint32_t prop, 17718fe96085Stim szeto const char *propVal) 17728fe96085Stim szeto { 17738fe96085Stim szeto int ret = STMF_STATUS_SUCCESS; 17748fe96085Stim szeto if (fname == NULL) { 17758fe96085Stim szeto return (STMF_ERROR_INVALID_ARG); 17768fe96085Stim szeto } 17778fe96085Stim szeto 17788fe96085Stim szeto if (dType == STMF_DISK) { 17798fe96085Stim szeto ret = modifyDiskLuProp(NULL, fname, prop, propVal); 17808fe96085Stim szeto } else { 17818fe96085Stim szeto return (STMF_ERROR_INVALID_ARG); 17828fe96085Stim szeto } 17838fe96085Stim szeto 17848fe96085Stim szeto return (ret); 17858fe96085Stim szeto } 17868fe96085Stim szeto 17878fe96085Stim szeto static int 17888fe96085Stim szeto modifyDiskLuProp(stmfGuid *luGuid, const char *fname, uint32_t prop, 17898fe96085Stim szeto const char *propVal) 17908fe96085Stim szeto { 17918fe96085Stim szeto int ret = STMF_STATUS_SUCCESS; 17928fe96085Stim szeto luResource hdl = NULL; 17938fe96085Stim szeto luResourceImpl *luPropsHdl; 17948fe96085Stim szeto 17958fe96085Stim szeto ret = stmfCreateLuResource(STMF_DISK, &hdl); 17968fe96085Stim szeto if (ret != STMF_STATUS_SUCCESS) { 17978fe96085Stim szeto return (ret); 17988fe96085Stim szeto } 17998fe96085Stim szeto ret = validateModifyDiskProp(prop); 18008fe96085Stim szeto if (ret != STMF_STATUS_SUCCESS) { 18018fe96085Stim szeto (void) stmfFreeLuResource(hdl); 18028fe96085Stim szeto return (STMF_ERROR_INVALID_PROP); 18038fe96085Stim szeto } 18048fe96085Stim szeto ret = stmfSetLuProp(hdl, prop, propVal); 18058fe96085Stim szeto if (ret != STMF_STATUS_SUCCESS) { 18068fe96085Stim szeto (void) stmfFreeLuResource(hdl); 18078fe96085Stim szeto return (ret); 18088fe96085Stim szeto } 18098fe96085Stim szeto luPropsHdl = hdl; 18108fe96085Stim szeto ret = modifyDiskLu((diskResource *)luPropsHdl->resource, luGuid, fname); 18118fe96085Stim szeto (void) stmfFreeLuResource(hdl); 18128fe96085Stim szeto return (ret); 18138fe96085Stim szeto } 18148fe96085Stim szeto 18158fe96085Stim szeto static int 18168fe96085Stim szeto validateModifyDiskProp(uint32_t prop) 18178fe96085Stim szeto { 18188fe96085Stim szeto switch (prop) { 18198fe96085Stim szeto case STMF_LU_PROP_ALIAS: 18208fe96085Stim szeto case STMF_LU_PROP_SIZE: 18212f624233SNattuvetty Bhavyan case STMF_LU_PROP_MGMT_URL: 18228fe96085Stim szeto case STMF_LU_PROP_WRITE_PROTECT: 18238fe96085Stim szeto case STMF_LU_PROP_WRITE_CACHE_DISABLE: 18248fe96085Stim szeto return (STMF_STATUS_SUCCESS); 18258fe96085Stim szeto break; 18268fe96085Stim szeto default: 18278fe96085Stim szeto return (STMF_STATUS_ERROR); 18288fe96085Stim szeto break; 18298fe96085Stim szeto } 18308fe96085Stim szeto } 18318fe96085Stim szeto 18328fe96085Stim szeto static int 18338fe96085Stim szeto modifyDiskLu(diskResource *disk, stmfGuid *luGuid, const char *fname) 18348fe96085Stim szeto { 18358fe96085Stim szeto int ret = STMF_STATUS_SUCCESS; 18368fe96085Stim szeto int luAliasLen = 0; 18372f624233SNattuvetty Bhavyan int luMgmtUrlLen = 0; 18388fe96085Stim szeto int mluBufSize = 0; 18398fe96085Stim szeto int bufOffset = 0; 18408fe96085Stim szeto int fd = 0; 18418fe96085Stim szeto int ioctlRet; 18428fe96085Stim szeto int savedErrno; 18438fe96085Stim szeto int fnameSize = 0; 18448fe96085Stim szeto stmf_iocdata_t sbdIoctl = {0}; 18458fe96085Stim szeto 18468fe96085Stim szeto sbd_modify_lu_t *sbdLu = NULL; 18478fe96085Stim szeto 18488fe96085Stim szeto if (luGuid == NULL && fname == NULL) { 18498fe96085Stim szeto return (STMF_ERROR_INVALID_ARG); 18508fe96085Stim szeto } 18518fe96085Stim szeto 18528fe96085Stim szeto if (fname) { 18538fe96085Stim szeto fnameSize = strlen(fname) + 1; 18548fe96085Stim szeto mluBufSize += fnameSize; 18558fe96085Stim szeto } 18568fe96085Stim szeto 18578fe96085Stim szeto /* 18588fe96085Stim szeto * Open control node for sbd 18598fe96085Stim szeto */ 18608fe96085Stim szeto if ((ret = openSbd(OPEN_SBD, &fd)) != STMF_STATUS_SUCCESS) 18618fe96085Stim szeto return (ret); 18628fe96085Stim szeto 18638fe96085Stim szeto if (disk->luAliasValid) { 18648fe96085Stim szeto luAliasLen = strlen(disk->luAlias); 18658fe96085Stim szeto mluBufSize += luAliasLen + 1; 18668fe96085Stim szeto } 18678fe96085Stim szeto 18682f624233SNattuvetty Bhavyan if (disk->luMgmtUrlValid) { 18692f624233SNattuvetty Bhavyan luMgmtUrlLen = strlen(disk->luMgmtUrl); 18702f624233SNattuvetty Bhavyan mluBufSize += luMgmtUrlLen + 1; 18712f624233SNattuvetty Bhavyan } 18722f624233SNattuvetty Bhavyan 18738fe96085Stim szeto /* 18748fe96085Stim szeto * 8 is the size of the buffer set aside for 18758fe96085Stim szeto * concatenation of variable length fields 18768fe96085Stim szeto */ 18778fe96085Stim szeto sbdLu = (sbd_modify_lu_t *)calloc(1, 18788fe96085Stim szeto sizeof (sbd_modify_lu_t) + mluBufSize - 8 + fnameSize); 18798fe96085Stim szeto if (sbdLu == NULL) { 18808fe96085Stim szeto (void) close(fd); 18818fe96085Stim szeto return (STMF_ERROR_NOMEM); 18828fe96085Stim szeto } 18838fe96085Stim szeto 18848fe96085Stim szeto sbdLu->mlu_struct_size = sizeof (sbd_modify_lu_t) + 18858fe96085Stim szeto mluBufSize - 8 + fnameSize; 18868fe96085Stim szeto 18878fe96085Stim szeto if (disk->luAliasValid) { 18888fe96085Stim szeto sbdLu->mlu_alias_valid = 1; 18898fe96085Stim szeto sbdLu->mlu_alias_off = bufOffset; 18908fe96085Stim szeto bcopy(disk->luAlias, &(sbdLu->mlu_buf[bufOffset]), 18918fe96085Stim szeto luAliasLen + 1); 18928fe96085Stim szeto bufOffset += luAliasLen + 1; 18938fe96085Stim szeto } 18948fe96085Stim szeto 18952f624233SNattuvetty Bhavyan if (disk->luMgmtUrlValid) { 18962f624233SNattuvetty Bhavyan sbdLu->mlu_mgmt_url_valid = 1; 18972f624233SNattuvetty Bhavyan sbdLu->mlu_mgmt_url_off = bufOffset; 18982f624233SNattuvetty Bhavyan bcopy(disk->luMgmtUrl, &(sbdLu->mlu_buf[bufOffset]), 18992f624233SNattuvetty Bhavyan luMgmtUrlLen + 1); 19002f624233SNattuvetty Bhavyan bufOffset += luMgmtUrlLen + 1; 19012f624233SNattuvetty Bhavyan } 19022f624233SNattuvetty Bhavyan 19038fe96085Stim szeto if (disk->luSizeValid) { 19048fe96085Stim szeto sbdLu->mlu_lu_size_valid = 1; 19058fe96085Stim szeto sbdLu->mlu_lu_size = disk->luSize; 19068fe96085Stim szeto } 19078fe96085Stim szeto 19088fe96085Stim szeto if (disk->writeProtectEnableValid) { 19098fe96085Stim szeto sbdLu->mlu_write_protected_valid = 1; 19108fe96085Stim szeto if (disk->writeProtectEnable) { 19118fe96085Stim szeto sbdLu->mlu_write_protected = 1; 19128fe96085Stim szeto } 19138fe96085Stim szeto } 19148fe96085Stim szeto 19158fe96085Stim szeto if (disk->writebackCacheDisableValid) { 19168fe96085Stim szeto sbdLu->mlu_writeback_cache_disable_valid = 1; 19178fe96085Stim szeto if (disk->writebackCacheDisable) { 19188fe96085Stim szeto sbdLu->mlu_writeback_cache_disable = 1; 19198fe96085Stim szeto } 19208fe96085Stim szeto } 19218fe96085Stim szeto 19228fe96085Stim szeto if (luGuid) { 19238fe96085Stim szeto bcopy(luGuid, sbdLu->mlu_input_guid, sizeof (stmfGuid)); 19248fe96085Stim szeto sbdLu->mlu_by_guid = 1; 19258fe96085Stim szeto } else { 19268fe96085Stim szeto sbdLu->mlu_fname_off = bufOffset; 19278fe96085Stim szeto bcopy(fname, &(sbdLu->mlu_buf[bufOffset]), fnameSize + 1); 19288fe96085Stim szeto sbdLu->mlu_by_fname = 1; 19298fe96085Stim szeto } 19308fe96085Stim szeto 19318fe96085Stim szeto sbdIoctl.stmf_version = STMF_VERSION_1; 19328fe96085Stim szeto sbdIoctl.stmf_ibuf_size = sbdLu->mlu_struct_size; 19338fe96085Stim szeto sbdIoctl.stmf_ibuf = (uint64_t)(unsigned long)sbdLu; 19348fe96085Stim szeto 19358fe96085Stim szeto ioctlRet = ioctl(fd, SBD_IOCTL_MODIFY_LU, &sbdIoctl); 19368fe96085Stim szeto if (ioctlRet != 0) { 19378fe96085Stim szeto savedErrno = errno; 19388fe96085Stim szeto switch (savedErrno) { 19398fe96085Stim szeto case EBUSY: 19408fe96085Stim szeto ret = STMF_ERROR_BUSY; 19418fe96085Stim szeto break; 19428fe96085Stim szeto case EPERM: 19438fe96085Stim szeto case EACCES: 19448fe96085Stim szeto ret = STMF_ERROR_PERM; 19458fe96085Stim szeto break; 19468fe96085Stim szeto default: 19478fe96085Stim szeto diskError(sbdIoctl.stmf_error, &ret); 19488fe96085Stim szeto if (ret == STMF_STATUS_ERROR) { 19498fe96085Stim szeto syslog(LOG_DEBUG, 19508fe96085Stim szeto "modifyDiskLu:ioctl " 19518fe96085Stim szeto "error(%d) (%d) (%d)", ioctlRet, 19528fe96085Stim szeto sbdIoctl.stmf_error, savedErrno); 19538fe96085Stim szeto } 19548fe96085Stim szeto break; 19558fe96085Stim szeto } 19568fe96085Stim szeto } 19578fe96085Stim szeto 19588fe96085Stim szeto if (ret != STMF_STATUS_SUCCESS) { 19598fe96085Stim szeto goto done; 19608fe96085Stim szeto } 19618fe96085Stim szeto 19628fe96085Stim szeto done: 19638fe96085Stim szeto free(sbdLu); 19648fe96085Stim szeto (void) close(fd); 19658fe96085Stim szeto return (ret); 19668fe96085Stim szeto } 19678fe96085Stim szeto 19688fe96085Stim szeto /* 19698fe96085Stim szeto * removeGuidFromDiskStore 19708fe96085Stim szeto * 19718fe96085Stim szeto * Purpose: delete a logical unit from the sbd provider data 19728fe96085Stim szeto */ 19738fe96085Stim szeto static int 19748fe96085Stim szeto removeGuidFromDiskStore(stmfGuid *guid) 19758fe96085Stim szeto { 19768fe96085Stim szeto return (persistDiskGuid(guid, NULL, B_FALSE)); 19778fe96085Stim szeto } 19788fe96085Stim szeto 19798fe96085Stim szeto 19808fe96085Stim szeto /* 19818fe96085Stim szeto * addGuidToDiskStore 19828fe96085Stim szeto * 19838fe96085Stim szeto * Purpose: add a logical unit to the sbd provider data 19848fe96085Stim szeto */ 19858fe96085Stim szeto static int 19868fe96085Stim szeto addGuidToDiskStore(stmfGuid *guid, char *filename) 19878fe96085Stim szeto { 19888fe96085Stim szeto return (persistDiskGuid(guid, filename, B_TRUE)); 19898fe96085Stim szeto } 19908fe96085Stim szeto 19918fe96085Stim szeto 19928fe96085Stim szeto /* 19938fe96085Stim szeto * persistDiskGuid 19948fe96085Stim szeto * 19958fe96085Stim szeto * Purpose: Persist or unpersist a guid for the sbd provider data 19968fe96085Stim szeto * 19978fe96085Stim szeto */ 19988fe96085Stim szeto static int 19998fe96085Stim szeto persistDiskGuid(stmfGuid *guid, char *filename, boolean_t persist) 20008fe96085Stim szeto { 20018fe96085Stim szeto char guidAsciiBuf[LU_ASCII_GUID_SIZE + 1] = {0}; 20028fe96085Stim szeto nvlist_t *nvl = NULL; 20038fe96085Stim szeto 20048fe96085Stim szeto uint64_t setToken; 20058fe96085Stim szeto boolean_t retryGetProviderData = B_FALSE; 20068fe96085Stim szeto boolean_t newData = B_FALSE; 20078fe96085Stim szeto int ret = STMF_STATUS_SUCCESS; 20088fe96085Stim szeto int retryCnt = 0; 20098fe96085Stim szeto int stmfRet; 20108fe96085Stim szeto 20118fe96085Stim szeto /* if we're persisting a guid, there must be a filename */ 20128fe96085Stim szeto if (persist && !filename) { 20138fe96085Stim szeto return (1); 20148fe96085Stim szeto } 20158fe96085Stim szeto 20168fe96085Stim szeto /* guid is stored in lowercase ascii hex */ 20178fe96085Stim szeto (void) snprintf(guidAsciiBuf, sizeof (guidAsciiBuf), 20188fe96085Stim szeto "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x" 20198fe96085Stim szeto "%02x%02x%02x%02x%02x%02x", 20208fe96085Stim szeto guid->guid[0], guid->guid[1], guid->guid[2], guid->guid[3], 20218fe96085Stim szeto guid->guid[4], guid->guid[5], guid->guid[6], guid->guid[7], 20228fe96085Stim szeto guid->guid[8], guid->guid[9], guid->guid[10], guid->guid[11], 20238fe96085Stim szeto guid->guid[12], guid->guid[13], guid->guid[14], guid->guid[15]); 20248fe96085Stim szeto 20258fe96085Stim szeto 20268fe96085Stim szeto do { 20278fe96085Stim szeto retryGetProviderData = B_FALSE; 20288fe96085Stim szeto stmfRet = stmfGetProviderDataProt("sbd", &nvl, 20298fe96085Stim szeto STMF_LU_PROVIDER_TYPE, &setToken); 20308fe96085Stim szeto if (stmfRet != STMF_STATUS_SUCCESS) { 20318fe96085Stim szeto if (persist && stmfRet == STMF_ERROR_NOT_FOUND) { 20328fe96085Stim szeto ret = nvlist_alloc(&nvl, NV_UNIQUE_NAME, 0); 20338fe96085Stim szeto if (ret != 0) { 20348fe96085Stim szeto syslog(LOG_DEBUG, 20358fe96085Stim szeto "unpersistGuid:nvlist_alloc(%d)", 20368fe96085Stim szeto ret); 20378fe96085Stim szeto ret = STMF_STATUS_ERROR; 20388fe96085Stim szeto goto done; 20398fe96085Stim szeto } 20408fe96085Stim szeto newData = B_TRUE; 20418fe96085Stim szeto } else { 204245039663SJohn Forte /* 204345039663SJohn Forte * if we're persisting the data, it's 204445039663SJohn Forte * an error. Otherwise, just return 204545039663SJohn Forte */ 204645039663SJohn Forte if (persist) { 20478fe96085Stim szeto ret = stmfRet; 204845039663SJohn Forte } 20498fe96085Stim szeto goto done; 20508fe96085Stim szeto } 20518fe96085Stim szeto } 20528fe96085Stim szeto if (persist) { 20538fe96085Stim szeto ret = nvlist_add_string(nvl, guidAsciiBuf, filename); 20548fe96085Stim szeto } else { 20558fe96085Stim szeto ret = nvlist_remove(nvl, guidAsciiBuf, 20568fe96085Stim szeto DATA_TYPE_STRING); 20578fe96085Stim szeto if (ret == ENOENT) { 20588fe96085Stim szeto ret = 0; 20598fe96085Stim szeto } 20608fe96085Stim szeto } 20618fe96085Stim szeto if (ret == 0) { 20628fe96085Stim szeto if (newData) { 20638fe96085Stim szeto stmfRet = stmfSetProviderDataProt("sbd", nvl, 20648fe96085Stim szeto STMF_LU_PROVIDER_TYPE, NULL); 20658fe96085Stim szeto } else { 20668fe96085Stim szeto stmfRet = stmfSetProviderDataProt("sbd", nvl, 20678fe96085Stim szeto STMF_LU_PROVIDER_TYPE, &setToken); 20688fe96085Stim szeto } 20698fe96085Stim szeto if (stmfRet != STMF_STATUS_SUCCESS) { 20708fe96085Stim szeto if (stmfRet == STMF_ERROR_BUSY) { 20718fe96085Stim szeto /* get/set failed, try again */ 20728fe96085Stim szeto retryGetProviderData = B_TRUE; 20738fe96085Stim szeto if (retryCnt++ > MAX_PROVIDER_RETRY) { 20748fe96085Stim szeto ret = stmfRet; 20758fe96085Stim szeto break; 20768fe96085Stim szeto } 20778fe96085Stim szeto continue; 20788fe96085Stim szeto } else if (stmfRet == 20798fe96085Stim szeto STMF_ERROR_PROV_DATA_STALE) { 20808fe96085Stim szeto /* update failed, try again */ 20818fe96085Stim szeto nvlist_free(nvl); 20828fe96085Stim szeto nvl = NULL; 20838fe96085Stim szeto retryGetProviderData = B_TRUE; 20848fe96085Stim szeto if (retryCnt++ > MAX_PROVIDER_RETRY) { 20858fe96085Stim szeto ret = stmfRet; 20868fe96085Stim szeto break; 20878fe96085Stim szeto } 20888fe96085Stim szeto continue; 20898fe96085Stim szeto } else { 20908fe96085Stim szeto syslog(LOG_DEBUG, 20918fe96085Stim szeto "unpersistGuid:error(%x)", stmfRet); 20928fe96085Stim szeto ret = stmfRet; 20938fe96085Stim szeto } 20948fe96085Stim szeto break; 20958fe96085Stim szeto } 20968fe96085Stim szeto } else { 20978fe96085Stim szeto syslog(LOG_DEBUG, 20988fe96085Stim szeto "unpersistGuid:error nvlist_add/remove(%d)", 20998fe96085Stim szeto ret); 21008fe96085Stim szeto ret = STMF_STATUS_ERROR; 21018fe96085Stim szeto } 21028fe96085Stim szeto } while (retryGetProviderData); 21038fe96085Stim szeto 21048fe96085Stim szeto done: 21058fe96085Stim szeto nvlist_free(nvl); 21068fe96085Stim szeto return (ret); 21078fe96085Stim szeto } 21088fe96085Stim szeto 21098fe96085Stim szeto 21108fe96085Stim szeto /* 21118fe96085Stim szeto * stmfGetLuProp 21128fe96085Stim szeto * 21138fe96085Stim szeto * Purpose: Get current value for a resource property 21148fe96085Stim szeto * 21158fe96085Stim szeto * hdl - luResource from a previous call to stmfCreateLuResource 21168fe96085Stim szeto * 21178fe96085Stim szeto * resourceProp - a valid resource property type 21188fe96085Stim szeto * 21198fe96085Stim szeto * propVal - void pointer to a pointer of the value to be retrieved 21208fe96085Stim szeto */ 21218fe96085Stim szeto int 21228fe96085Stim szeto stmfGetLuProp(luResource hdl, uint32_t prop, char *propVal, size_t *propLen) 21238fe96085Stim szeto { 21248fe96085Stim szeto int ret = STMF_STATUS_SUCCESS; 21258fe96085Stim szeto luResourceImpl *luPropsHdl = hdl; 21268fe96085Stim szeto if (hdl == NULL || propLen == NULL || propVal == NULL) { 21278fe96085Stim szeto return (STMF_ERROR_INVALID_ARG); 21288fe96085Stim szeto } 21298fe96085Stim szeto 21308fe96085Stim szeto if (luPropsHdl->type == STMF_DISK) { 21318fe96085Stim szeto ret = getDiskProp(luPropsHdl, prop, propVal, propLen); 21328fe96085Stim szeto } else { 21338fe96085Stim szeto return (STMF_ERROR_INVALID_ARG); 21348fe96085Stim szeto } 21358fe96085Stim szeto 21368fe96085Stim szeto return (ret); 21378fe96085Stim szeto } 21388fe96085Stim szeto 21398fe96085Stim szeto /* 21408fe96085Stim szeto * stmfGetLuResource 21418fe96085Stim szeto * 21428fe96085Stim szeto * Purpose: Get a logical unit resource handle for a given logical unit. 21438fe96085Stim szeto * 21448fe96085Stim szeto * hdl - pointer to luResource 21458fe96085Stim szeto */ 21468fe96085Stim szeto int 21478fe96085Stim szeto stmfGetLuResource(stmfGuid *luGuid, luResource *hdl) 21488fe96085Stim szeto { 21498fe96085Stim szeto int ret = STMF_STATUS_SUCCESS; 21508fe96085Stim szeto stmfLogicalUnitProperties luProps; 21518fe96085Stim szeto 21527b506e25Ssrivijitha dugganapalli if (hdl == NULL) { 21537b506e25Ssrivijitha dugganapalli return (STMF_ERROR_INVALID_ARG); 21547b506e25Ssrivijitha dugganapalli } 21558fe96085Stim szeto 21568fe96085Stim szeto /* Check logical unit provider name to call correct dtype function */ 21578fe96085Stim szeto if ((ret = stmfGetLogicalUnitProperties(luGuid, &luProps)) 21588fe96085Stim szeto != STMF_STATUS_SUCCESS) { 21598fe96085Stim szeto return (ret); 21608fe96085Stim szeto } else { 21618fe96085Stim szeto if (strcmp(luProps.providerName, "sbd") == 0) { 21628fe96085Stim szeto ret = getDiskAllProps(luGuid, hdl); 21638fe96085Stim szeto } else if (luProps.status == STMF_LOGICAL_UNIT_UNREGISTERED) { 21648fe96085Stim szeto return (STMF_ERROR_NOT_FOUND); 21658fe96085Stim szeto } else { 21668fe96085Stim szeto return (STMF_ERROR_INVALID_ARG); 21678fe96085Stim szeto } 21688fe96085Stim szeto } 21698fe96085Stim szeto 21708fe96085Stim szeto return (ret); 21718fe96085Stim szeto } 21728fe96085Stim szeto 21738fe96085Stim szeto /* 21748fe96085Stim szeto * getDiskAllProps 21758fe96085Stim szeto * 21768fe96085Stim szeto * Purpose: load all disk properties from sbd driver 21778fe96085Stim szeto * 21788fe96085Stim szeto * luGuid - guid of disk device for which properties are to be retrieved 21798fe96085Stim szeto * hdl - allocated luResource into which properties are to be copied 21808fe96085Stim szeto * 21818fe96085Stim szeto */ 21828fe96085Stim szeto static int 21838fe96085Stim szeto getDiskAllProps(stmfGuid *luGuid, luResource *hdl) 21848fe96085Stim szeto { 21858fe96085Stim szeto int ret = STMF_STATUS_SUCCESS; 21868fe96085Stim szeto int fd; 21878fe96085Stim szeto sbd_lu_props_t *sbdProps; 21888fe96085Stim szeto int ioctlRet; 21898fe96085Stim szeto int savedErrno; 21908fe96085Stim szeto int sbdPropsSize = sizeof (*sbdProps) + MAX_SBD_PROPS; 21918fe96085Stim szeto stmf_iocdata_t sbdIoctl = {0}; 21928fe96085Stim szeto 21938fe96085Stim szeto /* 21948fe96085Stim szeto * Open control node for sbd 21958fe96085Stim szeto */ 21968fe96085Stim szeto if ((ret = openSbd(OPEN_SBD, &fd)) != STMF_STATUS_SUCCESS) 21978fe96085Stim szeto return (ret); 21988fe96085Stim szeto 21998fe96085Stim szeto 22008fe96085Stim szeto *hdl = calloc(1, sizeof (luResourceImpl)); 22018fe96085Stim szeto if (*hdl == NULL) { 22028fe96085Stim szeto (void) close(fd); 22038fe96085Stim szeto return (STMF_ERROR_NOMEM); 22048fe96085Stim szeto } 22058fe96085Stim szeto 22068fe96085Stim szeto sbdProps = calloc(1, sbdPropsSize); 22078fe96085Stim szeto if (sbdProps == NULL) { 22088fe96085Stim szeto free(*hdl); 22098fe96085Stim szeto (void) close(fd); 22108fe96085Stim szeto return (STMF_ERROR_NOMEM); 22118fe96085Stim szeto } 22128fe96085Stim szeto 22138fe96085Stim szeto ret = createDiskResource((luResourceImpl *)*hdl); 22148fe96085Stim szeto if (ret != STMF_STATUS_SUCCESS) { 22158fe96085Stim szeto free(*hdl); 221645039663SJohn Forte free(sbdProps); 22178fe96085Stim szeto (void) close(fd); 22188fe96085Stim szeto return (ret); 22198fe96085Stim szeto } 22208fe96085Stim szeto 22218fe96085Stim szeto sbdProps->slp_input_guid = 1; 22228fe96085Stim szeto bcopy(luGuid, sbdProps->slp_guid, sizeof (sbdProps->slp_guid)); 22238fe96085Stim szeto 22248fe96085Stim szeto sbdIoctl.stmf_version = STMF_VERSION_1; 22258fe96085Stim szeto sbdIoctl.stmf_ibuf_size = sbdPropsSize; 22268fe96085Stim szeto sbdIoctl.stmf_ibuf = (uint64_t)(unsigned long)sbdProps; 22278fe96085Stim szeto sbdIoctl.stmf_obuf_size = sbdPropsSize; 22288fe96085Stim szeto sbdIoctl.stmf_obuf = (uint64_t)(unsigned long)sbdProps; 22298fe96085Stim szeto ioctlRet = ioctl(fd, SBD_IOCTL_GET_LU_PROPS, &sbdIoctl); 22308fe96085Stim szeto if (ioctlRet != 0) { 22318fe96085Stim szeto savedErrno = errno; 22328fe96085Stim szeto switch (savedErrno) { 22338fe96085Stim szeto case EBUSY: 22348fe96085Stim szeto ret = STMF_ERROR_BUSY; 22358fe96085Stim szeto break; 22368fe96085Stim szeto case EPERM: 22378fe96085Stim szeto case EACCES: 22388fe96085Stim szeto ret = STMF_ERROR_PERM; 22398fe96085Stim szeto break; 22408fe96085Stim szeto case ENOENT: 22418fe96085Stim szeto ret = STMF_ERROR_NOT_FOUND; 22428fe96085Stim szeto break; 22438fe96085Stim szeto default: 22448fe96085Stim szeto syslog(LOG_DEBUG, 22458fe96085Stim szeto "getDiskAllProps:ioctl error(%d) (%d) (%d)", 22468fe96085Stim szeto ioctlRet, sbdIoctl.stmf_error, savedErrno); 22478fe96085Stim szeto ret = STMF_STATUS_ERROR; 22488fe96085Stim szeto break; 22498fe96085Stim szeto } 22508fe96085Stim szeto } 22518fe96085Stim szeto 22528fe96085Stim szeto if (ret == STMF_STATUS_SUCCESS) { 22538fe96085Stim szeto ret = loadDiskPropsFromDriver((luResourceImpl *)*hdl, sbdProps); 22548fe96085Stim szeto } 22558fe96085Stim szeto 225645039663SJohn Forte free(sbdProps); 22578fe96085Stim szeto (void) close(fd); 22588fe96085Stim szeto return (ret); 22598fe96085Stim szeto } 22608fe96085Stim szeto 22618fe96085Stim szeto /* 22628fe96085Stim szeto * loadDiskPropsFromDriver 22638fe96085Stim szeto * 22648fe96085Stim szeto * Purpose: Retrieve all disk type properties from sbd driver 22658fe96085Stim szeto * 22668fe96085Stim szeto * hdl - Allocated luResourceImpl 22678fe96085Stim szeto * sbdProps - sbd_lu_props_t structure returned from sbd driver 22688fe96085Stim szeto * 22698fe96085Stim szeto */ 22708fe96085Stim szeto static int 22718fe96085Stim szeto loadDiskPropsFromDriver(luResourceImpl *hdl, sbd_lu_props_t *sbdProps) 22728fe96085Stim szeto { 22738fe96085Stim szeto int ret = STMF_STATUS_SUCCESS; 22748fe96085Stim szeto diskResource *diskLu = hdl->resource; 22758fe96085Stim szeto /* copy guid */ 22768fe96085Stim szeto diskLu->luGuidValid = B_TRUE; 22778fe96085Stim szeto bcopy(sbdProps->slp_guid, diskLu->luGuid, sizeof (sbdProps->slp_guid)); 22788fe96085Stim szeto 22798fe96085Stim szeto if (sbdProps->slp_separate_meta && sbdProps->slp_meta_fname_valid) { 22808fe96085Stim szeto diskLu->luMetaFileNameValid = B_TRUE; 22818fe96085Stim szeto if (strlcpy(diskLu->luMetaFileName, 22828fe96085Stim szeto (char *)&(sbdProps->slp_buf[sbdProps->slp_meta_fname_off]), 22838fe96085Stim szeto sizeof (diskLu->luMetaFileName)) >= 22848fe96085Stim szeto sizeof (diskLu->luMetaFileName)) { 22858fe96085Stim szeto return (STMF_STATUS_ERROR); 22868fe96085Stim szeto } 22878fe96085Stim szeto } 22888fe96085Stim szeto 22898fe96085Stim szeto if (sbdProps->slp_data_fname_valid) { 22908fe96085Stim szeto diskLu->luDataFileNameValid = B_TRUE; 22918fe96085Stim szeto if (strlcpy(diskLu->luDataFileName, 22928fe96085Stim szeto (char *)&(sbdProps->slp_buf[sbdProps->slp_data_fname_off]), 22938fe96085Stim szeto sizeof (diskLu->luDataFileName)) >= 22948fe96085Stim szeto sizeof (diskLu->luDataFileName)) { 22958fe96085Stim szeto return (STMF_STATUS_ERROR); 22968fe96085Stim szeto } 22978fe96085Stim szeto } 22988fe96085Stim szeto 22998fe96085Stim szeto if (sbdProps->slp_serial_valid) { 23008fe96085Stim szeto diskLu->serialNumValid = B_TRUE; 23018fe96085Stim szeto bcopy(&(sbdProps->slp_buf[sbdProps->slp_serial_off]), 23028fe96085Stim szeto diskLu->serialNum, sbdProps->slp_serial_size); 23038fe96085Stim szeto } 23048fe96085Stim szeto 23052f624233SNattuvetty Bhavyan if (sbdProps->slp_mgmt_url_valid) { 23062f624233SNattuvetty Bhavyan diskLu->luMgmtUrlValid = B_TRUE; 23072f624233SNattuvetty Bhavyan if (strlcpy(diskLu->luMgmtUrl, 23082f624233SNattuvetty Bhavyan (char *)&(sbdProps->slp_buf[sbdProps->slp_mgmt_url_off]), 23092f624233SNattuvetty Bhavyan sizeof (diskLu->luMgmtUrl)) >= 23102f624233SNattuvetty Bhavyan sizeof (diskLu->luMgmtUrl)) { 23112f624233SNattuvetty Bhavyan return (STMF_STATUS_ERROR); 23122f624233SNattuvetty Bhavyan } 23132f624233SNattuvetty Bhavyan } 23142f624233SNattuvetty Bhavyan 23158fe96085Stim szeto if (sbdProps->slp_alias_valid) { 23168fe96085Stim szeto diskLu->luAliasValid = B_TRUE; 23178fe96085Stim szeto if (strlcpy(diskLu->luAlias, 23188fe96085Stim szeto (char *)&(sbdProps->slp_buf[sbdProps->slp_alias_off]), 23198fe96085Stim szeto sizeof (diskLu->luAlias)) >= 23208fe96085Stim szeto sizeof (diskLu->luAlias)) { 23218fe96085Stim szeto return (STMF_STATUS_ERROR); 23228fe96085Stim szeto } 23238fe96085Stim szeto } else { /* set alias to data filename if not set */ 23248fe96085Stim szeto if (sbdProps->slp_data_fname_valid) { 23258fe96085Stim szeto diskLu->luAliasValid = B_TRUE; 23268fe96085Stim szeto if (strlcpy(diskLu->luAlias, 23278fe96085Stim szeto (char *)&(sbdProps->slp_buf[ 23288fe96085Stim szeto sbdProps->slp_data_fname_off]), 23298fe96085Stim szeto sizeof (diskLu->luAlias)) >= 23308fe96085Stim szeto sizeof (diskLu->luAlias)) { 23318fe96085Stim szeto return (STMF_STATUS_ERROR); 23328fe96085Stim szeto } 23338fe96085Stim szeto } 23348fe96085Stim szeto } 23358fe96085Stim szeto 23368fe96085Stim szeto diskLu->vidValid = B_TRUE; 23378fe96085Stim szeto bcopy(sbdProps->slp_vid, diskLu->vid, sizeof (diskLu->vid)); 23388fe96085Stim szeto 23398fe96085Stim szeto diskLu->pidValid = B_TRUE; 23408fe96085Stim szeto bcopy(sbdProps->slp_pid, diskLu->pid, sizeof (diskLu->pid)); 23418fe96085Stim szeto 23428fe96085Stim szeto diskLu->revValid = B_TRUE; 23438fe96085Stim szeto bcopy(sbdProps->slp_rev, diskLu->rev, sizeof (diskLu->rev)); 23448fe96085Stim szeto 23458fe96085Stim szeto diskLu->writeProtectEnableValid = B_TRUE; 23468fe96085Stim szeto if (sbdProps->slp_write_protected) { 23478fe96085Stim szeto diskLu->writeProtectEnable = B_TRUE; 23488fe96085Stim szeto } 23498fe96085Stim szeto 23508fe96085Stim szeto diskLu->writebackCacheDisableValid = B_TRUE; 23518fe96085Stim szeto if (sbdProps->slp_writeback_cache_disable_cur) { 23528fe96085Stim szeto diskLu->writebackCacheDisable = B_TRUE; 23538fe96085Stim szeto } 23548fe96085Stim szeto 23558fe96085Stim szeto diskLu->blkSizeValid = B_TRUE; 23568fe96085Stim szeto diskLu->blkSize = sbdProps->slp_blksize; 23578fe96085Stim szeto 23588fe96085Stim szeto diskLu->luSizeValid = B_TRUE; 23598fe96085Stim szeto diskLu->luSize = sbdProps->slp_lu_size; 23608fe96085Stim szeto 236145039663SJohn Forte diskLu->accessState = sbdProps->slp_access_state; 236245039663SJohn Forte 23638fe96085Stim szeto return (ret); 23648fe96085Stim szeto } 23658fe96085Stim szeto 23667beff157SJohn Forte /* 23677beff157SJohn Forte * stmfGetGlobalLuProp 23687beff157SJohn Forte * 23697beff157SJohn Forte * Purpose: get a global property for a device type 23707beff157SJohn Forte * 23717beff157SJohn Forte */ 23727beff157SJohn Forte int 23737beff157SJohn Forte stmfGetGlobalLuProp(uint16_t dType, uint32_t prop, char *propVal, 23747beff157SJohn Forte size_t *propLen) 23757beff157SJohn Forte { 23767beff157SJohn Forte int ret = STMF_STATUS_SUCCESS; 23777beff157SJohn Forte if (dType != STMF_DISK || propVal == NULL) { 23787beff157SJohn Forte return (STMF_ERROR_INVALID_ARG); 23797beff157SJohn Forte } 23807beff157SJohn Forte 23817beff157SJohn Forte ret = getDiskGlobalProp(prop, propVal, propLen); 23827beff157SJohn Forte 23837beff157SJohn Forte return (ret); 23847beff157SJohn Forte } 23857beff157SJohn Forte 23867beff157SJohn Forte /* 23877beff157SJohn Forte * getDiskGlobalProp 23887beff157SJohn Forte * 23897beff157SJohn Forte * Purpose: get global property from sbd driver 23907beff157SJohn Forte * 23917beff157SJohn Forte */ 23927beff157SJohn Forte static int 23937beff157SJohn Forte getDiskGlobalProp(uint32_t prop, char *propVal, size_t *propLen) 23947beff157SJohn Forte { 23957beff157SJohn Forte int ret = STMF_STATUS_SUCCESS; 23967beff157SJohn Forte int fd; 23977beff157SJohn Forte sbd_global_props_t *sbdProps; 23987beff157SJohn Forte void *sbd_realloc; 23997beff157SJohn Forte int retryCnt = 0; 24007beff157SJohn Forte boolean_t retry; 24017beff157SJohn Forte int ioctlRet; 24027beff157SJohn Forte int savedErrno; 24037beff157SJohn Forte int sbdPropsSize = sizeof (*sbdProps) + MAX_SBD_PROPS; 24047beff157SJohn Forte stmf_iocdata_t sbdIoctl = {0}; 24057beff157SJohn Forte size_t reqLen; 24067beff157SJohn Forte 24077beff157SJohn Forte switch (prop) { 24087beff157SJohn Forte case STMF_LU_PROP_MGMT_URL: 24097beff157SJohn Forte break; 24107beff157SJohn Forte default: 24117beff157SJohn Forte return (STMF_ERROR_INVALID_PROP); 24127beff157SJohn Forte } 24137beff157SJohn Forte 24147beff157SJohn Forte /* 24157beff157SJohn Forte * Open control node for sbd 24167beff157SJohn Forte */ 24177beff157SJohn Forte if ((ret = openSbd(OPEN_SBD, &fd)) != STMF_STATUS_SUCCESS) 24187beff157SJohn Forte return (ret); 24197beff157SJohn Forte 24207beff157SJohn Forte sbdProps = calloc(1, sbdPropsSize); 24217beff157SJohn Forte if (sbdProps == NULL) { 24227beff157SJohn Forte (void) close(fd); 24237beff157SJohn Forte return (STMF_ERROR_NOMEM); 24247beff157SJohn Forte } 24257beff157SJohn Forte 24267beff157SJohn Forte do { 24277beff157SJohn Forte retry = B_FALSE; 24287beff157SJohn Forte sbdIoctl.stmf_version = STMF_VERSION_1; 24297beff157SJohn Forte sbdIoctl.stmf_obuf_size = sbdPropsSize; 24307beff157SJohn Forte sbdIoctl.stmf_obuf = (uint64_t)(unsigned long)sbdProps; 24317beff157SJohn Forte ioctlRet = ioctl(fd, SBD_IOCTL_GET_GLOBAL_LU, &sbdIoctl); 24327beff157SJohn Forte if (ioctlRet != 0) { 24337beff157SJohn Forte savedErrno = errno; 24347beff157SJohn Forte switch (savedErrno) { 24357beff157SJohn Forte case EBUSY: 24367beff157SJohn Forte ret = STMF_ERROR_BUSY; 24377beff157SJohn Forte break; 24387beff157SJohn Forte case EPERM: 24397beff157SJohn Forte case EACCES: 24407beff157SJohn Forte ret = STMF_ERROR_PERM; 24417beff157SJohn Forte break; 24427beff157SJohn Forte case ENOMEM: 24437beff157SJohn Forte if (sbdIoctl.stmf_error == 24447beff157SJohn Forte SBD_RET_INSUFFICIENT_BUF_SPACE && 24457beff157SJohn Forte retryCnt++ < 3) { 24467beff157SJohn Forte sbdPropsSize = 24477beff157SJohn Forte sizeof (*sbdProps) + 24487beff157SJohn Forte sbdProps-> 24497beff157SJohn Forte mlu_buf_size_needed; 24507beff157SJohn Forte 24517beff157SJohn Forte sbd_realloc = sbdProps; 24527beff157SJohn Forte sbdProps = realloc(sbdProps, 24537beff157SJohn Forte sbdPropsSize); 24547beff157SJohn Forte if (sbdProps == NULL) { 24557beff157SJohn Forte free(sbd_realloc); 24567beff157SJohn Forte ret = STMF_ERROR_NOMEM; 24577beff157SJohn Forte break; 24587beff157SJohn Forte } 24597beff157SJohn Forte retry = B_TRUE; 24607beff157SJohn Forte } else { 24617beff157SJohn Forte ret = STMF_ERROR_NOMEM; 24627beff157SJohn Forte } 24637beff157SJohn Forte break; 24647beff157SJohn Forte default: 24657beff157SJohn Forte syslog(LOG_DEBUG, 24667beff157SJohn Forte "getDiskGlobalProp:ioctl error(%d)" 24677beff157SJohn Forte "(%d)(%d)", ioctlRet, 24687beff157SJohn Forte sbdIoctl.stmf_error, savedErrno); 24697beff157SJohn Forte ret = STMF_STATUS_ERROR; 24707beff157SJohn Forte break; 24717beff157SJohn Forte } 24727beff157SJohn Forte 24737beff157SJohn Forte } 24747beff157SJohn Forte } while (retry); 24757beff157SJohn Forte 24767beff157SJohn Forte if (ret != STMF_STATUS_SUCCESS) { 24777beff157SJohn Forte goto done; 24787beff157SJohn Forte } 24797beff157SJohn Forte 24807beff157SJohn Forte switch (prop) { 24817beff157SJohn Forte case STMF_LU_PROP_MGMT_URL: 24827beff157SJohn Forte if (sbdProps->mlu_mgmt_url_valid == 0) { 24837beff157SJohn Forte ret = STMF_ERROR_NO_PROP; 24847beff157SJohn Forte goto done; 24857beff157SJohn Forte } 24867beff157SJohn Forte if ((reqLen = strlcpy(propVal, (char *)&( 24877beff157SJohn Forte sbdProps->mlu_buf[sbdProps->mlu_mgmt_url_off]), 24887beff157SJohn Forte *propLen)) >= *propLen) { 24897beff157SJohn Forte *propLen = reqLen + 1; 24907beff157SJohn Forte ret = STMF_ERROR_INVALID_ARG; 24917beff157SJohn Forte goto done; 24927beff157SJohn Forte } 24937beff157SJohn Forte break; 24947beff157SJohn Forte } 24957beff157SJohn Forte 24967beff157SJohn Forte done: 24977beff157SJohn Forte free(sbdProps); 24987beff157SJohn Forte (void) close(fd); 24997beff157SJohn Forte return (ret); 25007beff157SJohn Forte } 25017beff157SJohn Forte 25027beff157SJohn Forte /* 25037beff157SJohn Forte * stmfSetGlobalLuProp 25047beff157SJohn Forte * 25057beff157SJohn Forte * Purpose: set a global property for a device type 25067beff157SJohn Forte * 25077beff157SJohn Forte */ 25087beff157SJohn Forte int 25097beff157SJohn Forte stmfSetGlobalLuProp(uint16_t dType, uint32_t prop, const char *propVal) 25107beff157SJohn Forte { 25117beff157SJohn Forte int ret = STMF_STATUS_SUCCESS; 25127beff157SJohn Forte if (dType != STMF_DISK || propVal == NULL) { 25137beff157SJohn Forte return (STMF_ERROR_INVALID_ARG); 25147beff157SJohn Forte } 25157beff157SJohn Forte 25167beff157SJohn Forte ret = setDiskGlobalProp(prop, propVal); 25177beff157SJohn Forte 25187beff157SJohn Forte return (ret); 25197beff157SJohn Forte } 25207beff157SJohn Forte 25217beff157SJohn Forte /* 25227beff157SJohn Forte * setDiskGlobalProp 25237beff157SJohn Forte * 25247beff157SJohn Forte * Purpose: set properties for resource of type disk 25257beff157SJohn Forte * 25267beff157SJohn Forte * resourceProp - valid resource identifier 25277beff157SJohn Forte * propVal - valid resource value 25287beff157SJohn Forte */ 25297beff157SJohn Forte static int 25307beff157SJohn Forte setDiskGlobalProp(uint32_t resourceProp, const char *propVal) 25317beff157SJohn Forte { 25327beff157SJohn Forte int ret = STMF_STATUS_SUCCESS; 25337beff157SJohn Forte sbd_global_props_t *sbdGlobalProps = NULL; 25347beff157SJohn Forte int sbdGlobalPropsSize = 0; 25357beff157SJohn Forte int propLen; 25367beff157SJohn Forte int mluBufSize = 0; 25377beff157SJohn Forte int fd; 25387beff157SJohn Forte int savedErrno; 25397beff157SJohn Forte int ioctlRet; 25407beff157SJohn Forte stmf_iocdata_t sbdIoctl = {0}; 25417beff157SJohn Forte 25427beff157SJohn Forte switch (resourceProp) { 25437beff157SJohn Forte case STMF_LU_PROP_MGMT_URL: 25447beff157SJohn Forte break; 25457beff157SJohn Forte default: 25467beff157SJohn Forte return (STMF_ERROR_INVALID_PROP); 25477beff157SJohn Forte break; 25487beff157SJohn Forte } 25497beff157SJohn Forte 25507beff157SJohn Forte /* 25517beff157SJohn Forte * Open control node for sbd 25527beff157SJohn Forte */ 25537beff157SJohn Forte if ((ret = openSbd(OPEN_SBD, &fd)) != STMF_STATUS_SUCCESS) 25547beff157SJohn Forte return (ret); 25557beff157SJohn Forte 25567beff157SJohn Forte propLen = strlen(propVal); 25577beff157SJohn Forte mluBufSize += propLen + 1; 25587beff157SJohn Forte sbdGlobalPropsSize += sizeof (sbd_global_props_t) - 8 + 25597beff157SJohn Forte max(8, mluBufSize); 25607beff157SJohn Forte /* 25617beff157SJohn Forte * 8 is the size of the buffer set aside for 25627beff157SJohn Forte * concatenation of variable length fields 25637beff157SJohn Forte */ 25647beff157SJohn Forte sbdGlobalProps = (sbd_global_props_t *)calloc(1, sbdGlobalPropsSize); 25657beff157SJohn Forte if (sbdGlobalProps == NULL) { 25667beff157SJohn Forte (void) close(fd); 25677beff157SJohn Forte return (STMF_ERROR_NOMEM); 25687beff157SJohn Forte } 25697beff157SJohn Forte 25707beff157SJohn Forte sbdGlobalProps->mlu_struct_size = sbdGlobalPropsSize; 25717beff157SJohn Forte 25727beff157SJohn Forte switch (resourceProp) { 25737beff157SJohn Forte case STMF_LU_PROP_MGMT_URL: 25747beff157SJohn Forte sbdGlobalProps->mlu_mgmt_url_valid = 1; 25757beff157SJohn Forte bcopy(propVal, &(sbdGlobalProps->mlu_buf), 25767beff157SJohn Forte propLen + 1); 25777beff157SJohn Forte break; 25787beff157SJohn Forte default: 25797beff157SJohn Forte ret = STMF_ERROR_NO_PROP; 25807beff157SJohn Forte goto done; 25817beff157SJohn Forte } 25827beff157SJohn Forte 25837beff157SJohn Forte sbdIoctl.stmf_version = STMF_VERSION_1; 25847beff157SJohn Forte sbdIoctl.stmf_ibuf_size = sbdGlobalProps->mlu_struct_size; 25857beff157SJohn Forte sbdIoctl.stmf_ibuf = (uint64_t)(unsigned long)sbdGlobalProps; 25867beff157SJohn Forte 25877beff157SJohn Forte ioctlRet = ioctl(fd, SBD_IOCTL_SET_GLOBAL_LU, &sbdIoctl); 25887beff157SJohn Forte if (ioctlRet != 0) { 25897beff157SJohn Forte savedErrno = errno; 25907beff157SJohn Forte switch (savedErrno) { 25917beff157SJohn Forte case EBUSY: 25927beff157SJohn Forte ret = STMF_ERROR_BUSY; 25937beff157SJohn Forte break; 25947beff157SJohn Forte case EPERM: 25957beff157SJohn Forte case EACCES: 25967beff157SJohn Forte ret = STMF_ERROR_PERM; 25977beff157SJohn Forte break; 25987beff157SJohn Forte default: 25997beff157SJohn Forte diskError(sbdIoctl.stmf_error, &ret); 26007beff157SJohn Forte if (ret == STMF_STATUS_ERROR) { 26017beff157SJohn Forte syslog(LOG_DEBUG, 26027beff157SJohn Forte "modifyDiskLu:ioctl " 26037beff157SJohn Forte "error(%d) (%d) (%d)", ioctlRet, 26047beff157SJohn Forte sbdIoctl.stmf_error, savedErrno); 26057beff157SJohn Forte } 26067beff157SJohn Forte break; 26077beff157SJohn Forte } 26087beff157SJohn Forte } 26097beff157SJohn Forte 26107beff157SJohn Forte done: 26117beff157SJohn Forte free(sbdGlobalProps); 26127beff157SJohn Forte (void) close(fd); 26137beff157SJohn Forte return (ret); 26147beff157SJohn Forte } 26157beff157SJohn Forte 26168fe96085Stim szeto 26178fe96085Stim szeto /* 26188fe96085Stim szeto * stmfSetLuProp 26198fe96085Stim szeto * 26208fe96085Stim szeto * Purpose: set a property on an luResource 26218fe96085Stim szeto * 26228fe96085Stim szeto * hdl - allocated luResource 26238fe96085Stim szeto * prop - property identifier 26248fe96085Stim szeto * propVal - property value to be set 26258fe96085Stim szeto */ 26268fe96085Stim szeto int 26278fe96085Stim szeto stmfSetLuProp(luResource hdl, uint32_t prop, const char *propVal) 26288fe96085Stim szeto { 26298fe96085Stim szeto int ret = STMF_STATUS_SUCCESS; 26308fe96085Stim szeto luResourceImpl *luPropsHdl = hdl; 26318fe96085Stim szeto if (hdl == NULL) { 26328fe96085Stim szeto return (STMF_ERROR_INVALID_ARG); 26338fe96085Stim szeto } 26348fe96085Stim szeto 26358fe96085Stim szeto if (luPropsHdl->type == STMF_DISK) { 26368fe96085Stim szeto ret = setDiskProp(luPropsHdl, prop, propVal); 26378fe96085Stim szeto } else { 26388fe96085Stim szeto return (STMF_ERROR_INVALID_ARG); 26398fe96085Stim szeto } 26408fe96085Stim szeto 26418fe96085Stim szeto return (ret); 26428fe96085Stim szeto } 26438fe96085Stim szeto 26448fe96085Stim szeto /* 26458fe96085Stim szeto * getDiskProp 26468fe96085Stim szeto * 26478fe96085Stim szeto * Purpose: retrieve a given property from a logical unit resource of type disk 26488fe96085Stim szeto * 26498fe96085Stim szeto * hdl - allocated luResourceImpl 26508fe96085Stim szeto * prop - property identifier 26518fe96085Stim szeto * propVal - pointer to character to contain the retrieved property value 26528fe96085Stim szeto * propLen - On input this is the length of propVal. On failure, it contains the 26538fe96085Stim szeto * number of bytes required for propVal 26548fe96085Stim szeto */ 26558fe96085Stim szeto static int 26568fe96085Stim szeto getDiskProp(luResourceImpl *hdl, uint32_t prop, char *propVal, size_t *propLen) 26578fe96085Stim szeto { 26588fe96085Stim szeto int ret = STMF_STATUS_SUCCESS; 26598fe96085Stim szeto diskResource *diskLu = hdl->resource; 266045039663SJohn Forte char accessState[20]; 26618fe96085Stim szeto size_t reqLen; 26628fe96085Stim szeto 266345039663SJohn Forte if (prop == STMF_LU_PROP_ACCESS_STATE) { 266445039663SJohn Forte if (diskLu->accessState == SBD_LU_ACTIVE) { 266545039663SJohn Forte (void) strlcpy(accessState, STMF_ACCESS_ACTIVE, 266645039663SJohn Forte sizeof (accessState)); 266745039663SJohn Forte } else if (diskLu->accessState == SBD_LU_TRANSITION_TO_ACTIVE) { 266845039663SJohn Forte (void) strlcpy(accessState, 266945039663SJohn Forte STMF_ACCESS_STANDBY_TO_ACTIVE, 267045039663SJohn Forte sizeof (accessState)); 267145039663SJohn Forte } else if (diskLu->accessState == SBD_LU_STANDBY) { 267245039663SJohn Forte (void) strlcpy(accessState, STMF_ACCESS_STANDBY, 267345039663SJohn Forte sizeof (accessState)); 267445039663SJohn Forte } else if (diskLu->accessState == 267545039663SJohn Forte SBD_LU_TRANSITION_TO_STANDBY) { 267645039663SJohn Forte (void) strlcpy(accessState, 267745039663SJohn Forte STMF_ACCESS_ACTIVE_TO_STANDBY, 267845039663SJohn Forte sizeof (accessState)); 267945039663SJohn Forte } 268045039663SJohn Forte if ((reqLen = strlcpy(propVal, accessState, 268145039663SJohn Forte *propLen)) >= *propLen) { 268245039663SJohn Forte *propLen = reqLen + 1; 268345039663SJohn Forte return (STMF_ERROR_INVALID_ARG); 268445039663SJohn Forte } 268545039663SJohn Forte return (0); 268645039663SJohn Forte } 268745039663SJohn Forte 268845039663SJohn Forte if (diskLu->accessState != SBD_LU_ACTIVE) { 268945039663SJohn Forte return (STMF_ERROR_NO_PROP_STANDBY); 269045039663SJohn Forte } 269145039663SJohn Forte 26928fe96085Stim szeto switch (prop) { 26938fe96085Stim szeto case STMF_LU_PROP_BLOCK_SIZE: 26948fe96085Stim szeto if (diskLu->blkSizeValid == B_FALSE) { 26958fe96085Stim szeto return (STMF_ERROR_NO_PROP); 26968fe96085Stim szeto } 26978fe96085Stim szeto reqLen = snprintf(propVal, *propLen, "%llu", 26988fe96085Stim szeto (u_longlong_t)diskLu->blkSize); 26998fe96085Stim szeto if (reqLen >= *propLen) { 27008fe96085Stim szeto *propLen = reqLen + 1; 27018fe96085Stim szeto return (STMF_ERROR_INVALID_ARG); 27028fe96085Stim szeto } 27038fe96085Stim szeto break; 27048fe96085Stim szeto case STMF_LU_PROP_FILENAME: 27058fe96085Stim szeto if (diskLu->luDataFileNameValid == B_FALSE) { 27068fe96085Stim szeto return (STMF_ERROR_NO_PROP); 27078fe96085Stim szeto } 27088fe96085Stim szeto if ((reqLen = strlcpy(propVal, diskLu->luDataFileName, 27098fe96085Stim szeto *propLen)) >= *propLen) { 27108fe96085Stim szeto *propLen = reqLen + 1; 27118fe96085Stim szeto return (STMF_ERROR_INVALID_ARG); 27128fe96085Stim szeto } 27138fe96085Stim szeto break; 27148fe96085Stim szeto case STMF_LU_PROP_META_FILENAME: 27158fe96085Stim szeto if (diskLu->luMetaFileNameValid == B_FALSE) { 27168fe96085Stim szeto return (STMF_ERROR_NO_PROP); 27178fe96085Stim szeto } 27188fe96085Stim szeto if ((reqLen = strlcpy(propVal, diskLu->luMetaFileName, 27198fe96085Stim szeto *propLen)) >= *propLen) { 27208fe96085Stim szeto *propLen = reqLen + 1; 27218fe96085Stim szeto return (STMF_ERROR_INVALID_ARG); 27228fe96085Stim szeto } 27238fe96085Stim szeto break; 27242f624233SNattuvetty Bhavyan case STMF_LU_PROP_MGMT_URL: 27252f624233SNattuvetty Bhavyan if (diskLu->luMgmtUrlValid == B_FALSE) { 27262f624233SNattuvetty Bhavyan return (STMF_ERROR_NO_PROP); 27272f624233SNattuvetty Bhavyan } 27282f624233SNattuvetty Bhavyan if ((reqLen = strlcpy(propVal, diskLu->luMgmtUrl, 27292f624233SNattuvetty Bhavyan *propLen)) >= *propLen) { 27302f624233SNattuvetty Bhavyan *propLen = reqLen + 1; 27312f624233SNattuvetty Bhavyan return (STMF_ERROR_INVALID_ARG); 27322f624233SNattuvetty Bhavyan } 27332f624233SNattuvetty Bhavyan break; 27348fe96085Stim szeto case STMF_LU_PROP_GUID: 27358fe96085Stim szeto if (diskLu->luGuidValid == B_FALSE) { 27368fe96085Stim szeto return (STMF_ERROR_NO_PROP); 27378fe96085Stim szeto } 27388fe96085Stim szeto reqLen = snprintf(propVal, *propLen, 27398fe96085Stim szeto "%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X" 27408fe96085Stim szeto "%02X%02X%02X%02X", 27418fe96085Stim szeto diskLu->luGuid[0], diskLu->luGuid[1], 27428fe96085Stim szeto diskLu->luGuid[2], diskLu->luGuid[3], 27438fe96085Stim szeto diskLu->luGuid[4], diskLu->luGuid[5], 27448fe96085Stim szeto diskLu->luGuid[6], diskLu->luGuid[7], 27458fe96085Stim szeto diskLu->luGuid[8], diskLu->luGuid[9], 27468fe96085Stim szeto diskLu->luGuid[10], diskLu->luGuid[11], 27478fe96085Stim szeto diskLu->luGuid[12], diskLu->luGuid[13], 27488fe96085Stim szeto diskLu->luGuid[14], diskLu->luGuid[15]); 27498fe96085Stim szeto if (reqLen >= *propLen) { 27508fe96085Stim szeto *propLen = reqLen + 1; 27518fe96085Stim szeto return (STMF_ERROR_INVALID_ARG); 27528fe96085Stim szeto } 27538fe96085Stim szeto break; 27548fe96085Stim szeto case STMF_LU_PROP_SERIAL_NUM: 27558fe96085Stim szeto if (diskLu->serialNumValid == B_FALSE) { 27568fe96085Stim szeto return (STMF_ERROR_NO_PROP); 27578fe96085Stim szeto } 27588fe96085Stim szeto if ((reqLen = strlcpy(propVal, diskLu->serialNum, 27598fe96085Stim szeto *propLen)) >= *propLen) { 27608fe96085Stim szeto *propLen = reqLen + 1; 27618fe96085Stim szeto return (STMF_ERROR_INVALID_ARG); 27628fe96085Stim szeto } 27638fe96085Stim szeto break; 27648fe96085Stim szeto case STMF_LU_PROP_SIZE: 27658fe96085Stim szeto if (diskLu->luSizeValid == B_FALSE) { 27668fe96085Stim szeto return (STMF_ERROR_NO_PROP); 27678fe96085Stim szeto } 27688fe96085Stim szeto (void) snprintf(propVal, *propLen, "%llu", 27698fe96085Stim szeto (u_longlong_t)diskLu->luSize); 27708fe96085Stim szeto break; 27718fe96085Stim szeto case STMF_LU_PROP_ALIAS: 27728fe96085Stim szeto if (diskLu->luAliasValid == B_FALSE) { 27738fe96085Stim szeto return (STMF_ERROR_NO_PROP); 27748fe96085Stim szeto } 27758fe96085Stim szeto if ((reqLen = strlcpy(propVal, diskLu->luAlias, 27768fe96085Stim szeto *propLen)) >= *propLen) { 27778fe96085Stim szeto *propLen = reqLen + 1; 27788fe96085Stim szeto return (STMF_ERROR_INVALID_ARG); 27798fe96085Stim szeto } 27808fe96085Stim szeto break; 27818fe96085Stim szeto case STMF_LU_PROP_VID: 27828fe96085Stim szeto if (diskLu->vidValid == B_FALSE) { 27838fe96085Stim szeto return (STMF_ERROR_NO_PROP); 27848fe96085Stim szeto } 27858fe96085Stim szeto if (*propLen <= sizeof (diskLu->vid)) { 27868fe96085Stim szeto return (STMF_ERROR_INVALID_ARG); 27878fe96085Stim szeto } 27888fe96085Stim szeto bcopy(diskLu->vid, propVal, sizeof (diskLu->vid)); 27898fe96085Stim szeto propVal[sizeof (diskLu->vid)] = 0; 27908fe96085Stim szeto break; 27918fe96085Stim szeto case STMF_LU_PROP_PID: 27928fe96085Stim szeto if (diskLu->pidValid == B_FALSE) { 27938fe96085Stim szeto return (STMF_ERROR_NO_PROP); 27948fe96085Stim szeto } 27958fe96085Stim szeto if (*propLen <= sizeof (diskLu->pid)) { 27968fe96085Stim szeto return (STMF_ERROR_INVALID_ARG); 27978fe96085Stim szeto } 27988fe96085Stim szeto bcopy(diskLu->pid, propVal, sizeof (diskLu->pid)); 27998fe96085Stim szeto propVal[sizeof (diskLu->pid)] = 0; 28008fe96085Stim szeto break; 28018fe96085Stim szeto case STMF_LU_PROP_WRITE_PROTECT: 28028fe96085Stim szeto if (diskLu->writeProtectEnableValid == B_FALSE) { 28038fe96085Stim szeto return (STMF_ERROR_NO_PROP); 28048fe96085Stim szeto } 28058fe96085Stim szeto if (diskLu->writeProtectEnable) { 28068fe96085Stim szeto if ((reqLen = strlcpy(propVal, "true", 28078fe96085Stim szeto *propLen)) >= *propLen) { 28088fe96085Stim szeto *propLen = reqLen + 1; 28098fe96085Stim szeto return (STMF_ERROR_INVALID_ARG); 28108fe96085Stim szeto } 28118fe96085Stim szeto } else { 28128fe96085Stim szeto if ((reqLen = strlcpy(propVal, "false", 28138fe96085Stim szeto *propLen)) >= *propLen) { 28148fe96085Stim szeto *propLen = reqLen + 1; 28158fe96085Stim szeto return (STMF_ERROR_INVALID_ARG); 28168fe96085Stim szeto } 28178fe96085Stim szeto } 28188fe96085Stim szeto break; 28198fe96085Stim szeto case STMF_LU_PROP_WRITE_CACHE_DISABLE: 28208fe96085Stim szeto if (diskLu->writebackCacheDisableValid == B_FALSE) { 28218fe96085Stim szeto return (STMF_ERROR_NO_PROP); 28228fe96085Stim szeto } 28238fe96085Stim szeto if (diskLu->writebackCacheDisable) { 28248fe96085Stim szeto if ((reqLen = strlcpy(propVal, "true", 28258fe96085Stim szeto *propLen)) >= *propLen) { 28268fe96085Stim szeto *propLen = reqLen + 1; 28278fe96085Stim szeto return (STMF_ERROR_INVALID_ARG); 28288fe96085Stim szeto } 28298fe96085Stim szeto } else { 28308fe96085Stim szeto if ((reqLen = strlcpy(propVal, "false", 28318fe96085Stim szeto *propLen)) >= *propLen) { 28328fe96085Stim szeto *propLen = reqLen + 1; 28338fe96085Stim szeto return (STMF_ERROR_INVALID_ARG); 28348fe96085Stim szeto } 28358fe96085Stim szeto } 28368fe96085Stim szeto break; 28378fe96085Stim szeto default: 28387b506e25Ssrivijitha dugganapalli ret = STMF_ERROR_INVALID_PROP; 28398fe96085Stim szeto break; 28408fe96085Stim szeto } 28418fe96085Stim szeto 28428fe96085Stim szeto return (ret); 28438fe96085Stim szeto } 28448fe96085Stim szeto 28458fe96085Stim szeto /* 28468fe96085Stim szeto * setDiskProp 28478fe96085Stim szeto * 28488fe96085Stim szeto * Purpose: set properties for resource of type disk 28498fe96085Stim szeto * 28508fe96085Stim szeto * hdl - allocated luResourceImpl 28518fe96085Stim szeto * resourceProp - valid resource identifier 28528fe96085Stim szeto * propVal - valid resource value 28538fe96085Stim szeto */ 28548fe96085Stim szeto static int 28558fe96085Stim szeto setDiskProp(luResourceImpl *hdl, uint32_t resourceProp, const char *propVal) 28568fe96085Stim szeto { 28578fe96085Stim szeto int ret = STMF_STATUS_SUCCESS; 28588fe96085Stim szeto int i; 28598fe96085Stim szeto diskResource *diskLu = hdl->resource; 28608fe96085Stim szeto unsigned long long numericProp = 0; 28618fe96085Stim szeto char guidProp[LU_ASCII_GUID_SIZE + 1]; 28628fe96085Stim szeto char ouiProp[OUI_ASCII_SIZE + 1]; 2863fdcc480aSJohn Forte char hostIdProp[HOST_ID_ASCII_SIZE + 1]; 28648fe96085Stim szeto unsigned int oui[OUI_SIZE]; 2865fdcc480aSJohn Forte unsigned int hostId[HOST_ID_SIZE]; 28668fe96085Stim szeto unsigned int guid[LU_GUID_SIZE]; 28678fe96085Stim szeto int propSize; 28688fe96085Stim szeto 28698fe96085Stim szeto 28708fe96085Stim szeto if (propVal == NULL) { 28718fe96085Stim szeto return (STMF_ERROR_INVALID_ARG); 28728fe96085Stim szeto } 28738fe96085Stim szeto 28748fe96085Stim szeto switch (resourceProp) { 28758fe96085Stim szeto case STMF_LU_PROP_ALIAS: 28768fe96085Stim szeto if (strlcpy(diskLu->luAlias, propVal, 28778fe96085Stim szeto sizeof (diskLu->luAlias)) >= 28788fe96085Stim szeto sizeof (diskLu->luAlias)) { 28798fe96085Stim szeto return (STMF_ERROR_INVALID_PROPSIZE); 28808fe96085Stim szeto } 28818fe96085Stim szeto diskLu->luAliasValid = B_TRUE; 28828fe96085Stim szeto break; 288326717e15Ssrivijitha dugganapalli case STMF_LU_PROP_BLOCK_SIZE: { 288426717e15Ssrivijitha dugganapalli const char *tmp = propVal; 288526717e15Ssrivijitha dugganapalli while (*tmp) { 288626717e15Ssrivijitha dugganapalli if (!isdigit(*tmp++)) { 288726717e15Ssrivijitha dugganapalli return (STMF_ERROR_INVALID_ARG); 288826717e15Ssrivijitha dugganapalli } 288926717e15Ssrivijitha dugganapalli } 28908fe96085Stim szeto (void) sscanf(propVal, "%llu", &numericProp); 28918fe96085Stim szeto if (numericProp > UINT16_MAX) { 28928fe96085Stim szeto return (STMF_ERROR_INVALID_PROPSIZE); 28938fe96085Stim szeto } 28948fe96085Stim szeto diskLu->blkSize = numericProp; 28958fe96085Stim szeto diskLu->blkSizeValid = B_TRUE; 28968fe96085Stim szeto break; 289726717e15Ssrivijitha dugganapalli } 28988fe96085Stim szeto case STMF_LU_PROP_COMPANY_ID: 28998fe96085Stim szeto if ((strlcpy(ouiProp, propVal, sizeof (ouiProp))) >= 29008fe96085Stim szeto sizeof (ouiProp)) { 29018fe96085Stim szeto return (STMF_ERROR_INVALID_ARG); 29028fe96085Stim szeto } 29038fe96085Stim szeto if (checkHexUpper(ouiProp) != 0) { 29048fe96085Stim szeto return (STMF_ERROR_INVALID_ARG); 29058fe96085Stim szeto } 29068fe96085Stim szeto (void) sscanf(ouiProp, "%2X%2X%2X", 29078fe96085Stim szeto &oui[0], &oui[1], &oui[2]); 29088fe96085Stim szeto 29098fe96085Stim szeto diskLu->companyId = 0; 29108fe96085Stim szeto diskLu->companyId += oui[0] << 16; 29118fe96085Stim szeto diskLu->companyId += oui[1] << 8; 29128fe96085Stim szeto diskLu->companyId += oui[2]; 2913fdcc480aSJohn Forte if (diskLu->companyId == 0) { 2914fdcc480aSJohn Forte return (STMF_ERROR_INVALID_ARG); 2915fdcc480aSJohn Forte } 29168fe96085Stim szeto diskLu->companyIdValid = B_TRUE; 29178fe96085Stim szeto break; 2918fdcc480aSJohn Forte case STMF_LU_PROP_HOST_ID: 2919fdcc480aSJohn Forte if ((strlcpy(hostIdProp, propVal, 2920fdcc480aSJohn Forte sizeof (hostIdProp))) >= sizeof (hostIdProp)) { 2921fdcc480aSJohn Forte return (STMF_ERROR_INVALID_ARG); 2922fdcc480aSJohn Forte } 2923fdcc480aSJohn Forte if (checkHexUpper(hostIdProp) != 0) { 2924fdcc480aSJohn Forte return (STMF_ERROR_INVALID_ARG); 2925fdcc480aSJohn Forte } 2926fdcc480aSJohn Forte (void) sscanf(hostIdProp, "%2X%2X%2X%2X", 2927fdcc480aSJohn Forte &hostId[0], &hostId[1], &hostId[2], &hostId[3]); 2928fdcc480aSJohn Forte 2929fdcc480aSJohn Forte diskLu->hostId = 0; 2930fdcc480aSJohn Forte diskLu->hostId += hostId[0] << 24; 2931fdcc480aSJohn Forte diskLu->hostId += hostId[1] << 16; 2932fdcc480aSJohn Forte diskLu->hostId += hostId[2] << 8; 2933fdcc480aSJohn Forte diskLu->hostId += hostId[3]; 2934fdcc480aSJohn Forte if (diskLu->hostId == 0) { 2935fdcc480aSJohn Forte return (STMF_ERROR_INVALID_ARG); 2936fdcc480aSJohn Forte } 2937fdcc480aSJohn Forte diskLu->hostIdValid = B_TRUE; 2938fdcc480aSJohn Forte break; 29398fe96085Stim szeto case STMF_LU_PROP_GUID: 29408fe96085Stim szeto if (strlen(propVal) != LU_ASCII_GUID_SIZE) { 29418fe96085Stim szeto return (STMF_ERROR_INVALID_PROPSIZE); 29428fe96085Stim szeto } 29438fe96085Stim szeto 29448fe96085Stim szeto if ((strlcpy(guidProp, propVal, sizeof (guidProp))) >= 29458fe96085Stim szeto sizeof (guidProp)) { 29468fe96085Stim szeto return (STMF_ERROR_INVALID_ARG); 29478fe96085Stim szeto } 29488fe96085Stim szeto 29498fe96085Stim szeto if (checkHexUpper(guidProp) != 0) { 29508fe96085Stim szeto return (STMF_ERROR_INVALID_ARG); 29518fe96085Stim szeto } 29528fe96085Stim szeto 29538fe96085Stim szeto (void) sscanf(guidProp, 29548fe96085Stim szeto "%2X%2X%2X%2X%2X%2X%2X%2X%2X%2X%2X%2X%2X%2X%2X%2X", 29558fe96085Stim szeto &guid[0], &guid[1], &guid[2], &guid[3], &guid[4], 29568fe96085Stim szeto &guid[5], &guid[6], &guid[7], &guid[8], &guid[9], 29578fe96085Stim szeto &guid[10], &guid[11], &guid[12], &guid[13], 29588fe96085Stim szeto &guid[14], &guid[15]); 29598fe96085Stim szeto for (i = 0; i < sizeof (diskLu->luGuid); i++) { 29608fe96085Stim szeto diskLu->luGuid[i] = guid[i]; 29618fe96085Stim szeto } 29628fe96085Stim szeto diskLu->luGuidValid = B_TRUE; 29638fe96085Stim szeto break; 29648fe96085Stim szeto case STMF_LU_PROP_FILENAME: 29658fe96085Stim szeto if ((strlcpy(diskLu->luDataFileName, propVal, 29668fe96085Stim szeto sizeof (diskLu->luDataFileName))) >= 29678fe96085Stim szeto sizeof (diskLu->luDataFileName)) { 29688fe96085Stim szeto return (STMF_ERROR_INVALID_PROPSIZE); 29698fe96085Stim szeto } 29708fe96085Stim szeto diskLu->luDataFileNameValid = B_TRUE; 29718fe96085Stim szeto break; 29728fe96085Stim szeto case STMF_LU_PROP_META_FILENAME: 29738fe96085Stim szeto if ((strlcpy(diskLu->luMetaFileName, propVal, 29748fe96085Stim szeto sizeof (diskLu->luMetaFileName))) >= 29758fe96085Stim szeto sizeof (diskLu->luMetaFileName)) { 29768fe96085Stim szeto return (STMF_ERROR_INVALID_PROPSIZE); 29778fe96085Stim szeto } 29788fe96085Stim szeto diskLu->luMetaFileNameValid = B_TRUE; 29798fe96085Stim szeto break; 29802f624233SNattuvetty Bhavyan case STMF_LU_PROP_MGMT_URL: 29812f624233SNattuvetty Bhavyan if ((strlcpy(diskLu->luMgmtUrl, propVal, 29822f624233SNattuvetty Bhavyan sizeof (diskLu->luMgmtUrl))) >= 29832f624233SNattuvetty Bhavyan sizeof (diskLu->luMgmtUrl)) { 29842f624233SNattuvetty Bhavyan return (STMF_ERROR_INVALID_PROPSIZE); 29852f624233SNattuvetty Bhavyan } 29862f624233SNattuvetty Bhavyan diskLu->luMgmtUrlValid = B_TRUE; 29872f624233SNattuvetty Bhavyan break; 29888fe96085Stim szeto case STMF_LU_PROP_PID: 29898fe96085Stim szeto if ((propSize = strlen(propVal)) > 29908fe96085Stim szeto sizeof (diskLu->pid)) { 29918fe96085Stim szeto return (STMF_ERROR_INVALID_PROPSIZE); 29928fe96085Stim szeto } 29938fe96085Stim szeto (void) strncpy(diskLu->pid, propVal, propSize); 29948fe96085Stim szeto diskLu->pidValid = B_TRUE; 29958fe96085Stim szeto break; 29968fe96085Stim szeto case STMF_LU_PROP_SERIAL_NUM: 29978fe96085Stim szeto if ((propSize = strlen(propVal)) > 29988fe96085Stim szeto (sizeof (diskLu->serialNum) - 1)) { 29998fe96085Stim szeto return (STMF_ERROR_INVALID_PROPSIZE); 30008fe96085Stim szeto } 30018fe96085Stim szeto (void) strncpy(diskLu->serialNum, propVal, propSize); 30028fe96085Stim szeto diskLu->serialNumValid = B_TRUE; 30038fe96085Stim szeto break; 30048fe96085Stim szeto case STMF_LU_PROP_SIZE: 30058fe96085Stim szeto if ((niceStrToNum(propVal, &diskLu->luSize) != 0)) { 30068fe96085Stim szeto return (STMF_ERROR_INVALID_ARG); 30078fe96085Stim szeto } 30088fe96085Stim szeto diskLu->luSizeValid = B_TRUE; 30098fe96085Stim szeto break; 30108fe96085Stim szeto case STMF_LU_PROP_VID: 30118fe96085Stim szeto if ((propSize = strlen(propVal)) > 30128fe96085Stim szeto sizeof (diskLu->vid)) { 30138fe96085Stim szeto return (STMF_ERROR_INVALID_PROPSIZE); 30148fe96085Stim szeto } 30158fe96085Stim szeto (void) strncpy(diskLu->vid, propVal, propSize); 30168fe96085Stim szeto diskLu->vidValid = B_TRUE; 30178fe96085Stim szeto break; 30188fe96085Stim szeto case STMF_LU_PROP_WRITE_PROTECT: 30198fe96085Stim szeto if (strcasecmp(propVal, "TRUE") == 0) { 30208fe96085Stim szeto diskLu->writeProtectEnable = B_TRUE; 30218fe96085Stim szeto } else if (strcasecmp(propVal, "FALSE") == 0) { 30228fe96085Stim szeto diskLu->writeProtectEnable = B_FALSE; 30238fe96085Stim szeto } else { 30248fe96085Stim szeto return (STMF_ERROR_INVALID_ARG); 30258fe96085Stim szeto } 30268fe96085Stim szeto diskLu->writeProtectEnableValid = B_TRUE; 30278fe96085Stim szeto break; 30288fe96085Stim szeto case STMF_LU_PROP_WRITE_CACHE_DISABLE: 30298fe96085Stim szeto if (strcasecmp(propVal, "TRUE") == 0) { 30308fe96085Stim szeto diskLu->writebackCacheDisable = B_TRUE; 30318fe96085Stim szeto } else if (strcasecmp(propVal, "FALSE") == 0) { 30328fe96085Stim szeto diskLu->writebackCacheDisable = B_FALSE; 30338fe96085Stim szeto } else { 30348fe96085Stim szeto return (STMF_ERROR_INVALID_ARG); 30358fe96085Stim szeto } 30368fe96085Stim szeto diskLu->writebackCacheDisableValid = B_TRUE; 30378fe96085Stim szeto break; 303845039663SJohn Forte case STMF_LU_PROP_ACCESS_STATE: 303945039663SJohn Forte ret = STMF_ERROR_INVALID_PROP; 304045039663SJohn Forte break; 30418fe96085Stim szeto default: 30427b506e25Ssrivijitha dugganapalli ret = STMF_ERROR_INVALID_PROP; 30438fe96085Stim szeto break; 30448fe96085Stim szeto } 30458fe96085Stim szeto return (ret); 30468fe96085Stim szeto } 30478fe96085Stim szeto 30488fe96085Stim szeto static int 30498fe96085Stim szeto checkHexUpper(char *buf) 30508fe96085Stim szeto { 30518fe96085Stim szeto int i; 30528fe96085Stim szeto 30538fe96085Stim szeto for (i = 0; i < strlen(buf); i++) { 30548fe96085Stim szeto if (isxdigit(buf[i])) { 30558fe96085Stim szeto buf[i] = toupper(buf[i]); 30568fe96085Stim szeto continue; 30578fe96085Stim szeto } 30588fe96085Stim szeto return (-1); 30598fe96085Stim szeto } 30608fe96085Stim szeto 30618fe96085Stim szeto return (0); 30628fe96085Stim szeto } 30638fe96085Stim szeto 30648fe96085Stim szeto /* 30658fe96085Stim szeto * Given a numeric suffix, convert the value into a number of bits that the 30668fe96085Stim szeto * resulting value must be shifted. 30678fe96085Stim szeto * Code lifted from libzfs_util.c 30688fe96085Stim szeto */ 30698fe96085Stim szeto static int 30708fe96085Stim szeto strToShift(const char *buf) 30718fe96085Stim szeto { 30728fe96085Stim szeto const char *ends = "BKMGTPE"; 30738fe96085Stim szeto int i; 30748fe96085Stim szeto 30758fe96085Stim szeto if (buf[0] == '\0') 30768fe96085Stim szeto return (0); 30778fe96085Stim szeto 30788fe96085Stim szeto for (i = 0; i < strlen(ends); i++) { 30798fe96085Stim szeto if (toupper(buf[0]) == ends[i]) 30808fe96085Stim szeto return (10*i); 30818fe96085Stim szeto } 30828fe96085Stim szeto 30838fe96085Stim szeto return (-1); 30848fe96085Stim szeto } 30858fe96085Stim szeto 30868fe96085Stim szeto int 30878fe96085Stim szeto stmfFreeLuResource(luResource hdl) 30888fe96085Stim szeto { 30898fe96085Stim szeto int ret = STMF_STATUS_SUCCESS; 30908fe96085Stim szeto if (hdl == NULL) { 30918fe96085Stim szeto return (STMF_ERROR_INVALID_ARG); 30928fe96085Stim szeto } 30938fe96085Stim szeto 30948fe96085Stim szeto luResourceImpl *hdlImpl = hdl; 30958fe96085Stim szeto free(hdlImpl->resource); 30968fe96085Stim szeto free(hdlImpl); 30978fe96085Stim szeto return (ret); 30988fe96085Stim szeto } 30998fe96085Stim szeto 31008fe96085Stim szeto /* 31018fe96085Stim szeto * Convert a string of the form '100G' into a real number. Used when setting 31028fe96085Stim szeto * the size of a logical unit. 31038fe96085Stim szeto * Code lifted from libzfs_util.c 31048fe96085Stim szeto */ 31058fe96085Stim szeto static int 31068fe96085Stim szeto niceStrToNum(const char *value, uint64_t *num) 31078fe96085Stim szeto { 31088fe96085Stim szeto char *end; 31098fe96085Stim szeto int shift; 31108fe96085Stim szeto 31118fe96085Stim szeto *num = 0; 31128fe96085Stim szeto 31138fe96085Stim szeto /* Check to see if this looks like a number. */ 31148fe96085Stim szeto if ((value[0] < '0' || value[0] > '9') && value[0] != '.') { 31158fe96085Stim szeto return (-1); 31168fe96085Stim szeto } 31178fe96085Stim szeto 31188fe96085Stim szeto /* Rely on stroull() to process the numeric portion. */ 31198fe96085Stim szeto errno = 0; 31208fe96085Stim szeto *num = strtoull(value, &end, 10); 31218fe96085Stim szeto 31228fe96085Stim szeto /* 31238fe96085Stim szeto * Check for ERANGE, which indicates that the value is too large to fit 31248fe96085Stim szeto * in a 64-bit value. 31258fe96085Stim szeto */ 31268fe96085Stim szeto if (errno == ERANGE) { 31278fe96085Stim szeto return (-1); 31288fe96085Stim szeto } 31298fe96085Stim szeto 31308fe96085Stim szeto /* 31318fe96085Stim szeto * If we have a decimal value, then do the computation with floating 31328fe96085Stim szeto * point arithmetic. Otherwise, use standard arithmetic. 31338fe96085Stim szeto */ 31348fe96085Stim szeto if (*end == '.') { 31358fe96085Stim szeto double fval = strtod(value, &end); 31368fe96085Stim szeto 31378fe96085Stim szeto if ((shift = strToShift(end)) == -1) { 31388fe96085Stim szeto return (-1); 31398fe96085Stim szeto } 31408fe96085Stim szeto 31418fe96085Stim szeto fval *= pow(2, shift); 31428fe96085Stim szeto 31438fe96085Stim szeto if (fval > UINT64_MAX) { 31448fe96085Stim szeto return (-1); 31458fe96085Stim szeto } 31468fe96085Stim szeto 31478fe96085Stim szeto *num = (uint64_t)fval; 31488fe96085Stim szeto } else { 31498fe96085Stim szeto if ((shift = strToShift(end)) == -1) { 31508fe96085Stim szeto return (-1); 31518fe96085Stim szeto } 31528fe96085Stim szeto 31538fe96085Stim szeto /* Check for overflow */ 31548fe96085Stim szeto if (shift >= 64 || (*num << shift) >> shift != *num) { 31558fe96085Stim szeto return (-1); 31568fe96085Stim szeto } 31578fe96085Stim szeto 31588fe96085Stim szeto *num <<= shift; 31598fe96085Stim szeto } 31608fe96085Stim szeto 31618fe96085Stim szeto return (0); 31628fe96085Stim szeto } 31638fe96085Stim szeto 31648fe96085Stim szeto /* 3165fcf3ce44SJohn Forte * stmfCreateTargetGroup 3166fcf3ce44SJohn Forte * 3167fcf3ce44SJohn Forte * Purpose: Create a local port group 3168fcf3ce44SJohn Forte * 3169fcf3ce44SJohn Forte * targetGroupName - name of local port group to create 3170fcf3ce44SJohn Forte */ 3171fcf3ce44SJohn Forte int 3172fcf3ce44SJohn Forte stmfCreateTargetGroup(stmfGroupName *targetGroupName) 3173fcf3ce44SJohn Forte { 3174fcf3ce44SJohn Forte int ret; 3175fcf3ce44SJohn Forte int fd; 3176fcf3ce44SJohn Forte 3177fcf3ce44SJohn Forte if (targetGroupName == NULL || 3178fcf3ce44SJohn Forte (strnlen((char *)targetGroupName, sizeof (stmfGroupName)) 3179fcf3ce44SJohn Forte == sizeof (stmfGroupName))) { 3180fcf3ce44SJohn Forte return (STMF_ERROR_INVALID_ARG); 3181fcf3ce44SJohn Forte } 3182fcf3ce44SJohn Forte 3183fcf3ce44SJohn Forte /* Check to ensure service exists */ 3184fcf3ce44SJohn Forte if (psCheckService() != STMF_STATUS_SUCCESS) { 3185fcf3ce44SJohn Forte return (STMF_ERROR_SERVICE_NOT_FOUND); 3186fcf3ce44SJohn Forte } 3187fcf3ce44SJohn Forte 3188fcf3ce44SJohn Forte /* call init */ 3189fcf3ce44SJohn Forte ret = initializeConfig(); 3190fcf3ce44SJohn Forte if (ret != STMF_STATUS_SUCCESS) { 3191fcf3ce44SJohn Forte return (ret); 3192fcf3ce44SJohn Forte } 3193fcf3ce44SJohn Forte 3194fcf3ce44SJohn Forte /* 3195fcf3ce44SJohn Forte * Open control node for stmf 3196fcf3ce44SJohn Forte */ 3197fcf3ce44SJohn Forte if ((ret = openStmf(OPEN_STMF, &fd)) != STMF_STATUS_SUCCESS) 3198fcf3ce44SJohn Forte return (ret); 3199fcf3ce44SJohn Forte 3200fcf3ce44SJohn Forte /* 3201fcf3ce44SJohn Forte * Add the group to the driver 3202fcf3ce44SJohn Forte */ 3203fcf3ce44SJohn Forte if ((ret = groupIoctl(fd, STMF_IOCTL_CREATE_TARGET_GROUP, 3204fcf3ce44SJohn Forte targetGroupName)) != STMF_STATUS_SUCCESS) { 3205fcf3ce44SJohn Forte goto done; 3206fcf3ce44SJohn Forte } 3207fcf3ce44SJohn Forte 32088fe96085Stim szeto if (iGetPersistMethod() == STMF_PERSIST_NONE) { 32098fe96085Stim szeto goto done; 32108fe96085Stim szeto } 32118fe96085Stim szeto 3212fcf3ce44SJohn Forte /* 3213fcf3ce44SJohn Forte * If the add to the driver was successful, add it to the persistent 3214fcf3ce44SJohn Forte * store. 3215fcf3ce44SJohn Forte */ 3216fcf3ce44SJohn Forte ret = psCreateTargetGroup((char *)targetGroupName); 3217fcf3ce44SJohn Forte switch (ret) { 3218fcf3ce44SJohn Forte case STMF_PS_SUCCESS: 3219fcf3ce44SJohn Forte ret = STMF_STATUS_SUCCESS; 3220fcf3ce44SJohn Forte break; 3221fcf3ce44SJohn Forte case STMF_PS_ERROR_EXISTS: 3222fcf3ce44SJohn Forte ret = STMF_ERROR_EXISTS; 3223fcf3ce44SJohn Forte break; 3224fcf3ce44SJohn Forte case STMF_PS_ERROR_BUSY: 3225fcf3ce44SJohn Forte ret = STMF_ERROR_BUSY; 3226fcf3ce44SJohn Forte break; 3227fcf3ce44SJohn Forte case STMF_PS_ERROR_SERVICE_NOT_FOUND: 3228fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_NOT_FOUND; 3229fcf3ce44SJohn Forte break; 3230fcf3ce44SJohn Forte case STMF_PS_ERROR_VERSION_MISMATCH: 3231fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_DATA_VERSION; 3232fcf3ce44SJohn Forte break; 3233fcf3ce44SJohn Forte default: 3234fcf3ce44SJohn Forte syslog(LOG_DEBUG, 3235fcf3ce44SJohn Forte "stmfCreateTargetGroup:psCreateTargetGroup" 3236fcf3ce44SJohn Forte ":error(%d)", ret); 3237fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR; 3238fcf3ce44SJohn Forte break; 3239fcf3ce44SJohn Forte } 3240fcf3ce44SJohn Forte 3241fcf3ce44SJohn Forte done: 3242fcf3ce44SJohn Forte (void) close(fd); 3243fcf3ce44SJohn Forte return (ret); 3244fcf3ce44SJohn Forte } 3245fcf3ce44SJohn Forte 3246fcf3ce44SJohn Forte /* 3247fcf3ce44SJohn Forte * stmfDeleteHostGroup 3248fcf3ce44SJohn Forte * 3249fcf3ce44SJohn Forte * Purpose: Delete an initiator or local port group 3250fcf3ce44SJohn Forte * 3251fcf3ce44SJohn Forte * hostGroupName - group to delete 3252fcf3ce44SJohn Forte */ 3253fcf3ce44SJohn Forte int 3254fcf3ce44SJohn Forte stmfDeleteHostGroup(stmfGroupName *hostGroupName) 3255fcf3ce44SJohn Forte { 3256fcf3ce44SJohn Forte int ret; 3257fcf3ce44SJohn Forte int fd; 3258fcf3ce44SJohn Forte 3259fcf3ce44SJohn Forte if (hostGroupName == NULL) { 3260fcf3ce44SJohn Forte return (STMF_ERROR_INVALID_ARG); 3261fcf3ce44SJohn Forte } 3262fcf3ce44SJohn Forte 3263fcf3ce44SJohn Forte /* Check to ensure service exists */ 3264fcf3ce44SJohn Forte if (psCheckService() != STMF_STATUS_SUCCESS) { 3265fcf3ce44SJohn Forte return (STMF_ERROR_SERVICE_NOT_FOUND); 3266fcf3ce44SJohn Forte } 3267fcf3ce44SJohn Forte 3268fcf3ce44SJohn Forte /* call init */ 3269fcf3ce44SJohn Forte ret = initializeConfig(); 3270fcf3ce44SJohn Forte if (ret != STMF_STATUS_SUCCESS) { 3271fcf3ce44SJohn Forte return (ret); 3272fcf3ce44SJohn Forte } 3273fcf3ce44SJohn Forte 3274fcf3ce44SJohn Forte /* 3275fcf3ce44SJohn Forte * Open control node for stmf 3276fcf3ce44SJohn Forte */ 3277fcf3ce44SJohn Forte if ((ret = openStmf(OPEN_STMF, &fd)) != STMF_STATUS_SUCCESS) 3278fcf3ce44SJohn Forte return (ret); 3279fcf3ce44SJohn Forte 3280fcf3ce44SJohn Forte /* 3281fcf3ce44SJohn Forte * Remove the group from the driver 3282fcf3ce44SJohn Forte */ 3283fcf3ce44SJohn Forte if ((ret = groupIoctl(fd, STMF_IOCTL_REMOVE_HOST_GROUP, 3284fcf3ce44SJohn Forte hostGroupName)) != STMF_STATUS_SUCCESS) { 3285fcf3ce44SJohn Forte goto done; 3286fcf3ce44SJohn Forte } 3287fcf3ce44SJohn Forte 32888fe96085Stim szeto if (iGetPersistMethod() == STMF_PERSIST_NONE) { 32898fe96085Stim szeto goto done; 32908fe96085Stim szeto } 32918fe96085Stim szeto 3292fcf3ce44SJohn Forte /* 3293fcf3ce44SJohn Forte * If the remove from the driver was successful, remove it from the 3294fcf3ce44SJohn Forte * persistent store. 3295fcf3ce44SJohn Forte */ 3296fcf3ce44SJohn Forte ret = psDeleteHostGroup((char *)hostGroupName); 3297fcf3ce44SJohn Forte switch (ret) { 3298fcf3ce44SJohn Forte case STMF_PS_SUCCESS: 3299fcf3ce44SJohn Forte ret = STMF_STATUS_SUCCESS; 3300fcf3ce44SJohn Forte break; 3301fcf3ce44SJohn Forte case STMF_PS_ERROR_NOT_FOUND: 3302fcf3ce44SJohn Forte ret = STMF_ERROR_NOT_FOUND; 3303fcf3ce44SJohn Forte break; 3304fcf3ce44SJohn Forte case STMF_PS_ERROR_BUSY: 3305fcf3ce44SJohn Forte ret = STMF_ERROR_BUSY; 3306fcf3ce44SJohn Forte break; 3307fcf3ce44SJohn Forte case STMF_PS_ERROR_SERVICE_NOT_FOUND: 3308fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_NOT_FOUND; 3309fcf3ce44SJohn Forte break; 3310fcf3ce44SJohn Forte case STMF_PS_ERROR_VERSION_MISMATCH: 3311fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_DATA_VERSION; 3312fcf3ce44SJohn Forte break; 3313fcf3ce44SJohn Forte default: 3314fcf3ce44SJohn Forte syslog(LOG_DEBUG, 3315fcf3ce44SJohn Forte "stmfDeleteHostGroup:psDeleteHostGroup:error(%d)", 3316fcf3ce44SJohn Forte ret); 3317fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR; 3318fcf3ce44SJohn Forte break; 3319fcf3ce44SJohn Forte } 3320fcf3ce44SJohn Forte 3321fcf3ce44SJohn Forte done: 3322fcf3ce44SJohn Forte (void) close(fd); 3323fcf3ce44SJohn Forte return (ret); 3324fcf3ce44SJohn Forte } 3325fcf3ce44SJohn Forte 3326fcf3ce44SJohn Forte /* 3327fcf3ce44SJohn Forte * stmfDeleteTargetGroup 3328fcf3ce44SJohn Forte * 3329fcf3ce44SJohn Forte * Purpose: Delete an initiator or local port group 3330fcf3ce44SJohn Forte * 3331fcf3ce44SJohn Forte * targetGroupName - group to delete 3332fcf3ce44SJohn Forte */ 3333fcf3ce44SJohn Forte int 3334fcf3ce44SJohn Forte stmfDeleteTargetGroup(stmfGroupName *targetGroupName) 3335fcf3ce44SJohn Forte { 3336fcf3ce44SJohn Forte int ret = STMF_STATUS_SUCCESS; 3337fcf3ce44SJohn Forte int fd; 3338fcf3ce44SJohn Forte 3339fcf3ce44SJohn Forte if (targetGroupName == NULL) { 3340fcf3ce44SJohn Forte return (STMF_ERROR_INVALID_ARG); 3341fcf3ce44SJohn Forte } 3342fcf3ce44SJohn Forte 3343fcf3ce44SJohn Forte /* Check to ensure service exists */ 3344fcf3ce44SJohn Forte if (psCheckService() != STMF_STATUS_SUCCESS) { 3345fcf3ce44SJohn Forte return (STMF_ERROR_SERVICE_NOT_FOUND); 3346fcf3ce44SJohn Forte } 3347fcf3ce44SJohn Forte 3348fcf3ce44SJohn Forte /* call init */ 3349fcf3ce44SJohn Forte ret = initializeConfig(); 3350fcf3ce44SJohn Forte if (ret != STMF_STATUS_SUCCESS) { 3351fcf3ce44SJohn Forte return (ret); 3352fcf3ce44SJohn Forte } 3353fcf3ce44SJohn Forte 3354fcf3ce44SJohn Forte /* 3355fcf3ce44SJohn Forte * Open control node for stmf 3356fcf3ce44SJohn Forte */ 3357fcf3ce44SJohn Forte if ((ret = openStmf(OPEN_STMF, &fd)) != STMF_STATUS_SUCCESS) 3358fcf3ce44SJohn Forte return (ret); 3359fcf3ce44SJohn Forte 3360fcf3ce44SJohn Forte /* 3361fcf3ce44SJohn Forte * Remove the group from the driver 3362fcf3ce44SJohn Forte */ 3363fcf3ce44SJohn Forte if ((ret = groupIoctl(fd, STMF_IOCTL_REMOVE_TARGET_GROUP, 3364fcf3ce44SJohn Forte targetGroupName)) != STMF_STATUS_SUCCESS) { 3365fcf3ce44SJohn Forte goto done; 3366fcf3ce44SJohn Forte } 3367fcf3ce44SJohn Forte 33688fe96085Stim szeto if (iGetPersistMethod() == STMF_PERSIST_NONE) { 33698fe96085Stim szeto goto done; 33708fe96085Stim szeto } 33718fe96085Stim szeto 3372fcf3ce44SJohn Forte /* 3373fcf3ce44SJohn Forte * If the remove from the driver was successful, remove it from the 3374fcf3ce44SJohn Forte * persistent store. 3375fcf3ce44SJohn Forte */ 3376fcf3ce44SJohn Forte ret = psDeleteTargetGroup((char *)targetGroupName); 3377fcf3ce44SJohn Forte switch (ret) { 3378fcf3ce44SJohn Forte case STMF_PS_SUCCESS: 3379fcf3ce44SJohn Forte ret = STMF_STATUS_SUCCESS; 3380fcf3ce44SJohn Forte break; 3381fcf3ce44SJohn Forte case STMF_PS_ERROR_NOT_FOUND: 3382fcf3ce44SJohn Forte ret = STMF_ERROR_NOT_FOUND; 3383fcf3ce44SJohn Forte break; 3384fcf3ce44SJohn Forte case STMF_PS_ERROR_BUSY: 3385fcf3ce44SJohn Forte ret = STMF_ERROR_BUSY; 3386fcf3ce44SJohn Forte break; 3387fcf3ce44SJohn Forte case STMF_PS_ERROR_SERVICE_NOT_FOUND: 3388fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_NOT_FOUND; 3389fcf3ce44SJohn Forte break; 3390fcf3ce44SJohn Forte case STMF_PS_ERROR_VERSION_MISMATCH: 3391fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_DATA_VERSION; 3392fcf3ce44SJohn Forte break; 3393fcf3ce44SJohn Forte default: 3394fcf3ce44SJohn Forte syslog(LOG_DEBUG, 3395fcf3ce44SJohn Forte "stmfDeleteTargetGroup:psDeleteTargetGroup" 3396fcf3ce44SJohn Forte ":error(%d)", ret); 3397fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR; 3398fcf3ce44SJohn Forte break; 3399fcf3ce44SJohn Forte } 3400fcf3ce44SJohn Forte 3401fcf3ce44SJohn Forte done: 3402fcf3ce44SJohn Forte (void) close(fd); 3403fcf3ce44SJohn Forte return (ret); 3404fcf3ce44SJohn Forte } 3405fcf3ce44SJohn Forte 3406fcf3ce44SJohn Forte /* 3407fcf3ce44SJohn Forte * stmfDevidFromIscsiName 3408fcf3ce44SJohn Forte * 3409fcf3ce44SJohn Forte * Purpose: convert an iSCSI name to an stmf devid 3410fcf3ce44SJohn Forte * 3411fcf3ce44SJohn Forte * iscsiName - unicode nul terminated utf-8 encoded iSCSI name 3412fcf3ce44SJohn Forte * devid - on success, contains the converted iscsi name 3413fcf3ce44SJohn Forte */ 3414fcf3ce44SJohn Forte int 3415fcf3ce44SJohn Forte stmfDevidFromIscsiName(char *iscsiName, stmfDevid *devid) 3416fcf3ce44SJohn Forte { 3417fcf3ce44SJohn Forte if (devid == NULL || iscsiName == NULL) 3418fcf3ce44SJohn Forte return (STMF_ERROR_INVALID_ARG); 3419fcf3ce44SJohn Forte 3420fcf3ce44SJohn Forte bzero(devid, sizeof (stmfDevid)); 3421fcf3ce44SJohn Forte 3422fcf3ce44SJohn Forte /* Validate size of target */ 3423fcf3ce44SJohn Forte if ((devid->identLength = strlen(iscsiName)) > MAX_ISCSI_NAME || 3424fcf3ce44SJohn Forte devid->identLength < strlen(EUI) || 3425fcf3ce44SJohn Forte devid->identLength < strlen(IQN)) { 3426fcf3ce44SJohn Forte return (STMF_ERROR_INVALID_ARG); 3427fcf3ce44SJohn Forte } 3428fcf3ce44SJohn Forte 3429fcf3ce44SJohn Forte if ((strncmp(iscsiName, EUI, strlen(EUI)) != 0) && 3430fcf3ce44SJohn Forte strncmp(iscsiName, IQN, strlen(IQN)) != 0) { 3431fcf3ce44SJohn Forte return (STMF_ERROR_INVALID_ARG); 3432fcf3ce44SJohn Forte } 3433fcf3ce44SJohn Forte 3434fcf3ce44SJohn Forte /* copy UTF-8 bytes to ident */ 3435fcf3ce44SJohn Forte bcopy(iscsiName, devid->ident, devid->identLength); 3436fcf3ce44SJohn Forte 3437fcf3ce44SJohn Forte return (STMF_STATUS_SUCCESS); 3438fcf3ce44SJohn Forte } 3439fcf3ce44SJohn Forte 3440fcf3ce44SJohn Forte /* 3441fcf3ce44SJohn Forte * stmfDevidFromWwn 3442fcf3ce44SJohn Forte * 3443fcf3ce44SJohn Forte * Purpose: convert a WWN to an stmf devid 3444fcf3ce44SJohn Forte * 3445fcf3ce44SJohn Forte * wwn - 8-byte wwn identifier 3446fcf3ce44SJohn Forte * devid - on success, contains the converted wwn 3447fcf3ce44SJohn Forte */ 3448fcf3ce44SJohn Forte int 3449fcf3ce44SJohn Forte stmfDevidFromWwn(uchar_t *wwn, stmfDevid *devid) 3450fcf3ce44SJohn Forte { 3451fcf3ce44SJohn Forte if (wwn == NULL || devid == NULL) 3452fcf3ce44SJohn Forte return (STMF_ERROR_INVALID_ARG); 3453fcf3ce44SJohn Forte 3454fcf3ce44SJohn Forte bzero(devid, sizeof (stmfDevid)); 3455fcf3ce44SJohn Forte 3456fcf3ce44SJohn Forte /* Copy eui prefix */ 3457fcf3ce44SJohn Forte (void) bcopy(WWN, devid->ident, strlen(WWN)); 3458fcf3ce44SJohn Forte 3459fcf3ce44SJohn Forte /* Convert to ASCII uppercase hexadecimal string */ 3460fcf3ce44SJohn Forte (void) snprintf((char *)&devid->ident[strlen(WWN)], 3461fcf3ce44SJohn Forte sizeof (devid->ident), "%02X%02X%02X%02X%02X%02X%02X%02X", 3462fcf3ce44SJohn Forte wwn[0], wwn[1], wwn[2], wwn[3], wwn[4], wwn[5], wwn[6], wwn[7]); 3463fcf3ce44SJohn Forte 3464fcf3ce44SJohn Forte devid->identLength = strlen((char *)devid->ident); 3465fcf3ce44SJohn Forte 3466fcf3ce44SJohn Forte return (STMF_STATUS_SUCCESS); 3467fcf3ce44SJohn Forte } 3468fcf3ce44SJohn Forte 3469fcf3ce44SJohn Forte /* 3470fcf3ce44SJohn Forte * stmfFreeMemory 3471fcf3ce44SJohn Forte * 3472fcf3ce44SJohn Forte * Purpose: Free memory allocated by this library 3473fcf3ce44SJohn Forte * 3474fcf3ce44SJohn Forte * memory - previously allocated pointer of memory managed by library 3475fcf3ce44SJohn Forte */ 3476fcf3ce44SJohn Forte void 3477fcf3ce44SJohn Forte stmfFreeMemory(void *memory) 3478fcf3ce44SJohn Forte { 3479fcf3ce44SJohn Forte free(memory); 3480fcf3ce44SJohn Forte } 3481fcf3ce44SJohn Forte 3482fcf3ce44SJohn Forte /* 34838fe96085Stim szeto * get host group, target group list from stmf 3484fcf3ce44SJohn Forte * 34858fe96085Stim szeto * groupType - HOST_GROUP, TARGET_GROUP 3486fcf3ce44SJohn Forte */ 34878fe96085Stim szeto static int 34888fe96085Stim szeto groupListIoctl(stmfGroupList **groupList, int groupType) 3489fcf3ce44SJohn Forte { 3490fcf3ce44SJohn Forte int ret; 34918fe96085Stim szeto int fd; 34928fe96085Stim szeto int ioctlRet; 34938fe96085Stim szeto int i; 34948fe96085Stim szeto int cmd; 34958fe96085Stim szeto stmf_iocdata_t stmfIoctl; 34968fe96085Stim szeto /* framework group list */ 34978fe96085Stim szeto stmf_group_name_t *iGroupList = NULL; 34988fe96085Stim szeto uint32_t groupListSize; 3499fcf3ce44SJohn Forte 35008fe96085Stim szeto if (groupList == NULL) { 3501fcf3ce44SJohn Forte return (STMF_ERROR_INVALID_ARG); 3502fcf3ce44SJohn Forte } 3503fcf3ce44SJohn Forte 35048fe96085Stim szeto if (groupType == HOST_GROUP) { 35058fe96085Stim szeto cmd = STMF_IOCTL_GET_HG_LIST; 35068fe96085Stim szeto } else if (groupType == TARGET_GROUP) { 35078fe96085Stim szeto cmd = STMF_IOCTL_GET_TG_LIST; 35088fe96085Stim szeto } else { 35098fe96085Stim szeto return (STMF_ERROR_INVALID_ARG); 35108fe96085Stim szeto } 35118fe96085Stim szeto 35128fe96085Stim szeto /* call init */ 35138fe96085Stim szeto ret = initializeConfig(); 35148fe96085Stim szeto if (ret != STMF_STATUS_SUCCESS) { 35158fe96085Stim szeto return (ret); 35168fe96085Stim szeto } 35178fe96085Stim szeto 35188fe96085Stim szeto /* 35198fe96085Stim szeto * Open control node for stmf 35208fe96085Stim szeto */ 35218fe96085Stim szeto if ((ret = openStmf(OPEN_STMF, &fd)) != STMF_STATUS_SUCCESS) 35228fe96085Stim szeto return (ret); 35238fe96085Stim szeto 35248fe96085Stim szeto /* 35258fe96085Stim szeto * Allocate ioctl input buffer 35268fe96085Stim szeto */ 35278fe96085Stim szeto groupListSize = ALLOC_GROUP; 35288fe96085Stim szeto groupListSize = groupListSize * (sizeof (stmf_group_name_t)); 35298fe96085Stim szeto iGroupList = (stmf_group_name_t *)calloc(1, groupListSize); 35308fe96085Stim szeto if (iGroupList == NULL) { 35318fe96085Stim szeto ret = STMF_ERROR_NOMEM; 35328fe96085Stim szeto goto done; 35338fe96085Stim szeto } 35348fe96085Stim szeto 35358fe96085Stim szeto bzero(&stmfIoctl, sizeof (stmfIoctl)); 35368fe96085Stim szeto /* 35378fe96085Stim szeto * Issue ioctl to get the group list 35388fe96085Stim szeto */ 35398fe96085Stim szeto stmfIoctl.stmf_version = STMF_VERSION_1; 35408fe96085Stim szeto stmfIoctl.stmf_obuf_size = groupListSize; 35418fe96085Stim szeto stmfIoctl.stmf_obuf = (uint64_t)(unsigned long)iGroupList; 35428fe96085Stim szeto ioctlRet = ioctl(fd, cmd, &stmfIoctl); 35438fe96085Stim szeto if (ioctlRet != 0) { 35448fe96085Stim szeto switch (errno) { 35458fe96085Stim szeto case EBUSY: 35468fe96085Stim szeto ret = STMF_ERROR_BUSY; 35478fe96085Stim szeto break; 35488fe96085Stim szeto case EPERM: 35498fe96085Stim szeto case EACCES: 35508fe96085Stim szeto ret = STMF_ERROR_PERM; 35518fe96085Stim szeto break; 35528fe96085Stim szeto default: 35538fe96085Stim szeto syslog(LOG_DEBUG, 35548fe96085Stim szeto "groupListIoctl:ioctl errno(%d)", 35558fe96085Stim szeto errno); 35568fe96085Stim szeto ret = STMF_STATUS_ERROR; 35578fe96085Stim szeto break; 35588fe96085Stim szeto } 35598fe96085Stim szeto goto done; 35608fe96085Stim szeto } 35618fe96085Stim szeto /* 35628fe96085Stim szeto * Check whether input buffer was large enough 35638fe96085Stim szeto */ 35648fe96085Stim szeto if (stmfIoctl.stmf_obuf_max_nentries > ALLOC_GROUP) { 35658fe96085Stim szeto groupListSize = stmfIoctl.stmf_obuf_max_nentries * 35668fe96085Stim szeto sizeof (stmf_group_name_t); 35678fe96085Stim szeto iGroupList = realloc(iGroupList, groupListSize); 35688fe96085Stim szeto if (iGroupList == NULL) { 35698fe96085Stim szeto ret = STMF_ERROR_NOMEM; 35708fe96085Stim szeto goto done; 35718fe96085Stim szeto } 35728fe96085Stim szeto stmfIoctl.stmf_obuf_size = groupListSize; 35738fe96085Stim szeto stmfIoctl.stmf_obuf = (uint64_t)(unsigned long)iGroupList; 35748fe96085Stim szeto ioctlRet = ioctl(fd, cmd, &stmfIoctl); 35758fe96085Stim szeto if (ioctlRet != 0) { 35768fe96085Stim szeto switch (errno) { 35778fe96085Stim szeto case EBUSY: 35788fe96085Stim szeto ret = STMF_ERROR_BUSY; 35798fe96085Stim szeto break; 35808fe96085Stim szeto case EPERM: 35818fe96085Stim szeto case EACCES: 35828fe96085Stim szeto ret = STMF_ERROR_PERM; 35838fe96085Stim szeto break; 35848fe96085Stim szeto default: 35858fe96085Stim szeto syslog(LOG_DEBUG, 35868fe96085Stim szeto "groupListIoctl:ioctl errno(%d)", 35878fe96085Stim szeto errno); 35888fe96085Stim szeto ret = STMF_STATUS_ERROR; 35898fe96085Stim szeto break; 35908fe96085Stim szeto } 35918fe96085Stim szeto goto done; 35928fe96085Stim szeto } 35938fe96085Stim szeto } 35948fe96085Stim szeto 35958fe96085Stim szeto /* allocate and copy to caller's buffer */ 35964f2997b2Ssrivijitha dugganapalli *groupList = (stmfGroupList *)calloc(1, sizeof (stmfGroupList) + 35974f2997b2Ssrivijitha dugganapalli sizeof (stmfGroupName) * stmfIoctl.stmf_obuf_nentries); 35988fe96085Stim szeto if (*groupList == NULL) { 35998fe96085Stim szeto ret = STMF_ERROR_NOMEM; 36008fe96085Stim szeto goto done; 36018fe96085Stim szeto } 36028fe96085Stim szeto (*groupList)->cnt = stmfIoctl.stmf_obuf_nentries; 36038fe96085Stim szeto for (i = 0; i < stmfIoctl.stmf_obuf_nentries; i++) { 36042f624233SNattuvetty Bhavyan bcopy(iGroupList[i].name, (*groupList)->name[i], 36058fe96085Stim szeto sizeof (stmfGroupName)); 36068fe96085Stim szeto } 36078fe96085Stim szeto 36088fe96085Stim szeto done: 36098fe96085Stim szeto free(iGroupList); 36108fe96085Stim szeto (void) close(fd); 36118fe96085Stim szeto return (ret); 36128fe96085Stim szeto } 36138fe96085Stim szeto 36148fe96085Stim szeto /* 36158fe96085Stim szeto * get host group members, target group members from stmf 36168fe96085Stim szeto * 36178fe96085Stim szeto * groupProps - allocated on success 36188fe96085Stim szeto * 36198fe96085Stim szeto * groupType - HOST_GROUP, TARGET_GROUP 36208fe96085Stim szeto */ 36218fe96085Stim szeto static int 36228fe96085Stim szeto groupMemberListIoctl(stmfGroupName *groupName, stmfGroupProperties **groupProps, 36238fe96085Stim szeto int groupType) 36248fe96085Stim szeto { 36258fe96085Stim szeto int ret; 36268fe96085Stim szeto int fd; 36278fe96085Stim szeto int ioctlRet; 36288fe96085Stim szeto int i; 36298fe96085Stim szeto int cmd; 36308fe96085Stim szeto stmf_iocdata_t stmfIoctl; 36318fe96085Stim szeto /* framework group list */ 36328fe96085Stim szeto stmf_group_name_t iGroupName; 36338fe96085Stim szeto stmf_ge_ident_t *iGroupMembers; 36348fe96085Stim szeto uint32_t groupListSize; 36358fe96085Stim szeto 36368fe96085Stim szeto if (groupName == NULL) { 36378fe96085Stim szeto return (STMF_ERROR_INVALID_ARG); 36388fe96085Stim szeto } 36398fe96085Stim szeto 36408fe96085Stim szeto if (groupType == HOST_GROUP) { 36418fe96085Stim szeto cmd = STMF_IOCTL_GET_HG_ENTRIES; 36428fe96085Stim szeto } else if (groupType == TARGET_GROUP) { 36438fe96085Stim szeto cmd = STMF_IOCTL_GET_TG_ENTRIES; 36448fe96085Stim szeto } else { 36458fe96085Stim szeto return (STMF_ERROR_INVALID_ARG); 36468fe96085Stim szeto } 36478fe96085Stim szeto 36488fe96085Stim szeto /* call init */ 36498fe96085Stim szeto ret = initializeConfig(); 36508fe96085Stim szeto if (ret != STMF_STATUS_SUCCESS) { 36518fe96085Stim szeto return (ret); 36528fe96085Stim szeto } 36538fe96085Stim szeto 36548fe96085Stim szeto /* 36558fe96085Stim szeto * Open control node for stmf 36568fe96085Stim szeto */ 36578fe96085Stim szeto if ((ret = openStmf(OPEN_STMF, &fd)) != STMF_STATUS_SUCCESS) 36588fe96085Stim szeto return (ret); 36598fe96085Stim szeto 36608fe96085Stim szeto bzero(&iGroupName, sizeof (iGroupName)); 36618fe96085Stim szeto 36628fe96085Stim szeto bcopy(groupName, &iGroupName.name, strlen((char *)groupName)); 36638fe96085Stim szeto 36648fe96085Stim szeto iGroupName.name_size = strlen((char *)groupName); 36658fe96085Stim szeto 36668fe96085Stim szeto /* 36678fe96085Stim szeto * Allocate ioctl input buffer 36688fe96085Stim szeto */ 36698fe96085Stim szeto groupListSize = ALLOC_GRP_MEMBER; 36708fe96085Stim szeto groupListSize = groupListSize * (sizeof (stmf_ge_ident_t)); 36718fe96085Stim szeto iGroupMembers = (stmf_ge_ident_t *)calloc(1, groupListSize); 36728fe96085Stim szeto if (iGroupMembers == NULL) { 36738fe96085Stim szeto ret = STMF_ERROR_NOMEM; 36748fe96085Stim szeto goto done; 36758fe96085Stim szeto } 36768fe96085Stim szeto 36778fe96085Stim szeto bzero(&stmfIoctl, sizeof (stmfIoctl)); 36788fe96085Stim szeto /* 36798fe96085Stim szeto * Issue ioctl to get the group list 36808fe96085Stim szeto */ 36818fe96085Stim szeto stmfIoctl.stmf_version = STMF_VERSION_1; 36828fe96085Stim szeto stmfIoctl.stmf_ibuf = (uint64_t)(unsigned long)&iGroupName; 36838fe96085Stim szeto stmfIoctl.stmf_ibuf_size = sizeof (stmf_group_name_t); 36848fe96085Stim szeto stmfIoctl.stmf_obuf_size = groupListSize; 36858fe96085Stim szeto stmfIoctl.stmf_obuf = (uint64_t)(unsigned long)iGroupMembers; 36868fe96085Stim szeto ioctlRet = ioctl(fd, cmd, &stmfIoctl); 36878fe96085Stim szeto if (ioctlRet != 0) { 36888fe96085Stim szeto switch (errno) { 36898fe96085Stim szeto case EBUSY: 36908fe96085Stim szeto ret = STMF_ERROR_BUSY; 36918fe96085Stim szeto break; 36928fe96085Stim szeto case EPERM: 36938fe96085Stim szeto case EACCES: 36948fe96085Stim szeto ret = STMF_ERROR_PERM; 36958fe96085Stim szeto break; 36968fe96085Stim szeto default: 36978fe96085Stim szeto syslog(LOG_DEBUG, 36988fe96085Stim szeto "groupListIoctl:ioctl errno(%d)", 36998fe96085Stim szeto errno); 37008fe96085Stim szeto ret = STMF_STATUS_ERROR; 37018fe96085Stim szeto break; 37028fe96085Stim szeto } 37038fe96085Stim szeto goto done; 37048fe96085Stim szeto } 37058fe96085Stim szeto /* 37068fe96085Stim szeto * Check whether input buffer was large enough 37078fe96085Stim szeto */ 37088fe96085Stim szeto if (stmfIoctl.stmf_obuf_max_nentries > ALLOC_GRP_MEMBER) { 37098fe96085Stim szeto groupListSize = stmfIoctl.stmf_obuf_max_nentries * 37108fe96085Stim szeto sizeof (stmf_ge_ident_t); 37118fe96085Stim szeto iGroupMembers = realloc(iGroupMembers, groupListSize); 37128fe96085Stim szeto if (iGroupMembers == NULL) { 37138fe96085Stim szeto ret = STMF_ERROR_NOMEM; 37148fe96085Stim szeto goto done; 37158fe96085Stim szeto } 37168fe96085Stim szeto stmfIoctl.stmf_ibuf = (uint64_t)(unsigned long)&iGroupName; 37178fe96085Stim szeto stmfIoctl.stmf_ibuf_size = sizeof (stmf_group_name_t); 37188fe96085Stim szeto stmfIoctl.stmf_obuf_size = groupListSize; 37198fe96085Stim szeto stmfIoctl.stmf_obuf = (uint64_t)(unsigned long)iGroupMembers; 37208fe96085Stim szeto ioctlRet = ioctl(fd, cmd, &stmfIoctl); 37218fe96085Stim szeto if (ioctlRet != 0) { 37228fe96085Stim szeto switch (errno) { 37238fe96085Stim szeto case EBUSY: 37248fe96085Stim szeto ret = STMF_ERROR_BUSY; 37258fe96085Stim szeto break; 37268fe96085Stim szeto case EPERM: 37278fe96085Stim szeto case EACCES: 37288fe96085Stim szeto ret = STMF_ERROR_PERM; 37298fe96085Stim szeto break; 37308fe96085Stim szeto default: 37318fe96085Stim szeto syslog(LOG_DEBUG, 37328fe96085Stim szeto "groupListIoctl:ioctl errno(%d)", 37338fe96085Stim szeto errno); 37348fe96085Stim szeto ret = STMF_STATUS_ERROR; 37358fe96085Stim szeto break; 37368fe96085Stim szeto } 37378fe96085Stim szeto goto done; 37388fe96085Stim szeto } 37398fe96085Stim szeto } 37408fe96085Stim szeto 37418fe96085Stim szeto /* allocate and copy to caller's buffer */ 37428fe96085Stim szeto *groupProps = (stmfGroupProperties *)calloc(1, 37434f2997b2Ssrivijitha dugganapalli sizeof (stmfGroupProperties) + 37444f2997b2Ssrivijitha dugganapalli sizeof (stmfDevid) * stmfIoctl.stmf_obuf_nentries); 37458fe96085Stim szeto if (*groupProps == NULL) { 37468fe96085Stim szeto ret = STMF_ERROR_NOMEM; 37478fe96085Stim szeto goto done; 37488fe96085Stim szeto } 37498fe96085Stim szeto (*groupProps)->cnt = stmfIoctl.stmf_obuf_nentries; 37508fe96085Stim szeto for (i = 0; i < stmfIoctl.stmf_obuf_nentries; i++) { 37518fe96085Stim szeto (*groupProps)->name[i].identLength = 37522f624233SNattuvetty Bhavyan iGroupMembers[i].ident_size; 37532f624233SNattuvetty Bhavyan bcopy(iGroupMembers[i].ident, (*groupProps)->name[i].ident, 37542f624233SNattuvetty Bhavyan iGroupMembers[i].ident_size); 37558fe96085Stim szeto } 37568fe96085Stim szeto 37578fe96085Stim szeto done: 37588fe96085Stim szeto free(iGroupMembers); 37598fe96085Stim szeto (void) close(fd); 37608fe96085Stim szeto return (ret); 37618fe96085Stim szeto } 37628fe96085Stim szeto 37638fe96085Stim szeto /* 37648fe96085Stim szeto * Purpose: access persistent config data for host groups and target groups 37658fe96085Stim szeto */ 37668fe96085Stim szeto static int 37678fe96085Stim szeto iLoadGroupFromPs(stmfGroupList **groupList, int type) 37688fe96085Stim szeto { 37698fe96085Stim szeto int ret; 37708fe96085Stim szeto 37718fe96085Stim szeto if (groupList == NULL) { 37728fe96085Stim szeto return (STMF_ERROR_INVALID_ARG); 37738fe96085Stim szeto } 37748fe96085Stim szeto 37758fe96085Stim szeto if (type == HOST_GROUP) { 37768fe96085Stim szeto ret = psGetHostGroupList(groupList); 37778fe96085Stim szeto } else if (type == TARGET_GROUP) { 37788fe96085Stim szeto ret = psGetTargetGroupList(groupList); 37798fe96085Stim szeto } else { 37808fe96085Stim szeto return (STMF_ERROR_INVALID_ARG); 37818fe96085Stim szeto } 3782fcf3ce44SJohn Forte switch (ret) { 3783fcf3ce44SJohn Forte case STMF_PS_SUCCESS: 3784fcf3ce44SJohn Forte ret = STMF_STATUS_SUCCESS; 3785fcf3ce44SJohn Forte break; 3786fcf3ce44SJohn Forte case STMF_PS_ERROR_NOT_FOUND: 3787fcf3ce44SJohn Forte ret = STMF_ERROR_NOT_FOUND; 3788fcf3ce44SJohn Forte break; 3789fcf3ce44SJohn Forte case STMF_PS_ERROR_BUSY: 3790fcf3ce44SJohn Forte ret = STMF_ERROR_BUSY; 3791fcf3ce44SJohn Forte break; 3792fcf3ce44SJohn Forte case STMF_PS_ERROR_SERVICE_NOT_FOUND: 3793fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_NOT_FOUND; 3794fcf3ce44SJohn Forte break; 3795fcf3ce44SJohn Forte case STMF_PS_ERROR_VERSION_MISMATCH: 3796fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_DATA_VERSION; 3797fcf3ce44SJohn Forte break; 3798fcf3ce44SJohn Forte default: 3799fcf3ce44SJohn Forte syslog(LOG_DEBUG, 3800fcf3ce44SJohn Forte "stmfGetHostGroupList:psGetHostGroupList:error(%d)", 3801fcf3ce44SJohn Forte ret); 3802fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR; 3803fcf3ce44SJohn Forte break; 3804fcf3ce44SJohn Forte } 3805fcf3ce44SJohn Forte 3806fcf3ce44SJohn Forte return (ret); 3807fcf3ce44SJohn Forte } 3808fcf3ce44SJohn Forte 3809fcf3ce44SJohn Forte /* 38108fe96085Stim szeto * stmfGetHostGroupList 3811fcf3ce44SJohn Forte * 38128fe96085Stim szeto * Purpose: Retrieves the list of initiator group oids 3813fcf3ce44SJohn Forte * 38148fe96085Stim szeto * hostGroupList - pointer to pointer to hostGroupList structure 38158fe96085Stim szeto * on success, this contains the host group list. 3816fcf3ce44SJohn Forte */ 3817fcf3ce44SJohn Forte int 38188fe96085Stim szeto stmfGetHostGroupList(stmfGroupList **hostGroupList) 3819fcf3ce44SJohn Forte { 38208fe96085Stim szeto int ret = STMF_STATUS_ERROR; 3821fcf3ce44SJohn Forte 38228fe96085Stim szeto if (hostGroupList == NULL) { 3823fcf3ce44SJohn Forte return (STMF_ERROR_INVALID_ARG); 3824fcf3ce44SJohn Forte } 3825fcf3ce44SJohn Forte 38268fe96085Stim szeto ret = groupListIoctl(hostGroupList, HOST_GROUP); 38278fe96085Stim szeto return (ret); 38288fe96085Stim szeto } 38298fe96085Stim szeto 38308fe96085Stim szeto 38318fe96085Stim szeto /* 38328fe96085Stim szeto * Purpose: access persistent config data for host groups and target groups 38338fe96085Stim szeto */ 38348fe96085Stim szeto static int 38358fe96085Stim szeto iLoadGroupMembersFromPs(stmfGroupName *groupName, 38368fe96085Stim szeto stmfGroupProperties **groupProp, int type) 38378fe96085Stim szeto { 38388fe96085Stim szeto int ret; 38398fe96085Stim szeto 38408fe96085Stim szeto if (groupName == NULL) { 38418fe96085Stim szeto return (STMF_ERROR_INVALID_ARG); 38428fe96085Stim szeto } 38438fe96085Stim szeto 38448fe96085Stim szeto if (type == HOST_GROUP) { 3845fcf3ce44SJohn Forte ret = psGetHostGroupMemberList((char *)groupName, groupProp); 38468fe96085Stim szeto } else if (type == TARGET_GROUP) { 38478fe96085Stim szeto ret = psGetTargetGroupMemberList((char *)groupName, groupProp); 38488fe96085Stim szeto } else { 38498fe96085Stim szeto return (STMF_ERROR_INVALID_ARG); 38508fe96085Stim szeto } 3851fcf3ce44SJohn Forte switch (ret) { 3852fcf3ce44SJohn Forte case STMF_PS_SUCCESS: 3853fcf3ce44SJohn Forte ret = STMF_STATUS_SUCCESS; 3854fcf3ce44SJohn Forte break; 3855fcf3ce44SJohn Forte case STMF_PS_ERROR_NOT_FOUND: 3856fcf3ce44SJohn Forte ret = STMF_ERROR_NOT_FOUND; 3857fcf3ce44SJohn Forte break; 3858fcf3ce44SJohn Forte case STMF_PS_ERROR_BUSY: 3859fcf3ce44SJohn Forte ret = STMF_ERROR_BUSY; 3860fcf3ce44SJohn Forte break; 3861fcf3ce44SJohn Forte case STMF_PS_ERROR_SERVICE_NOT_FOUND: 3862fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_NOT_FOUND; 3863fcf3ce44SJohn Forte break; 3864fcf3ce44SJohn Forte case STMF_PS_ERROR_VERSION_MISMATCH: 3865fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_DATA_VERSION; 3866fcf3ce44SJohn Forte break; 3867fcf3ce44SJohn Forte default: 3868fcf3ce44SJohn Forte syslog(LOG_DEBUG, 38698fe96085Stim szeto "iLoadGroupMembersFromPs:psGetHostGroupList:" 38708fe96085Stim szeto "error(%d)", ret); 3871fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR; 3872fcf3ce44SJohn Forte break; 3873fcf3ce44SJohn Forte } 3874fcf3ce44SJohn Forte 3875fcf3ce44SJohn Forte return (ret); 3876fcf3ce44SJohn Forte } 3877fcf3ce44SJohn Forte 3878fcf3ce44SJohn Forte /* 38798fe96085Stim szeto * stmfGetHostGroupMembers 38808fe96085Stim szeto * 38818fe96085Stim szeto * Purpose: Retrieves the group properties for a host group 38828fe96085Stim szeto * 38838fe96085Stim szeto * groupName - name of group for which to retrieve host group members. 38848fe96085Stim szeto * groupProp - pointer to pointer to stmfGroupProperties structure 38858fe96085Stim szeto * on success, this contains the list of group members. 38868fe96085Stim szeto */ 38878fe96085Stim szeto int 38888fe96085Stim szeto stmfGetHostGroupMembers(stmfGroupName *groupName, 38898fe96085Stim szeto stmfGroupProperties **groupProp) 38908fe96085Stim szeto { 38918fe96085Stim szeto int ret; 38928fe96085Stim szeto 38938fe96085Stim szeto if (groupName == NULL || groupProp == NULL) { 38948fe96085Stim szeto return (STMF_ERROR_INVALID_ARG); 38958fe96085Stim szeto } 38968fe96085Stim szeto 38978fe96085Stim szeto ret = groupMemberListIoctl(groupName, groupProp, HOST_GROUP); 38988fe96085Stim szeto 38998fe96085Stim szeto return (ret); 39008fe96085Stim szeto } 39018fe96085Stim szeto 39028fe96085Stim szeto /* 3903fcf3ce44SJohn Forte * stmfGetProviderData 3904fcf3ce44SJohn Forte * 3905fcf3ce44SJohn Forte * Purpose: Get provider data list 3906fcf3ce44SJohn Forte * 3907fcf3ce44SJohn Forte * providerName - name of provider for which to retrieve the data 3908fcf3ce44SJohn Forte * nvl - pointer to nvlist_t pointer which will contain the nvlist data 3909fcf3ce44SJohn Forte * retrieved. 3910fcf3ce44SJohn Forte * providerType - type of provider for which to retrieve data. 3911fcf3ce44SJohn Forte * STMF_LU_PROVIDER_TYPE 3912fcf3ce44SJohn Forte * STMF_PORT_PROVIDER_TYPE 3913fcf3ce44SJohn Forte */ 3914fcf3ce44SJohn Forte int 3915fcf3ce44SJohn Forte stmfGetProviderData(char *providerName, nvlist_t **nvl, int providerType) 3916fcf3ce44SJohn Forte { 3917fcf3ce44SJohn Forte return (stmfGetProviderDataProt(providerName, nvl, providerType, 3918fcf3ce44SJohn Forte NULL)); 3919fcf3ce44SJohn Forte } 3920fcf3ce44SJohn Forte 3921fcf3ce44SJohn Forte /* 3922fcf3ce44SJohn Forte * stmfGetProviderDataProt 3923fcf3ce44SJohn Forte * 3924fcf3ce44SJohn Forte * Purpose: Get provider data list with token 3925fcf3ce44SJohn Forte * 3926fcf3ce44SJohn Forte * providerName - name of provider for which to retrieve the data 3927fcf3ce44SJohn Forte * nvl - pointer to nvlist_t pointer which will contain the nvlist data 3928fcf3ce44SJohn Forte * retrieved. 3929fcf3ce44SJohn Forte * providerType - type of provider for which to retrieve data. 3930fcf3ce44SJohn Forte * STMF_LU_PROVIDER_TYPE 3931fcf3ce44SJohn Forte * STMF_PORT_PROVIDER_TYPE 3932fcf3ce44SJohn Forte * setToken - Returns the stale data token 3933fcf3ce44SJohn Forte */ 3934fcf3ce44SJohn Forte int 3935fcf3ce44SJohn Forte stmfGetProviderDataProt(char *providerName, nvlist_t **nvl, int providerType, 3936fcf3ce44SJohn Forte uint64_t *setToken) 3937fcf3ce44SJohn Forte { 3938fcf3ce44SJohn Forte int ret; 3939fcf3ce44SJohn Forte 3940fcf3ce44SJohn Forte if (providerName == NULL || nvl == NULL) { 3941fcf3ce44SJohn Forte return (STMF_ERROR_INVALID_ARG); 3942fcf3ce44SJohn Forte } 3943fcf3ce44SJohn Forte if (providerType != STMF_LU_PROVIDER_TYPE && 3944fcf3ce44SJohn Forte providerType != STMF_PORT_PROVIDER_TYPE) { 3945fcf3ce44SJohn Forte return (STMF_ERROR_INVALID_ARG); 3946fcf3ce44SJohn Forte } 3947fcf3ce44SJohn Forte /* call init */ 3948fcf3ce44SJohn Forte ret = initializeConfig(); 3949fcf3ce44SJohn Forte if (ret != STMF_STATUS_SUCCESS) { 3950fcf3ce44SJohn Forte return (ret); 3951fcf3ce44SJohn Forte } 39528fe96085Stim szeto return (getProviderData(providerName, nvl, providerType, setToken)); 3953fcf3ce44SJohn Forte } 3954fcf3ce44SJohn Forte 3955fcf3ce44SJohn Forte /* 3956fcf3ce44SJohn Forte * stmfGetProviderDataList 3957fcf3ce44SJohn Forte * 3958fcf3ce44SJohn Forte * Purpose: Get the list of providers currently persisting data 3959fcf3ce44SJohn Forte * 3960fcf3ce44SJohn Forte * providerList - pointer to pointer to an stmfProviderList structure allocated 3961fcf3ce44SJohn Forte * by the caller. Will contain the list of providers on success. 3962fcf3ce44SJohn Forte */ 3963fcf3ce44SJohn Forte int 3964fcf3ce44SJohn Forte stmfGetProviderDataList(stmfProviderList **providerList) 3965fcf3ce44SJohn Forte { 3966fcf3ce44SJohn Forte int ret; 3967fcf3ce44SJohn Forte 3968fcf3ce44SJohn Forte ret = psGetProviderDataList(providerList); 3969fcf3ce44SJohn Forte switch (ret) { 3970fcf3ce44SJohn Forte case STMF_PS_SUCCESS: 3971fcf3ce44SJohn Forte ret = STMF_STATUS_SUCCESS; 3972fcf3ce44SJohn Forte break; 3973fcf3ce44SJohn Forte case STMF_PS_ERROR_BUSY: 3974fcf3ce44SJohn Forte ret = STMF_ERROR_BUSY; 3975fcf3ce44SJohn Forte break; 3976fcf3ce44SJohn Forte case STMF_PS_ERROR_SERVICE_NOT_FOUND: 3977fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_NOT_FOUND; 3978fcf3ce44SJohn Forte break; 3979fcf3ce44SJohn Forte case STMF_PS_ERROR_VERSION_MISMATCH: 3980fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_DATA_VERSION; 3981fcf3ce44SJohn Forte break; 3982fcf3ce44SJohn Forte default: 3983fcf3ce44SJohn Forte syslog(LOG_DEBUG, 3984fcf3ce44SJohn Forte "stmfGetProviderDataList:psGetProviderDataList" 3985fcf3ce44SJohn Forte ":error(%d)", ret); 3986fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR; 3987fcf3ce44SJohn Forte break; 3988fcf3ce44SJohn Forte } 3989fcf3ce44SJohn Forte 3990fcf3ce44SJohn Forte return (ret); 3991fcf3ce44SJohn Forte } 3992fcf3ce44SJohn Forte 3993fcf3ce44SJohn Forte 3994fcf3ce44SJohn Forte /* 3995fcf3ce44SJohn Forte * stmfGetSessionList 3996fcf3ce44SJohn Forte * 3997fcf3ce44SJohn Forte * Purpose: Retrieves the session list for a target (devid) 3998fcf3ce44SJohn Forte * 3999fcf3ce44SJohn Forte * devid - devid of target for which to retrieve session information. 4000fcf3ce44SJohn Forte * sessionList - pointer to pointer to stmfSessionList structure 4001fcf3ce44SJohn Forte * on success, this contains the list of initiator sessions. 4002fcf3ce44SJohn Forte */ 4003fcf3ce44SJohn Forte int 4004fcf3ce44SJohn Forte stmfGetSessionList(stmfDevid *devid, stmfSessionList **sessionList) 4005fcf3ce44SJohn Forte { 4006fcf3ce44SJohn Forte int ret = STMF_STATUS_SUCCESS; 4007fcf3ce44SJohn Forte int fd; 4008fcf3ce44SJohn Forte int ioctlRet; 4009fcf3ce44SJohn Forte int cmd = STMF_IOCTL_SESSION_LIST; 4010fcf3ce44SJohn Forte int i; 4011fcf3ce44SJohn Forte stmf_iocdata_t stmfIoctl; 401256261083SCharles Ting slist_scsi_session_t *fSessionList, *fSessionListP = NULL; 4013fcf3ce44SJohn Forte uint8_t ident[260]; 4014fcf3ce44SJohn Forte uint32_t fSessionListSize; 4015fcf3ce44SJohn Forte 4016fcf3ce44SJohn Forte if (sessionList == NULL || devid == NULL) { 4017fcf3ce44SJohn Forte ret = STMF_ERROR_INVALID_ARG; 4018fcf3ce44SJohn Forte } 4019fcf3ce44SJohn Forte 4020fcf3ce44SJohn Forte /* call init */ 4021fcf3ce44SJohn Forte ret = initializeConfig(); 4022fcf3ce44SJohn Forte if (ret != STMF_STATUS_SUCCESS) { 4023fcf3ce44SJohn Forte return (ret); 4024fcf3ce44SJohn Forte } 4025fcf3ce44SJohn Forte 4026fcf3ce44SJohn Forte /* 4027fcf3ce44SJohn Forte * Open control node for stmf 4028fcf3ce44SJohn Forte */ 4029fcf3ce44SJohn Forte if ((ret = openStmf(OPEN_STMF, &fd)) != STMF_STATUS_SUCCESS) 4030fcf3ce44SJohn Forte return (ret); 4031fcf3ce44SJohn Forte 4032fcf3ce44SJohn Forte /* 4033fcf3ce44SJohn Forte * Allocate ioctl input buffer 4034fcf3ce44SJohn Forte */ 40358fe96085Stim szeto fSessionListSize = ALLOC_SESSION; 4036fcf3ce44SJohn Forte fSessionListSize = fSessionListSize * (sizeof (slist_scsi_session_t)); 4037fcf3ce44SJohn Forte fSessionList = (slist_scsi_session_t *)calloc(1, fSessionListSize); 403856261083SCharles Ting fSessionListP = fSessionList; 4039fcf3ce44SJohn Forte if (fSessionList == NULL) { 404056261083SCharles Ting ret = STMF_ERROR_NOMEM; 404156261083SCharles Ting goto done; 4042fcf3ce44SJohn Forte } 4043fcf3ce44SJohn Forte 4044fcf3ce44SJohn Forte ident[IDENT_LENGTH_BYTE] = devid->identLength; 4045fcf3ce44SJohn Forte bcopy(&(devid->ident), &ident[IDENT_LENGTH_BYTE + 1], 4046fcf3ce44SJohn Forte devid->identLength); 4047fcf3ce44SJohn Forte 4048fcf3ce44SJohn Forte bzero(&stmfIoctl, sizeof (stmfIoctl)); 4049fcf3ce44SJohn Forte /* 4050fcf3ce44SJohn Forte * Issue ioctl to get the session list 4051fcf3ce44SJohn Forte */ 4052fcf3ce44SJohn Forte stmfIoctl.stmf_version = STMF_VERSION_1; 4053fcf3ce44SJohn Forte stmfIoctl.stmf_ibuf = (uint64_t)(unsigned long)&ident; 4054fcf3ce44SJohn Forte stmfIoctl.stmf_ibuf_size = sizeof (ident); 4055fcf3ce44SJohn Forte stmfIoctl.stmf_obuf_size = fSessionListSize; 4056fcf3ce44SJohn Forte stmfIoctl.stmf_obuf = (uint64_t)(unsigned long)fSessionList; 4057fcf3ce44SJohn Forte ioctlRet = ioctl(fd, cmd, &stmfIoctl); 4058fcf3ce44SJohn Forte if (ioctlRet != 0) { 4059fcf3ce44SJohn Forte switch (errno) { 4060fcf3ce44SJohn Forte case EBUSY: 4061fcf3ce44SJohn Forte ret = STMF_ERROR_BUSY; 4062fcf3ce44SJohn Forte break; 40638fe96085Stim szeto case EPERM: 4064fcf3ce44SJohn Forte case EACCES: 4065fcf3ce44SJohn Forte ret = STMF_ERROR_PERM; 4066fcf3ce44SJohn Forte break; 4067fcf3ce44SJohn Forte default: 4068fcf3ce44SJohn Forte syslog(LOG_DEBUG, 4069fcf3ce44SJohn Forte "stmfGetSessionList:ioctl errno(%d)", 4070fcf3ce44SJohn Forte errno); 4071fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR; 4072fcf3ce44SJohn Forte break; 4073fcf3ce44SJohn Forte } 4074fcf3ce44SJohn Forte goto done; 4075fcf3ce44SJohn Forte } 4076fcf3ce44SJohn Forte /* 4077fcf3ce44SJohn Forte * Check whether input buffer was large enough 4078fcf3ce44SJohn Forte */ 40798fe96085Stim szeto if (stmfIoctl.stmf_obuf_max_nentries > ALLOC_SESSION) { 4080fcf3ce44SJohn Forte fSessionListSize = stmfIoctl.stmf_obuf_max_nentries * 4081fcf3ce44SJohn Forte sizeof (slist_scsi_session_t); 4082fcf3ce44SJohn Forte fSessionList = realloc(fSessionList, fSessionListSize); 4083fcf3ce44SJohn Forte if (fSessionList == NULL) { 408456261083SCharles Ting ret = STMF_ERROR_NOMEM; 408556261083SCharles Ting goto done; 4086fcf3ce44SJohn Forte } 408756261083SCharles Ting fSessionListP = fSessionList; 4088fcf3ce44SJohn Forte stmfIoctl.stmf_obuf_size = fSessionListSize; 4089fcf3ce44SJohn Forte stmfIoctl.stmf_obuf = (uint64_t)(unsigned long)fSessionList; 4090fcf3ce44SJohn Forte ioctlRet = ioctl(fd, cmd, &stmfIoctl); 4091fcf3ce44SJohn Forte if (ioctlRet != 0) { 4092fcf3ce44SJohn Forte switch (errno) { 4093fcf3ce44SJohn Forte case EBUSY: 4094fcf3ce44SJohn Forte ret = STMF_ERROR_BUSY; 4095fcf3ce44SJohn Forte break; 40968fe96085Stim szeto case EPERM: 4097fcf3ce44SJohn Forte case EACCES: 4098fcf3ce44SJohn Forte ret = STMF_ERROR_PERM; 4099fcf3ce44SJohn Forte break; 4100fcf3ce44SJohn Forte default: 4101fcf3ce44SJohn Forte syslog(LOG_DEBUG, 4102fcf3ce44SJohn Forte "stmfGetSessionList:ioctl " 4103fcf3ce44SJohn Forte "errno(%d)", errno); 4104fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR; 4105fcf3ce44SJohn Forte break; 4106fcf3ce44SJohn Forte } 4107fcf3ce44SJohn Forte goto done; 4108fcf3ce44SJohn Forte } 4109fcf3ce44SJohn Forte } 4110fcf3ce44SJohn Forte 4111fcf3ce44SJohn Forte /* 4112fcf3ce44SJohn Forte * allocate caller's buffer with the final size 4113fcf3ce44SJohn Forte */ 4114fcf3ce44SJohn Forte *sessionList = (stmfSessionList *)calloc(1, sizeof (stmfSessionList) + 4115fcf3ce44SJohn Forte stmfIoctl.stmf_obuf_max_nentries * sizeof (stmfSession)); 4116fcf3ce44SJohn Forte if (*sessionList == NULL) { 4117fcf3ce44SJohn Forte ret = STMF_ERROR_NOMEM; 4118fcf3ce44SJohn Forte free(sessionList); 4119fcf3ce44SJohn Forte goto done; 4120fcf3ce44SJohn Forte } 4121fcf3ce44SJohn Forte 4122fcf3ce44SJohn Forte (*sessionList)->cnt = stmfIoctl.stmf_obuf_max_nentries; 4123fcf3ce44SJohn Forte 4124fcf3ce44SJohn Forte /* 4125fcf3ce44SJohn Forte * copy session info to caller's buffer 4126fcf3ce44SJohn Forte */ 4127fcf3ce44SJohn Forte for (i = 0; i < (*sessionList)->cnt; i++) { 4128fcf3ce44SJohn Forte (*sessionList)->session[i].initiator.identLength = 4129fcf3ce44SJohn Forte fSessionList->initiator[IDENT_LENGTH_BYTE]; 4130fcf3ce44SJohn Forte bcopy(&(fSessionList->initiator[IDENT_LENGTH_BYTE + 1]), 4131fcf3ce44SJohn Forte (*sessionList)->session[i].initiator.ident, 4132fcf3ce44SJohn Forte STMF_IDENT_LENGTH); 4133fcf3ce44SJohn Forte bcopy(&(fSessionList->alias), 4134fcf3ce44SJohn Forte &((*sessionList)->session[i].alias), 4135fcf3ce44SJohn Forte sizeof ((*sessionList)->session[i].alias)); 4136fcf3ce44SJohn Forte bcopy(&(fSessionList++->creation_time), 4137fcf3ce44SJohn Forte &((*sessionList)->session[i].creationTime), 4138fcf3ce44SJohn Forte sizeof (time_t)); 4139fcf3ce44SJohn Forte } 4140fcf3ce44SJohn Forte done: 4141fcf3ce44SJohn Forte (void) close(fd); 414256261083SCharles Ting free(fSessionListP); 4143fcf3ce44SJohn Forte return (ret); 4144fcf3ce44SJohn Forte } 4145fcf3ce44SJohn Forte 4146fcf3ce44SJohn Forte /* 4147fcf3ce44SJohn Forte * stmfGetTargetGroupList 4148fcf3ce44SJohn Forte * 4149fcf3ce44SJohn Forte * Purpose: Retrieves the list of target groups 4150fcf3ce44SJohn Forte * 4151fcf3ce44SJohn Forte * targetGroupList - pointer to a pointer to an stmfGroupList structure. On 4152fcf3ce44SJohn Forte * success, it contains the list of target groups. 4153fcf3ce44SJohn Forte */ 4154fcf3ce44SJohn Forte int 4155fcf3ce44SJohn Forte stmfGetTargetGroupList(stmfGroupList **targetGroupList) 4156fcf3ce44SJohn Forte { 4157fcf3ce44SJohn Forte int ret; 4158fcf3ce44SJohn Forte 4159fcf3ce44SJohn Forte if (targetGroupList == NULL) { 4160fcf3ce44SJohn Forte return (STMF_ERROR_INVALID_ARG); 4161fcf3ce44SJohn Forte } 4162fcf3ce44SJohn Forte 41638fe96085Stim szeto ret = groupListIoctl(targetGroupList, TARGET_GROUP); 4164fcf3ce44SJohn Forte return (ret); 4165fcf3ce44SJohn Forte } 4166fcf3ce44SJohn Forte 4167fcf3ce44SJohn Forte /* 4168fcf3ce44SJohn Forte * stmfGetTargetGroupMembers 4169fcf3ce44SJohn Forte * 4170fcf3ce44SJohn Forte * Purpose: Retrieves the group members for a target group 4171fcf3ce44SJohn Forte * 4172fcf3ce44SJohn Forte * groupName - name of target group for which to retrieve members. 4173fcf3ce44SJohn Forte * groupProp - pointer to pointer to stmfGroupProperties structure 4174fcf3ce44SJohn Forte * on success, this contains the list of group members. 4175fcf3ce44SJohn Forte */ 4176fcf3ce44SJohn Forte int 4177fcf3ce44SJohn Forte stmfGetTargetGroupMembers(stmfGroupName *groupName, 4178fcf3ce44SJohn Forte stmfGroupProperties **groupProp) 4179fcf3ce44SJohn Forte { 4180fcf3ce44SJohn Forte int ret; 4181fcf3ce44SJohn Forte 4182fcf3ce44SJohn Forte if (groupName == NULL || groupProp == NULL) { 4183fcf3ce44SJohn Forte return (STMF_ERROR_INVALID_ARG); 4184fcf3ce44SJohn Forte } 4185fcf3ce44SJohn Forte 41868fe96085Stim szeto ret = groupMemberListIoctl(groupName, groupProp, TARGET_GROUP); 4187fcf3ce44SJohn Forte 4188fcf3ce44SJohn Forte return (ret); 4189fcf3ce44SJohn Forte } 4190fcf3ce44SJohn Forte 4191fcf3ce44SJohn Forte /* 4192fcf3ce44SJohn Forte * stmfGetTargetList 4193fcf3ce44SJohn Forte * 4194fcf3ce44SJohn Forte * Purpose: Retrieves the list of target ports 4195fcf3ce44SJohn Forte * 4196fcf3ce44SJohn Forte * targetList - pointer to a pointer to an stmfDevidList structure. 4197fcf3ce44SJohn Forte * On success, it contains the list of local ports (target). 4198fcf3ce44SJohn Forte */ 4199fcf3ce44SJohn Forte int 4200fcf3ce44SJohn Forte stmfGetTargetList(stmfDevidList **targetList) 4201fcf3ce44SJohn Forte { 4202fcf3ce44SJohn Forte int ret; 4203fcf3ce44SJohn Forte int fd; 4204fcf3ce44SJohn Forte int ioctlRet; 4205fcf3ce44SJohn Forte int i; 4206fcf3ce44SJohn Forte stmf_iocdata_t stmfIoctl; 4207fcf3ce44SJohn Forte /* framework target port list */ 42088fe96085Stim szeto slist_target_port_t *fTargetList, *fTargetListP = NULL; 4209fcf3ce44SJohn Forte uint32_t fTargetListSize; 4210fcf3ce44SJohn Forte 4211fcf3ce44SJohn Forte if (targetList == NULL) { 4212fcf3ce44SJohn Forte return (STMF_ERROR_INVALID_ARG); 4213fcf3ce44SJohn Forte } 4214fcf3ce44SJohn Forte 4215fcf3ce44SJohn Forte /* call init */ 4216fcf3ce44SJohn Forte ret = initializeConfig(); 4217fcf3ce44SJohn Forte if (ret != STMF_STATUS_SUCCESS) { 4218fcf3ce44SJohn Forte return (ret); 4219fcf3ce44SJohn Forte } 4220fcf3ce44SJohn Forte 4221fcf3ce44SJohn Forte /* 4222fcf3ce44SJohn Forte * Open control node for stmf 4223fcf3ce44SJohn Forte */ 4224fcf3ce44SJohn Forte if ((ret = openStmf(OPEN_STMF, &fd)) != STMF_STATUS_SUCCESS) 4225fcf3ce44SJohn Forte return (ret); 4226fcf3ce44SJohn Forte 4227fcf3ce44SJohn Forte /* 4228fcf3ce44SJohn Forte * Allocate ioctl input buffer 4229fcf3ce44SJohn Forte */ 42308fe96085Stim szeto fTargetListSize = ALLOC_TARGET_PORT * sizeof (slist_target_port_t); 42313e7352aeSJohn Forte fTargetListP = fTargetList = 42323e7352aeSJohn Forte (slist_target_port_t *)calloc(1, fTargetListSize); 4233fcf3ce44SJohn Forte if (fTargetList == NULL) { 42348fe96085Stim szeto ret = STMF_ERROR_NOMEM; 4235fcf3ce44SJohn Forte goto done; 4236fcf3ce44SJohn Forte } 4237fcf3ce44SJohn Forte 4238fcf3ce44SJohn Forte bzero(&stmfIoctl, sizeof (stmfIoctl)); 4239fcf3ce44SJohn Forte /* 42403e7352aeSJohn Forte * Issue ioctl to retrieve target list 4241fcf3ce44SJohn Forte */ 4242fcf3ce44SJohn Forte stmfIoctl.stmf_version = STMF_VERSION_1; 4243fcf3ce44SJohn Forte stmfIoctl.stmf_obuf_size = fTargetListSize; 4244fcf3ce44SJohn Forte stmfIoctl.stmf_obuf = (uint64_t)(unsigned long)fTargetList; 4245fcf3ce44SJohn Forte ioctlRet = ioctl(fd, STMF_IOCTL_TARGET_PORT_LIST, &stmfIoctl); 4246fcf3ce44SJohn Forte if (ioctlRet != 0) { 4247fcf3ce44SJohn Forte switch (errno) { 4248fcf3ce44SJohn Forte case EBUSY: 4249fcf3ce44SJohn Forte ret = STMF_ERROR_BUSY; 4250fcf3ce44SJohn Forte break; 42518fe96085Stim szeto case EPERM: 4252fcf3ce44SJohn Forte case EACCES: 4253fcf3ce44SJohn Forte ret = STMF_ERROR_PERM; 4254fcf3ce44SJohn Forte break; 4255fcf3ce44SJohn Forte default: 4256fcf3ce44SJohn Forte syslog(LOG_DEBUG, 4257fcf3ce44SJohn Forte "stmfGetTargetList:ioctl errno(%d)", errno); 4258fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR; 4259fcf3ce44SJohn Forte break; 4260fcf3ce44SJohn Forte } 4261fcf3ce44SJohn Forte goto done; 4262fcf3ce44SJohn Forte } 4263fcf3ce44SJohn Forte /* 4264fcf3ce44SJohn Forte * Check whether input buffer was large enough 4265fcf3ce44SJohn Forte */ 42668fe96085Stim szeto if (stmfIoctl.stmf_obuf_max_nentries > ALLOC_TARGET_PORT) { 4267fcf3ce44SJohn Forte fTargetListSize = stmfIoctl.stmf_obuf_max_nentries * 426876602b8dSJohn Forte sizeof (slist_target_port_t); 42693e7352aeSJohn Forte fTargetListP = fTargetList = 42703e7352aeSJohn Forte realloc(fTargetList, fTargetListSize); 4271fcf3ce44SJohn Forte if (fTargetList == NULL) { 42728fe96085Stim szeto ret = STMF_ERROR_NOMEM; 42738fe96085Stim szeto goto done; 4274fcf3ce44SJohn Forte } 4275fcf3ce44SJohn Forte stmfIoctl.stmf_obuf_size = fTargetListSize; 4276fcf3ce44SJohn Forte stmfIoctl.stmf_obuf = (uint64_t)(unsigned long)fTargetList; 4277fcf3ce44SJohn Forte ioctlRet = ioctl(fd, STMF_IOCTL_TARGET_PORT_LIST, 4278fcf3ce44SJohn Forte &stmfIoctl); 4279fcf3ce44SJohn Forte if (ioctlRet != 0) { 4280fcf3ce44SJohn Forte switch (errno) { 4281fcf3ce44SJohn Forte case EBUSY: 4282fcf3ce44SJohn Forte ret = STMF_ERROR_BUSY; 4283fcf3ce44SJohn Forte break; 42848fe96085Stim szeto case EPERM: 4285fcf3ce44SJohn Forte case EACCES: 4286fcf3ce44SJohn Forte ret = STMF_ERROR_PERM; 4287fcf3ce44SJohn Forte break; 4288fcf3ce44SJohn Forte default: 4289fcf3ce44SJohn Forte syslog(LOG_DEBUG, 4290fcf3ce44SJohn Forte "stmfGetTargetList:ioctl errno(%d)", 4291fcf3ce44SJohn Forte errno); 4292fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR; 4293fcf3ce44SJohn Forte break; 4294fcf3ce44SJohn Forte } 4295fcf3ce44SJohn Forte goto done; 4296fcf3ce44SJohn Forte } 4297fcf3ce44SJohn Forte } 4298fcf3ce44SJohn Forte 4299fcf3ce44SJohn Forte *targetList = (stmfDevidList *)calloc(1, 4300fcf3ce44SJohn Forte stmfIoctl.stmf_obuf_max_nentries * sizeof (stmfDevid) + 4301fcf3ce44SJohn Forte sizeof (stmfDevidList)); 43028fe96085Stim szeto if (*targetList == NULL) { 43038fe96085Stim szeto ret = STMF_ERROR_NOMEM; 43048fe96085Stim szeto goto done; 43058fe96085Stim szeto } 4306fcf3ce44SJohn Forte 4307fcf3ce44SJohn Forte (*targetList)->cnt = stmfIoctl.stmf_obuf_max_nentries; 4308fcf3ce44SJohn Forte for (i = 0; i < stmfIoctl.stmf_obuf_max_nentries; i++, fTargetList++) { 4309fcf3ce44SJohn Forte (*targetList)->devid[i].identLength = 4310fcf3ce44SJohn Forte fTargetList->target[IDENT_LENGTH_BYTE]; 4311fcf3ce44SJohn Forte bcopy(&fTargetList->target[IDENT_LENGTH_BYTE + 1], 4312fcf3ce44SJohn Forte &(*targetList)->devid[i].ident, 4313fcf3ce44SJohn Forte fTargetList->target[IDENT_LENGTH_BYTE]); 4314fcf3ce44SJohn Forte } 4315fcf3ce44SJohn Forte 4316fcf3ce44SJohn Forte done: 4317fcf3ce44SJohn Forte (void) close(fd); 43183e7352aeSJohn Forte free(fTargetListP); 4319fcf3ce44SJohn Forte return (ret); 4320fcf3ce44SJohn Forte } 4321fcf3ce44SJohn Forte 4322fcf3ce44SJohn Forte /* 4323fcf3ce44SJohn Forte * stmfGetTargetProperties 4324fcf3ce44SJohn Forte * 4325fcf3ce44SJohn Forte * Purpose: Retrieves the properties for a logical unit 4326fcf3ce44SJohn Forte * 4327fcf3ce44SJohn Forte * devid - devid of the target for which to retrieve properties 4328fcf3ce44SJohn Forte * targetProps - pointer to an stmfTargetProperties structure. 4329fcf3ce44SJohn Forte * On success, it contains the target properties for 4330fcf3ce44SJohn Forte * the specified devid. 4331fcf3ce44SJohn Forte */ 4332fcf3ce44SJohn Forte int 4333fcf3ce44SJohn Forte stmfGetTargetProperties(stmfDevid *devid, stmfTargetProperties *targetProps) 4334fcf3ce44SJohn Forte { 4335fcf3ce44SJohn Forte int ret = STMF_STATUS_SUCCESS; 4336fcf3ce44SJohn Forte int fd; 4337fcf3ce44SJohn Forte int ioctlRet; 4338fcf3ce44SJohn Forte stmf_iocdata_t stmfIoctl; 4339fcf3ce44SJohn Forte sioc_target_port_props_t targetProperties; 434045039663SJohn Forte scsi_devid_desc_t *scsiDevid; 4341fcf3ce44SJohn Forte 4342fcf3ce44SJohn Forte if (devid == NULL || targetProps == NULL) { 4343fcf3ce44SJohn Forte return (STMF_ERROR_INVALID_ARG); 4344fcf3ce44SJohn Forte } 4345fcf3ce44SJohn Forte 4346fcf3ce44SJohn Forte /* call init */ 4347fcf3ce44SJohn Forte ret = initializeConfig(); 4348fcf3ce44SJohn Forte if (ret != STMF_STATUS_SUCCESS) { 4349fcf3ce44SJohn Forte return (ret); 4350fcf3ce44SJohn Forte } 4351fcf3ce44SJohn Forte 4352fcf3ce44SJohn Forte /* 4353fcf3ce44SJohn Forte * Open control node for stmf 4354fcf3ce44SJohn Forte */ 4355fcf3ce44SJohn Forte if ((ret = openStmf(OPEN_STMF, &fd)) != STMF_STATUS_SUCCESS) 4356fcf3ce44SJohn Forte return (ret); 4357fcf3ce44SJohn Forte 4358fcf3ce44SJohn Forte targetProperties.tgt_id[IDENT_LENGTH_BYTE] = devid->identLength; 4359fcf3ce44SJohn Forte bcopy(&(devid->ident), &targetProperties.tgt_id[IDENT_LENGTH_BYTE + 1], 4360fcf3ce44SJohn Forte devid->identLength); 4361fcf3ce44SJohn Forte 4362fcf3ce44SJohn Forte bzero(&stmfIoctl, sizeof (stmfIoctl)); 4363fcf3ce44SJohn Forte /* 4364fcf3ce44SJohn Forte * Issue ioctl to add to the host group 4365fcf3ce44SJohn Forte */ 4366fcf3ce44SJohn Forte stmfIoctl.stmf_version = STMF_VERSION_1; 4367fcf3ce44SJohn Forte stmfIoctl.stmf_ibuf_size = sizeof (targetProperties.tgt_id); 4368fcf3ce44SJohn Forte stmfIoctl.stmf_ibuf = (uint64_t)(unsigned long)&targetProperties.tgt_id; 4369fcf3ce44SJohn Forte stmfIoctl.stmf_obuf = (uint64_t)(unsigned long)&targetProperties; 4370fcf3ce44SJohn Forte stmfIoctl.stmf_obuf_size = sizeof (targetProperties); 4371fcf3ce44SJohn Forte ioctlRet = ioctl(fd, STMF_IOCTL_GET_TARGET_PORT_PROPERTIES, 4372fcf3ce44SJohn Forte &stmfIoctl); 4373fcf3ce44SJohn Forte if (ioctlRet != 0) { 4374fcf3ce44SJohn Forte switch (errno) { 4375fcf3ce44SJohn Forte case EBUSY: 4376fcf3ce44SJohn Forte ret = STMF_ERROR_BUSY; 4377fcf3ce44SJohn Forte break; 43788fe96085Stim szeto case EPERM: 4379fcf3ce44SJohn Forte case EACCES: 4380fcf3ce44SJohn Forte ret = STMF_ERROR_PERM; 4381fcf3ce44SJohn Forte break; 4382fcf3ce44SJohn Forte case ENOENT: 4383fcf3ce44SJohn Forte ret = STMF_ERROR_NOT_FOUND; 4384fcf3ce44SJohn Forte break; 4385fcf3ce44SJohn Forte default: 4386fcf3ce44SJohn Forte syslog(LOG_DEBUG, 4387fcf3ce44SJohn Forte "stmfGetTargetProperties:ioctl errno(%d)", 4388fcf3ce44SJohn Forte errno); 4389fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR; 4390fcf3ce44SJohn Forte break; 4391fcf3ce44SJohn Forte } 4392fcf3ce44SJohn Forte goto done; 4393fcf3ce44SJohn Forte } 4394fcf3ce44SJohn Forte 4395fcf3ce44SJohn Forte bcopy(targetProperties.tgt_provider_name, targetProps->providerName, 4396fcf3ce44SJohn Forte sizeof (targetProperties.tgt_provider_name)); 4397fcf3ce44SJohn Forte if (targetProperties.tgt_state == STMF_STATE_ONLINE) { 4398fcf3ce44SJohn Forte targetProps->status = STMF_TARGET_PORT_ONLINE; 4399fcf3ce44SJohn Forte } else if (targetProperties.tgt_state == STMF_STATE_OFFLINE) { 4400fcf3ce44SJohn Forte targetProps->status = STMF_TARGET_PORT_OFFLINE; 4401fcf3ce44SJohn Forte } else if (targetProperties.tgt_state == STMF_STATE_ONLINING) { 4402fcf3ce44SJohn Forte targetProps->status = STMF_TARGET_PORT_ONLINING; 4403fcf3ce44SJohn Forte } else if (targetProperties.tgt_state == STMF_STATE_OFFLINING) { 4404fcf3ce44SJohn Forte targetProps->status = STMF_TARGET_PORT_OFFLINING; 4405fcf3ce44SJohn Forte } 4406fcf3ce44SJohn Forte bcopy(targetProperties.tgt_alias, targetProps->alias, 4407fcf3ce44SJohn Forte sizeof (targetProps->alias)); 440845039663SJohn Forte 440945039663SJohn Forte scsiDevid = (scsi_devid_desc_t *)&targetProperties.tgt_id; 441045039663SJohn Forte targetProps->protocol = scsiDevid->protocol_id; 441145039663SJohn Forte 4412fcf3ce44SJohn Forte done: 4413fcf3ce44SJohn Forte (void) close(fd); 4414fcf3ce44SJohn Forte return (ret); 4415fcf3ce44SJohn Forte } 4416fcf3ce44SJohn Forte 4417fcf3ce44SJohn Forte /* 4418fcf3ce44SJohn Forte * stmfGetLogicalUnitList 4419fcf3ce44SJohn Forte * 4420fcf3ce44SJohn Forte * Purpose: Retrieves list of logical unit Object IDs 4421fcf3ce44SJohn Forte * 4422fcf3ce44SJohn Forte * luList - pointer to a pointer to a stmfGuidList structure. On success, 4423fcf3ce44SJohn Forte * it contains the list of logical unit guids. 4424fcf3ce44SJohn Forte * 4425fcf3ce44SJohn Forte */ 4426fcf3ce44SJohn Forte int 4427fcf3ce44SJohn Forte stmfGetLogicalUnitList(stmfGuidList **luList) 4428fcf3ce44SJohn Forte { 4429fcf3ce44SJohn Forte int ret; 4430fcf3ce44SJohn Forte int fd; 4431fcf3ce44SJohn Forte int ioctlRet; 4432fcf3ce44SJohn Forte int cmd = STMF_IOCTL_LU_LIST; 44338fe96085Stim szeto int i; 4434fcf3ce44SJohn Forte stmf_iocdata_t stmfIoctl; 4435fcf3ce44SJohn Forte slist_lu_t *fLuList; 4436fcf3ce44SJohn Forte uint32_t fLuListSize; 44378fe96085Stim szeto uint32_t listCnt; 4438fcf3ce44SJohn Forte 4439fcf3ce44SJohn Forte if (luList == NULL) { 4440fcf3ce44SJohn Forte return (STMF_ERROR_INVALID_ARG); 4441fcf3ce44SJohn Forte } 4442fcf3ce44SJohn Forte 4443fcf3ce44SJohn Forte /* call init */ 4444fcf3ce44SJohn Forte ret = initializeConfig(); 4445fcf3ce44SJohn Forte if (ret != STMF_STATUS_SUCCESS) { 4446fcf3ce44SJohn Forte return (ret); 4447fcf3ce44SJohn Forte } 4448fcf3ce44SJohn Forte 4449fcf3ce44SJohn Forte /* 4450fcf3ce44SJohn Forte * Open control node for stmf 4451fcf3ce44SJohn Forte */ 4452fcf3ce44SJohn Forte if ((ret = openStmf(OPEN_STMF, &fd)) != STMF_STATUS_SUCCESS) 4453fcf3ce44SJohn Forte return (ret); 4454fcf3ce44SJohn Forte 4455fcf3ce44SJohn Forte /* 4456fcf3ce44SJohn Forte * Allocate ioctl input buffer 4457fcf3ce44SJohn Forte */ 44588fe96085Stim szeto fLuListSize = ALLOC_LU; 4459fcf3ce44SJohn Forte fLuListSize = fLuListSize * (sizeof (slist_lu_t)); 4460fcf3ce44SJohn Forte fLuList = (slist_lu_t *)calloc(1, fLuListSize); 4461fcf3ce44SJohn Forte if (fLuList == NULL) { 44628fe96085Stim szeto ret = STMF_ERROR_NOMEM; 44638fe96085Stim szeto goto done; 4464fcf3ce44SJohn Forte } 4465fcf3ce44SJohn Forte 4466fcf3ce44SJohn Forte bzero(&stmfIoctl, sizeof (stmfIoctl)); 4467fcf3ce44SJohn Forte /* 4468fcf3ce44SJohn Forte * Issue ioctl to get the LU list 4469fcf3ce44SJohn Forte */ 4470fcf3ce44SJohn Forte stmfIoctl.stmf_version = STMF_VERSION_1; 4471fcf3ce44SJohn Forte stmfIoctl.stmf_obuf_size = fLuListSize; 4472fcf3ce44SJohn Forte stmfIoctl.stmf_obuf = (uint64_t)(unsigned long)fLuList; 4473fcf3ce44SJohn Forte ioctlRet = ioctl(fd, cmd, &stmfIoctl); 4474fcf3ce44SJohn Forte if (ioctlRet != 0) { 4475fcf3ce44SJohn Forte switch (errno) { 4476fcf3ce44SJohn Forte case EBUSY: 4477fcf3ce44SJohn Forte ret = STMF_ERROR_BUSY; 4478fcf3ce44SJohn Forte break; 44798fe96085Stim szeto case EPERM: 4480fcf3ce44SJohn Forte case EACCES: 4481fcf3ce44SJohn Forte ret = STMF_ERROR_PERM; 4482fcf3ce44SJohn Forte break; 4483fcf3ce44SJohn Forte default: 4484fcf3ce44SJohn Forte syslog(LOG_DEBUG, 4485fcf3ce44SJohn Forte "stmfGetLogicalUnitList:ioctl errno(%d)", 4486fcf3ce44SJohn Forte errno); 4487fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR; 4488fcf3ce44SJohn Forte break; 4489fcf3ce44SJohn Forte } 4490fcf3ce44SJohn Forte goto done; 4491fcf3ce44SJohn Forte } 4492fcf3ce44SJohn Forte /* 4493fcf3ce44SJohn Forte * Check whether input buffer was large enough 4494fcf3ce44SJohn Forte */ 44958fe96085Stim szeto if (stmfIoctl.stmf_obuf_max_nentries > ALLOC_LU) { 4496fcf3ce44SJohn Forte fLuListSize = stmfIoctl.stmf_obuf_max_nentries * 4497fcf3ce44SJohn Forte sizeof (slist_lu_t); 44988fe96085Stim szeto free(fLuList); 44998fe96085Stim szeto fLuList = (slist_lu_t *)calloc(1, fLuListSize); 4500fcf3ce44SJohn Forte if (fLuList == NULL) { 45018fe96085Stim szeto ret = STMF_ERROR_NOMEM; 45028fe96085Stim szeto goto done; 4503fcf3ce44SJohn Forte } 4504fcf3ce44SJohn Forte stmfIoctl.stmf_obuf_size = fLuListSize; 4505fcf3ce44SJohn Forte stmfIoctl.stmf_obuf = (uint64_t)(unsigned long)fLuList; 4506fcf3ce44SJohn Forte ioctlRet = ioctl(fd, cmd, &stmfIoctl); 4507fcf3ce44SJohn Forte if (ioctlRet != 0) { 4508fcf3ce44SJohn Forte switch (errno) { 4509fcf3ce44SJohn Forte case EBUSY: 4510fcf3ce44SJohn Forte ret = STMF_ERROR_BUSY; 4511fcf3ce44SJohn Forte break; 45128fe96085Stim szeto case EPERM: 4513fcf3ce44SJohn Forte case EACCES: 4514fcf3ce44SJohn Forte ret = STMF_ERROR_PERM; 4515fcf3ce44SJohn Forte break; 4516fcf3ce44SJohn Forte default: 4517fcf3ce44SJohn Forte syslog(LOG_DEBUG, 4518fcf3ce44SJohn Forte "stmfGetLogicalUnitList:" 4519fcf3ce44SJohn Forte "ioctl errno(%d)", errno); 4520fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR; 4521fcf3ce44SJohn Forte break; 4522fcf3ce44SJohn Forte } 4523fcf3ce44SJohn Forte goto done; 4524fcf3ce44SJohn Forte } 4525fcf3ce44SJohn Forte } 4526fcf3ce44SJohn Forte 4527fcf3ce44SJohn Forte if (ret != STMF_STATUS_SUCCESS) { 4528fcf3ce44SJohn Forte goto done; 4529fcf3ce44SJohn Forte } 4530fcf3ce44SJohn Forte 45318fe96085Stim szeto listCnt = stmfIoctl.stmf_obuf_nentries; 4532fcf3ce44SJohn Forte 4533fcf3ce44SJohn Forte /* 4534fcf3ce44SJohn Forte * allocate caller's buffer with the final size 4535fcf3ce44SJohn Forte */ 4536fcf3ce44SJohn Forte *luList = (stmfGuidList *)calloc(1, sizeof (stmfGuidList) + 45378fe96085Stim szeto listCnt * sizeof (stmfGuid)); 4538fcf3ce44SJohn Forte if (*luList == NULL) { 4539fcf3ce44SJohn Forte ret = STMF_ERROR_NOMEM; 4540fcf3ce44SJohn Forte goto done; 4541fcf3ce44SJohn Forte } 4542fcf3ce44SJohn Forte 45438fe96085Stim szeto (*luList)->cnt = listCnt; 45448fe96085Stim szeto 45458fe96085Stim szeto /* copy to caller's buffer */ 45468fe96085Stim szeto for (i = 0; i < listCnt; i++) { 45478fe96085Stim szeto bcopy(&fLuList[i].lu_guid, (*luList)->guid[i].guid, 4548fcf3ce44SJohn Forte sizeof (stmfGuid)); 4549fcf3ce44SJohn Forte } 4550fcf3ce44SJohn Forte 45518fe96085Stim szeto /* 45528fe96085Stim szeto * sort the list. This gives a consistent view across gets 45538fe96085Stim szeto */ 45548fe96085Stim szeto qsort((void *)&((*luList)->guid[0]), (*luList)->cnt, 45558fe96085Stim szeto sizeof (stmfGuid), guidCompare); 4556fcf3ce44SJohn Forte 4557fcf3ce44SJohn Forte done: 4558fcf3ce44SJohn Forte (void) close(fd); 4559fcf3ce44SJohn Forte /* 4560fcf3ce44SJohn Forte * free internal buffers 4561fcf3ce44SJohn Forte */ 4562fcf3ce44SJohn Forte free(fLuList); 4563fcf3ce44SJohn Forte return (ret); 4564fcf3ce44SJohn Forte } 4565fcf3ce44SJohn Forte 4566fcf3ce44SJohn Forte /* 4567fcf3ce44SJohn Forte * stmfGetLogicalUnitProperties 4568fcf3ce44SJohn Forte * 4569fcf3ce44SJohn Forte * Purpose: Retrieves the properties for a logical unit 4570fcf3ce44SJohn Forte * 4571fcf3ce44SJohn Forte * lu - guid of the logical unit for which to retrieve properties 4572fcf3ce44SJohn Forte * stmfLuProps - pointer to an stmfLogicalUnitProperties structure. On success, 4573fcf3ce44SJohn Forte * it contains the logical unit properties for the specified guid. 4574fcf3ce44SJohn Forte */ 4575fcf3ce44SJohn Forte int 4576fcf3ce44SJohn Forte stmfGetLogicalUnitProperties(stmfGuid *lu, stmfLogicalUnitProperties *luProps) 4577fcf3ce44SJohn Forte { 4578fcf3ce44SJohn Forte int ret = STMF_STATUS_SUCCESS; 4579fcf3ce44SJohn Forte int stmfRet; 4580fcf3ce44SJohn Forte int fd; 4581fcf3ce44SJohn Forte int ioctlRet; 4582fcf3ce44SJohn Forte int cmd = STMF_IOCTL_GET_LU_PROPERTIES; 4583fcf3ce44SJohn Forte stmfViewEntryList *viewEntryList = NULL; 4584fcf3ce44SJohn Forte stmf_iocdata_t stmfIoctl; 4585fcf3ce44SJohn Forte sioc_lu_props_t fLuProps; 4586fcf3ce44SJohn Forte 45878fe96085Stim szeto if (lu == NULL || luProps == NULL) { 45888fe96085Stim szeto return (STMF_ERROR_INVALID_ARG); 4589fcf3ce44SJohn Forte } 4590fcf3ce44SJohn Forte 4591fcf3ce44SJohn Forte bzero(luProps, sizeof (stmfLogicalUnitProperties)); 4592fcf3ce44SJohn Forte 4593fcf3ce44SJohn Forte /* call init */ 4594fcf3ce44SJohn Forte ret = initializeConfig(); 4595fcf3ce44SJohn Forte if (ret != STMF_STATUS_SUCCESS) { 4596fcf3ce44SJohn Forte return (ret); 4597fcf3ce44SJohn Forte } 4598fcf3ce44SJohn Forte 4599fcf3ce44SJohn Forte /* 4600fcf3ce44SJohn Forte * Open control node for stmf 4601fcf3ce44SJohn Forte */ 4602fcf3ce44SJohn Forte if ((ret = openStmf(OPEN_STMF, &fd)) != STMF_STATUS_SUCCESS) 4603fcf3ce44SJohn Forte return (ret); 4604fcf3ce44SJohn Forte 4605fcf3ce44SJohn Forte bzero(&stmfIoctl, sizeof (stmfIoctl)); 4606fcf3ce44SJohn Forte /* 4607fcf3ce44SJohn Forte * Issue ioctl to add to the host group 4608fcf3ce44SJohn Forte */ 4609fcf3ce44SJohn Forte stmfIoctl.stmf_version = STMF_VERSION_1; 4610fcf3ce44SJohn Forte stmfIoctl.stmf_ibuf_size = sizeof (stmfGuid); 4611fcf3ce44SJohn Forte stmfIoctl.stmf_ibuf = (uint64_t)(unsigned long)lu; 4612fcf3ce44SJohn Forte stmfIoctl.stmf_obuf = (uint64_t)(unsigned long)&fLuProps; 4613fcf3ce44SJohn Forte stmfIoctl.stmf_obuf_size = sizeof (fLuProps); 4614fcf3ce44SJohn Forte ioctlRet = ioctl(fd, cmd, &stmfIoctl); 4615fcf3ce44SJohn Forte if (ioctlRet != 0) { 4616fcf3ce44SJohn Forte switch (errno) { 4617fcf3ce44SJohn Forte case EBUSY: 4618fcf3ce44SJohn Forte ret = STMF_ERROR_BUSY; 4619fcf3ce44SJohn Forte break; 46208fe96085Stim szeto case EPERM: 4621fcf3ce44SJohn Forte case EACCES: 4622fcf3ce44SJohn Forte ret = STMF_ERROR_PERM; 4623fcf3ce44SJohn Forte break; 4624fcf3ce44SJohn Forte case ENOENT: 4625fcf3ce44SJohn Forte stmfRet = stmfGetViewEntryList(lu, 4626fcf3ce44SJohn Forte &viewEntryList); 4627fcf3ce44SJohn Forte if (stmfRet == STMF_STATUS_SUCCESS) { 4628fcf3ce44SJohn Forte luProps->status = 4629fcf3ce44SJohn Forte STMF_LOGICAL_UNIT_UNREGISTERED; 4630fcf3ce44SJohn Forte if (viewEntryList->cnt > 0) { 4631fcf3ce44SJohn Forte ret = STMF_STATUS_SUCCESS; 4632fcf3ce44SJohn Forte } else { 4633fcf3ce44SJohn Forte ret = STMF_ERROR_NOT_FOUND; 4634fcf3ce44SJohn Forte } 4635fcf3ce44SJohn Forte } else { 4636fcf3ce44SJohn Forte ret = STMF_ERROR_NOT_FOUND; 4637fcf3ce44SJohn Forte } 4638fcf3ce44SJohn Forte stmfFreeMemory(viewEntryList); 4639fcf3ce44SJohn Forte break; 4640fcf3ce44SJohn Forte default: 4641fcf3ce44SJohn Forte syslog(LOG_DEBUG, 4642fcf3ce44SJohn Forte "stmfGetLogicalUnit:ioctl errno(%d)", 4643fcf3ce44SJohn Forte errno); 4644fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR; 4645fcf3ce44SJohn Forte break; 4646fcf3ce44SJohn Forte } 4647fcf3ce44SJohn Forte goto done; 4648fcf3ce44SJohn Forte } 4649fcf3ce44SJohn Forte 4650fcf3ce44SJohn Forte bcopy(fLuProps.lu_provider_name, luProps->providerName, 4651fcf3ce44SJohn Forte sizeof (fLuProps.lu_provider_name)); 4652fcf3ce44SJohn Forte if (fLuProps.lu_state == STMF_STATE_ONLINE) { 4653fcf3ce44SJohn Forte luProps->status = STMF_LOGICAL_UNIT_ONLINE; 4654fcf3ce44SJohn Forte } else if (fLuProps.lu_state == STMF_STATE_OFFLINE) { 4655fcf3ce44SJohn Forte luProps->status = STMF_LOGICAL_UNIT_OFFLINE; 4656fcf3ce44SJohn Forte } else if (fLuProps.lu_state == STMF_STATE_ONLINING) { 4657fcf3ce44SJohn Forte luProps->status = STMF_LOGICAL_UNIT_ONLINING; 4658fcf3ce44SJohn Forte } else if (fLuProps.lu_state == STMF_STATE_OFFLINING) { 4659fcf3ce44SJohn Forte luProps->status = STMF_LOGICAL_UNIT_OFFLINING; 4660fcf3ce44SJohn Forte } 4661fcf3ce44SJohn Forte bcopy(fLuProps.lu_alias, luProps->alias, sizeof (luProps->alias)); 4662fcf3ce44SJohn Forte done: 4663fcf3ce44SJohn Forte (void) close(fd); 4664fcf3ce44SJohn Forte return (ret); 4665fcf3ce44SJohn Forte } 4666fcf3ce44SJohn Forte 4667fcf3ce44SJohn Forte /* 4668fcf3ce44SJohn Forte * stmfGetState 4669fcf3ce44SJohn Forte * 4670fcf3ce44SJohn Forte * Purpose: retrieve the current state of the stmf module 4671fcf3ce44SJohn Forte * 4672fcf3ce44SJohn Forte * state - pointer to stmfState structure allocated by the caller 4673fcf3ce44SJohn Forte * On success, contains the state of stmf 4674fcf3ce44SJohn Forte */ 4675fcf3ce44SJohn Forte int 4676fcf3ce44SJohn Forte stmfGetState(stmfState *state) 4677fcf3ce44SJohn Forte { 4678fcf3ce44SJohn Forte int ret; 4679fcf3ce44SJohn Forte stmf_state_desc_t iState; 4680fcf3ce44SJohn Forte 4681fcf3ce44SJohn Forte if (state == NULL) { 4682fcf3ce44SJohn Forte return (STMF_ERROR_INVALID_ARG); 4683fcf3ce44SJohn Forte } 4684fcf3ce44SJohn Forte 4685fcf3ce44SJohn Forte ret = getStmfState(&iState); 4686fcf3ce44SJohn Forte if (ret != STMF_STATUS_SUCCESS) { 4687fcf3ce44SJohn Forte return (ret); 4688fcf3ce44SJohn Forte } 4689fcf3ce44SJohn Forte switch (iState.state) { 4690fcf3ce44SJohn Forte case STMF_STATE_ONLINE: 4691fcf3ce44SJohn Forte state->operationalState = 4692fcf3ce44SJohn Forte STMF_SERVICE_STATE_ONLINE; 4693fcf3ce44SJohn Forte break; 4694fcf3ce44SJohn Forte case STMF_STATE_OFFLINE: 4695fcf3ce44SJohn Forte state->operationalState = 4696fcf3ce44SJohn Forte STMF_SERVICE_STATE_OFFLINE; 4697fcf3ce44SJohn Forte break; 4698fcf3ce44SJohn Forte case STMF_STATE_ONLINING: 4699fcf3ce44SJohn Forte state->operationalState = 4700fcf3ce44SJohn Forte STMF_SERVICE_STATE_ONLINING; 4701fcf3ce44SJohn Forte break; 4702fcf3ce44SJohn Forte case STMF_STATE_OFFLINING: 4703fcf3ce44SJohn Forte state->operationalState = 4704fcf3ce44SJohn Forte STMF_SERVICE_STATE_OFFLINING; 4705fcf3ce44SJohn Forte break; 4706fcf3ce44SJohn Forte default: 4707fcf3ce44SJohn Forte state->operationalState = 4708fcf3ce44SJohn Forte STMF_SERVICE_STATE_UNKNOWN; 4709fcf3ce44SJohn Forte break; 4710fcf3ce44SJohn Forte } 4711fcf3ce44SJohn Forte switch (iState.config_state) { 4712fcf3ce44SJohn Forte case STMF_CONFIG_NONE: 4713fcf3ce44SJohn Forte state->configState = STMF_CONFIG_STATE_NONE; 4714fcf3ce44SJohn Forte break; 4715fcf3ce44SJohn Forte case STMF_CONFIG_INIT: 4716fcf3ce44SJohn Forte state->configState = STMF_CONFIG_STATE_INIT; 4717fcf3ce44SJohn Forte break; 4718fcf3ce44SJohn Forte case STMF_CONFIG_INIT_DONE: 4719fcf3ce44SJohn Forte state->configState = 4720fcf3ce44SJohn Forte STMF_CONFIG_STATE_INIT_DONE; 4721fcf3ce44SJohn Forte break; 4722fcf3ce44SJohn Forte default: 4723fcf3ce44SJohn Forte state->configState = 4724fcf3ce44SJohn Forte STMF_CONFIG_STATE_UNKNOWN; 4725fcf3ce44SJohn Forte break; 4726fcf3ce44SJohn Forte } 4727fcf3ce44SJohn Forte return (STMF_STATUS_SUCCESS); 4728fcf3ce44SJohn Forte } 4729fcf3ce44SJohn Forte 4730fcf3ce44SJohn Forte /* 4731fcf3ce44SJohn Forte * stmfGetViewEntryList 4732fcf3ce44SJohn Forte * 4733fcf3ce44SJohn Forte * Purpose: Retrieves the list of view entries for the specified 4734fcf3ce44SJohn Forte * logical unit. 4735fcf3ce44SJohn Forte * 4736fcf3ce44SJohn Forte * lu - the guid of the logical unit for which to retrieve the view entry list 4737fcf3ce44SJohn Forte * viewEntryList - a pointer to a pointer to a stmfViewEntryList structure. On 4738fcf3ce44SJohn Forte * success, contains the list of view entries. 4739fcf3ce44SJohn Forte */ 4740fcf3ce44SJohn Forte int 4741fcf3ce44SJohn Forte stmfGetViewEntryList(stmfGuid *lu, stmfViewEntryList **viewEntryList) 4742fcf3ce44SJohn Forte { 4743fcf3ce44SJohn Forte int ret; 47448fe96085Stim szeto int fd; 47458fe96085Stim szeto int ioctlRet; 47468fe96085Stim szeto int cmd = STMF_IOCTL_LU_VE_LIST; 47478fe96085Stim szeto int i; 47488fe96085Stim szeto stmf_iocdata_t stmfIoctl; 47498fe96085Stim szeto stmf_view_op_entry_t *fVeList; 47508fe96085Stim szeto uint32_t fVeListSize; 47518fe96085Stim szeto uint32_t listCnt; 4752fcf3ce44SJohn Forte 4753fcf3ce44SJohn Forte if (lu == NULL || viewEntryList == NULL) { 4754fcf3ce44SJohn Forte return (STMF_ERROR_INVALID_ARG); 4755fcf3ce44SJohn Forte } 4756fcf3ce44SJohn Forte 47578fe96085Stim szeto /* call init */ 47588fe96085Stim szeto ret = initializeConfig(); 47598fe96085Stim szeto if (ret != STMF_STATUS_SUCCESS) { 47608fe96085Stim szeto return (ret); 47618fe96085Stim szeto } 47628fe96085Stim szeto 47638fe96085Stim szeto /* 47648fe96085Stim szeto * Open control node for stmf 47658fe96085Stim szeto */ 47668fe96085Stim szeto if ((ret = openStmf(OPEN_STMF, &fd)) != STMF_STATUS_SUCCESS) 47678fe96085Stim szeto return (ret); 47688fe96085Stim szeto 47698fe96085Stim szeto /* 47708fe96085Stim szeto * Allocate ioctl input buffer 47718fe96085Stim szeto */ 47728fe96085Stim szeto fVeListSize = ALLOC_VE; 47738fe96085Stim szeto fVeListSize = fVeListSize * (sizeof (stmf_view_op_entry_t)); 47748fe96085Stim szeto fVeList = (stmf_view_op_entry_t *)calloc(1, fVeListSize); 47758fe96085Stim szeto if (fVeList == NULL) { 47768fe96085Stim szeto ret = STMF_ERROR_NOMEM; 47778fe96085Stim szeto goto done; 47788fe96085Stim szeto } 47798fe96085Stim szeto 47808fe96085Stim szeto bzero(&stmfIoctl, sizeof (stmfIoctl)); 47818fe96085Stim szeto /* 47828fe96085Stim szeto * Issue ioctl to get the LU list 47838fe96085Stim szeto */ 47848fe96085Stim szeto stmfIoctl.stmf_version = STMF_VERSION_1; 47858fe96085Stim szeto stmfIoctl.stmf_ibuf = (uint64_t)(unsigned long)lu; 47868fe96085Stim szeto stmfIoctl.stmf_ibuf_size = sizeof (stmfGuid); 47878fe96085Stim szeto stmfIoctl.stmf_obuf_size = fVeListSize; 47888fe96085Stim szeto stmfIoctl.stmf_obuf = (uint64_t)(unsigned long)fVeList; 47898fe96085Stim szeto ioctlRet = ioctl(fd, cmd, &stmfIoctl); 47908fe96085Stim szeto if (ioctlRet != 0) { 47918fe96085Stim szeto switch (errno) { 47928fe96085Stim szeto case EBUSY: 4793fcf3ce44SJohn Forte ret = STMF_ERROR_BUSY; 4794fcf3ce44SJohn Forte break; 47958fe96085Stim szeto case EPERM: 47968fe96085Stim szeto case EACCES: 47978fe96085Stim szeto ret = STMF_ERROR_PERM; 4798fcf3ce44SJohn Forte break; 4799fcf3ce44SJohn Forte default: 4800fcf3ce44SJohn Forte syslog(LOG_DEBUG, 48018fe96085Stim szeto "stmfGetViewEntryList:ioctl errno(%d)", 48028fe96085Stim szeto errno); 4803fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR; 4804fcf3ce44SJohn Forte break; 4805fcf3ce44SJohn Forte } 48068fe96085Stim szeto goto done; 48078fe96085Stim szeto } 48088fe96085Stim szeto /* 48098fe96085Stim szeto * Check whether input buffer was large enough 48108fe96085Stim szeto */ 48118fe96085Stim szeto if (stmfIoctl.stmf_obuf_max_nentries > ALLOC_VE) { 48128fe96085Stim szeto bzero(&stmfIoctl, sizeof (stmfIoctl)); 48138fe96085Stim szeto fVeListSize = stmfIoctl.stmf_obuf_max_nentries * 48148fe96085Stim szeto sizeof (stmf_view_op_entry_t); 48158fe96085Stim szeto free(fVeList); 48168fe96085Stim szeto fVeList = (stmf_view_op_entry_t *)calloc(1, fVeListSize); 48178fe96085Stim szeto if (fVeList == NULL) { 48188fe96085Stim szeto return (STMF_ERROR_NOMEM); 48198fe96085Stim szeto } 48208fe96085Stim szeto stmfIoctl.stmf_obuf_size = fVeListSize; 48218fe96085Stim szeto stmfIoctl.stmf_obuf = (uint64_t)(unsigned long)fVeList; 48228fe96085Stim szeto ioctlRet = ioctl(fd, cmd, &stmfIoctl); 48238fe96085Stim szeto if (ioctlRet != 0) { 48248fe96085Stim szeto switch (errno) { 48258fe96085Stim szeto case EBUSY: 48268fe96085Stim szeto ret = STMF_ERROR_BUSY; 48278fe96085Stim szeto break; 48288fe96085Stim szeto case EPERM: 48298fe96085Stim szeto case EACCES: 48308fe96085Stim szeto ret = STMF_ERROR_PERM; 48318fe96085Stim szeto break; 48328fe96085Stim szeto default: 48338fe96085Stim szeto syslog(LOG_DEBUG, 48348fe96085Stim szeto "stmfGetLogicalUnitList:" 48358fe96085Stim szeto "ioctl errno(%d)", errno); 48368fe96085Stim szeto ret = STMF_STATUS_ERROR; 48378fe96085Stim szeto break; 48388fe96085Stim szeto } 48398fe96085Stim szeto goto done; 48408fe96085Stim szeto } 48418fe96085Stim szeto } 4842fcf3ce44SJohn Forte 48438fe96085Stim szeto if (ret != STMF_STATUS_SUCCESS) { 48448fe96085Stim szeto goto done; 48458fe96085Stim szeto } 48468fe96085Stim szeto 48478fe96085Stim szeto listCnt = stmfIoctl.stmf_obuf_nentries; 48488fe96085Stim szeto 48498fe96085Stim szeto /* 48508fe96085Stim szeto * allocate caller's buffer with the final size 48518fe96085Stim szeto */ 48528fe96085Stim szeto *viewEntryList = (stmfViewEntryList *)calloc(1, 48538fe96085Stim szeto sizeof (stmfViewEntryList) + listCnt * sizeof (stmfViewEntry)); 48548fe96085Stim szeto if (*viewEntryList == NULL) { 48558fe96085Stim szeto ret = STMF_ERROR_NOMEM; 48568fe96085Stim szeto goto done; 48578fe96085Stim szeto } 48588fe96085Stim szeto 48598fe96085Stim szeto (*viewEntryList)->cnt = listCnt; 48608fe96085Stim szeto 48618fe96085Stim szeto /* copy to caller's buffer */ 48628fe96085Stim szeto for (i = 0; i < listCnt; i++) { 48638fe96085Stim szeto (*viewEntryList)->ve[i].veIndexValid = B_TRUE; 48648fe96085Stim szeto (*viewEntryList)->ve[i].veIndex = fVeList[i].ve_ndx; 48658fe96085Stim szeto if (fVeList[i].ve_all_hosts == 1) { 48668fe96085Stim szeto (*viewEntryList)->ve[i].allHosts = B_TRUE; 48678fe96085Stim szeto } else { 48688fe96085Stim szeto bcopy(fVeList[i].ve_host_group.name, 48698fe96085Stim szeto (*viewEntryList)->ve[i].hostGroup, 48708fe96085Stim szeto fVeList[i].ve_host_group.name_size); 48718fe96085Stim szeto } 48728fe96085Stim szeto if (fVeList[i].ve_all_targets == 1) { 48738fe96085Stim szeto (*viewEntryList)->ve[i].allTargets = B_TRUE; 48748fe96085Stim szeto } else { 48758fe96085Stim szeto bcopy(fVeList[i].ve_target_group.name, 48768fe96085Stim szeto (*viewEntryList)->ve[i].targetGroup, 48778fe96085Stim szeto fVeList[i].ve_target_group.name_size); 48788fe96085Stim szeto } 48798fe96085Stim szeto bcopy(fVeList[i].ve_lu_nbr, (*viewEntryList)->ve[i].luNbr, 48808fe96085Stim szeto sizeof ((*viewEntryList)->ve[i].luNbr)); 48818fe96085Stim szeto (*viewEntryList)->ve[i].luNbrValid = B_TRUE; 48828fe96085Stim szeto } 48838fe96085Stim szeto 48848fe96085Stim szeto /* 48858fe96085Stim szeto * sort the list. This gives a consistent view across gets 48868fe96085Stim szeto */ 48878fe96085Stim szeto qsort((void *)&((*viewEntryList)->ve[0]), (*viewEntryList)->cnt, 48888fe96085Stim szeto sizeof (stmfViewEntry), viewEntryCompare); 48898fe96085Stim szeto 48908fe96085Stim szeto done: 48918fe96085Stim szeto (void) close(fd); 48928fe96085Stim szeto /* 48938fe96085Stim szeto * free internal buffers 48948fe96085Stim szeto */ 48958fe96085Stim szeto free(fVeList); 4896fcf3ce44SJohn Forte return (ret); 4897fcf3ce44SJohn Forte } 4898fcf3ce44SJohn Forte 48998fe96085Stim szeto 4900fcf3ce44SJohn Forte /* 4901fcf3ce44SJohn Forte * loadHostGroups 4902fcf3ce44SJohn Forte * 4903fcf3ce44SJohn Forte * Purpose - issues the ioctl to load the host groups into stmf 4904fcf3ce44SJohn Forte * 4905fcf3ce44SJohn Forte * fd - file descriptor for the control node of stmf. 4906fcf3ce44SJohn Forte * groupList - populated host group list 4907fcf3ce44SJohn Forte */ 4908fcf3ce44SJohn Forte static int 4909fcf3ce44SJohn Forte loadHostGroups(int fd, stmfGroupList *groupList) 4910fcf3ce44SJohn Forte { 4911fcf3ce44SJohn Forte int i, j; 4912fcf3ce44SJohn Forte int ret = STMF_STATUS_SUCCESS; 4913fcf3ce44SJohn Forte stmfGroupProperties *groupProps = NULL; 4914fcf3ce44SJohn Forte 4915fcf3ce44SJohn Forte for (i = 0; i < groupList->cnt; i++) { 4916fcf3ce44SJohn Forte if ((ret = groupIoctl(fd, STMF_IOCTL_CREATE_HOST_GROUP, 4917fcf3ce44SJohn Forte &(groupList->name[i]))) != STMF_STATUS_SUCCESS) { 4918fcf3ce44SJohn Forte goto out; 4919fcf3ce44SJohn Forte } 49208fe96085Stim szeto ret = iLoadGroupMembersFromPs(&(groupList->name[i]), 49218fe96085Stim szeto &groupProps, HOST_GROUP); 4922fcf3ce44SJohn Forte for (j = 0; j < groupProps->cnt; j++) { 4923fcf3ce44SJohn Forte if ((ret = groupMemberIoctl(fd, STMF_IOCTL_ADD_HG_ENTRY, 4924fcf3ce44SJohn Forte &(groupList->name[i]), &(groupProps->name[j]))) 4925fcf3ce44SJohn Forte != STMF_STATUS_SUCCESS) { 4926fcf3ce44SJohn Forte goto out; 4927fcf3ce44SJohn Forte } 4928fcf3ce44SJohn Forte } 4929fcf3ce44SJohn Forte } 4930fcf3ce44SJohn Forte 4931fcf3ce44SJohn Forte 4932fcf3ce44SJohn Forte out: 4933fcf3ce44SJohn Forte stmfFreeMemory(groupProps); 4934fcf3ce44SJohn Forte return (ret); 4935fcf3ce44SJohn Forte } 4936fcf3ce44SJohn Forte 4937fcf3ce44SJohn Forte /* 4938fcf3ce44SJohn Forte * loadTargetGroups 4939fcf3ce44SJohn Forte * 4940fcf3ce44SJohn Forte * Purpose - issues the ioctl to load the target groups into stmf 4941fcf3ce44SJohn Forte * 4942fcf3ce44SJohn Forte * fd - file descriptor for the control node of stmf. 4943fcf3ce44SJohn Forte * groupList - populated target group list. 4944fcf3ce44SJohn Forte */ 4945fcf3ce44SJohn Forte static int 4946fcf3ce44SJohn Forte loadTargetGroups(int fd, stmfGroupList *groupList) 4947fcf3ce44SJohn Forte { 4948fcf3ce44SJohn Forte int i, j; 4949fcf3ce44SJohn Forte int ret = STMF_STATUS_SUCCESS; 4950fcf3ce44SJohn Forte stmfGroupProperties *groupProps = NULL; 4951fcf3ce44SJohn Forte 4952fcf3ce44SJohn Forte for (i = 0; i < groupList->cnt; i++) { 4953fcf3ce44SJohn Forte if ((ret = groupIoctl(fd, STMF_IOCTL_CREATE_TARGET_GROUP, 4954fcf3ce44SJohn Forte &(groupList->name[i]))) != STMF_STATUS_SUCCESS) { 4955fcf3ce44SJohn Forte goto out; 4956fcf3ce44SJohn Forte } 49578fe96085Stim szeto ret = iLoadGroupMembersFromPs(&(groupList->name[i]), 49588fe96085Stim szeto &groupProps, TARGET_GROUP); 4959fcf3ce44SJohn Forte for (j = 0; j < groupProps->cnt; j++) { 4960fcf3ce44SJohn Forte if ((ret = groupMemberIoctl(fd, STMF_IOCTL_ADD_TG_ENTRY, 4961fcf3ce44SJohn Forte &(groupList->name[i]), &(groupProps->name[j]))) 4962fcf3ce44SJohn Forte != STMF_STATUS_SUCCESS) { 4963fcf3ce44SJohn Forte goto out; 4964fcf3ce44SJohn Forte } 4965fcf3ce44SJohn Forte } 4966fcf3ce44SJohn Forte } 4967fcf3ce44SJohn Forte 4968fcf3ce44SJohn Forte 4969fcf3ce44SJohn Forte out: 4970fcf3ce44SJohn Forte stmfFreeMemory(groupProps); 4971fcf3ce44SJohn Forte return (ret); 4972fcf3ce44SJohn Forte } 4973fcf3ce44SJohn Forte 4974fcf3ce44SJohn Forte 4975fcf3ce44SJohn Forte /* 4976fcf3ce44SJohn Forte * loadStore 4977fcf3ce44SJohn Forte * 4978fcf3ce44SJohn Forte * Purpose: Load the configuration data from the store 4979fcf3ce44SJohn Forte * 4980fcf3ce44SJohn Forte * First load the host groups and target groups, then the view entries 4981fcf3ce44SJohn Forte * and finally the provider data 4982fcf3ce44SJohn Forte * 4983fcf3ce44SJohn Forte * fd - file descriptor of control node for stmf. 4984fcf3ce44SJohn Forte */ 4985fcf3ce44SJohn Forte static int 4986fcf3ce44SJohn Forte loadStore(int fd) 4987fcf3ce44SJohn Forte { 4988fcf3ce44SJohn Forte int ret; 4989fcf3ce44SJohn Forte int i, j; 4990fcf3ce44SJohn Forte stmfGroupList *groupList = NULL; 4991fcf3ce44SJohn Forte stmfGuidList *guidList = NULL; 4992fcf3ce44SJohn Forte stmfViewEntryList *viewEntryList = NULL; 4993fcf3ce44SJohn Forte stmfProviderList *providerList = NULL; 4994fcf3ce44SJohn Forte int providerType; 4995fcf3ce44SJohn Forte nvlist_t *nvl = NULL; 4996fcf3ce44SJohn Forte 4997fcf3ce44SJohn Forte 4998fcf3ce44SJohn Forte 4999fcf3ce44SJohn Forte /* load host groups */ 50008fe96085Stim szeto ret = iLoadGroupFromPs(&groupList, HOST_GROUP); 5001fcf3ce44SJohn Forte if (ret != STMF_STATUS_SUCCESS) { 5002fcf3ce44SJohn Forte return (ret); 5003fcf3ce44SJohn Forte } 5004fcf3ce44SJohn Forte ret = loadHostGroups(fd, groupList); 5005fcf3ce44SJohn Forte if (ret != STMF_STATUS_SUCCESS) { 5006fcf3ce44SJohn Forte goto out; 5007fcf3ce44SJohn Forte } 5008fcf3ce44SJohn Forte 5009fcf3ce44SJohn Forte stmfFreeMemory(groupList); 5010fcf3ce44SJohn Forte groupList = NULL; 5011fcf3ce44SJohn Forte 5012fcf3ce44SJohn Forte /* load target groups */ 50138fe96085Stim szeto ret = iLoadGroupFromPs(&groupList, TARGET_GROUP); 5014fcf3ce44SJohn Forte if (ret != STMF_STATUS_SUCCESS) { 5015fcf3ce44SJohn Forte goto out; 5016fcf3ce44SJohn Forte } 5017fcf3ce44SJohn Forte ret = loadTargetGroups(fd, groupList); 5018fcf3ce44SJohn Forte if (ret != STMF_STATUS_SUCCESS) { 5019fcf3ce44SJohn Forte goto out; 5020fcf3ce44SJohn Forte } 5021fcf3ce44SJohn Forte 5022fcf3ce44SJohn Forte stmfFreeMemory(groupList); 5023fcf3ce44SJohn Forte groupList = NULL; 5024fcf3ce44SJohn Forte 5025fcf3ce44SJohn Forte /* Get the guid list */ 5026fcf3ce44SJohn Forte ret = psGetLogicalUnitList(&guidList); 5027fcf3ce44SJohn Forte switch (ret) { 5028fcf3ce44SJohn Forte case STMF_PS_SUCCESS: 5029fcf3ce44SJohn Forte ret = STMF_STATUS_SUCCESS; 5030fcf3ce44SJohn Forte break; 5031fcf3ce44SJohn Forte case STMF_PS_ERROR_NOT_FOUND: 5032fcf3ce44SJohn Forte ret = STMF_ERROR_NOT_FOUND; 5033fcf3ce44SJohn Forte break; 5034fcf3ce44SJohn Forte case STMF_PS_ERROR_BUSY: 5035fcf3ce44SJohn Forte ret = STMF_ERROR_BUSY; 5036fcf3ce44SJohn Forte break; 5037fcf3ce44SJohn Forte case STMF_PS_ERROR_SERVICE_NOT_FOUND: 5038fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_NOT_FOUND; 5039fcf3ce44SJohn Forte break; 5040fcf3ce44SJohn Forte case STMF_PS_ERROR_VERSION_MISMATCH: 5041fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_DATA_VERSION; 5042fcf3ce44SJohn Forte break; 5043fcf3ce44SJohn Forte default: 5044fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR; 5045fcf3ce44SJohn Forte break; 5046fcf3ce44SJohn Forte } 5047fcf3ce44SJohn Forte 5048fcf3ce44SJohn Forte if (ret != STMF_STATUS_SUCCESS) { 5049fcf3ce44SJohn Forte goto out; 5050fcf3ce44SJohn Forte } 5051fcf3ce44SJohn Forte 5052fcf3ce44SJohn Forte /* 5053fcf3ce44SJohn Forte * We have the guid list, now get the corresponding 5054fcf3ce44SJohn Forte * view entries for each guid 5055fcf3ce44SJohn Forte */ 5056fcf3ce44SJohn Forte for (i = 0; i < guidList->cnt; i++) { 5057fcf3ce44SJohn Forte ret = psGetViewEntryList(&guidList->guid[i], &viewEntryList); 5058fcf3ce44SJohn Forte switch (ret) { 5059fcf3ce44SJohn Forte case STMF_PS_SUCCESS: 5060fcf3ce44SJohn Forte ret = STMF_STATUS_SUCCESS; 5061fcf3ce44SJohn Forte break; 5062fcf3ce44SJohn Forte case STMF_PS_ERROR_NOT_FOUND: 5063fcf3ce44SJohn Forte ret = STMF_ERROR_NOT_FOUND; 5064fcf3ce44SJohn Forte break; 5065fcf3ce44SJohn Forte case STMF_PS_ERROR_BUSY: 5066fcf3ce44SJohn Forte ret = STMF_ERROR_BUSY; 5067fcf3ce44SJohn Forte break; 5068fcf3ce44SJohn Forte case STMF_PS_ERROR_SERVICE_NOT_FOUND: 5069fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_NOT_FOUND; 5070fcf3ce44SJohn Forte break; 5071fcf3ce44SJohn Forte case STMF_PS_ERROR_VERSION_MISMATCH: 5072fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_DATA_VERSION; 5073fcf3ce44SJohn Forte break; 5074fcf3ce44SJohn Forte default: 5075fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR; 5076fcf3ce44SJohn Forte break; 5077fcf3ce44SJohn Forte } 5078fcf3ce44SJohn Forte if (ret != STMF_STATUS_SUCCESS) { 5079fcf3ce44SJohn Forte goto out; 5080fcf3ce44SJohn Forte } 5081fcf3ce44SJohn Forte for (j = 0; j < viewEntryList->cnt; j++) { 5082fcf3ce44SJohn Forte ret = addViewEntryIoctl(fd, &guidList->guid[i], 5083fcf3ce44SJohn Forte &viewEntryList->ve[j]); 5084fcf3ce44SJohn Forte if (ret != STMF_STATUS_SUCCESS) { 5085fcf3ce44SJohn Forte goto out; 5086fcf3ce44SJohn Forte } 5087fcf3ce44SJohn Forte } 5088fcf3ce44SJohn Forte } 5089fcf3ce44SJohn Forte 5090fcf3ce44SJohn Forte /* get the list of providers that have data */ 5091fcf3ce44SJohn Forte ret = psGetProviderDataList(&providerList); 5092fcf3ce44SJohn Forte switch (ret) { 5093fcf3ce44SJohn Forte case STMF_PS_SUCCESS: 5094fcf3ce44SJohn Forte ret = STMF_STATUS_SUCCESS; 5095fcf3ce44SJohn Forte break; 5096fcf3ce44SJohn Forte case STMF_PS_ERROR_NOT_FOUND: 5097fcf3ce44SJohn Forte ret = STMF_ERROR_NOT_FOUND; 5098fcf3ce44SJohn Forte break; 5099fcf3ce44SJohn Forte case STMF_PS_ERROR_BUSY: 5100fcf3ce44SJohn Forte ret = STMF_ERROR_BUSY; 5101fcf3ce44SJohn Forte break; 5102fcf3ce44SJohn Forte case STMF_PS_ERROR_SERVICE_NOT_FOUND: 5103fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_NOT_FOUND; 5104fcf3ce44SJohn Forte break; 5105fcf3ce44SJohn Forte case STMF_PS_ERROR_VERSION_MISMATCH: 5106fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_DATA_VERSION; 5107fcf3ce44SJohn Forte break; 5108fcf3ce44SJohn Forte default: 5109fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR; 5110fcf3ce44SJohn Forte break; 5111fcf3ce44SJohn Forte } 5112fcf3ce44SJohn Forte if (ret != STMF_STATUS_SUCCESS) { 5113fcf3ce44SJohn Forte goto out; 5114fcf3ce44SJohn Forte } 5115fcf3ce44SJohn Forte 5116fcf3ce44SJohn Forte for (i = 0; i < providerList->cnt; i++) { 5117fcf3ce44SJohn Forte providerType = providerList->provider[i].providerType; 5118fcf3ce44SJohn Forte ret = psGetProviderData(providerList->provider[i].name, 5119fcf3ce44SJohn Forte &nvl, providerType, NULL); 5120fcf3ce44SJohn Forte switch (ret) { 5121fcf3ce44SJohn Forte case STMF_PS_SUCCESS: 5122fcf3ce44SJohn Forte ret = STMF_STATUS_SUCCESS; 5123fcf3ce44SJohn Forte break; 5124fcf3ce44SJohn Forte case STMF_PS_ERROR_NOT_FOUND: 5125fcf3ce44SJohn Forte ret = STMF_ERROR_NOT_FOUND; 5126fcf3ce44SJohn Forte break; 5127fcf3ce44SJohn Forte case STMF_PS_ERROR_BUSY: 5128fcf3ce44SJohn Forte ret = STMF_ERROR_BUSY; 5129fcf3ce44SJohn Forte break; 5130fcf3ce44SJohn Forte case STMF_PS_ERROR_SERVICE_NOT_FOUND: 5131fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_NOT_FOUND; 5132fcf3ce44SJohn Forte break; 5133fcf3ce44SJohn Forte case STMF_PS_ERROR_VERSION_MISMATCH: 5134fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_DATA_VERSION; 5135fcf3ce44SJohn Forte break; 5136fcf3ce44SJohn Forte default: 5137fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR; 5138fcf3ce44SJohn Forte break; 5139fcf3ce44SJohn Forte } 5140fcf3ce44SJohn Forte if (ret != STMF_STATUS_SUCCESS) { 5141fcf3ce44SJohn Forte goto out; 5142fcf3ce44SJohn Forte } 5143fcf3ce44SJohn Forte 5144fcf3ce44SJohn Forte /* call setProviderData */ 5145fcf3ce44SJohn Forte ret = setProviderData(fd, providerList->provider[i].name, nvl, 51468fe96085Stim szeto providerType, NULL); 5147fcf3ce44SJohn Forte switch (ret) { 5148fcf3ce44SJohn Forte case STMF_PS_SUCCESS: 5149fcf3ce44SJohn Forte ret = STMF_STATUS_SUCCESS; 5150fcf3ce44SJohn Forte break; 5151fcf3ce44SJohn Forte case STMF_PS_ERROR_NOT_FOUND: 5152fcf3ce44SJohn Forte ret = STMF_ERROR_NOT_FOUND; 5153fcf3ce44SJohn Forte break; 5154fcf3ce44SJohn Forte case STMF_PS_ERROR_BUSY: 5155fcf3ce44SJohn Forte ret = STMF_ERROR_BUSY; 5156fcf3ce44SJohn Forte break; 5157fcf3ce44SJohn Forte case STMF_PS_ERROR_SERVICE_NOT_FOUND: 5158fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_NOT_FOUND; 5159fcf3ce44SJohn Forte break; 5160fcf3ce44SJohn Forte case STMF_PS_ERROR_VERSION_MISMATCH: 5161fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_DATA_VERSION; 5162fcf3ce44SJohn Forte break; 5163fcf3ce44SJohn Forte default: 5164fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR; 5165fcf3ce44SJohn Forte break; 5166fcf3ce44SJohn Forte } 5167fcf3ce44SJohn Forte if (ret != STMF_STATUS_SUCCESS) { 5168fcf3ce44SJohn Forte goto out; 5169fcf3ce44SJohn Forte } 5170fcf3ce44SJohn Forte 5171fcf3ce44SJohn Forte nvlist_free(nvl); 5172fcf3ce44SJohn Forte nvl = NULL; 5173fcf3ce44SJohn Forte } 5174fcf3ce44SJohn Forte out: 5175fcf3ce44SJohn Forte if (groupList != NULL) { 5176fcf3ce44SJohn Forte free(groupList); 5177fcf3ce44SJohn Forte } 5178fcf3ce44SJohn Forte if (guidList != NULL) { 5179fcf3ce44SJohn Forte free(guidList); 5180fcf3ce44SJohn Forte } 5181fcf3ce44SJohn Forte if (viewEntryList != NULL) { 5182fcf3ce44SJohn Forte free(viewEntryList); 5183fcf3ce44SJohn Forte } 5184fcf3ce44SJohn Forte if (nvl != NULL) { 5185fcf3ce44SJohn Forte nvlist_free(nvl); 5186fcf3ce44SJohn Forte } 5187fcf3ce44SJohn Forte return (ret); 5188fcf3ce44SJohn Forte } 5189fcf3ce44SJohn Forte 5190fcf3ce44SJohn Forte /* 519145039663SJohn Forte * stmfGetAluaState 519245039663SJohn Forte * 519345039663SJohn Forte * Purpose - Get the alua state 519445039663SJohn Forte * 519545039663SJohn Forte */ 519645039663SJohn Forte int 519745039663SJohn Forte stmfGetAluaState(boolean_t *enabled, uint32_t *node) 519845039663SJohn Forte { 519945039663SJohn Forte int ret = STMF_STATUS_SUCCESS; 520045039663SJohn Forte int fd; 520145039663SJohn Forte stmf_iocdata_t stmfIoctl = {0}; 520245039663SJohn Forte stmf_alua_state_desc_t alua_state = {0}; 520345039663SJohn Forte int ioctlRet; 520445039663SJohn Forte 520545039663SJohn Forte if (enabled == NULL || node == NULL) { 520645039663SJohn Forte return (STMF_ERROR_INVALID_ARG); 520745039663SJohn Forte } 520845039663SJohn Forte 520945039663SJohn Forte /* 521045039663SJohn Forte * Open control node for stmf 521145039663SJohn Forte */ 521245039663SJohn Forte if ((ret = openStmf(OPEN_STMF, &fd)) != STMF_STATUS_SUCCESS) 521345039663SJohn Forte return (ret); 521445039663SJohn Forte 521545039663SJohn Forte /* 521645039663SJohn Forte * Issue ioctl to get the stmf state 521745039663SJohn Forte */ 521845039663SJohn Forte stmfIoctl.stmf_version = STMF_VERSION_1; 521945039663SJohn Forte stmfIoctl.stmf_obuf_size = sizeof (alua_state); 522045039663SJohn Forte stmfIoctl.stmf_obuf = (uint64_t)(unsigned long)&alua_state; 522145039663SJohn Forte ioctlRet = ioctl(fd, STMF_IOCTL_GET_ALUA_STATE, &stmfIoctl); 522245039663SJohn Forte 522345039663SJohn Forte (void) close(fd); 522445039663SJohn Forte 522545039663SJohn Forte if (ioctlRet != 0) { 522645039663SJohn Forte switch (errno) { 522745039663SJohn Forte case EBUSY: 522845039663SJohn Forte ret = STMF_ERROR_BUSY; 522945039663SJohn Forte break; 523045039663SJohn Forte case EPERM: 523145039663SJohn Forte case EACCES: 523245039663SJohn Forte ret = STMF_ERROR_PERM; 523345039663SJohn Forte break; 523445039663SJohn Forte default: 523545039663SJohn Forte syslog(LOG_DEBUG, 523645039663SJohn Forte "getStmfState:ioctl errno(%d)", errno); 523745039663SJohn Forte ret = STMF_STATUS_ERROR; 523845039663SJohn Forte break; 523945039663SJohn Forte } 524045039663SJohn Forte } else { 524145039663SJohn Forte if (alua_state.alua_state == 1) { 524245039663SJohn Forte *enabled = B_TRUE; 524345039663SJohn Forte } else { 524445039663SJohn Forte *enabled = B_FALSE; 524545039663SJohn Forte } 524645039663SJohn Forte *node = alua_state.alua_node; 524745039663SJohn Forte } 524845039663SJohn Forte 524945039663SJohn Forte return (ret); 525045039663SJohn Forte } 525145039663SJohn Forte 525245039663SJohn Forte /* 525345039663SJohn Forte * stmfSetAluaState 525445039663SJohn Forte * 525545039663SJohn Forte * Purpose - set the alua state to enabled/disabled 525645039663SJohn Forte * 525745039663SJohn Forte */ 525845039663SJohn Forte int 525945039663SJohn Forte stmfSetAluaState(boolean_t enabled, uint32_t node) 526045039663SJohn Forte { 526145039663SJohn Forte int ret = STMF_STATUS_SUCCESS; 526245039663SJohn Forte int fd; 526345039663SJohn Forte stmf_iocdata_t stmfIoctl = {0}; 526445039663SJohn Forte stmf_alua_state_desc_t alua_state = {0}; 526545039663SJohn Forte int ioctlRet; 526645039663SJohn Forte 526745039663SJohn Forte if ((enabled != B_TRUE && enabled != B_FALSE) || (node > 1)) { 526845039663SJohn Forte return (STMF_ERROR_INVALID_ARG); 526945039663SJohn Forte } 527045039663SJohn Forte 527145039663SJohn Forte if (enabled) { 527245039663SJohn Forte alua_state.alua_state = 1; 527345039663SJohn Forte } 527445039663SJohn Forte 527545039663SJohn Forte alua_state.alua_node = node; 527645039663SJohn Forte 527745039663SJohn Forte /* 527845039663SJohn Forte * Open control node for stmf 527945039663SJohn Forte */ 528045039663SJohn Forte if ((ret = openStmf(OPEN_STMF, &fd)) != STMF_STATUS_SUCCESS) 528145039663SJohn Forte return (ret); 528245039663SJohn Forte 528345039663SJohn Forte /* 528445039663SJohn Forte * Issue ioctl to get the stmf state 528545039663SJohn Forte */ 528645039663SJohn Forte stmfIoctl.stmf_version = STMF_VERSION_1; 528745039663SJohn Forte stmfIoctl.stmf_ibuf_size = sizeof (alua_state); 528845039663SJohn Forte stmfIoctl.stmf_ibuf = (uint64_t)(unsigned long)&alua_state; 528945039663SJohn Forte ioctlRet = ioctl(fd, STMF_IOCTL_SET_ALUA_STATE, &stmfIoctl); 529045039663SJohn Forte 529145039663SJohn Forte (void) close(fd); 529245039663SJohn Forte 529345039663SJohn Forte if (ioctlRet != 0) { 529445039663SJohn Forte switch (errno) { 529545039663SJohn Forte case EBUSY: 529645039663SJohn Forte ret = STMF_ERROR_BUSY; 529745039663SJohn Forte break; 529845039663SJohn Forte case EPERM: 529945039663SJohn Forte case EACCES: 530045039663SJohn Forte ret = STMF_ERROR_PERM; 530145039663SJohn Forte break; 530245039663SJohn Forte default: 530345039663SJohn Forte syslog(LOG_DEBUG, 530445039663SJohn Forte "getStmfState:ioctl errno(%d)", errno); 530545039663SJohn Forte ret = STMF_STATUS_ERROR; 530645039663SJohn Forte break; 530745039663SJohn Forte } 530845039663SJohn Forte } 5309cd36db67SJohn Forte if (!enabled && ret == STMF_STATUS_SUCCESS) { 531045039663SJohn Forte deleteNonActiveLus(); 531145039663SJohn Forte } 531245039663SJohn Forte 531345039663SJohn Forte return (ret); 531445039663SJohn Forte } 531545039663SJohn Forte 531645039663SJohn Forte static void 531745039663SJohn Forte deleteNonActiveLus() 531845039663SJohn Forte { 531945039663SJohn Forte int stmfRet; 532045039663SJohn Forte int i; 532145039663SJohn Forte stmfGuidList *luList; 532245039663SJohn Forte luResource hdl = NULL; 532345039663SJohn Forte char propVal[10]; 532445039663SJohn Forte size_t propValSize = sizeof (propVal); 532545039663SJohn Forte 532645039663SJohn Forte stmfRet = stmfGetLogicalUnitList(&luList); 532745039663SJohn Forte if (stmfRet != STMF_STATUS_SUCCESS) { 532845039663SJohn Forte return; 532945039663SJohn Forte } 533045039663SJohn Forte 533145039663SJohn Forte for (i = 0; i < luList->cnt; i++) { 533245039663SJohn Forte stmfRet = stmfGetLuResource(&luList->guid[i], &hdl); 533345039663SJohn Forte if (stmfRet != STMF_STATUS_SUCCESS) { 533445039663SJohn Forte goto err; 533545039663SJohn Forte } 533645039663SJohn Forte stmfRet = stmfGetLuProp(hdl, STMF_LU_PROP_ACCESS_STATE, propVal, 533745039663SJohn Forte &propValSize); 533845039663SJohn Forte if (stmfRet != STMF_STATUS_SUCCESS) { 533945039663SJohn Forte goto err; 534045039663SJohn Forte } 534145039663SJohn Forte if (propVal[0] == '0') { 534245039663SJohn Forte (void) stmfFreeLuResource(hdl); 534345039663SJohn Forte hdl = NULL; 534445039663SJohn Forte continue; 534545039663SJohn Forte } 534645039663SJohn Forte (void) stmfDeleteLu(&luList->guid[i]); 534745039663SJohn Forte (void) stmfFreeLuResource(hdl); 534845039663SJohn Forte hdl = NULL; 534945039663SJohn Forte } 535045039663SJohn Forte 535145039663SJohn Forte err: 535245039663SJohn Forte stmfFreeMemory(luList); 535345039663SJohn Forte (void) stmfFreeLuResource(hdl); 535445039663SJohn Forte } 535545039663SJohn Forte 535645039663SJohn Forte /* 5357fcf3ce44SJohn Forte * stmfLoadConfig 5358fcf3ce44SJohn Forte * 5359fcf3ce44SJohn Forte * Purpose - load the configuration data from smf into stmf 5360fcf3ce44SJohn Forte * 5361fcf3ce44SJohn Forte */ 5362fcf3ce44SJohn Forte int 5363fcf3ce44SJohn Forte stmfLoadConfig(void) 5364fcf3ce44SJohn Forte { 53658fe96085Stim szeto int ret = STMF_STATUS_SUCCESS; 5366fcf3ce44SJohn Forte int fd; 5367fcf3ce44SJohn Forte stmf_state_desc_t stmfStateSet; 5368fcf3ce44SJohn Forte stmfState state; 5369fcf3ce44SJohn Forte 53708fe96085Stim szeto if (iGetPersistMethod() == STMF_PERSIST_NONE) { 53718fe96085Stim szeto stmfStateSet.state = STMF_STATE_OFFLINE; 5372640428aeSSue Gleeson 53738fe96085Stim szeto if ((ret = openStmf(OPEN_EXCL_STMF, &fd)) 53748fe96085Stim szeto != STMF_STATUS_SUCCESS) { 53758fe96085Stim szeto return (ret); 53768fe96085Stim szeto } 5377640428aeSSue Gleeson /* 5378640428aeSSue Gleeson * Configuration not stored persistently; nothing to 5379640428aeSSue Gleeson * initialize so do not set to STMF_CONFIG_INIT. 5380640428aeSSue Gleeson */ 53818fe96085Stim szeto stmfStateSet.config_state = STMF_CONFIG_INIT_DONE; 53828fe96085Stim szeto goto done; 53838fe96085Stim szeto } 5384fcf3ce44SJohn Forte 5385fcf3ce44SJohn Forte /* Check to ensure service exists */ 5386fcf3ce44SJohn Forte if (psCheckService() != STMF_STATUS_SUCCESS) { 5387fcf3ce44SJohn Forte return (STMF_ERROR_SERVICE_NOT_FOUND); 5388fcf3ce44SJohn Forte } 5389fcf3ce44SJohn Forte 5390fcf3ce44SJohn Forte ret = stmfGetState(&state); 5391fcf3ce44SJohn Forte if (ret == STMF_STATUS_SUCCESS) { 5392fcf3ce44SJohn Forte if (state.operationalState != STMF_SERVICE_STATE_OFFLINE) { 5393fcf3ce44SJohn Forte return (STMF_ERROR_SERVICE_ONLINE); 5394fcf3ce44SJohn Forte } 5395fcf3ce44SJohn Forte } else { 5396fcf3ce44SJohn Forte return (STMF_STATUS_ERROR); 5397fcf3ce44SJohn Forte } 5398fcf3ce44SJohn Forte 5399fcf3ce44SJohn Forte 5400fcf3ce44SJohn Forte stmfStateSet.state = STMF_STATE_OFFLINE; 5401fcf3ce44SJohn Forte stmfStateSet.config_state = STMF_CONFIG_INIT; 5402fcf3ce44SJohn Forte 5403fcf3ce44SJohn Forte /* 5404fcf3ce44SJohn Forte * Open control node for stmf 5405fcf3ce44SJohn Forte */ 5406fcf3ce44SJohn Forte if ((ret = openStmf(OPEN_EXCL_STMF, &fd)) != STMF_STATUS_SUCCESS) 5407fcf3ce44SJohn Forte return (ret); 5408fcf3ce44SJohn Forte 5409fcf3ce44SJohn Forte ret = setStmfState(fd, &stmfStateSet, STMF_SERVICE_TYPE); 5410fcf3ce44SJohn Forte if (ret != STMF_STATUS_SUCCESS) { 5411fcf3ce44SJohn Forte goto done; 5412fcf3ce44SJohn Forte } 5413fcf3ce44SJohn Forte 5414fcf3ce44SJohn Forte /* Load the persistent configuration data */ 5415fcf3ce44SJohn Forte ret = loadStore(fd); 5416fcf3ce44SJohn Forte if (ret != 0) { 5417fcf3ce44SJohn Forte goto done; 5418fcf3ce44SJohn Forte } 5419fcf3ce44SJohn Forte 5420fcf3ce44SJohn Forte stmfStateSet.state = STMF_STATE_OFFLINE; 5421fcf3ce44SJohn Forte stmfStateSet.config_state = STMF_CONFIG_INIT_DONE; 5422fcf3ce44SJohn Forte 5423fcf3ce44SJohn Forte done: 5424fcf3ce44SJohn Forte if (ret == STMF_STATUS_SUCCESS) { 5425fcf3ce44SJohn Forte ret = setStmfState(fd, &stmfStateSet, STMF_SERVICE_TYPE); 5426fcf3ce44SJohn Forte } 5427fcf3ce44SJohn Forte (void) close(fd); 5428fcf3ce44SJohn Forte return (ret); 5429fcf3ce44SJohn Forte } 5430fcf3ce44SJohn Forte 54318fe96085Stim szeto 5432fcf3ce44SJohn Forte /* 5433fcf3ce44SJohn Forte * getStmfState 5434fcf3ce44SJohn Forte * 5435fcf3ce44SJohn Forte * stmfState - pointer to stmf_state_desc_t structure. Will contain the state 5436fcf3ce44SJohn Forte * information of the stmf service on success. 5437fcf3ce44SJohn Forte */ 5438fcf3ce44SJohn Forte static int 5439fcf3ce44SJohn Forte getStmfState(stmf_state_desc_t *stmfState) 5440fcf3ce44SJohn Forte { 5441fcf3ce44SJohn Forte int ret = STMF_STATUS_SUCCESS; 5442fcf3ce44SJohn Forte int fd; 5443fcf3ce44SJohn Forte int ioctlRet; 5444fcf3ce44SJohn Forte stmf_iocdata_t stmfIoctl; 5445fcf3ce44SJohn Forte 5446fcf3ce44SJohn Forte /* 5447fcf3ce44SJohn Forte * Open control node for stmf 5448fcf3ce44SJohn Forte */ 5449fcf3ce44SJohn Forte if ((ret = openStmf(OPEN_STMF, &fd)) != STMF_STATUS_SUCCESS) 5450fcf3ce44SJohn Forte return (ret); 5451fcf3ce44SJohn Forte 5452fcf3ce44SJohn Forte bzero(&stmfIoctl, sizeof (stmfIoctl)); 5453fcf3ce44SJohn Forte /* 5454fcf3ce44SJohn Forte * Issue ioctl to get the stmf state 5455fcf3ce44SJohn Forte */ 5456fcf3ce44SJohn Forte stmfIoctl.stmf_version = STMF_VERSION_1; 5457fcf3ce44SJohn Forte stmfIoctl.stmf_ibuf_size = sizeof (stmf_state_desc_t); 5458fcf3ce44SJohn Forte stmfIoctl.stmf_ibuf = (uint64_t)(unsigned long)stmfState; 5459fcf3ce44SJohn Forte stmfIoctl.stmf_obuf_size = sizeof (stmf_state_desc_t); 5460fcf3ce44SJohn Forte stmfIoctl.stmf_obuf = (uint64_t)(unsigned long)stmfState; 5461fcf3ce44SJohn Forte ioctlRet = ioctl(fd, STMF_IOCTL_GET_STMF_STATE, &stmfIoctl); 5462fcf3ce44SJohn Forte 5463fcf3ce44SJohn Forte (void) close(fd); 5464fcf3ce44SJohn Forte 5465fcf3ce44SJohn Forte if (ioctlRet != 0) { 5466fcf3ce44SJohn Forte switch (errno) { 5467fcf3ce44SJohn Forte case EBUSY: 5468fcf3ce44SJohn Forte ret = STMF_ERROR_BUSY; 5469fcf3ce44SJohn Forte break; 5470fcf3ce44SJohn Forte case EPERM: 5471fcf3ce44SJohn Forte case EACCES: 5472fcf3ce44SJohn Forte ret = STMF_ERROR_PERM; 5473fcf3ce44SJohn Forte break; 5474fcf3ce44SJohn Forte default: 5475fcf3ce44SJohn Forte syslog(LOG_DEBUG, 5476fcf3ce44SJohn Forte "getStmfState:ioctl errno(%d)", errno); 5477fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR; 5478fcf3ce44SJohn Forte break; 5479fcf3ce44SJohn Forte } 5480fcf3ce44SJohn Forte } 5481fcf3ce44SJohn Forte return (ret); 5482fcf3ce44SJohn Forte } 5483fcf3ce44SJohn Forte 5484fcf3ce44SJohn Forte 5485fcf3ce44SJohn Forte /* 5486fcf3ce44SJohn Forte * setStmfState 5487fcf3ce44SJohn Forte * 5488fcf3ce44SJohn Forte * stmfState - pointer to caller set state structure 5489fcf3ce44SJohn Forte * objectType - one of: 5490fcf3ce44SJohn Forte * LOGICAL_UNIT_TYPE 5491fcf3ce44SJohn Forte * TARGET_TYPE 5492fcf3ce44SJohn Forte * STMF_SERVICE_TYPE 5493fcf3ce44SJohn Forte */ 5494fcf3ce44SJohn Forte static int 5495fcf3ce44SJohn Forte setStmfState(int fd, stmf_state_desc_t *stmfState, int objectType) 5496fcf3ce44SJohn Forte { 5497fcf3ce44SJohn Forte int ret = STMF_STATUS_SUCCESS; 5498fcf3ce44SJohn Forte int ioctlRet; 5499fcf3ce44SJohn Forte int cmd; 5500fcf3ce44SJohn Forte stmf_iocdata_t stmfIoctl; 5501fcf3ce44SJohn Forte 5502fcf3ce44SJohn Forte switch (objectType) { 5503fcf3ce44SJohn Forte case LOGICAL_UNIT_TYPE: 5504fcf3ce44SJohn Forte cmd = STMF_IOCTL_SET_LU_STATE; 5505fcf3ce44SJohn Forte break; 5506fcf3ce44SJohn Forte case TARGET_TYPE: 5507fcf3ce44SJohn Forte cmd = STMF_IOCTL_SET_TARGET_PORT_STATE; 5508fcf3ce44SJohn Forte break; 5509fcf3ce44SJohn Forte case STMF_SERVICE_TYPE: 5510fcf3ce44SJohn Forte cmd = STMF_IOCTL_SET_STMF_STATE; 5511fcf3ce44SJohn Forte break; 5512fcf3ce44SJohn Forte default: 5513fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR; 5514fcf3ce44SJohn Forte goto done; 5515fcf3ce44SJohn Forte } 5516fcf3ce44SJohn Forte 5517fcf3ce44SJohn Forte bzero(&stmfIoctl, sizeof (stmfIoctl)); 5518fcf3ce44SJohn Forte /* 5519fcf3ce44SJohn Forte * Issue ioctl to set the stmf state 5520fcf3ce44SJohn Forte */ 5521fcf3ce44SJohn Forte stmfIoctl.stmf_version = STMF_VERSION_1; 5522fcf3ce44SJohn Forte stmfIoctl.stmf_ibuf_size = sizeof (stmf_state_desc_t); 5523fcf3ce44SJohn Forte stmfIoctl.stmf_ibuf = (uint64_t)(unsigned long)stmfState; 5524fcf3ce44SJohn Forte ioctlRet = ioctl(fd, cmd, &stmfIoctl); 5525fcf3ce44SJohn Forte if (ioctlRet != 0) { 5526fcf3ce44SJohn Forte switch (errno) { 5527fcf3ce44SJohn Forte case EBUSY: 5528fcf3ce44SJohn Forte ret = STMF_ERROR_BUSY; 5529fcf3ce44SJohn Forte break; 55308fe96085Stim szeto case EPERM: 5531fcf3ce44SJohn Forte case EACCES: 5532fcf3ce44SJohn Forte ret = STMF_ERROR_PERM; 5533fcf3ce44SJohn Forte break; 5534fcf3ce44SJohn Forte case ENOENT: 5535fcf3ce44SJohn Forte ret = STMF_ERROR_NOT_FOUND; 5536fcf3ce44SJohn Forte break; 5537fcf3ce44SJohn Forte default: 5538fcf3ce44SJohn Forte syslog(LOG_DEBUG, 5539fcf3ce44SJohn Forte "setStmfState:ioctl errno(%d)", errno); 5540fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR; 5541fcf3ce44SJohn Forte break; 5542fcf3ce44SJohn Forte } 5543fcf3ce44SJohn Forte } 5544fcf3ce44SJohn Forte done: 5545fcf3ce44SJohn Forte return (ret); 5546fcf3ce44SJohn Forte } 5547*4b31676fSsrivijitha dugganapalli int 5548*4b31676fSsrivijitha dugganapalli stmfSetStmfProp(uint8_t propType, char *propVal) 5549*4b31676fSsrivijitha dugganapalli { 5550*4b31676fSsrivijitha dugganapalli int ret = STMF_STATUS_SUCCESS; 5551*4b31676fSsrivijitha dugganapalli switch (propType) { 5552*4b31676fSsrivijitha dugganapalli case STMF_DEFAULT_LU_STATE: 5553*4b31676fSsrivijitha dugganapalli break; 5554*4b31676fSsrivijitha dugganapalli case STMF_DEFAULT_TARGET_PORT_STATE: 5555*4b31676fSsrivijitha dugganapalli break; 5556*4b31676fSsrivijitha dugganapalli default: 5557*4b31676fSsrivijitha dugganapalli return (STMF_ERROR_INVALID_ARG); 5558*4b31676fSsrivijitha dugganapalli } 5559*4b31676fSsrivijitha dugganapalli ret = psSetStmfProp(propType, propVal); 5560*4b31676fSsrivijitha dugganapalli switch (ret) { 5561*4b31676fSsrivijitha dugganapalli case STMF_PS_SUCCESS: 5562*4b31676fSsrivijitha dugganapalli ret = STMF_STATUS_SUCCESS; 5563*4b31676fSsrivijitha dugganapalli break; 5564*4b31676fSsrivijitha dugganapalli case STMF_PS_ERROR_BUSY: 5565*4b31676fSsrivijitha dugganapalli ret = STMF_ERROR_BUSY; 5566*4b31676fSsrivijitha dugganapalli break; 5567*4b31676fSsrivijitha dugganapalli default: 5568*4b31676fSsrivijitha dugganapalli syslog(LOG_DEBUG, 5569*4b31676fSsrivijitha dugganapalli "stmfSetStmfProp:psSetStmfProp:error(%d)", 5570*4b31676fSsrivijitha dugganapalli ret); 5571*4b31676fSsrivijitha dugganapalli ret = STMF_STATUS_ERROR; 5572*4b31676fSsrivijitha dugganapalli break; 5573*4b31676fSsrivijitha dugganapalli } 5574*4b31676fSsrivijitha dugganapalli return (ret); 5575*4b31676fSsrivijitha dugganapalli } 5576*4b31676fSsrivijitha dugganapalli 5577*4b31676fSsrivijitha dugganapalli 5578*4b31676fSsrivijitha dugganapalli int 5579*4b31676fSsrivijitha dugganapalli stmfGetStmfProp(uint8_t propType, char *propVal, size_t *propLen) 5580*4b31676fSsrivijitha dugganapalli { 5581*4b31676fSsrivijitha dugganapalli int ret = STMF_STATUS_SUCCESS; 5582*4b31676fSsrivijitha dugganapalli char prop[MAXNAMELEN] = {0}; 5583*4b31676fSsrivijitha dugganapalli size_t reqLen; 5584*4b31676fSsrivijitha dugganapalli 5585*4b31676fSsrivijitha dugganapalli if (propVal == NULL || propLen == NULL) { 5586*4b31676fSsrivijitha dugganapalli return (STMF_ERROR_INVALID_ARG); 5587*4b31676fSsrivijitha dugganapalli } 5588*4b31676fSsrivijitha dugganapalli switch (propType) { 5589*4b31676fSsrivijitha dugganapalli case STMF_DEFAULT_LU_STATE: 5590*4b31676fSsrivijitha dugganapalli break; 5591*4b31676fSsrivijitha dugganapalli case STMF_DEFAULT_TARGET_PORT_STATE: 5592*4b31676fSsrivijitha dugganapalli break; 5593*4b31676fSsrivijitha dugganapalli default: 5594*4b31676fSsrivijitha dugganapalli return (STMF_ERROR_INVALID_ARG); 5595*4b31676fSsrivijitha dugganapalli } 5596*4b31676fSsrivijitha dugganapalli ret = psGetStmfProp(propType, prop); 5597*4b31676fSsrivijitha dugganapalli if ((reqLen = strlcpy(propVal, prop, *propLen)) >= *propLen) { 5598*4b31676fSsrivijitha dugganapalli *propLen = reqLen + 1; 5599*4b31676fSsrivijitha dugganapalli return (STMF_ERROR_INVALID_ARG); 5600*4b31676fSsrivijitha dugganapalli } 5601*4b31676fSsrivijitha dugganapalli 5602*4b31676fSsrivijitha dugganapalli switch (ret) { 5603*4b31676fSsrivijitha dugganapalli case STMF_PS_SUCCESS: 5604*4b31676fSsrivijitha dugganapalli ret = STMF_STATUS_SUCCESS; 5605*4b31676fSsrivijitha dugganapalli break; 5606*4b31676fSsrivijitha dugganapalli case STMF_PS_ERROR_BUSY: 5607*4b31676fSsrivijitha dugganapalli ret = STMF_ERROR_BUSY; 5608*4b31676fSsrivijitha dugganapalli break; 5609*4b31676fSsrivijitha dugganapalli case STMF_PS_ERROR_NOT_FOUND: 5610*4b31676fSsrivijitha dugganapalli ret = STMF_ERROR_NOT_FOUND; 5611*4b31676fSsrivijitha dugganapalli break; 5612*4b31676fSsrivijitha dugganapalli default: 5613*4b31676fSsrivijitha dugganapalli syslog(LOG_DEBUG, 5614*4b31676fSsrivijitha dugganapalli "stmfGetStmfProp:psGetStmfProp:error(%d)", 5615*4b31676fSsrivijitha dugganapalli ret); 5616*4b31676fSsrivijitha dugganapalli ret = STMF_STATUS_ERROR; 5617*4b31676fSsrivijitha dugganapalli break; 5618*4b31676fSsrivijitha dugganapalli } 5619*4b31676fSsrivijitha dugganapalli return (ret); 5620*4b31676fSsrivijitha dugganapalli } 5621*4b31676fSsrivijitha dugganapalli 5622*4b31676fSsrivijitha dugganapalli static int 5623*4b31676fSsrivijitha dugganapalli setStmfProp(stmf_set_props_t *stmf_set_props) 5624*4b31676fSsrivijitha dugganapalli { 5625*4b31676fSsrivijitha dugganapalli char propVal[MAXNAMELEN] = {0}; 5626*4b31676fSsrivijitha dugganapalli int ret; 5627*4b31676fSsrivijitha dugganapalli if ((ret = psGetStmfProp(STMF_DEFAULT_LU_STATE, propVal)) == 5628*4b31676fSsrivijitha dugganapalli STMF_PS_SUCCESS) { 5629*4b31676fSsrivijitha dugganapalli if (strncmp(propVal, "offline", strlen(propVal)) == 0) { 5630*4b31676fSsrivijitha dugganapalli stmf_set_props->default_lu_state_value = 5631*4b31676fSsrivijitha dugganapalli STMF_STATE_OFFLINE; 5632*4b31676fSsrivijitha dugganapalli } else { 5633*4b31676fSsrivijitha dugganapalli stmf_set_props->default_lu_state_value = 5634*4b31676fSsrivijitha dugganapalli STMF_STATE_ONLINE; 5635*4b31676fSsrivijitha dugganapalli } 5636*4b31676fSsrivijitha dugganapalli } else { 5637*4b31676fSsrivijitha dugganapalli syslog(LOG_DEBUG, 5638*4b31676fSsrivijitha dugganapalli "DefaultLuState:psSetStmfProp:error(%d)", ret); 5639*4b31676fSsrivijitha dugganapalli goto done; 5640*4b31676fSsrivijitha dugganapalli } 5641*4b31676fSsrivijitha dugganapalli 5642*4b31676fSsrivijitha dugganapalli if ((ret = psGetStmfProp(STMF_DEFAULT_TARGET_PORT_STATE, propVal)) == 5643*4b31676fSsrivijitha dugganapalli STMF_PS_SUCCESS) { 5644*4b31676fSsrivijitha dugganapalli if (strncmp(propVal, "offline", strlen(propVal)) == 0) { 5645*4b31676fSsrivijitha dugganapalli stmf_set_props->default_target_state_value = 5646*4b31676fSsrivijitha dugganapalli STMF_STATE_OFFLINE; 5647*4b31676fSsrivijitha dugganapalli } else { 5648*4b31676fSsrivijitha dugganapalli stmf_set_props->default_target_state_value = 5649*4b31676fSsrivijitha dugganapalli STMF_STATE_ONLINE; 5650*4b31676fSsrivijitha dugganapalli } 5651*4b31676fSsrivijitha dugganapalli } else { 5652*4b31676fSsrivijitha dugganapalli syslog(LOG_DEBUG, 5653*4b31676fSsrivijitha dugganapalli "DefaultTargetPortState:psSetStmfProp:error(%d)", ret); 5654*4b31676fSsrivijitha dugganapalli goto done; 5655*4b31676fSsrivijitha dugganapalli } 5656*4b31676fSsrivijitha dugganapalli done: 5657*4b31676fSsrivijitha dugganapalli switch (ret) { 5658*4b31676fSsrivijitha dugganapalli case STMF_PS_SUCCESS: 5659*4b31676fSsrivijitha dugganapalli ret = STMF_STATUS_SUCCESS; 5660*4b31676fSsrivijitha dugganapalli break; 5661*4b31676fSsrivijitha dugganapalli case STMF_PS_ERROR_NOT_FOUND: 5662*4b31676fSsrivijitha dugganapalli ret = STMF_ERROR_NOT_FOUND; 5663*4b31676fSsrivijitha dugganapalli break; 5664*4b31676fSsrivijitha dugganapalli case STMF_PS_ERROR_BUSY: 5665*4b31676fSsrivijitha dugganapalli ret = STMF_ERROR_BUSY; 5666*4b31676fSsrivijitha dugganapalli break; 5667*4b31676fSsrivijitha dugganapalli default: 5668*4b31676fSsrivijitha dugganapalli ret = STMF_STATUS_ERROR; 5669*4b31676fSsrivijitha dugganapalli break; 5670*4b31676fSsrivijitha dugganapalli } 5671*4b31676fSsrivijitha dugganapalli return (ret); 5672*4b31676fSsrivijitha dugganapalli } 5673*4b31676fSsrivijitha dugganapalli 5674*4b31676fSsrivijitha dugganapalli static int 5675*4b31676fSsrivijitha dugganapalli loadStmfProp(int fd) 5676*4b31676fSsrivijitha dugganapalli { 5677*4b31676fSsrivijitha dugganapalli int ret = STMF_STATUS_SUCCESS; 5678*4b31676fSsrivijitha dugganapalli int ioctlRet; 5679*4b31676fSsrivijitha dugganapalli stmf_iocdata_t stmfIoctl = {0}; 5680*4b31676fSsrivijitha dugganapalli stmf_set_props_t *stmf_set_props = NULL; 5681*4b31676fSsrivijitha dugganapalli 5682*4b31676fSsrivijitha dugganapalli stmf_set_props = (stmf_set_props_t *) 5683*4b31676fSsrivijitha dugganapalli calloc(1, (sizeof (stmf_set_props_t))); 5684*4b31676fSsrivijitha dugganapalli if (stmf_set_props == NULL) { 5685*4b31676fSsrivijitha dugganapalli ret = STMF_ERROR_NOMEM; 5686*4b31676fSsrivijitha dugganapalli goto done; 5687*4b31676fSsrivijitha dugganapalli } 5688*4b31676fSsrivijitha dugganapalli 5689*4b31676fSsrivijitha dugganapalli /* Loading the default property values from smf */ 5690*4b31676fSsrivijitha dugganapalli 5691*4b31676fSsrivijitha dugganapalli if ((ret = setStmfProp(stmf_set_props)) != STMF_STATUS_SUCCESS) 5692*4b31676fSsrivijitha dugganapalli goto done; 5693*4b31676fSsrivijitha dugganapalli 5694*4b31676fSsrivijitha dugganapalli stmfIoctl.stmf_version = STMF_VERSION_1; 5695*4b31676fSsrivijitha dugganapalli stmfIoctl.stmf_ibuf_size = sizeof (stmf_set_props_t); 5696*4b31676fSsrivijitha dugganapalli stmfIoctl.stmf_ibuf = 5697*4b31676fSsrivijitha dugganapalli (uint64_t)(unsigned long)stmf_set_props; 5698*4b31676fSsrivijitha dugganapalli 5699*4b31676fSsrivijitha dugganapalli ioctlRet = ioctl(fd, STMF_IOCTL_SET_STMF_PROPS, 5700*4b31676fSsrivijitha dugganapalli &stmfIoctl); 5701*4b31676fSsrivijitha dugganapalli 5702*4b31676fSsrivijitha dugganapalli if (ioctlRet != 0) { 5703*4b31676fSsrivijitha dugganapalli switch (errno) { 5704*4b31676fSsrivijitha dugganapalli case EBUSY: 5705*4b31676fSsrivijitha dugganapalli ret = STMF_ERROR_BUSY; 5706*4b31676fSsrivijitha dugganapalli break; 5707*4b31676fSsrivijitha dugganapalli case EPERM: 5708*4b31676fSsrivijitha dugganapalli case EACCES: 5709*4b31676fSsrivijitha dugganapalli ret = STMF_ERROR_PERM; 5710*4b31676fSsrivijitha dugganapalli break; 5711*4b31676fSsrivijitha dugganapalli case ENOENT: 5712*4b31676fSsrivijitha dugganapalli ret = STMF_ERROR_NOT_FOUND; 5713*4b31676fSsrivijitha dugganapalli break; 5714*4b31676fSsrivijitha dugganapalli default: 5715*4b31676fSsrivijitha dugganapalli syslog(LOG_DEBUG, 5716*4b31676fSsrivijitha dugganapalli "setDefaultStmfState:" 5717*4b31676fSsrivijitha dugganapalli "ioctl errno(%d)", errno); 5718*4b31676fSsrivijitha dugganapalli ret = STMF_STATUS_ERROR; 5719*4b31676fSsrivijitha dugganapalli break; 5720*4b31676fSsrivijitha dugganapalli } 5721*4b31676fSsrivijitha dugganapalli } 5722*4b31676fSsrivijitha dugganapalli done: 5723*4b31676fSsrivijitha dugganapalli if (stmf_set_props != NULL) { 5724*4b31676fSsrivijitha dugganapalli free(stmf_set_props); 5725*4b31676fSsrivijitha dugganapalli } 5726*4b31676fSsrivijitha dugganapalli return (ret); 5727*4b31676fSsrivijitha dugganapalli } 5728*4b31676fSsrivijitha dugganapalli 5729*4b31676fSsrivijitha dugganapalli int 5730*4b31676fSsrivijitha dugganapalli stmfLoadStmfProps(void) 5731*4b31676fSsrivijitha dugganapalli { 5732*4b31676fSsrivijitha dugganapalli int ret = STMF_STATUS_SUCCESS; 5733*4b31676fSsrivijitha dugganapalli int fd; 5734*4b31676fSsrivijitha dugganapalli /* open control node for stmf */ 5735*4b31676fSsrivijitha dugganapalli if ((ret = openStmf(OPEN_EXCL_STMF, &fd)) 5736*4b31676fSsrivijitha dugganapalli != STMF_STATUS_SUCCESS) { 5737*4b31676fSsrivijitha dugganapalli goto done; 5738*4b31676fSsrivijitha dugganapalli } 5739*4b31676fSsrivijitha dugganapalli ret = loadStmfProp(fd); 5740*4b31676fSsrivijitha dugganapalli 5741*4b31676fSsrivijitha dugganapalli (void) close(fd); 5742*4b31676fSsrivijitha dugganapalli done: 5743*4b31676fSsrivijitha dugganapalli if (ret != STMF_STATUS_SUCCESS) { 5744*4b31676fSsrivijitha dugganapalli syslog(LOG_DEBUG, 5745*4b31676fSsrivijitha dugganapalli "stmfLoadStmfProps:Failed"); 5746*4b31676fSsrivijitha dugganapalli } 5747*4b31676fSsrivijitha dugganapalli return (ret); 5748*4b31676fSsrivijitha dugganapalli } 5749fcf3ce44SJohn Forte 5750fcf3ce44SJohn Forte /* 5751fcf3ce44SJohn Forte * stmfOnline 5752fcf3ce44SJohn Forte * 5753fcf3ce44SJohn Forte * Purpose: Online stmf service 5754fcf3ce44SJohn Forte * 5755fcf3ce44SJohn Forte */ 5756fcf3ce44SJohn Forte int 5757fcf3ce44SJohn Forte stmfOnline(void) 5758fcf3ce44SJohn Forte { 5759fcf3ce44SJohn Forte int ret; 5760fcf3ce44SJohn Forte int fd; 5761fcf3ce44SJohn Forte stmfState state; 5762fcf3ce44SJohn Forte stmf_state_desc_t iState; 5763fcf3ce44SJohn Forte 5764fcf3ce44SJohn Forte ret = stmfGetState(&state); 5765fcf3ce44SJohn Forte if (ret == STMF_STATUS_SUCCESS) { 5766fcf3ce44SJohn Forte if (state.operationalState == STMF_SERVICE_STATE_ONLINE) { 5767fcf3ce44SJohn Forte return (STMF_ERROR_SERVICE_ONLINE); 5768fcf3ce44SJohn Forte } 5769fcf3ce44SJohn Forte } else { 5770fcf3ce44SJohn Forte return (STMF_STATUS_ERROR); 5771fcf3ce44SJohn Forte } 5772fcf3ce44SJohn Forte iState.state = STMF_STATE_ONLINE; 5773fcf3ce44SJohn Forte iState.config_state = STMF_CONFIG_NONE; 5774fcf3ce44SJohn Forte /* 5775fcf3ce44SJohn Forte * Open control node for stmf 5776fcf3ce44SJohn Forte * to make call to setStmfState() 5777fcf3ce44SJohn Forte */ 5778fcf3ce44SJohn Forte if ((ret = openStmf(OPEN_EXCL_STMF, &fd)) != STMF_STATUS_SUCCESS) 5779fcf3ce44SJohn Forte return (ret); 5780fcf3ce44SJohn Forte ret = setStmfState(fd, &iState, STMF_SERVICE_TYPE); 5781fcf3ce44SJohn Forte (void) close(fd); 5782fcf3ce44SJohn Forte return (ret); 5783fcf3ce44SJohn Forte } 5784fcf3ce44SJohn Forte 5785fcf3ce44SJohn Forte /* 5786fcf3ce44SJohn Forte * stmfOffline 5787fcf3ce44SJohn Forte * 5788fcf3ce44SJohn Forte * Purpose: Offline stmf service 5789fcf3ce44SJohn Forte * 5790fcf3ce44SJohn Forte */ 5791fcf3ce44SJohn Forte int 5792fcf3ce44SJohn Forte stmfOffline(void) 5793fcf3ce44SJohn Forte { 5794fcf3ce44SJohn Forte int ret; 5795fcf3ce44SJohn Forte int fd; 5796fcf3ce44SJohn Forte stmfState state; 5797fcf3ce44SJohn Forte stmf_state_desc_t iState; 5798fcf3ce44SJohn Forte 5799fcf3ce44SJohn Forte ret = stmfGetState(&state); 5800fcf3ce44SJohn Forte if (ret == STMF_STATUS_SUCCESS) { 5801fcf3ce44SJohn Forte if (state.operationalState == STMF_SERVICE_STATE_OFFLINE) { 5802fcf3ce44SJohn Forte return (STMF_ERROR_SERVICE_OFFLINE); 5803fcf3ce44SJohn Forte } 5804fcf3ce44SJohn Forte } else { 5805fcf3ce44SJohn Forte return (STMF_STATUS_ERROR); 5806fcf3ce44SJohn Forte } 5807fcf3ce44SJohn Forte iState.state = STMF_STATE_OFFLINE; 5808fcf3ce44SJohn Forte iState.config_state = STMF_CONFIG_NONE; 5809fcf3ce44SJohn Forte 5810fcf3ce44SJohn Forte /* 5811fcf3ce44SJohn Forte * Open control node for stmf 5812fcf3ce44SJohn Forte * to make call to setStmfState() 5813fcf3ce44SJohn Forte */ 5814fcf3ce44SJohn Forte if ((ret = openStmf(OPEN_EXCL_STMF, &fd)) != STMF_STATUS_SUCCESS) 5815fcf3ce44SJohn Forte return (ret); 5816fcf3ce44SJohn Forte ret = setStmfState(fd, &iState, STMF_SERVICE_TYPE); 5817fcf3ce44SJohn Forte (void) close(fd); 5818fcf3ce44SJohn Forte return (ret); 5819fcf3ce44SJohn Forte } 5820fcf3ce44SJohn Forte 5821fcf3ce44SJohn Forte 5822fcf3ce44SJohn Forte /* 5823fcf3ce44SJohn Forte * stmfOfflineTarget 5824fcf3ce44SJohn Forte * 5825fcf3ce44SJohn Forte * Purpose: Change state of target to offline 5826fcf3ce44SJohn Forte * 5827fcf3ce44SJohn Forte * devid - devid of the target to offline 5828fcf3ce44SJohn Forte */ 5829fcf3ce44SJohn Forte int 5830fcf3ce44SJohn Forte stmfOfflineTarget(stmfDevid *devid) 5831fcf3ce44SJohn Forte { 5832fcf3ce44SJohn Forte stmf_state_desc_t targetState; 5833fcf3ce44SJohn Forte int ret = STMF_STATUS_SUCCESS; 5834fcf3ce44SJohn Forte int fd; 5835fcf3ce44SJohn Forte 5836fcf3ce44SJohn Forte if (devid == NULL) { 5837fcf3ce44SJohn Forte return (STMF_ERROR_INVALID_ARG); 5838fcf3ce44SJohn Forte } 5839fcf3ce44SJohn Forte bzero(&targetState, sizeof (targetState)); 5840fcf3ce44SJohn Forte 5841fcf3ce44SJohn Forte targetState.state = STMF_STATE_OFFLINE; 5842fcf3ce44SJohn Forte targetState.ident[IDENT_LENGTH_BYTE] = devid->identLength; 5843fcf3ce44SJohn Forte bcopy(&(devid->ident), &targetState.ident[IDENT_LENGTH_BYTE + 1], 5844fcf3ce44SJohn Forte devid->identLength); 5845fcf3ce44SJohn Forte /* 5846fcf3ce44SJohn Forte * Open control node for stmf 5847fcf3ce44SJohn Forte * to make call to setStmfState() 5848fcf3ce44SJohn Forte */ 5849fcf3ce44SJohn Forte if ((ret = openStmf(OPEN_EXCL_STMF, &fd)) != STMF_STATUS_SUCCESS) 5850fcf3ce44SJohn Forte return (ret); 5851fcf3ce44SJohn Forte ret = setStmfState(fd, &targetState, TARGET_TYPE); 5852fcf3ce44SJohn Forte (void) close(fd); 5853fcf3ce44SJohn Forte return (ret); 5854fcf3ce44SJohn Forte } 5855fcf3ce44SJohn Forte 5856fcf3ce44SJohn Forte /* 5857fcf3ce44SJohn Forte * stmfOfflineLogicalUnit 5858fcf3ce44SJohn Forte * 5859fcf3ce44SJohn Forte * Purpose: Change state of logical unit to offline 5860fcf3ce44SJohn Forte * 5861fcf3ce44SJohn Forte * lu - guid of the logical unit to offline 5862fcf3ce44SJohn Forte */ 5863fcf3ce44SJohn Forte int 5864fcf3ce44SJohn Forte stmfOfflineLogicalUnit(stmfGuid *lu) 5865fcf3ce44SJohn Forte { 5866fcf3ce44SJohn Forte stmf_state_desc_t luState; 5867fcf3ce44SJohn Forte int ret = STMF_STATUS_SUCCESS; 5868fcf3ce44SJohn Forte int fd; 5869fcf3ce44SJohn Forte 5870fcf3ce44SJohn Forte if (lu == NULL) { 5871fcf3ce44SJohn Forte return (STMF_ERROR_INVALID_ARG); 5872fcf3ce44SJohn Forte } 5873fcf3ce44SJohn Forte 5874fcf3ce44SJohn Forte bzero(&luState, sizeof (luState)); 5875fcf3ce44SJohn Forte 5876fcf3ce44SJohn Forte luState.state = STMF_STATE_OFFLINE; 5877fcf3ce44SJohn Forte bcopy(lu, &luState.ident, sizeof (stmfGuid)); 5878fcf3ce44SJohn Forte /* 5879fcf3ce44SJohn Forte * Open control node for stmf 5880fcf3ce44SJohn Forte * to make call to setStmfState() 5881fcf3ce44SJohn Forte */ 5882fcf3ce44SJohn Forte if ((ret = openStmf(OPEN_EXCL_STMF, &fd)) != STMF_STATUS_SUCCESS) 5883fcf3ce44SJohn Forte return (ret); 5884fcf3ce44SJohn Forte ret = setStmfState(fd, &luState, LOGICAL_UNIT_TYPE); 5885fcf3ce44SJohn Forte (void) close(fd); 5886fcf3ce44SJohn Forte return (ret); 5887fcf3ce44SJohn Forte } 5888fcf3ce44SJohn Forte 5889fcf3ce44SJohn Forte /* 5890fcf3ce44SJohn Forte * stmfOnlineTarget 5891fcf3ce44SJohn Forte * 5892fcf3ce44SJohn Forte * Purpose: Change state of target to online 5893fcf3ce44SJohn Forte * 5894fcf3ce44SJohn Forte * devid - devid of the target to online 5895fcf3ce44SJohn Forte */ 5896fcf3ce44SJohn Forte int 5897fcf3ce44SJohn Forte stmfOnlineTarget(stmfDevid *devid) 5898fcf3ce44SJohn Forte { 5899fcf3ce44SJohn Forte stmf_state_desc_t targetState; 5900fcf3ce44SJohn Forte int ret = STMF_STATUS_SUCCESS; 5901fcf3ce44SJohn Forte int fd; 5902fcf3ce44SJohn Forte 5903fcf3ce44SJohn Forte if (devid == NULL) { 5904fcf3ce44SJohn Forte return (STMF_ERROR_INVALID_ARG); 5905fcf3ce44SJohn Forte } 5906fcf3ce44SJohn Forte bzero(&targetState, sizeof (targetState)); 5907fcf3ce44SJohn Forte 5908fcf3ce44SJohn Forte targetState.state = STMF_STATE_ONLINE; 5909fcf3ce44SJohn Forte targetState.ident[IDENT_LENGTH_BYTE] = devid->identLength; 5910fcf3ce44SJohn Forte bcopy(&(devid->ident), &targetState.ident[IDENT_LENGTH_BYTE + 1], 5911fcf3ce44SJohn Forte devid->identLength); 5912fcf3ce44SJohn Forte /* 5913fcf3ce44SJohn Forte * Open control node for stmf 5914fcf3ce44SJohn Forte * to make call to setStmfState() 5915fcf3ce44SJohn Forte */ 5916fcf3ce44SJohn Forte if ((ret = openStmf(OPEN_EXCL_STMF, &fd)) != STMF_STATUS_SUCCESS) 5917fcf3ce44SJohn Forte return (ret); 5918fcf3ce44SJohn Forte ret = setStmfState(fd, &targetState, TARGET_TYPE); 5919fcf3ce44SJohn Forte (void) close(fd); 5920fcf3ce44SJohn Forte return (ret); 5921fcf3ce44SJohn Forte } 5922fcf3ce44SJohn Forte 5923fcf3ce44SJohn Forte /* 5924fcf3ce44SJohn Forte * stmfOnlineLogicalUnit 5925fcf3ce44SJohn Forte * 5926fcf3ce44SJohn Forte * Purpose: Change state of logical unit to online 5927fcf3ce44SJohn Forte * 5928fcf3ce44SJohn Forte * lu - guid of the logical unit to online 5929fcf3ce44SJohn Forte */ 5930fcf3ce44SJohn Forte int 5931fcf3ce44SJohn Forte stmfOnlineLogicalUnit(stmfGuid *lu) 5932fcf3ce44SJohn Forte { 5933fcf3ce44SJohn Forte stmf_state_desc_t luState; 5934fcf3ce44SJohn Forte int ret = STMF_STATUS_SUCCESS; 5935fcf3ce44SJohn Forte int fd; 5936fcf3ce44SJohn Forte 5937fcf3ce44SJohn Forte if (lu == NULL) { 5938fcf3ce44SJohn Forte return (STMF_ERROR_INVALID_ARG); 5939fcf3ce44SJohn Forte } 5940fcf3ce44SJohn Forte 5941fcf3ce44SJohn Forte bzero(&luState, sizeof (luState)); 5942fcf3ce44SJohn Forte 5943fcf3ce44SJohn Forte luState.state = STMF_STATE_ONLINE; 5944fcf3ce44SJohn Forte bcopy(lu, &luState.ident, sizeof (stmfGuid)); 5945fcf3ce44SJohn Forte /* 5946fcf3ce44SJohn Forte * Open control node for stmf 5947fcf3ce44SJohn Forte * to make call to setStmfState() 5948fcf3ce44SJohn Forte */ 5949fcf3ce44SJohn Forte if ((ret = openStmf(OPEN_EXCL_STMF, &fd)) != STMF_STATUS_SUCCESS) 5950fcf3ce44SJohn Forte return (ret); 5951fcf3ce44SJohn Forte ret = setStmfState(fd, &luState, LOGICAL_UNIT_TYPE); 5952fcf3ce44SJohn Forte (void) close(fd); 5953fcf3ce44SJohn Forte return (ret); 5954fcf3ce44SJohn Forte } 5955fcf3ce44SJohn Forte 5956fcf3ce44SJohn Forte /* 5957fcf3ce44SJohn Forte * stmfRemoveFromHostGroup 5958fcf3ce44SJohn Forte * 5959fcf3ce44SJohn Forte * Purpose: Removes an initiator from an initiator group 5960fcf3ce44SJohn Forte * 5961fcf3ce44SJohn Forte * hostGroupName - name of an initiator group 5962fcf3ce44SJohn Forte * hostName - name of host group member to remove 5963fcf3ce44SJohn Forte */ 5964fcf3ce44SJohn Forte int 5965fcf3ce44SJohn Forte stmfRemoveFromHostGroup(stmfGroupName *hostGroupName, stmfDevid *hostName) 5966fcf3ce44SJohn Forte { 5967fcf3ce44SJohn Forte int ret; 5968fcf3ce44SJohn Forte int fd; 5969fcf3ce44SJohn Forte 5970fcf3ce44SJohn Forte if (hostGroupName == NULL || 5971fcf3ce44SJohn Forte (strnlen((char *)hostGroupName, sizeof (stmfGroupName)) 5972fcf3ce44SJohn Forte == sizeof (stmfGroupName)) || hostName == NULL) { 5973fcf3ce44SJohn Forte return (STMF_ERROR_INVALID_ARG); 5974fcf3ce44SJohn Forte } 5975fcf3ce44SJohn Forte 5976fcf3ce44SJohn Forte /* call init */ 5977fcf3ce44SJohn Forte ret = initializeConfig(); 5978fcf3ce44SJohn Forte if (ret != STMF_STATUS_SUCCESS) { 5979fcf3ce44SJohn Forte return (ret); 5980fcf3ce44SJohn Forte } 5981fcf3ce44SJohn Forte 5982fcf3ce44SJohn Forte /* 5983fcf3ce44SJohn Forte * Open control node for stmf 5984fcf3ce44SJohn Forte */ 5985fcf3ce44SJohn Forte if ((ret = openStmf(OPEN_STMF, &fd)) != STMF_STATUS_SUCCESS) 5986fcf3ce44SJohn Forte return (ret); 5987fcf3ce44SJohn Forte 5988fcf3ce44SJohn Forte if ((ret = groupMemberIoctl(fd, STMF_IOCTL_REMOVE_HG_ENTRY, 5989fcf3ce44SJohn Forte hostGroupName, hostName)) != STMF_STATUS_SUCCESS) { 5990fcf3ce44SJohn Forte goto done; 5991fcf3ce44SJohn Forte } 5992fcf3ce44SJohn Forte 59938fe96085Stim szeto if (iGetPersistMethod() == STMF_PERSIST_NONE) { 59948fe96085Stim szeto goto done; 59958fe96085Stim szeto } 59968fe96085Stim szeto 5997fcf3ce44SJohn Forte ret = psRemoveHostGroupMember((char *)hostGroupName, 5998fcf3ce44SJohn Forte (char *)hostName->ident); 5999fcf3ce44SJohn Forte switch (ret) { 6000fcf3ce44SJohn Forte case STMF_PS_SUCCESS: 6001fcf3ce44SJohn Forte ret = STMF_STATUS_SUCCESS; 6002fcf3ce44SJohn Forte break; 6003fcf3ce44SJohn Forte case STMF_PS_ERROR_MEMBER_NOT_FOUND: 6004fcf3ce44SJohn Forte ret = STMF_ERROR_MEMBER_NOT_FOUND; 6005fcf3ce44SJohn Forte break; 6006fcf3ce44SJohn Forte case STMF_PS_ERROR_GROUP_NOT_FOUND: 6007fcf3ce44SJohn Forte ret = STMF_ERROR_GROUP_NOT_FOUND; 6008fcf3ce44SJohn Forte break; 6009fcf3ce44SJohn Forte case STMF_PS_ERROR_BUSY: 6010fcf3ce44SJohn Forte ret = STMF_ERROR_BUSY; 6011fcf3ce44SJohn Forte break; 6012fcf3ce44SJohn Forte case STMF_PS_ERROR_SERVICE_NOT_FOUND: 6013fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_NOT_FOUND; 6014fcf3ce44SJohn Forte break; 6015fcf3ce44SJohn Forte case STMF_PS_ERROR_VERSION_MISMATCH: 6016fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_DATA_VERSION; 6017fcf3ce44SJohn Forte break; 6018fcf3ce44SJohn Forte default: 6019fcf3ce44SJohn Forte syslog(LOG_DEBUG, 6020fcf3ce44SJohn Forte "stmfRemoveFromHostGroup" 6021fcf3ce44SJohn Forte "psRemoveHostGroupMember:error(%d)", ret); 6022fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR; 6023fcf3ce44SJohn Forte break; 6024fcf3ce44SJohn Forte } 6025fcf3ce44SJohn Forte 6026fcf3ce44SJohn Forte done: 6027fcf3ce44SJohn Forte (void) close(fd); 6028fcf3ce44SJohn Forte return (ret); 6029fcf3ce44SJohn Forte } 6030fcf3ce44SJohn Forte 6031fcf3ce44SJohn Forte /* 6032fcf3ce44SJohn Forte * stmfRemoveFromTargetGroup 6033fcf3ce44SJohn Forte * 6034fcf3ce44SJohn Forte * Purpose: Removes a local port from a local port group 6035fcf3ce44SJohn Forte * 6036fcf3ce44SJohn Forte * targetGroupName - name of a target group 6037fcf3ce44SJohn Forte * targetName - name of target to remove 6038fcf3ce44SJohn Forte */ 6039fcf3ce44SJohn Forte int 6040fcf3ce44SJohn Forte stmfRemoveFromTargetGroup(stmfGroupName *targetGroupName, stmfDevid *targetName) 6041fcf3ce44SJohn Forte { 6042fcf3ce44SJohn Forte int ret; 6043fcf3ce44SJohn Forte int fd; 6044fcf3ce44SJohn Forte 6045fcf3ce44SJohn Forte if (targetGroupName == NULL || 6046fcf3ce44SJohn Forte (strnlen((char *)targetGroupName, sizeof (stmfGroupName)) 6047fcf3ce44SJohn Forte == sizeof (stmfGroupName)) || targetName == NULL) { 6048fcf3ce44SJohn Forte return (STMF_ERROR_INVALID_ARG); 6049fcf3ce44SJohn Forte } 6050fcf3ce44SJohn Forte 6051fcf3ce44SJohn Forte /* call init */ 6052fcf3ce44SJohn Forte ret = initializeConfig(); 6053fcf3ce44SJohn Forte if (ret != STMF_STATUS_SUCCESS) { 6054fcf3ce44SJohn Forte return (ret); 6055fcf3ce44SJohn Forte } 6056fcf3ce44SJohn Forte 6057fcf3ce44SJohn Forte /* 6058fcf3ce44SJohn Forte * Open control node for stmf 6059fcf3ce44SJohn Forte */ 6060fcf3ce44SJohn Forte if ((ret = openStmf(OPEN_STMF, &fd)) != STMF_STATUS_SUCCESS) 6061fcf3ce44SJohn Forte return (ret); 6062fcf3ce44SJohn Forte 6063fcf3ce44SJohn Forte if ((ret = groupMemberIoctl(fd, STMF_IOCTL_REMOVE_TG_ENTRY, 6064fcf3ce44SJohn Forte targetGroupName, targetName)) != STMF_STATUS_SUCCESS) { 6065fcf3ce44SJohn Forte goto done; 6066fcf3ce44SJohn Forte } 6067fcf3ce44SJohn Forte 60688fe96085Stim szeto if (iGetPersistMethod() == STMF_PERSIST_NONE) { 60698fe96085Stim szeto goto done; 60708fe96085Stim szeto } 60718fe96085Stim szeto 6072fcf3ce44SJohn Forte ret = psRemoveTargetGroupMember((char *)targetGroupName, 6073fcf3ce44SJohn Forte (char *)targetName->ident); 6074fcf3ce44SJohn Forte switch (ret) { 6075fcf3ce44SJohn Forte case STMF_PS_SUCCESS: 6076fcf3ce44SJohn Forte ret = STMF_STATUS_SUCCESS; 6077fcf3ce44SJohn Forte break; 6078fcf3ce44SJohn Forte case STMF_PS_ERROR_MEMBER_NOT_FOUND: 6079fcf3ce44SJohn Forte ret = STMF_ERROR_MEMBER_NOT_FOUND; 6080fcf3ce44SJohn Forte break; 6081fcf3ce44SJohn Forte case STMF_PS_ERROR_GROUP_NOT_FOUND: 6082fcf3ce44SJohn Forte ret = STMF_ERROR_GROUP_NOT_FOUND; 6083fcf3ce44SJohn Forte break; 6084fcf3ce44SJohn Forte case STMF_PS_ERROR_BUSY: 6085fcf3ce44SJohn Forte ret = STMF_ERROR_BUSY; 6086fcf3ce44SJohn Forte break; 6087fcf3ce44SJohn Forte case STMF_PS_ERROR_SERVICE_NOT_FOUND: 6088fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_NOT_FOUND; 6089fcf3ce44SJohn Forte break; 6090fcf3ce44SJohn Forte case STMF_PS_ERROR_VERSION_MISMATCH: 6091fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_DATA_VERSION; 6092fcf3ce44SJohn Forte break; 6093fcf3ce44SJohn Forte default: 6094fcf3ce44SJohn Forte syslog(LOG_DEBUG, 6095fcf3ce44SJohn Forte "stmfRemoveFromTargetGroup" 6096fcf3ce44SJohn Forte "psRemoveTargetGroupMember:error(%d)", ret); 6097fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR; 6098fcf3ce44SJohn Forte break; 6099fcf3ce44SJohn Forte } 6100fcf3ce44SJohn Forte 6101fcf3ce44SJohn Forte done: 6102fcf3ce44SJohn Forte (void) close(fd); 6103fcf3ce44SJohn Forte return (ret); 6104fcf3ce44SJohn Forte } 6105fcf3ce44SJohn Forte 6106fcf3ce44SJohn Forte /* 6107fcf3ce44SJohn Forte * stmfRemoveViewEntry 6108fcf3ce44SJohn Forte * 6109fcf3ce44SJohn Forte * Purpose: Removes a view entry from a logical unit 6110fcf3ce44SJohn Forte * 6111fcf3ce44SJohn Forte * lu - guid of lu for which view entry is being removed 6112fcf3ce44SJohn Forte * viewEntryIndex - index of view entry to remove 6113fcf3ce44SJohn Forte * 6114fcf3ce44SJohn Forte */ 6115fcf3ce44SJohn Forte int 6116fcf3ce44SJohn Forte stmfRemoveViewEntry(stmfGuid *lu, uint32_t viewEntryIndex) 6117fcf3ce44SJohn Forte { 6118fcf3ce44SJohn Forte int ret = STMF_STATUS_SUCCESS; 6119fcf3ce44SJohn Forte int fd; 6120fcf3ce44SJohn Forte int ioctlRet; 6121fcf3ce44SJohn Forte stmf_iocdata_t stmfIoctl; 6122fcf3ce44SJohn Forte stmf_view_op_entry_t ioctlViewEntry; 6123fcf3ce44SJohn Forte 6124fcf3ce44SJohn Forte if (lu == NULL) { 6125fcf3ce44SJohn Forte return (STMF_ERROR_INVALID_ARG); 6126fcf3ce44SJohn Forte } 6127fcf3ce44SJohn Forte 6128fcf3ce44SJohn Forte /* call init */ 6129fcf3ce44SJohn Forte ret = initializeConfig(); 6130fcf3ce44SJohn Forte if (ret != STMF_STATUS_SUCCESS) { 6131fcf3ce44SJohn Forte return (ret); 6132fcf3ce44SJohn Forte } 6133fcf3ce44SJohn Forte 6134fcf3ce44SJohn Forte /* 6135fcf3ce44SJohn Forte * Open control node for stmf 6136fcf3ce44SJohn Forte */ 6137fcf3ce44SJohn Forte if ((ret = openStmf(OPEN_STMF, &fd)) != STMF_STATUS_SUCCESS) 6138fcf3ce44SJohn Forte return (ret); 6139fcf3ce44SJohn Forte 6140fcf3ce44SJohn Forte bzero(&ioctlViewEntry, sizeof (ioctlViewEntry)); 6141fcf3ce44SJohn Forte ioctlViewEntry.ve_ndx_valid = B_TRUE; 6142fcf3ce44SJohn Forte ioctlViewEntry.ve_ndx = viewEntryIndex; 6143fcf3ce44SJohn Forte bcopy(lu, &ioctlViewEntry.ve_guid, sizeof (stmfGuid)); 6144fcf3ce44SJohn Forte 6145fcf3ce44SJohn Forte bzero(&stmfIoctl, sizeof (stmfIoctl)); 6146fcf3ce44SJohn Forte /* 6147fcf3ce44SJohn Forte * Issue ioctl to add to the view entry 6148fcf3ce44SJohn Forte */ 6149fcf3ce44SJohn Forte stmfIoctl.stmf_version = STMF_VERSION_1; 6150fcf3ce44SJohn Forte stmfIoctl.stmf_ibuf_size = sizeof (ioctlViewEntry); 6151fcf3ce44SJohn Forte stmfIoctl.stmf_ibuf = (uint64_t)(unsigned long)&ioctlViewEntry; 6152fcf3ce44SJohn Forte ioctlRet = ioctl(fd, STMF_IOCTL_REMOVE_VIEW_ENTRY, &stmfIoctl); 6153fcf3ce44SJohn Forte if (ioctlRet != 0) { 6154fcf3ce44SJohn Forte switch (errno) { 6155fcf3ce44SJohn Forte case EBUSY: 6156fcf3ce44SJohn Forte ret = STMF_ERROR_BUSY; 6157fcf3ce44SJohn Forte break; 61588fe96085Stim szeto case EPERM: 61598fe96085Stim szeto ret = STMF_ERROR_PERM; 61608fe96085Stim szeto break; 6161fcf3ce44SJohn Forte case EACCES: 6162fcf3ce44SJohn Forte switch (stmfIoctl.stmf_error) { 6163fcf3ce44SJohn Forte case STMF_IOCERR_UPDATE_NEED_CFG_INIT: 6164fcf3ce44SJohn Forte ret = STMF_ERROR_CONFIG_NONE; 6165fcf3ce44SJohn Forte break; 6166fcf3ce44SJohn Forte default: 6167fcf3ce44SJohn Forte ret = STMF_ERROR_PERM; 6168fcf3ce44SJohn Forte break; 6169fcf3ce44SJohn Forte } 6170fcf3ce44SJohn Forte break; 6171fcf3ce44SJohn Forte case ENODEV: 6172fcf3ce44SJohn Forte case ENOENT: 6173fcf3ce44SJohn Forte ret = STMF_ERROR_NOT_FOUND; 6174fcf3ce44SJohn Forte break; 6175fcf3ce44SJohn Forte default: 6176fcf3ce44SJohn Forte syslog(LOG_DEBUG, 6177fcf3ce44SJohn Forte "stmfRemoveViewEntry:ioctl errno(%d)", 6178fcf3ce44SJohn Forte errno); 6179fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR; 6180fcf3ce44SJohn Forte break; 6181fcf3ce44SJohn Forte } 6182fcf3ce44SJohn Forte goto done; 6183fcf3ce44SJohn Forte } 6184fcf3ce44SJohn Forte 61858fe96085Stim szeto if (iGetPersistMethod() == STMF_PERSIST_NONE) { 61868fe96085Stim szeto goto done; 61878fe96085Stim szeto } 61888fe96085Stim szeto 6189fcf3ce44SJohn Forte ret = psRemoveViewEntry(lu, viewEntryIndex); 6190fcf3ce44SJohn Forte switch (ret) { 6191fcf3ce44SJohn Forte case STMF_PS_SUCCESS: 6192fcf3ce44SJohn Forte ret = STMF_STATUS_SUCCESS; 6193fcf3ce44SJohn Forte break; 6194fcf3ce44SJohn Forte case STMF_PS_ERROR_NOT_FOUND: 6195fcf3ce44SJohn Forte ret = STMF_ERROR_NOT_FOUND; 6196fcf3ce44SJohn Forte break; 6197fcf3ce44SJohn Forte case STMF_PS_ERROR_BUSY: 6198fcf3ce44SJohn Forte ret = STMF_ERROR_BUSY; 6199fcf3ce44SJohn Forte break; 6200fcf3ce44SJohn Forte case STMF_PS_ERROR_SERVICE_NOT_FOUND: 6201fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_NOT_FOUND; 6202fcf3ce44SJohn Forte break; 6203fcf3ce44SJohn Forte case STMF_PS_ERROR_VERSION_MISMATCH: 6204fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_DATA_VERSION; 6205fcf3ce44SJohn Forte break; 6206fcf3ce44SJohn Forte default: 6207fcf3ce44SJohn Forte syslog(LOG_DEBUG, 6208fcf3ce44SJohn Forte "stmfRemoveViewEntry" "psRemoveViewEntry:error(%d)", 6209fcf3ce44SJohn Forte ret); 6210fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR; 6211fcf3ce44SJohn Forte break; 6212fcf3ce44SJohn Forte } 6213fcf3ce44SJohn Forte 6214fcf3ce44SJohn Forte done: 6215fcf3ce44SJohn Forte (void) close(fd); 6216fcf3ce44SJohn Forte return (ret); 6217fcf3ce44SJohn Forte } 6218fcf3ce44SJohn Forte 6219fcf3ce44SJohn Forte /* 6220fcf3ce44SJohn Forte * stmfSetProviderData 6221fcf3ce44SJohn Forte * 6222fcf3ce44SJohn Forte * Purpose: set the provider data 6223fcf3ce44SJohn Forte * 6224fcf3ce44SJohn Forte * providerName - unique name of provider 6225fcf3ce44SJohn Forte * nvl - nvlist to set 6226fcf3ce44SJohn Forte * providerType - type of provider for which to set data 6227fcf3ce44SJohn Forte * STMF_LU_PROVIDER_TYPE 6228fcf3ce44SJohn Forte * STMF_PORT_PROVIDER_TYPE 6229fcf3ce44SJohn Forte */ 6230fcf3ce44SJohn Forte int 6231fcf3ce44SJohn Forte stmfSetProviderData(char *providerName, nvlist_t *nvl, int providerType) 6232fcf3ce44SJohn Forte { 6233fcf3ce44SJohn Forte return (stmfSetProviderDataProt(providerName, nvl, providerType, 6234fcf3ce44SJohn Forte NULL)); 6235fcf3ce44SJohn Forte } 6236fcf3ce44SJohn Forte 6237fcf3ce44SJohn Forte /* 6238fcf3ce44SJohn Forte * stmfSetProviderDataProt 6239fcf3ce44SJohn Forte * 6240fcf3ce44SJohn Forte * Purpose: set the provider data 6241fcf3ce44SJohn Forte * 6242fcf3ce44SJohn Forte * providerName - unique name of provider 6243fcf3ce44SJohn Forte * nvl - nvlist to set 6244fcf3ce44SJohn Forte * providerType - type of provider for which to set data 6245fcf3ce44SJohn Forte * STMF_LU_PROVIDER_TYPE 6246fcf3ce44SJohn Forte * STMF_PORT_PROVIDER_TYPE 6247fcf3ce44SJohn Forte * setToken - Stale data token returned in the stmfGetProviderDataProt() 6248fcf3ce44SJohn Forte * call or NULL. 6249fcf3ce44SJohn Forte */ 6250fcf3ce44SJohn Forte int 6251fcf3ce44SJohn Forte stmfSetProviderDataProt(char *providerName, nvlist_t *nvl, int providerType, 6252fcf3ce44SJohn Forte uint64_t *setToken) 6253fcf3ce44SJohn Forte { 6254fcf3ce44SJohn Forte int ret; 6255fcf3ce44SJohn Forte int fd; 6256fcf3ce44SJohn Forte 6257fcf3ce44SJohn Forte if (providerName == NULL || nvl == NULL) { 6258fcf3ce44SJohn Forte return (STMF_ERROR_INVALID_ARG); 6259fcf3ce44SJohn Forte } 6260fcf3ce44SJohn Forte 6261fcf3ce44SJohn Forte if (providerType != STMF_LU_PROVIDER_TYPE && 6262fcf3ce44SJohn Forte providerType != STMF_PORT_PROVIDER_TYPE) { 6263fcf3ce44SJohn Forte return (STMF_ERROR_INVALID_ARG); 6264fcf3ce44SJohn Forte } 6265fcf3ce44SJohn Forte 6266fcf3ce44SJohn Forte /* call init */ 6267fcf3ce44SJohn Forte ret = initializeConfig(); 6268fcf3ce44SJohn Forte if (ret != STMF_STATUS_SUCCESS) { 6269fcf3ce44SJohn Forte return (ret); 6270fcf3ce44SJohn Forte } 6271fcf3ce44SJohn Forte 6272fcf3ce44SJohn Forte /* 6273fcf3ce44SJohn Forte * Open control node for stmf 6274fcf3ce44SJohn Forte */ 6275fcf3ce44SJohn Forte if ((ret = openStmf(OPEN_STMF, &fd)) != STMF_STATUS_SUCCESS) 6276fcf3ce44SJohn Forte return (ret); 6277fcf3ce44SJohn Forte 62788fe96085Stim szeto ret = setProviderData(fd, providerName, nvl, providerType, setToken); 6279fcf3ce44SJohn Forte 6280fcf3ce44SJohn Forte (void) close(fd); 6281fcf3ce44SJohn Forte 6282fcf3ce44SJohn Forte if (ret != STMF_STATUS_SUCCESS) { 6283fcf3ce44SJohn Forte goto done; 6284fcf3ce44SJohn Forte } 6285fcf3ce44SJohn Forte 62868fe96085Stim szeto if (iGetPersistMethod() == STMF_PERSIST_NONE) { 62878fe96085Stim szeto goto done; 62888fe96085Stim szeto } 62898fe96085Stim szeto 6290fcf3ce44SJohn Forte /* setting driver provider data successful. Now persist it */ 62918fe96085Stim szeto ret = psSetProviderData(providerName, nvl, providerType, NULL); 6292fcf3ce44SJohn Forte switch (ret) { 6293fcf3ce44SJohn Forte case STMF_PS_SUCCESS: 6294fcf3ce44SJohn Forte ret = STMF_STATUS_SUCCESS; 6295fcf3ce44SJohn Forte break; 6296fcf3ce44SJohn Forte case STMF_PS_ERROR_EXISTS: 6297fcf3ce44SJohn Forte ret = STMF_ERROR_EXISTS; 6298fcf3ce44SJohn Forte break; 6299fcf3ce44SJohn Forte case STMF_PS_ERROR_BUSY: 6300fcf3ce44SJohn Forte ret = STMF_ERROR_BUSY; 6301fcf3ce44SJohn Forte break; 6302fcf3ce44SJohn Forte case STMF_PS_ERROR_SERVICE_NOT_FOUND: 6303fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_NOT_FOUND; 6304fcf3ce44SJohn Forte break; 6305fcf3ce44SJohn Forte case STMF_PS_ERROR_VERSION_MISMATCH: 6306fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_DATA_VERSION; 6307fcf3ce44SJohn Forte break; 6308fcf3ce44SJohn Forte case STMF_PS_ERROR_PROV_DATA_STALE: 6309fcf3ce44SJohn Forte ret = STMF_ERROR_PROV_DATA_STALE; 6310fcf3ce44SJohn Forte break; 6311fcf3ce44SJohn Forte default: 6312fcf3ce44SJohn Forte syslog(LOG_DEBUG, 6313fcf3ce44SJohn Forte "stmfSetProviderData" 6314fcf3ce44SJohn Forte "psSetProviderData:error(%d)", ret); 6315fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR; 6316fcf3ce44SJohn Forte break; 6317fcf3ce44SJohn Forte } 6318fcf3ce44SJohn Forte 6319fcf3ce44SJohn Forte done: 6320fcf3ce44SJohn Forte return (ret); 6321fcf3ce44SJohn Forte } 6322fcf3ce44SJohn Forte 6323fcf3ce44SJohn Forte /* 63248fe96085Stim szeto * getProviderData 63258fe96085Stim szeto * 63268fe96085Stim szeto * Purpose: set the provider data from stmf 63278fe96085Stim szeto * 63288fe96085Stim szeto * providerName - unique name of provider 63298fe96085Stim szeto * nvl - nvlist to load/retrieve 63308fe96085Stim szeto * providerType - logical unit or port provider 63318fe96085Stim szeto * setToken - returned stale data token 63328fe96085Stim szeto */ 63338fe96085Stim szeto int 63348fe96085Stim szeto getProviderData(char *providerName, nvlist_t **nvl, int providerType, 63358fe96085Stim szeto uint64_t *setToken) 63368fe96085Stim szeto { 63378fe96085Stim szeto int ret = STMF_STATUS_SUCCESS; 63388fe96085Stim szeto int fd; 63398fe96085Stim szeto int ioctlRet; 63408fe96085Stim szeto size_t nvlistSize = ALLOC_PP_DATA_SIZE; 63418fe96085Stim szeto int retryCnt = 0; 63428fe96085Stim szeto int retryCntMax = MAX_PROVIDER_RETRY; 63438fe96085Stim szeto stmf_ppioctl_data_t ppi = {0}, *ppi_out = NULL; 63448fe96085Stim szeto boolean_t retry = B_TRUE; 63458fe96085Stim szeto stmf_iocdata_t stmfIoctl; 63468fe96085Stim szeto 63478fe96085Stim szeto if (providerName == NULL) { 63488fe96085Stim szeto return (STMF_ERROR_INVALID_ARG); 63498fe96085Stim szeto } 63508fe96085Stim szeto 63518fe96085Stim szeto /* 63528fe96085Stim szeto * Open control node for stmf 63538fe96085Stim szeto */ 63548fe96085Stim szeto if ((ret = openStmf(OPEN_STMF, &fd)) != STMF_STATUS_SUCCESS) 63558fe96085Stim szeto return (ret); 63568fe96085Stim szeto 63578fe96085Stim szeto /* set provider name and provider type */ 63588fe96085Stim szeto if (strlcpy(ppi.ppi_name, providerName, 63598fe96085Stim szeto sizeof (ppi.ppi_name)) >= 63608fe96085Stim szeto sizeof (ppi.ppi_name)) { 63618fe96085Stim szeto ret = STMF_ERROR_INVALID_ARG; 63628fe96085Stim szeto goto done; 63638fe96085Stim szeto } 63648fe96085Stim szeto switch (providerType) { 63658fe96085Stim szeto case STMF_LU_PROVIDER_TYPE: 63668fe96085Stim szeto ppi.ppi_lu_provider = 1; 63678fe96085Stim szeto break; 63688fe96085Stim szeto case STMF_PORT_PROVIDER_TYPE: 63698fe96085Stim szeto ppi.ppi_port_provider = 1; 63708fe96085Stim szeto break; 63718fe96085Stim szeto default: 63728fe96085Stim szeto ret = STMF_ERROR_INVALID_ARG; 63738fe96085Stim szeto goto done; 63748fe96085Stim szeto } 63758fe96085Stim szeto 63768fe96085Stim szeto do { 63778fe96085Stim szeto /* allocate memory for ioctl */ 63788fe96085Stim szeto ppi_out = (stmf_ppioctl_data_t *)calloc(1, nvlistSize + 63798fe96085Stim szeto sizeof (stmf_ppioctl_data_t)); 63808fe96085Stim szeto if (ppi_out == NULL) { 63818fe96085Stim szeto ret = STMF_ERROR_NOMEM; 63828fe96085Stim szeto goto done; 63838fe96085Stim szeto 63848fe96085Stim szeto } 63858fe96085Stim szeto 63868fe96085Stim szeto /* set the size of the ioctl data to allocated buffer */ 63878fe96085Stim szeto ppi.ppi_data_size = nvlistSize; 63888fe96085Stim szeto 63898fe96085Stim szeto bzero(&stmfIoctl, sizeof (stmfIoctl)); 63908fe96085Stim szeto 63918fe96085Stim szeto stmfIoctl.stmf_version = STMF_VERSION_1; 63928fe96085Stim szeto stmfIoctl.stmf_ibuf_size = sizeof (stmf_ppioctl_data_t); 63938fe96085Stim szeto stmfIoctl.stmf_ibuf = (uint64_t)(unsigned long)&ppi; 63948fe96085Stim szeto stmfIoctl.stmf_obuf_size = sizeof (stmf_ppioctl_data_t) + 63958fe96085Stim szeto nvlistSize; 63968fe96085Stim szeto stmfIoctl.stmf_obuf = (uint64_t)(unsigned long)ppi_out; 63978fe96085Stim szeto ioctlRet = ioctl(fd, STMF_IOCTL_GET_PP_DATA, &stmfIoctl); 63988fe96085Stim szeto if (ioctlRet != 0) { 63998fe96085Stim szeto switch (errno) { 64008fe96085Stim szeto case EBUSY: 64018fe96085Stim szeto ret = STMF_ERROR_BUSY; 64028fe96085Stim szeto break; 64038fe96085Stim szeto case EPERM: 64048fe96085Stim szeto case EACCES: 64058fe96085Stim szeto ret = STMF_ERROR_PERM; 64068fe96085Stim szeto break; 64078fe96085Stim szeto case EINVAL: 64088fe96085Stim szeto if (stmfIoctl.stmf_error == 64098fe96085Stim szeto STMF_IOCERR_INSUFFICIENT_BUF) { 64108fe96085Stim szeto nvlistSize = 64118fe96085Stim szeto ppi_out->ppi_data_size; 64128fe96085Stim szeto free(ppi_out); 64138fe96085Stim szeto ppi_out = NULL; 64148fe96085Stim szeto if (retryCnt++ > retryCntMax) { 64158fe96085Stim szeto retry = B_FALSE; 64168fe96085Stim szeto ret = STMF_ERROR_BUSY; 64178fe96085Stim szeto } else { 64188fe96085Stim szeto ret = 64198fe96085Stim szeto STMF_STATUS_SUCCESS; 64208fe96085Stim szeto } 64218fe96085Stim szeto } else { 64228fe96085Stim szeto syslog(LOG_DEBUG, 64238fe96085Stim szeto "getProviderData:ioctl" 64248fe96085Stim szeto "unable to retrieve " 64258fe96085Stim szeto "nvlist"); 64268fe96085Stim szeto ret = STMF_STATUS_ERROR; 64278fe96085Stim szeto } 64288fe96085Stim szeto break; 64298fe96085Stim szeto case ENOENT: 64308fe96085Stim szeto ret = STMF_ERROR_NOT_FOUND; 64318fe96085Stim szeto break; 64328fe96085Stim szeto default: 64338fe96085Stim szeto syslog(LOG_DEBUG, 64348fe96085Stim szeto "getProviderData:ioctl errno(%d)", 64358fe96085Stim szeto errno); 64368fe96085Stim szeto ret = STMF_STATUS_ERROR; 64378fe96085Stim szeto break; 64388fe96085Stim szeto } 64398fe96085Stim szeto if (ret != STMF_STATUS_SUCCESS) 64408fe96085Stim szeto goto done; 64418fe96085Stim szeto } 64428fe96085Stim szeto } while (retry && stmfIoctl.stmf_error == STMF_IOCERR_INSUFFICIENT_BUF); 64438fe96085Stim szeto 64448fe96085Stim szeto if ((ret = nvlist_unpack((char *)ppi_out->ppi_data, 64458fe96085Stim szeto ppi_out->ppi_data_size, nvl, 0)) != 0) { 64468fe96085Stim szeto ret = STMF_STATUS_ERROR; 64478fe96085Stim szeto goto done; 64488fe96085Stim szeto } 64498fe96085Stim szeto 64508fe96085Stim szeto /* caller has asked for new token */ 64518fe96085Stim szeto if (setToken) { 64528fe96085Stim szeto *setToken = ppi_out->ppi_token; 64538fe96085Stim szeto } 64548fe96085Stim szeto done: 64558fe96085Stim szeto free(ppi_out); 64568fe96085Stim szeto (void) close(fd); 64578fe96085Stim szeto return (ret); 64588fe96085Stim szeto } 64598fe96085Stim szeto 64608fe96085Stim szeto /* 6461fcf3ce44SJohn Forte * setProviderData 6462fcf3ce44SJohn Forte * 64638fe96085Stim szeto * Purpose: set the provider data in stmf 6464fcf3ce44SJohn Forte * 6465fcf3ce44SJohn Forte * providerName - unique name of provider 6466fcf3ce44SJohn Forte * nvl - nvlist to set 6467fcf3ce44SJohn Forte * providerType - logical unit or port provider 64688fe96085Stim szeto * setToken - stale data token to check if not NULL 6469fcf3ce44SJohn Forte */ 6470fcf3ce44SJohn Forte static int 64718fe96085Stim szeto setProviderData(int fd, char *providerName, nvlist_t *nvl, int providerType, 64728fe96085Stim szeto uint64_t *setToken) 6473fcf3ce44SJohn Forte { 6474fcf3ce44SJohn Forte int ret = STMF_STATUS_SUCCESS; 6475fcf3ce44SJohn Forte int ioctlRet; 6476fcf3ce44SJohn Forte size_t nvlistEncodedSize; 6477fcf3ce44SJohn Forte stmf_ppioctl_data_t *ppi = NULL; 64788fe96085Stim szeto uint64_t outToken; 6479fcf3ce44SJohn Forte char *allocatedNvBuffer; 6480fcf3ce44SJohn Forte stmf_iocdata_t stmfIoctl; 6481fcf3ce44SJohn Forte 6482fcf3ce44SJohn Forte if (providerName == NULL) { 6483fcf3ce44SJohn Forte return (STMF_ERROR_INVALID_ARG); 6484fcf3ce44SJohn Forte } 6485fcf3ce44SJohn Forte 6486fcf3ce44SJohn Forte /* get size of encoded nvlist */ 6487fcf3ce44SJohn Forte if (nvlist_size(nvl, &nvlistEncodedSize, NV_ENCODE_XDR) != 0) { 6488fcf3ce44SJohn Forte return (STMF_STATUS_ERROR); 6489fcf3ce44SJohn Forte } 6490fcf3ce44SJohn Forte 6491fcf3ce44SJohn Forte /* allocate memory for ioctl */ 6492fcf3ce44SJohn Forte ppi = (stmf_ppioctl_data_t *)calloc(1, nvlistEncodedSize + 6493fcf3ce44SJohn Forte sizeof (stmf_ppioctl_data_t)); 6494fcf3ce44SJohn Forte if (ppi == NULL) { 6495fcf3ce44SJohn Forte return (STMF_ERROR_NOMEM); 6496fcf3ce44SJohn Forte } 6497fcf3ce44SJohn Forte 64988fe96085Stim szeto if (setToken) { 64998fe96085Stim szeto ppi->ppi_token_valid = 1; 65008fe96085Stim szeto ppi->ppi_token = *setToken; 65018fe96085Stim szeto } 65028fe96085Stim szeto 6503fcf3ce44SJohn Forte allocatedNvBuffer = (char *)&ppi->ppi_data; 6504fcf3ce44SJohn Forte if (nvlist_pack(nvl, &allocatedNvBuffer, &nvlistEncodedSize, 6505fcf3ce44SJohn Forte NV_ENCODE_XDR, 0) != 0) { 6506fcf3ce44SJohn Forte return (STMF_STATUS_ERROR); 6507fcf3ce44SJohn Forte } 6508fcf3ce44SJohn Forte 6509fcf3ce44SJohn Forte /* set provider name and provider type */ 6510fcf3ce44SJohn Forte (void) strncpy(ppi->ppi_name, providerName, sizeof (ppi->ppi_name)); 6511fcf3ce44SJohn Forte switch (providerType) { 6512fcf3ce44SJohn Forte case STMF_LU_PROVIDER_TYPE: 6513fcf3ce44SJohn Forte ppi->ppi_lu_provider = 1; 6514fcf3ce44SJohn Forte break; 6515fcf3ce44SJohn Forte case STMF_PORT_PROVIDER_TYPE: 6516fcf3ce44SJohn Forte ppi->ppi_port_provider = 1; 6517fcf3ce44SJohn Forte break; 6518fcf3ce44SJohn Forte default: 6519fcf3ce44SJohn Forte return (STMF_ERROR_INVALID_ARG); 6520fcf3ce44SJohn Forte } 6521fcf3ce44SJohn Forte 6522fcf3ce44SJohn Forte /* set the size of the ioctl data to packed data size */ 6523fcf3ce44SJohn Forte ppi->ppi_data_size = nvlistEncodedSize; 6524fcf3ce44SJohn Forte 6525fcf3ce44SJohn Forte bzero(&stmfIoctl, sizeof (stmfIoctl)); 6526fcf3ce44SJohn Forte 6527fcf3ce44SJohn Forte stmfIoctl.stmf_version = STMF_VERSION_1; 6528fcf3ce44SJohn Forte /* 6529fcf3ce44SJohn Forte * Subtracting 8 from the size as that is the size of the last member 6530fcf3ce44SJohn Forte * of the structure where the packed data resides 6531fcf3ce44SJohn Forte */ 6532fcf3ce44SJohn Forte stmfIoctl.stmf_ibuf_size = nvlistEncodedSize + 6533fcf3ce44SJohn Forte sizeof (stmf_ppioctl_data_t) - 8; 6534fcf3ce44SJohn Forte stmfIoctl.stmf_ibuf = (uint64_t)(unsigned long)ppi; 65358fe96085Stim szeto stmfIoctl.stmf_obuf_size = sizeof (uint64_t); 65368fe96085Stim szeto stmfIoctl.stmf_obuf = (uint64_t)(unsigned long)&outToken; 6537fcf3ce44SJohn Forte ioctlRet = ioctl(fd, STMF_IOCTL_LOAD_PP_DATA, &stmfIoctl); 6538fcf3ce44SJohn Forte if (ioctlRet != 0) { 6539fcf3ce44SJohn Forte switch (errno) { 6540fcf3ce44SJohn Forte case EBUSY: 6541fcf3ce44SJohn Forte ret = STMF_ERROR_BUSY; 6542fcf3ce44SJohn Forte break; 65438fe96085Stim szeto case EPERM: 6544fcf3ce44SJohn Forte case EACCES: 6545fcf3ce44SJohn Forte ret = STMF_ERROR_PERM; 6546fcf3ce44SJohn Forte break; 65478fe96085Stim szeto case EINVAL: 65488fe96085Stim szeto if (stmfIoctl.stmf_error == 65498fe96085Stim szeto STMF_IOCERR_PPD_UPDATED) { 65508fe96085Stim szeto ret = STMF_ERROR_PROV_DATA_STALE; 65518fe96085Stim szeto } else { 65528fe96085Stim szeto ret = STMF_STATUS_ERROR; 65538fe96085Stim szeto } 65548fe96085Stim szeto break; 6555fcf3ce44SJohn Forte default: 6556fcf3ce44SJohn Forte syslog(LOG_DEBUG, 6557fcf3ce44SJohn Forte "setProviderData:ioctl errno(%d)", errno); 6558fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR; 6559fcf3ce44SJohn Forte break; 6560fcf3ce44SJohn Forte } 6561fcf3ce44SJohn Forte if (ret != STMF_STATUS_SUCCESS) 6562fcf3ce44SJohn Forte goto done; 6563fcf3ce44SJohn Forte } 6564fcf3ce44SJohn Forte 65658fe96085Stim szeto /* caller has asked for new token */ 65668fe96085Stim szeto if (setToken) { 65678fe96085Stim szeto *setToken = outToken; 65688fe96085Stim szeto } 6569fcf3ce44SJohn Forte done: 6570fcf3ce44SJohn Forte free(ppi); 6571fcf3ce44SJohn Forte return (ret); 6572fcf3ce44SJohn Forte } 65738fe96085Stim szeto 65748fe96085Stim szeto /* 65758fe96085Stim szeto * set the persistence method in the library only or library and service 65768fe96085Stim szeto */ 65778fe96085Stim szeto int 65788fe96085Stim szeto stmfSetPersistMethod(uint8_t persistType, boolean_t serviceSet) 65798fe96085Stim szeto { 65808fe96085Stim szeto int ret = STMF_STATUS_SUCCESS; 65818fe96085Stim szeto int oldPersist; 65828fe96085Stim szeto 65838fe96085Stim szeto (void) pthread_mutex_lock(&persistenceTypeLock); 65848fe96085Stim szeto oldPersist = iPersistType; 65858fe96085Stim szeto if (persistType == STMF_PERSIST_NONE || 65868fe96085Stim szeto persistType == STMF_PERSIST_SMF) { 65878fe96085Stim szeto iLibSetPersist = B_TRUE; 65888fe96085Stim szeto iPersistType = persistType; 65898fe96085Stim szeto } else { 65908fe96085Stim szeto (void) pthread_mutex_unlock(&persistenceTypeLock); 65918fe96085Stim szeto return (STMF_ERROR_INVALID_ARG); 65928fe96085Stim szeto } 65938fe96085Stim szeto /* Is this for this library open or in SMF */ 65948fe96085Stim szeto if (serviceSet == B_TRUE) { 65958fe96085Stim szeto ret = psSetServicePersist(persistType); 65968fe96085Stim szeto if (ret != STMF_PS_SUCCESS) { 65978fe96085Stim szeto ret = STMF_ERROR_PERSIST_TYPE; 65988fe96085Stim szeto /* Set to old value */ 65998fe96085Stim szeto iPersistType = oldPersist; 66008fe96085Stim szeto } 66018fe96085Stim szeto } 66028fe96085Stim szeto (void) pthread_mutex_unlock(&persistenceTypeLock); 66038fe96085Stim szeto 66048fe96085Stim szeto return (ret); 66058fe96085Stim szeto } 66068fe96085Stim szeto 66078fe96085Stim szeto /* 66088fe96085Stim szeto * Only returns internal state for persist. If unset, goes to ps. If that 66098fe96085Stim szeto * fails, returns default setting 66108fe96085Stim szeto */ 66118fe96085Stim szeto static uint8_t 66128fe96085Stim szeto iGetPersistMethod() 66138fe96085Stim szeto { 66148fe96085Stim szeto 66158fe96085Stim szeto uint8_t persistType = 0; 66168fe96085Stim szeto 66178fe96085Stim szeto (void) pthread_mutex_lock(&persistenceTypeLock); 66188fe96085Stim szeto if (iLibSetPersist) { 66198fe96085Stim szeto persistType = iPersistType; 66208fe96085Stim szeto } else { 66218fe96085Stim szeto int ret; 66228fe96085Stim szeto ret = psGetServicePersist(&persistType); 66238fe96085Stim szeto if (ret != STMF_PS_SUCCESS) { 66248fe96085Stim szeto /* set to default */ 66258fe96085Stim szeto persistType = STMF_DEFAULT_PERSIST; 66268fe96085Stim szeto } 66278fe96085Stim szeto } 66288fe96085Stim szeto (void) pthread_mutex_unlock(&persistenceTypeLock); 66298fe96085Stim szeto return (persistType); 66308fe96085Stim szeto } 66318fe96085Stim szeto 66328fe96085Stim szeto /* 66338fe96085Stim szeto * Returns either library state or persistent config state depending on 66348fe96085Stim szeto * serviceState 66358fe96085Stim szeto */ 66368fe96085Stim szeto int 66378fe96085Stim szeto stmfGetPersistMethod(uint8_t *persistType, boolean_t serviceState) 66388fe96085Stim szeto { 66398fe96085Stim szeto int ret = STMF_STATUS_SUCCESS; 66408fe96085Stim szeto 66418fe96085Stim szeto if (persistType == NULL) { 66428fe96085Stim szeto return (STMF_ERROR_INVALID_ARG); 66438fe96085Stim szeto } 66448fe96085Stim szeto if (serviceState) { 66458fe96085Stim szeto ret = psGetServicePersist(persistType); 66468fe96085Stim szeto if (ret != STMF_PS_SUCCESS) { 66478fe96085Stim szeto ret = STMF_ERROR_PERSIST_TYPE; 66488fe96085Stim szeto } 66498fe96085Stim szeto } else { 66508fe96085Stim szeto (void) pthread_mutex_lock(&persistenceTypeLock); 66518fe96085Stim szeto if (iLibSetPersist) { 66528fe96085Stim szeto *persistType = iPersistType; 66538fe96085Stim szeto } else { 66548fe96085Stim szeto *persistType = STMF_DEFAULT_PERSIST; 66558fe96085Stim szeto } 66568fe96085Stim szeto (void) pthread_mutex_unlock(&persistenceTypeLock); 66578fe96085Stim szeto } 66588fe96085Stim szeto 66598fe96085Stim szeto return (ret); 66608fe96085Stim szeto } 666163ed874aStim szeto 666263ed874aStim szeto /* 666345039663SJohn Forte * stmfPostProxyMsg 666445039663SJohn Forte * 666545039663SJohn Forte * Purpose: Post a message to the proxy port provider 666645039663SJohn Forte * 666745039663SJohn Forte * buf - buffer containing message to post 666845039663SJohn Forte * buflen - buffer length 666945039663SJohn Forte */ 667045039663SJohn Forte int 667145039663SJohn Forte stmfPostProxyMsg(int hdl, void *buf, uint32_t buflen) 667245039663SJohn Forte { 667345039663SJohn Forte int ret = STMF_STATUS_SUCCESS; 667445039663SJohn Forte int ioctlRet; 667545039663SJohn Forte pppt_iocdata_t ppptIoctl = {0}; 667645039663SJohn Forte 667745039663SJohn Forte if (buf == NULL) { 667845039663SJohn Forte return (STMF_ERROR_INVALID_ARG); 667945039663SJohn Forte } 668045039663SJohn Forte 668145039663SJohn Forte /* 668245039663SJohn Forte * Issue ioctl to post the message 668345039663SJohn Forte */ 668445039663SJohn Forte ppptIoctl.pppt_version = PPPT_VERSION_1; 668545039663SJohn Forte ppptIoctl.pppt_buf_size = buflen; 668645039663SJohn Forte ppptIoctl.pppt_buf = (uint64_t)(unsigned long)buf; 668745039663SJohn Forte ioctlRet = ioctl(hdl, PPPT_MESSAGE, &ppptIoctl); 668845039663SJohn Forte if (ioctlRet != 0) { 668945039663SJohn Forte switch (errno) { 669045039663SJohn Forte case EPERM: 669145039663SJohn Forte case EACCES: 669245039663SJohn Forte ret = STMF_ERROR_PERM; 669345039663SJohn Forte break; 669445039663SJohn Forte default: 669545039663SJohn Forte ret = STMF_ERROR_POST_MSG_FAILED; 669645039663SJohn Forte break; 669745039663SJohn Forte } 669845039663SJohn Forte } 669945039663SJohn Forte 670045039663SJohn Forte return (ret); 670145039663SJohn Forte } 670245039663SJohn Forte 670345039663SJohn Forte /* 670445039663SJohn Forte * stmfInitProxyDoor 670545039663SJohn Forte * 670645039663SJohn Forte * Purpose: Install door in proxy 670745039663SJohn Forte * 670845039663SJohn Forte * hdl - pointer to returned handle 670945039663SJohn Forte * fd - door from door_create() 671045039663SJohn Forte */ 671145039663SJohn Forte int 671245039663SJohn Forte stmfInitProxyDoor(int *hdl, int door) 671345039663SJohn Forte { 671445039663SJohn Forte int ret = STMF_STATUS_SUCCESS; 671545039663SJohn Forte int ioctlRet; 671645039663SJohn Forte int fd; 671745039663SJohn Forte pppt_iocdata_t ppptIoctl = {0}; 671845039663SJohn Forte 671945039663SJohn Forte if (hdl == NULL) { 672045039663SJohn Forte return (STMF_ERROR_INVALID_ARG); 672145039663SJohn Forte } 672245039663SJohn Forte 672345039663SJohn Forte /* 672445039663SJohn Forte * Open control node for pppt 672545039663SJohn Forte */ 672645039663SJohn Forte if ((ret = openPppt(OPEN_PPPT, &fd)) != STMF_STATUS_SUCCESS) { 672745039663SJohn Forte return (ret); 672845039663SJohn Forte } 672945039663SJohn Forte 673045039663SJohn Forte /* 673145039663SJohn Forte * Issue ioctl to install the door 673245039663SJohn Forte */ 673345039663SJohn Forte ppptIoctl.pppt_version = PPPT_VERSION_1; 673445039663SJohn Forte ppptIoctl.pppt_door_fd = (uint32_t)door; 673545039663SJohn Forte ioctlRet = ioctl(fd, PPPT_INSTALL_DOOR, &ppptIoctl); 673645039663SJohn Forte if (ioctlRet != 0) { 673745039663SJohn Forte switch (errno) { 673845039663SJohn Forte case EPERM: 673945039663SJohn Forte case EACCES: 674045039663SJohn Forte ret = STMF_ERROR_PERM; 674145039663SJohn Forte break; 674245039663SJohn Forte case EINVAL: 674345039663SJohn Forte ret = STMF_ERROR_INVALID_ARG; 674445039663SJohn Forte break; 674545039663SJohn Forte case EBUSY: 674645039663SJohn Forte ret = STMF_ERROR_DOOR_INSTALLED; 674745039663SJohn Forte break; 674845039663SJohn Forte default: 674945039663SJohn Forte ret = STMF_STATUS_ERROR; 675045039663SJohn Forte break; 675145039663SJohn Forte } 675245039663SJohn Forte } 675345039663SJohn Forte 675445039663SJohn Forte /* return driver fd to caller */ 675545039663SJohn Forte *hdl = fd; 675645039663SJohn Forte return (ret); 675745039663SJohn Forte } 675845039663SJohn Forte 675945039663SJohn Forte void 676045039663SJohn Forte stmfDestroyProxyDoor(int hdl) 676145039663SJohn Forte { 676245039663SJohn Forte (void) close(hdl); 676345039663SJohn Forte } 676445039663SJohn Forte 676545039663SJohn Forte /* 676663ed874aStim szeto * validateLunNumIoctl 676763ed874aStim szeto * 676863ed874aStim szeto * Purpose: Issues ioctl to check and get available lun# in view entry 676963ed874aStim szeto * 677063ed874aStim szeto * viewEntry - view entry to use 677163ed874aStim szeto */ 677263ed874aStim szeto static int 677363ed874aStim szeto validateLunNumIoctl(int fd, stmfViewEntry *viewEntry) 677463ed874aStim szeto { 677563ed874aStim szeto int ret = STMF_STATUS_SUCCESS; 677663ed874aStim szeto int ioctlRet; 677763ed874aStim szeto stmf_iocdata_t stmfIoctl; 677863ed874aStim szeto stmf_view_op_entry_t ioctlViewEntry; 677963ed874aStim szeto 678063ed874aStim szeto bzero(&ioctlViewEntry, sizeof (ioctlViewEntry)); 678163ed874aStim szeto /* 678263ed874aStim szeto * don't set ve_ndx or ve_ndx_valid as ve_ndx_valid should be 678363ed874aStim szeto * false on input 678463ed874aStim szeto */ 678563ed874aStim szeto ioctlViewEntry.ve_lu_number_valid = viewEntry->luNbrValid; 678663ed874aStim szeto ioctlViewEntry.ve_all_hosts = viewEntry->allHosts; 678763ed874aStim szeto ioctlViewEntry.ve_all_targets = viewEntry->allTargets; 678863ed874aStim szeto 678963ed874aStim szeto if (viewEntry->allHosts == B_FALSE) { 679063ed874aStim szeto bcopy(viewEntry->hostGroup, &ioctlViewEntry.ve_host_group.name, 679163ed874aStim szeto sizeof (stmfGroupName)); 679263ed874aStim szeto ioctlViewEntry.ve_host_group.name_size = 679363ed874aStim szeto strlen((char *)viewEntry->hostGroup); 679463ed874aStim szeto } 679563ed874aStim szeto if (viewEntry->allTargets == B_FALSE) { 679663ed874aStim szeto bcopy(viewEntry->targetGroup, 679763ed874aStim szeto &ioctlViewEntry.ve_target_group.name, 679863ed874aStim szeto sizeof (stmfGroupName)); 679963ed874aStim szeto ioctlViewEntry.ve_target_group.name_size = 680063ed874aStim szeto strlen((char *)viewEntry->targetGroup); 680163ed874aStim szeto } 680263ed874aStim szeto /* Validating the lun number */ 680363ed874aStim szeto if (viewEntry->luNbrValid) { 680463ed874aStim szeto bcopy(viewEntry->luNbr, &ioctlViewEntry.ve_lu_nbr, 680563ed874aStim szeto sizeof (ioctlViewEntry.ve_lu_nbr)); 680663ed874aStim szeto } 680763ed874aStim szeto 680863ed874aStim szeto bzero(&stmfIoctl, sizeof (stmfIoctl)); 680963ed874aStim szeto /* 681063ed874aStim szeto * Issue ioctl to validate lun# in the view entry 681163ed874aStim szeto */ 681263ed874aStim szeto stmfIoctl.stmf_version = STMF_VERSION_1; 681363ed874aStim szeto stmfIoctl.stmf_ibuf_size = sizeof (ioctlViewEntry); 681463ed874aStim szeto stmfIoctl.stmf_ibuf = (uint64_t)(unsigned long)&ioctlViewEntry; 681563ed874aStim szeto stmfIoctl.stmf_obuf_size = sizeof (ioctlViewEntry); 681663ed874aStim szeto stmfIoctl.stmf_obuf = (uint64_t)(unsigned long)&ioctlViewEntry; 681763ed874aStim szeto ioctlRet = ioctl(fd, STMF_IOCTL_VALIDATE_VIEW, &stmfIoctl); 681863ed874aStim szeto 681963ed874aStim szeto /* save available lun number */ 682063ed874aStim szeto if (!viewEntry->luNbrValid) { 682163ed874aStim szeto bcopy(ioctlViewEntry.ve_lu_nbr, viewEntry->luNbr, 682263ed874aStim szeto sizeof (ioctlViewEntry.ve_lu_nbr)); 682363ed874aStim szeto } 682463ed874aStim szeto if (ioctlRet != 0) { 682563ed874aStim szeto switch (errno) { 682663ed874aStim szeto case EBUSY: 682763ed874aStim szeto ret = STMF_ERROR_BUSY; 682863ed874aStim szeto break; 682963ed874aStim szeto case EPERM: 683063ed874aStim szeto ret = STMF_ERROR_PERM; 683163ed874aStim szeto break; 683263ed874aStim szeto case EACCES: 683363ed874aStim szeto switch (stmfIoctl.stmf_error) { 683463ed874aStim szeto case STMF_IOCERR_UPDATE_NEED_CFG_INIT: 683563ed874aStim szeto ret = STMF_ERROR_CONFIG_NONE; 683663ed874aStim szeto break; 683763ed874aStim szeto default: 683863ed874aStim szeto ret = STMF_ERROR_PERM; 683963ed874aStim szeto break; 684063ed874aStim szeto } 684163ed874aStim szeto break; 684263ed874aStim szeto default: 684363ed874aStim szeto switch (stmfIoctl.stmf_error) { 684463ed874aStim szeto case STMF_IOCERR_LU_NUMBER_IN_USE: 684563ed874aStim szeto ret = STMF_ERROR_LUN_IN_USE; 684663ed874aStim szeto break; 684763ed874aStim szeto case STMF_IOCERR_VIEW_ENTRY_CONFLICT: 684863ed874aStim szeto ret = STMF_ERROR_VE_CONFLICT; 684963ed874aStim szeto break; 685063ed874aStim szeto case STMF_IOCERR_UPDATE_NEED_CFG_INIT: 685163ed874aStim szeto ret = STMF_ERROR_CONFIG_NONE; 685263ed874aStim szeto break; 685363ed874aStim szeto case STMF_IOCERR_INVALID_HG: 685463ed874aStim szeto ret = STMF_ERROR_INVALID_HG; 685563ed874aStim szeto break; 685663ed874aStim szeto case STMF_IOCERR_INVALID_TG: 685763ed874aStim szeto ret = STMF_ERROR_INVALID_TG; 685863ed874aStim szeto break; 685963ed874aStim szeto default: 686063ed874aStim szeto syslog(LOG_DEBUG, 686163ed874aStim szeto "addViewEntryIoctl" 686263ed874aStim szeto ":error(%d)", 686363ed874aStim szeto stmfIoctl.stmf_error); 686463ed874aStim szeto ret = STMF_STATUS_ERROR; 686563ed874aStim szeto break; 686663ed874aStim szeto } 686763ed874aStim szeto break; 686863ed874aStim szeto } 686963ed874aStim szeto } 687063ed874aStim szeto return (ret); 687163ed874aStim szeto } 687263ed874aStim szeto 687363ed874aStim szeto /* 687463ed874aStim szeto * stmfValidateView 687563ed874aStim szeto * 687663ed874aStim szeto * Purpose: Validate or get lun # base on TG, HG of view entry 687763ed874aStim szeto * 687863ed874aStim szeto * viewEntry - view entry structure to use 687963ed874aStim szeto */ 688063ed874aStim szeto int 688163ed874aStim szeto stmfValidateView(stmfViewEntry *viewEntry) 688263ed874aStim szeto { 688363ed874aStim szeto int ret; 688463ed874aStim szeto int fd; 688563ed874aStim szeto stmfViewEntry iViewEntry; 688663ed874aStim szeto 688763ed874aStim szeto if (viewEntry == NULL) { 688863ed874aStim szeto return (STMF_ERROR_INVALID_ARG); 688963ed874aStim szeto } 689063ed874aStim szeto 689163ed874aStim szeto /* initialize and set internal view entry */ 689263ed874aStim szeto bzero(&iViewEntry, sizeof (iViewEntry)); 689363ed874aStim szeto 689463ed874aStim szeto if (!viewEntry->allHosts) { 689563ed874aStim szeto bcopy(viewEntry->hostGroup, iViewEntry.hostGroup, 689663ed874aStim szeto sizeof (iViewEntry.hostGroup)); 689763ed874aStim szeto } else { 689863ed874aStim szeto iViewEntry.allHosts = B_TRUE; 689963ed874aStim szeto } 690063ed874aStim szeto 690163ed874aStim szeto if (!viewEntry->allTargets) { 690263ed874aStim szeto bcopy(viewEntry->targetGroup, iViewEntry.targetGroup, 690363ed874aStim szeto sizeof (iViewEntry.targetGroup)); 690463ed874aStim szeto } else { 690563ed874aStim szeto iViewEntry.allTargets = B_TRUE; 690663ed874aStim szeto } 690763ed874aStim szeto 690863ed874aStim szeto if (viewEntry->luNbrValid) { 690963ed874aStim szeto iViewEntry.luNbrValid = B_TRUE; 691063ed874aStim szeto bcopy(viewEntry->luNbr, iViewEntry.luNbr, 691163ed874aStim szeto sizeof (iViewEntry.luNbr)); 691263ed874aStim szeto } 691363ed874aStim szeto 691463ed874aStim szeto /* 691563ed874aStim szeto * set users return view entry index valid flag to false 691663ed874aStim szeto * in case of failure 691763ed874aStim szeto */ 691863ed874aStim szeto viewEntry->veIndexValid = B_FALSE; 691963ed874aStim szeto 692063ed874aStim szeto /* Check to ensure service exists */ 692163ed874aStim szeto if (psCheckService() != STMF_STATUS_SUCCESS) { 692263ed874aStim szeto return (STMF_ERROR_SERVICE_NOT_FOUND); 692363ed874aStim szeto } 692463ed874aStim szeto 692563ed874aStim szeto /* call init */ 692663ed874aStim szeto ret = initializeConfig(); 692763ed874aStim szeto if (ret != STMF_STATUS_SUCCESS) { 692863ed874aStim szeto return (ret); 692963ed874aStim szeto } 693063ed874aStim szeto 693163ed874aStim szeto /* 693263ed874aStim szeto * Open control node for stmf 693363ed874aStim szeto */ 693463ed874aStim szeto if ((ret = openStmf(OPEN_STMF, &fd)) != STMF_STATUS_SUCCESS) 693563ed874aStim szeto return (ret); 693663ed874aStim szeto 693763ed874aStim szeto /* 693863ed874aStim szeto * Validate lun# in the view entry from the driver 693963ed874aStim szeto */ 694063ed874aStim szeto ret = validateLunNumIoctl(fd, &iViewEntry); 694163ed874aStim szeto (void) close(fd); 694263ed874aStim szeto 694363ed874aStim szeto /* save available lun number */ 694463ed874aStim szeto if (!viewEntry->luNbrValid) { 694563ed874aStim szeto bcopy(iViewEntry.luNbr, viewEntry->luNbr, 694663ed874aStim szeto sizeof (iViewEntry.luNbr)); 694763ed874aStim szeto } 694863ed874aStim szeto 694963ed874aStim szeto return (ret); 695063ed874aStim szeto } 6951