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.
23*33f5ff17SMilan Jurik * Copyright 2012 Milan Jurik. All rights reserved.
24fcf3ce44SJohn Forte */
25fcf3ce44SJohn Forte
26fcf3ce44SJohn Forte #include <stdlib.h>
27fcf3ce44SJohn Forte #include <stdio.h>
28fcf3ce44SJohn Forte #include <wchar.h>
29fcf3ce44SJohn Forte #include <strings.h>
30fcf3ce44SJohn Forte #include <sys/types.h>
31fcf3ce44SJohn Forte #include <sys/stat.h>
32fcf3ce44SJohn Forte #include <fcntl.h>
33fcf3ce44SJohn Forte #include <unistd.h>
34fcf3ce44SJohn Forte #include <libintl.h>
35fcf3ce44SJohn Forte #include <errno.h>
36fcf3ce44SJohn Forte #include <string.h>
37fcf3ce44SJohn Forte #include <assert.h>
38fcf3ce44SJohn Forte #include <libnvpair.h>
39fcf3ce44SJohn Forte #include <pthread.h>
40fcf3ce44SJohn Forte #include <syslog.h>
41fcf3ce44SJohn Forte #include <libstmf.h>
42fcf3ce44SJohn Forte #include <netinet/in.h>
43fcf3ce44SJohn Forte #include <inttypes.h>
44fcf3ce44SJohn Forte #include <store.h>
45fcf3ce44SJohn Forte #include <locale.h>
468fe96085Stim szeto #include <math.h>
478fe96085Stim szeto #include <libstmf_impl.h>
48fcf3ce44SJohn Forte #include <sys/stmf_ioctl.h>
498fe96085Stim szeto #include <sys/stmf_sbd_ioctl.h>
5045039663SJohn Forte #include <sys/pppt_ioctl.h>
517beff157SJohn Forte #include <macros.h>
52fcf3ce44SJohn Forte
53fcf3ce44SJohn Forte #define STMF_PATH "/devices/pseudo/stmf@0:admin"
548fe96085Stim szeto #define SBD_PATH "/devices/pseudo/stmf_sbd@0:admin"
5545039663SJohn Forte #define PPPT_PATH "/devices/pseudo/pppt@0:pppt"
56fcf3ce44SJohn Forte
57fcf3ce44SJohn Forte #define EUI "eui."
58fcf3ce44SJohn Forte #define WWN "wwn."
59fcf3ce44SJohn Forte #define IQN "iqn."
608fe96085Stim szeto #define LU_ASCII_GUID_SIZE 32
618fe96085Stim szeto #define LU_GUID_SIZE 16
628fe96085Stim szeto #define OUI_ASCII_SIZE 6
63fdcc480aSJohn Forte #define HOST_ID_ASCII_SIZE 8
648fe96085Stim szeto #define OUI_SIZE 3
65fdcc480aSJohn Forte #define HOST_ID_SIZE 4
66fcf3ce44SJohn Forte #define IDENT_LENGTH_BYTE 3
67fcf3ce44SJohn Forte
688fe96085Stim szeto /* various initial allocation values */
698fe96085Stim szeto #define ALLOC_LU 8192
708fe96085Stim szeto #define ALLOC_TARGET_PORT 2048
718fe96085Stim szeto #define ALLOC_PROVIDER 64
728fe96085Stim szeto #define ALLOC_GROUP 2048
738fe96085Stim szeto #define ALLOC_SESSION 2048
748fe96085Stim szeto #define ALLOC_VE 256
758fe96085Stim szeto #define ALLOC_PP_DATA_SIZE 128*1024
768fe96085Stim szeto #define ALLOC_GRP_MEMBER 256
778fe96085Stim szeto
78fcf3ce44SJohn Forte #define MAX_ISCSI_NAME 223
798fe96085Stim szeto #define MAX_SERIAL_SIZE 252 + 1
808fe96085Stim szeto #define MAX_LU_ALIAS_SIZE 256
818fe96085Stim szeto #define MAX_SBD_PROPS MAXPATHLEN + MAX_SERIAL_SIZE + MAX_LU_ALIAS_SIZE
82fcf3ce44SJohn Forte
83fcf3ce44SJohn Forte #define OPEN_STMF 0
84fcf3ce44SJohn Forte #define OPEN_EXCL_STMF O_EXCL
85fcf3ce44SJohn Forte
868fe96085Stim szeto #define OPEN_SBD 0
878fe96085Stim szeto #define OPEN_EXCL_SBD O_EXCL
888fe96085Stim szeto
8945039663SJohn Forte #define OPEN_PPPT 0
9045039663SJohn Forte #define OPEN_EXCL_PPPT O_EXCL
9145039663SJohn Forte
92fcf3ce44SJohn Forte #define LOGICAL_UNIT_TYPE 0
93fcf3ce44SJohn Forte #define TARGET_TYPE 1
94fcf3ce44SJohn Forte #define STMF_SERVICE_TYPE 2
95fcf3ce44SJohn Forte
968fe96085Stim szeto #define HOST_GROUP 1
978fe96085Stim szeto #define TARGET_GROUP 2
988fe96085Stim szeto
998fe96085Stim szeto /* set default persistence here */
1008fe96085Stim szeto #define STMF_DEFAULT_PERSIST STMF_PERSIST_SMF
1018fe96085Stim szeto
1028fe96085Stim szeto #define MAX_PROVIDER_RETRY 30
1038fe96085Stim szeto
104fcf3ce44SJohn Forte static int openStmf(int, int *fd);
1058fe96085Stim szeto static int openSbd(int, int *fd);
10645039663SJohn Forte static int openPppt(int, int *fd);
107fcf3ce44SJohn Forte static int groupIoctl(int fd, int cmd, stmfGroupName *);
108fcf3ce44SJohn Forte static int loadStore(int fd);
109fcf3ce44SJohn Forte static int initializeConfig();
110fcf3ce44SJohn Forte static int groupMemberIoctl(int fd, int cmd, stmfGroupName *, stmfDevid *);
111fcf3ce44SJohn Forte static int guidCompare(const void *, const void *);
112fcf3ce44SJohn Forte static int addViewEntryIoctl(int fd, stmfGuid *, stmfViewEntry *);
113fcf3ce44SJohn Forte static int loadHostGroups(int fd, stmfGroupList *);
114fcf3ce44SJohn Forte static int loadTargetGroups(int fd, stmfGroupList *);
115fcf3ce44SJohn Forte static int getStmfState(stmf_state_desc_t *);
116fcf3ce44SJohn Forte static int setStmfState(int fd, stmf_state_desc_t *, int);
1178fe96085Stim szeto static int setProviderData(int fd, char *, nvlist_t *, int, uint64_t *);
1188fe96085Stim szeto static int createDiskResource(luResourceImpl *);
1198fe96085Stim szeto static int createDiskLu(diskResource *, stmfGuid *);
1208fe96085Stim szeto static int deleteDiskLu(stmfGuid *luGuid);
1218fe96085Stim szeto static int getDiskProp(luResourceImpl *, uint32_t, char *, size_t *);
1228fe96085Stim szeto static int getDiskAllProps(stmfGuid *luGuid, luResource *hdl);
1238fe96085Stim szeto static int loadDiskPropsFromDriver(luResourceImpl *, sbd_lu_props_t *);
1248fe96085Stim szeto static int removeGuidFromDiskStore(stmfGuid *);
1258fe96085Stim szeto static int addGuidToDiskStore(stmfGuid *, char *);
1268fe96085Stim szeto static int persistDiskGuid(stmfGuid *, char *, boolean_t);
1278fe96085Stim szeto static int setDiskProp(luResourceImpl *, uint32_t, const char *);
1287beff157SJohn Forte static int getDiskGlobalProp(uint32_t prop, char *propVal, size_t *propLen);
1298fe96085Stim szeto static int checkHexUpper(char *);
1308fe96085Stim szeto static int strToShift(const char *);
1318fe96085Stim szeto static int niceStrToNum(const char *, uint64_t *);
1328fe96085Stim szeto static void diskError(uint32_t, int *);
1338fe96085Stim szeto static int importDiskLu(char *fname, stmfGuid *);
1348fe96085Stim szeto static int modifyDiskLu(diskResource *, stmfGuid *, const char *);
1358fe96085Stim szeto static int modifyDiskLuProp(stmfGuid *, const char *, uint32_t, const char *);
1368fe96085Stim szeto static int validateModifyDiskProp(uint32_t);
1378fe96085Stim szeto static uint8_t iGetPersistMethod();
1388fe96085Stim szeto static int groupListIoctl(stmfGroupList **, int);
1398fe96085Stim szeto static int iLoadGroupFromPs(stmfGroupList **, int);
1408fe96085Stim szeto static int groupMemberListIoctl(stmfGroupName *, stmfGroupProperties **, int);
1418fe96085Stim szeto static int getProviderData(char *, nvlist_t **, int, uint64_t *);
14245039663SJohn Forte static int setDiskStandby(stmfGuid *luGuid);
1437beff157SJohn Forte static int setDiskGlobalProp(uint32_t, const char *);
1448fe96085Stim szeto static int viewEntryCompare(const void *, const void *);
14545039663SJohn Forte static void deleteNonActiveLus();
1464b31676fSsrivijitha dugganapalli static int loadStmfProp(int fd);
1478fe96085Stim szeto
1488fe96085Stim szeto static pthread_mutex_t persistenceTypeLock = PTHREAD_MUTEX_INITIALIZER;
1498fe96085Stim szeto static int iPersistType = 0;
1508fe96085Stim szeto /* when B_TRUE, no need to access SMF anymore. Just use iPersistType */
1518fe96085Stim szeto static boolean_t iLibSetPersist = B_FALSE;
152fcf3ce44SJohn Forte
153fcf3ce44SJohn Forte /*
154fcf3ce44SJohn Forte * Open for stmf module
155fcf3ce44SJohn Forte *
156fcf3ce44SJohn Forte * flag - open flag (OPEN_STMF, OPEN_EXCL_STMF)
157fcf3ce44SJohn Forte * fd - pointer to integer. On success, contains the stmf file descriptor
158fcf3ce44SJohn Forte */
159fcf3ce44SJohn Forte static int
openStmf(int flag,int * fd)160fcf3ce44SJohn Forte openStmf(int flag, int *fd)
161fcf3ce44SJohn Forte {
162fcf3ce44SJohn Forte int ret = STMF_STATUS_ERROR;
163fcf3ce44SJohn Forte
164fcf3ce44SJohn Forte if ((*fd = open(STMF_PATH, O_NDELAY | O_RDONLY | flag)) != -1) {
165fcf3ce44SJohn Forte ret = STMF_STATUS_SUCCESS;
166fcf3ce44SJohn Forte } else {
167fcf3ce44SJohn Forte if (errno == EBUSY) {
168fcf3ce44SJohn Forte ret = STMF_ERROR_BUSY;
1698fe96085Stim szeto } else if (errno == EACCES) {
1708fe96085Stim szeto ret = STMF_ERROR_PERM;
171fcf3ce44SJohn Forte } else {
172fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR;
173fcf3ce44SJohn Forte }
174fcf3ce44SJohn Forte syslog(LOG_DEBUG, "openStmf:open failure:%s:errno(%d)",
175fcf3ce44SJohn Forte STMF_PATH, errno);
176fcf3ce44SJohn Forte }
177fcf3ce44SJohn Forte
178fcf3ce44SJohn Forte return (ret);
179fcf3ce44SJohn Forte }
180fcf3ce44SJohn Forte
181fcf3ce44SJohn Forte /*
1828fe96085Stim szeto * Open for sbd module
1838fe96085Stim szeto *
18445039663SJohn Forte * flag - open flag (OPEN_SBD, OPEN_EXCL_SBD)
1858fe96085Stim szeto * fd - pointer to integer. On success, contains the stmf file descriptor
1868fe96085Stim szeto */
1878fe96085Stim szeto static int
openSbd(int flag,int * fd)1888fe96085Stim szeto openSbd(int flag, int *fd)
1898fe96085Stim szeto {
1908fe96085Stim szeto int ret = STMF_STATUS_ERROR;
1918fe96085Stim szeto
1928fe96085Stim szeto if ((*fd = open(SBD_PATH, O_NDELAY | O_RDONLY | flag)) != -1) {
1938fe96085Stim szeto ret = STMF_STATUS_SUCCESS;
1948fe96085Stim szeto } else {
1958fe96085Stim szeto if (errno == EBUSY) {
1968fe96085Stim szeto ret = STMF_ERROR_BUSY;
1978fe96085Stim szeto } else if (errno == EACCES) {
1988fe96085Stim szeto ret = STMF_ERROR_PERM;
1998fe96085Stim szeto } else {
2008fe96085Stim szeto ret = STMF_STATUS_ERROR;
2018fe96085Stim szeto }
2028fe96085Stim szeto syslog(LOG_DEBUG, "openSbd:open failure:%s:errno(%d)",
2038fe96085Stim szeto SBD_PATH, errno);
2048fe96085Stim szeto }
2058fe96085Stim szeto
2068fe96085Stim szeto return (ret);
2078fe96085Stim szeto }
2088fe96085Stim szeto
2098fe96085Stim szeto /*
21045039663SJohn Forte * Open for pppt module
21145039663SJohn Forte *
21245039663SJohn Forte * flag - open flag (OPEN_PPPT, OPEN_EXCL_PPPT)
21345039663SJohn Forte * fd - pointer to integer. On success, contains the stmf file descriptor
21445039663SJohn Forte */
21545039663SJohn Forte static int
openPppt(int flag,int * fd)21645039663SJohn Forte openPppt(int flag, int *fd)
21745039663SJohn Forte {
21845039663SJohn Forte int ret = STMF_STATUS_ERROR;
21945039663SJohn Forte
22045039663SJohn Forte if ((*fd = open(PPPT_PATH, O_RDONLY | flag)) != -1) {
22145039663SJohn Forte ret = STMF_STATUS_SUCCESS;
22245039663SJohn Forte } else {
22345039663SJohn Forte if (errno == EBUSY) {
22445039663SJohn Forte ret = STMF_ERROR_BUSY;
22545039663SJohn Forte } else if (errno == EACCES) {
22645039663SJohn Forte ret = STMF_ERROR_PERM;
22745039663SJohn Forte } else {
22845039663SJohn Forte ret = STMF_STATUS_ERROR;
22945039663SJohn Forte }
23045039663SJohn Forte syslog(LOG_DEBUG, "openPppt:open failure:%s:errno(%d)",
23145039663SJohn Forte PPPT_PATH, errno);
23245039663SJohn Forte }
23345039663SJohn Forte
23445039663SJohn Forte return (ret);
23545039663SJohn Forte }
23645039663SJohn Forte
23745039663SJohn Forte /*
238fcf3ce44SJohn Forte * initializeConfig
239fcf3ce44SJohn Forte *
240fcf3ce44SJohn Forte * This routine should be called before any ioctl requiring initialization
241fcf3ce44SJohn Forte * which is basically everything except stmfGetState(), setStmfState() and
242fcf3ce44SJohn Forte * stmfLoadConfig().
243fcf3ce44SJohn Forte */
244fcf3ce44SJohn Forte static int
initializeConfig()245fcf3ce44SJohn Forte initializeConfig()
246fcf3ce44SJohn Forte {
247fcf3ce44SJohn Forte int ret;
248fcf3ce44SJohn Forte stmfState state;
249fcf3ce44SJohn Forte
250fcf3ce44SJohn Forte
251fcf3ce44SJohn Forte ret = stmfGetState(&state);
252fcf3ce44SJohn Forte if (ret != STMF_STATUS_SUCCESS) {
253fcf3ce44SJohn Forte return (ret);
254fcf3ce44SJohn Forte }
255fcf3ce44SJohn Forte
256fcf3ce44SJohn Forte /* if we've already initialized or in the process, return success */
257fcf3ce44SJohn Forte if (state.configState == STMF_CONFIG_STATE_INIT_DONE ||
258fcf3ce44SJohn Forte state.configState == STMF_CONFIG_STATE_INIT) {
259fcf3ce44SJohn Forte return (STMF_STATUS_SUCCESS);
260fcf3ce44SJohn Forte }
261fcf3ce44SJohn Forte
262fcf3ce44SJohn Forte ret = stmfLoadConfig();
263fcf3ce44SJohn Forte if (ret != STMF_STATUS_SUCCESS) {
264fcf3ce44SJohn Forte syslog(LOG_DEBUG,
265fcf3ce44SJohn Forte "initializeConfig:stmfLoadConfig:error(%d)", ret);
266fcf3ce44SJohn Forte return (ret);
267fcf3ce44SJohn Forte }
268fcf3ce44SJohn Forte
269fcf3ce44SJohn Forte ret = stmfGetState(&state);
270fcf3ce44SJohn Forte if (ret != STMF_STATUS_SUCCESS) {
271fcf3ce44SJohn Forte syslog(LOG_DEBUG,
272fcf3ce44SJohn Forte "initializeConfig:stmfGetState:error(%d)", ret);
273fcf3ce44SJohn Forte return (ret);
274fcf3ce44SJohn Forte }
275fcf3ce44SJohn Forte
276fcf3ce44SJohn Forte if (state.configState != STMF_CONFIG_STATE_INIT_DONE) {
277fcf3ce44SJohn Forte syslog(LOG_DEBUG, "initializeConfig:state.configState(%d)",
278fcf3ce44SJohn Forte state.configState);
279fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR;
280fcf3ce44SJohn Forte }
281fcf3ce44SJohn Forte
282fcf3ce44SJohn Forte return (ret);
283fcf3ce44SJohn Forte }
284fcf3ce44SJohn Forte
285fcf3ce44SJohn Forte
286fcf3ce44SJohn Forte /*
287fcf3ce44SJohn Forte * groupIoctl
288fcf3ce44SJohn Forte *
289fcf3ce44SJohn Forte * Purpose: issue ioctl for create/delete on group
290fcf3ce44SJohn Forte *
291fcf3ce44SJohn Forte * cmd - valid STMF ioctl group cmd
292fcf3ce44SJohn Forte * groupName - groupName to create or delete
293fcf3ce44SJohn Forte */
294fcf3ce44SJohn Forte static int
groupIoctl(int fd,int cmd,stmfGroupName * groupName)295fcf3ce44SJohn Forte groupIoctl(int fd, int cmd, stmfGroupName *groupName)
296fcf3ce44SJohn Forte {
297fcf3ce44SJohn Forte int ret = STMF_STATUS_SUCCESS;
298fcf3ce44SJohn Forte int ioctlRet;
299fcf3ce44SJohn Forte stmf_iocdata_t stmfIoctl;
300fcf3ce44SJohn Forte stmf_group_name_t iGroupName;
301fcf3ce44SJohn Forte
302fcf3ce44SJohn Forte bzero(&iGroupName, sizeof (iGroupName));
303fcf3ce44SJohn Forte
304fcf3ce44SJohn Forte bcopy(groupName, &iGroupName.name, strlen((char *)groupName));
305fcf3ce44SJohn Forte
306fcf3ce44SJohn Forte iGroupName.name_size = strlen((char *)groupName);
307fcf3ce44SJohn Forte
308fcf3ce44SJohn Forte bzero(&stmfIoctl, sizeof (stmfIoctl));
309fcf3ce44SJohn Forte /*
310fcf3ce44SJohn Forte * Issue ioctl to create the host group
311fcf3ce44SJohn Forte */
312fcf3ce44SJohn Forte stmfIoctl.stmf_version = STMF_VERSION_1;
313fcf3ce44SJohn Forte stmfIoctl.stmf_ibuf_size = sizeof (iGroupName);
314fcf3ce44SJohn Forte stmfIoctl.stmf_ibuf = (uint64_t)(unsigned long)&iGroupName;
315fcf3ce44SJohn Forte ioctlRet = ioctl(fd, cmd, &stmfIoctl);
316fcf3ce44SJohn Forte if (ioctlRet != 0) {
317fcf3ce44SJohn Forte switch (errno) {
3188fe96085Stim szeto case EPERM:
319fcf3ce44SJohn Forte case EACCES:
320fcf3ce44SJohn Forte ret = STMF_ERROR_PERM;
321fcf3ce44SJohn Forte break;
322fcf3ce44SJohn Forte default:
323fcf3ce44SJohn Forte switch (stmfIoctl.stmf_error) {
324fcf3ce44SJohn Forte case STMF_IOCERR_TG_EXISTS:
325fcf3ce44SJohn Forte case STMF_IOCERR_HG_EXISTS:
326fcf3ce44SJohn Forte ret = STMF_ERROR_EXISTS;
327fcf3ce44SJohn Forte break;
328fcf3ce44SJohn Forte case STMF_IOCERR_TG_IN_USE:
329fcf3ce44SJohn Forte case STMF_IOCERR_HG_IN_USE:
330fcf3ce44SJohn Forte ret = STMF_ERROR_GROUP_IN_USE;
331fcf3ce44SJohn Forte break;
332fcf3ce44SJohn Forte case STMF_IOCERR_INVALID_HG:
333fcf3ce44SJohn Forte case STMF_IOCERR_INVALID_TG:
334fcf3ce44SJohn Forte ret = STMF_ERROR_NOT_FOUND;
335fcf3ce44SJohn Forte break;
336fcf3ce44SJohn Forte default:
337fcf3ce44SJohn Forte syslog(LOG_DEBUG,
338fcf3ce44SJohn Forte "groupIoctl:error(%d)",
339fcf3ce44SJohn Forte stmfIoctl.stmf_error);
340fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR;
341fcf3ce44SJohn Forte break;
342fcf3ce44SJohn Forte }
343fcf3ce44SJohn Forte break;
344fcf3ce44SJohn Forte }
345fcf3ce44SJohn Forte }
346fcf3ce44SJohn Forte done:
347fcf3ce44SJohn Forte return (ret);
348fcf3ce44SJohn Forte }
349fcf3ce44SJohn Forte
350fcf3ce44SJohn Forte /*
3518fe96085Stim szeto * groupMemberIoctl
352fcf3ce44SJohn Forte *
353fcf3ce44SJohn Forte * Purpose: issue ioctl for add/remove member on group
354fcf3ce44SJohn Forte *
355fcf3ce44SJohn Forte * cmd - valid STMF ioctl group member cmd
356fcf3ce44SJohn Forte * groupName - groupName to add to or remove from
357fcf3ce44SJohn Forte * devid - group member to add or remove
358fcf3ce44SJohn Forte */
359fcf3ce44SJohn Forte static int
groupMemberIoctl(int fd,int cmd,stmfGroupName * groupName,stmfDevid * devid)360fcf3ce44SJohn Forte groupMemberIoctl(int fd, int cmd, stmfGroupName *groupName, stmfDevid *devid)
361fcf3ce44SJohn Forte {
362fcf3ce44SJohn Forte int ret = STMF_STATUS_SUCCESS;
363fcf3ce44SJohn Forte int ioctlRet;
364fcf3ce44SJohn Forte stmf_iocdata_t stmfIoctl;
365fcf3ce44SJohn Forte stmf_group_op_data_t stmfGroupData;
366fcf3ce44SJohn Forte
367fcf3ce44SJohn Forte bzero(&stmfGroupData, sizeof (stmfGroupData));
368fcf3ce44SJohn Forte
369fcf3ce44SJohn Forte bcopy(groupName, &stmfGroupData.group.name, strlen((char *)groupName));
370fcf3ce44SJohn Forte
371fcf3ce44SJohn Forte stmfGroupData.group.name_size = strlen((char *)groupName);
372fcf3ce44SJohn Forte stmfGroupData.ident[IDENT_LENGTH_BYTE] = devid->identLength;
373fcf3ce44SJohn Forte bcopy(&(devid->ident), &stmfGroupData.ident[IDENT_LENGTH_BYTE + 1],
374fcf3ce44SJohn Forte devid->identLength);
375fcf3ce44SJohn Forte
376fcf3ce44SJohn Forte bzero(&stmfIoctl, sizeof (stmfIoctl));
377fcf3ce44SJohn Forte /*
378fcf3ce44SJohn Forte * Issue ioctl to add to the host group
379fcf3ce44SJohn Forte */
380fcf3ce44SJohn Forte stmfIoctl.stmf_version = STMF_VERSION_1;
381fcf3ce44SJohn Forte stmfIoctl.stmf_ibuf_size = sizeof (stmfGroupData);
382fcf3ce44SJohn Forte stmfIoctl.stmf_ibuf = (uint64_t)(unsigned long)&stmfGroupData;
383fcf3ce44SJohn Forte ioctlRet = ioctl(fd, cmd, &stmfIoctl);
384fcf3ce44SJohn Forte if (ioctlRet != 0) {
385fcf3ce44SJohn Forte switch (errno) {
386fcf3ce44SJohn Forte case EBUSY:
3875c8cac22Stim szeto switch (stmfIoctl.stmf_error) {
3885c8cac22Stim szeto case STMF_IOCERR_TG_NEED_TG_OFFLINE:
3895c8cac22Stim szeto ret = STMF_ERROR_TG_ONLINE;
3905c8cac22Stim szeto break;
3915c8cac22Stim szeto default:
392fcf3ce44SJohn Forte ret = STMF_ERROR_BUSY;
393fcf3ce44SJohn Forte break;
3945c8cac22Stim szeto }
3955c8cac22Stim szeto break;
3968fe96085Stim szeto case EPERM:
397fcf3ce44SJohn Forte case EACCES:
398fcf3ce44SJohn Forte ret = STMF_ERROR_PERM;
399fcf3ce44SJohn Forte break;
400fcf3ce44SJohn Forte default:
401fcf3ce44SJohn Forte switch (stmfIoctl.stmf_error) {
402fcf3ce44SJohn Forte case STMF_IOCERR_TG_ENTRY_EXISTS:
403fcf3ce44SJohn Forte case STMF_IOCERR_HG_ENTRY_EXISTS:
404fcf3ce44SJohn Forte ret = STMF_ERROR_EXISTS;
405fcf3ce44SJohn Forte break;
406fcf3ce44SJohn Forte case STMF_IOCERR_INVALID_TG_ENTRY:
407fcf3ce44SJohn Forte case STMF_IOCERR_INVALID_HG_ENTRY:
408fcf3ce44SJohn Forte ret =
409fcf3ce44SJohn Forte STMF_ERROR_MEMBER_NOT_FOUND;
410fcf3ce44SJohn Forte break;
411fcf3ce44SJohn Forte case STMF_IOCERR_INVALID_TG:
412fcf3ce44SJohn Forte case STMF_IOCERR_INVALID_HG:
413fcf3ce44SJohn Forte ret =
414fcf3ce44SJohn Forte STMF_ERROR_GROUP_NOT_FOUND;
415fcf3ce44SJohn Forte break;
416fcf3ce44SJohn Forte default:
417fcf3ce44SJohn Forte syslog(LOG_DEBUG,
418fcf3ce44SJohn Forte "groupMemberIoctl:error"
419fcf3ce44SJohn Forte "(%d)",
420fcf3ce44SJohn Forte stmfIoctl.stmf_error);
421fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR;
422fcf3ce44SJohn Forte break;
423fcf3ce44SJohn Forte }
424fcf3ce44SJohn Forte break;
425fcf3ce44SJohn Forte }
426fcf3ce44SJohn Forte }
427fcf3ce44SJohn Forte done:
428fcf3ce44SJohn Forte return (ret);
429fcf3ce44SJohn Forte }
430fcf3ce44SJohn Forte
431fcf3ce44SJohn Forte /*
4328fe96085Stim szeto * qsort function
4338fe96085Stim szeto * sort on veIndex
4348fe96085Stim szeto */
4358fe96085Stim szeto static int
viewEntryCompare(const void * p1,const void * p2)4368fe96085Stim szeto viewEntryCompare(const void *p1, const void *p2)
4378fe96085Stim szeto {
4388fe96085Stim szeto
4398fe96085Stim szeto stmfViewEntry *v1 = (stmfViewEntry *)p1, *v2 = (stmfViewEntry *)p2;
4408fe96085Stim szeto if (v1->veIndex > v2->veIndex)
4418fe96085Stim szeto return (1);
4428fe96085Stim szeto if (v1->veIndex < v2->veIndex)
4438fe96085Stim szeto return (-1);
4448fe96085Stim szeto return (0);
4458fe96085Stim szeto }
4468fe96085Stim szeto
4478fe96085Stim szeto /*
448fcf3ce44SJohn Forte * guidCompare
449fcf3ce44SJohn Forte *
450fcf3ce44SJohn Forte * qsort function
451fcf3ce44SJohn Forte * sort on guid
452fcf3ce44SJohn Forte */
453fcf3ce44SJohn Forte static int
guidCompare(const void * p1,const void * p2)454fcf3ce44SJohn Forte guidCompare(const void *p1, const void *p2)
455fcf3ce44SJohn Forte {
456fcf3ce44SJohn Forte
457fcf3ce44SJohn Forte stmfGuid *g1 = (stmfGuid *)p1, *g2 = (stmfGuid *)p2;
458fcf3ce44SJohn Forte int i;
459fcf3ce44SJohn Forte
460fcf3ce44SJohn Forte for (i = 0; i < sizeof (stmfGuid); i++) {
461fcf3ce44SJohn Forte if (g1->guid[i] > g2->guid[i])
462fcf3ce44SJohn Forte return (1);
463fcf3ce44SJohn Forte if (g1->guid[i] < g2->guid[i])
464fcf3ce44SJohn Forte return (-1);
465fcf3ce44SJohn Forte }
466fcf3ce44SJohn Forte
467fcf3ce44SJohn Forte return (0);
468fcf3ce44SJohn Forte }
469fcf3ce44SJohn Forte
470fcf3ce44SJohn Forte /*
471fcf3ce44SJohn Forte * stmfAddToHostGroup
472fcf3ce44SJohn Forte *
473fcf3ce44SJohn Forte * Purpose: Adds an initiator to an existing host group
474fcf3ce44SJohn Forte *
475fcf3ce44SJohn Forte * hostGroupName - name of an existing host group
476fcf3ce44SJohn Forte * hostName - name of initiator to add
477fcf3ce44SJohn Forte */
478fcf3ce44SJohn Forte int
stmfAddToHostGroup(stmfGroupName * hostGroupName,stmfDevid * hostName)479fcf3ce44SJohn Forte stmfAddToHostGroup(stmfGroupName *hostGroupName, stmfDevid *hostName)
480fcf3ce44SJohn Forte {
481fcf3ce44SJohn Forte int ret;
482fcf3ce44SJohn Forte int fd;
483fcf3ce44SJohn Forte
484fcf3ce44SJohn Forte if (hostGroupName == NULL ||
485fcf3ce44SJohn Forte (strnlen((char *)hostGroupName, sizeof (stmfGroupName))
486fcf3ce44SJohn Forte == sizeof (stmfGroupName)) || hostName == NULL) {
487fcf3ce44SJohn Forte return (STMF_ERROR_INVALID_ARG);
488fcf3ce44SJohn Forte }
489fcf3ce44SJohn Forte
490fcf3ce44SJohn Forte /* call init */
491fcf3ce44SJohn Forte ret = initializeConfig();
492fcf3ce44SJohn Forte if (ret != STMF_STATUS_SUCCESS) {
493fcf3ce44SJohn Forte return (ret);
494fcf3ce44SJohn Forte }
495fcf3ce44SJohn Forte
496fcf3ce44SJohn Forte /*
497fcf3ce44SJohn Forte * Open control node for stmf
498fcf3ce44SJohn Forte */
499fcf3ce44SJohn Forte if ((ret = openStmf(OPEN_STMF, &fd)) != STMF_STATUS_SUCCESS)
500fcf3ce44SJohn Forte return (ret);
501fcf3ce44SJohn Forte
502fcf3ce44SJohn Forte if ((ret = groupMemberIoctl(fd, STMF_IOCTL_ADD_HG_ENTRY, hostGroupName,
503fcf3ce44SJohn Forte hostName)) != STMF_STATUS_SUCCESS) {
504fcf3ce44SJohn Forte goto done;
505fcf3ce44SJohn Forte }
506fcf3ce44SJohn Forte
5078fe96085Stim szeto if (iGetPersistMethod() == STMF_PERSIST_NONE) {
5088fe96085Stim szeto goto done;
5098fe96085Stim szeto }
5108fe96085Stim szeto
511fcf3ce44SJohn Forte ret = psAddHostGroupMember((char *)hostGroupName,
512fcf3ce44SJohn Forte (char *)hostName->ident);
513fcf3ce44SJohn Forte switch (ret) {
514fcf3ce44SJohn Forte case STMF_PS_SUCCESS:
515fcf3ce44SJohn Forte ret = STMF_STATUS_SUCCESS;
516fcf3ce44SJohn Forte break;
517fcf3ce44SJohn Forte case STMF_PS_ERROR_EXISTS:
518fcf3ce44SJohn Forte ret = STMF_ERROR_EXISTS;
519fcf3ce44SJohn Forte break;
520fcf3ce44SJohn Forte case STMF_PS_ERROR_GROUP_NOT_FOUND:
521fcf3ce44SJohn Forte ret = STMF_ERROR_GROUP_NOT_FOUND;
522fcf3ce44SJohn Forte break;
523fcf3ce44SJohn Forte case STMF_PS_ERROR_BUSY:
524fcf3ce44SJohn Forte ret = STMF_ERROR_BUSY;
525fcf3ce44SJohn Forte break;
526fcf3ce44SJohn Forte case STMF_PS_ERROR_SERVICE_NOT_FOUND:
527fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_NOT_FOUND;
528fcf3ce44SJohn Forte break;
529fcf3ce44SJohn Forte case STMF_PS_ERROR_VERSION_MISMATCH:
530fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_DATA_VERSION;
531fcf3ce44SJohn Forte break;
532fcf3ce44SJohn Forte default:
533fcf3ce44SJohn Forte syslog(LOG_DEBUG,
534fcf3ce44SJohn Forte "stmfAddToHostGroup:psAddHostGroupMember:error(%d)",
535fcf3ce44SJohn Forte ret);
536fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR;
537fcf3ce44SJohn Forte break;
538fcf3ce44SJohn Forte }
539fcf3ce44SJohn Forte
540fcf3ce44SJohn Forte done:
541fcf3ce44SJohn Forte (void) close(fd);
542fcf3ce44SJohn Forte return (ret);
543fcf3ce44SJohn Forte }
544fcf3ce44SJohn Forte
545fcf3ce44SJohn Forte /*
546fcf3ce44SJohn Forte * stmfAddToTargetGroup
547fcf3ce44SJohn Forte *
548fcf3ce44SJohn Forte * Purpose: Adds a local port to an existing target group
549fcf3ce44SJohn Forte *
550fcf3ce44SJohn Forte * targetGroupName - name of an existing target group
551fcf3ce44SJohn Forte * targetName - name of target to add
552fcf3ce44SJohn Forte */
553fcf3ce44SJohn Forte int
stmfAddToTargetGroup(stmfGroupName * targetGroupName,stmfDevid * targetName)554fcf3ce44SJohn Forte stmfAddToTargetGroup(stmfGroupName *targetGroupName, stmfDevid *targetName)
555fcf3ce44SJohn Forte {
556fcf3ce44SJohn Forte int ret;
557fcf3ce44SJohn Forte int fd;
558fcf3ce44SJohn Forte
559fcf3ce44SJohn Forte if (targetGroupName == NULL ||
560fcf3ce44SJohn Forte (strnlen((char *)targetGroupName, sizeof (stmfGroupName))
561fcf3ce44SJohn Forte == sizeof (stmfGroupName)) || targetName == NULL) {
562fcf3ce44SJohn Forte return (STMF_ERROR_INVALID_ARG);
563fcf3ce44SJohn Forte }
564fcf3ce44SJohn Forte
565fcf3ce44SJohn Forte /* call init */
566fcf3ce44SJohn Forte ret = initializeConfig();
567fcf3ce44SJohn Forte if (ret != STMF_STATUS_SUCCESS) {
568fcf3ce44SJohn Forte return (ret);
569fcf3ce44SJohn Forte }
570fcf3ce44SJohn Forte
571fcf3ce44SJohn Forte /*
572fcf3ce44SJohn Forte * Open control node for stmf
573fcf3ce44SJohn Forte */
574fcf3ce44SJohn Forte if ((ret = openStmf(OPEN_STMF, &fd)) != STMF_STATUS_SUCCESS)
575fcf3ce44SJohn Forte return (ret);
576fcf3ce44SJohn Forte
577fcf3ce44SJohn Forte if ((ret = groupMemberIoctl(fd, STMF_IOCTL_ADD_TG_ENTRY,
578fcf3ce44SJohn Forte targetGroupName, targetName)) != STMF_STATUS_SUCCESS) {
579fcf3ce44SJohn Forte goto done;
580fcf3ce44SJohn Forte }
581fcf3ce44SJohn Forte
5828fe96085Stim szeto if (iGetPersistMethod() == STMF_PERSIST_NONE) {
5838fe96085Stim szeto goto done;
5848fe96085Stim szeto }
5858fe96085Stim szeto
586fcf3ce44SJohn Forte ret = psAddTargetGroupMember((char *)targetGroupName,
587fcf3ce44SJohn Forte (char *)targetName->ident);
588fcf3ce44SJohn Forte switch (ret) {
589fcf3ce44SJohn Forte case STMF_PS_SUCCESS:
590fcf3ce44SJohn Forte ret = STMF_STATUS_SUCCESS;
591fcf3ce44SJohn Forte break;
592fcf3ce44SJohn Forte case STMF_PS_ERROR_EXISTS:
593fcf3ce44SJohn Forte ret = STMF_ERROR_EXISTS;
594fcf3ce44SJohn Forte break;
595fcf3ce44SJohn Forte case STMF_PS_ERROR_GROUP_NOT_FOUND:
596fcf3ce44SJohn Forte ret = STMF_ERROR_GROUP_NOT_FOUND;
597fcf3ce44SJohn Forte break;
598fcf3ce44SJohn Forte case STMF_PS_ERROR_BUSY:
599fcf3ce44SJohn Forte ret = STMF_ERROR_BUSY;
600fcf3ce44SJohn Forte break;
601fcf3ce44SJohn Forte case STMF_PS_ERROR_SERVICE_NOT_FOUND:
602fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_NOT_FOUND;
603fcf3ce44SJohn Forte break;
604fcf3ce44SJohn Forte case STMF_PS_ERROR_VERSION_MISMATCH:
605fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_DATA_VERSION;
606fcf3ce44SJohn Forte break;
607fcf3ce44SJohn Forte default:
608fcf3ce44SJohn Forte syslog(LOG_DEBUG,
609fcf3ce44SJohn Forte "stmfAddToTargetGroup:psAddTargetGroupMember:"
610fcf3ce44SJohn Forte "error(%d)", ret);
611fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR;
612fcf3ce44SJohn Forte break;
613fcf3ce44SJohn Forte }
614fcf3ce44SJohn Forte
615fcf3ce44SJohn Forte done:
616fcf3ce44SJohn Forte (void) close(fd);
617fcf3ce44SJohn Forte return (ret);
618fcf3ce44SJohn Forte }
619fcf3ce44SJohn Forte
620fcf3ce44SJohn Forte /*
621fcf3ce44SJohn Forte * addViewEntryIoctl
622fcf3ce44SJohn Forte *
623fcf3ce44SJohn Forte * Purpose: Issues ioctl to add a view entry
624fcf3ce44SJohn Forte *
625fcf3ce44SJohn Forte * lu - Logical Unit identifier to which the view entry is added
626fcf3ce44SJohn Forte * viewEntry - view entry to add
627fcf3ce44SJohn Forte * init - When set to B_TRUE, we are in the init state, i.e. don't call open
628fcf3ce44SJohn Forte */
629fcf3ce44SJohn Forte static int
addViewEntryIoctl(int fd,stmfGuid * lu,stmfViewEntry * viewEntry)630fcf3ce44SJohn Forte addViewEntryIoctl(int fd, stmfGuid *lu, stmfViewEntry *viewEntry)
631fcf3ce44SJohn Forte {
632fcf3ce44SJohn Forte int ret = STMF_STATUS_SUCCESS;
633fcf3ce44SJohn Forte int ioctlRet;
634fcf3ce44SJohn Forte stmf_iocdata_t stmfIoctl;
635fcf3ce44SJohn Forte stmf_view_op_entry_t ioctlViewEntry;
636fcf3ce44SJohn Forte
637fcf3ce44SJohn Forte bzero(&ioctlViewEntry, sizeof (ioctlViewEntry));
638fcf3ce44SJohn Forte /*
639fcf3ce44SJohn Forte * don't set ve_ndx or ve_ndx_valid as ve_ndx_valid should be
640fcf3ce44SJohn Forte * false on input
641fcf3ce44SJohn Forte */
642fcf3ce44SJohn Forte ioctlViewEntry.ve_lu_number_valid = viewEntry->luNbrValid;
643fcf3ce44SJohn Forte ioctlViewEntry.ve_all_hosts = viewEntry->allHosts;
644fcf3ce44SJohn Forte ioctlViewEntry.ve_all_targets = viewEntry->allTargets;
645fcf3ce44SJohn Forte
646fcf3ce44SJohn Forte if (viewEntry->allHosts == B_FALSE) {
647fcf3ce44SJohn Forte bcopy(viewEntry->hostGroup, &ioctlViewEntry.ve_host_group.name,
648fcf3ce44SJohn Forte sizeof (stmfGroupName));
649fcf3ce44SJohn Forte ioctlViewEntry.ve_host_group.name_size =
650fcf3ce44SJohn Forte strlen((char *)viewEntry->hostGroup);
651fcf3ce44SJohn Forte }
652fcf3ce44SJohn Forte if (viewEntry->allTargets == B_FALSE) {
653fcf3ce44SJohn Forte bcopy(viewEntry->targetGroup,
654fcf3ce44SJohn Forte &ioctlViewEntry.ve_target_group.name,
655fcf3ce44SJohn Forte sizeof (stmfGroupName));
656fcf3ce44SJohn Forte ioctlViewEntry.ve_target_group.name_size =
657fcf3ce44SJohn Forte strlen((char *)viewEntry->targetGroup);
658fcf3ce44SJohn Forte }
659fcf3ce44SJohn Forte if (viewEntry->luNbrValid) {
660fcf3ce44SJohn Forte bcopy(viewEntry->luNbr, &ioctlViewEntry.ve_lu_nbr,
661fcf3ce44SJohn Forte sizeof (ioctlViewEntry.ve_lu_nbr));
662fcf3ce44SJohn Forte }
663fcf3ce44SJohn Forte bcopy(lu, &ioctlViewEntry.ve_guid, sizeof (stmfGuid));
664fcf3ce44SJohn Forte
665fcf3ce44SJohn Forte bzero(&stmfIoctl, sizeof (stmfIoctl));
666fcf3ce44SJohn Forte /*
667fcf3ce44SJohn Forte * Issue ioctl to add to the view entry
668fcf3ce44SJohn Forte */
669fcf3ce44SJohn Forte stmfIoctl.stmf_version = STMF_VERSION_1;
670fcf3ce44SJohn Forte stmfIoctl.stmf_ibuf_size = sizeof (ioctlViewEntry);
671fcf3ce44SJohn Forte stmfIoctl.stmf_ibuf = (uint64_t)(unsigned long)&ioctlViewEntry;
672fcf3ce44SJohn Forte stmfIoctl.stmf_obuf_size = sizeof (ioctlViewEntry);
673fcf3ce44SJohn Forte stmfIoctl.stmf_obuf = (uint64_t)(unsigned long)&ioctlViewEntry;
674fcf3ce44SJohn Forte ioctlRet = ioctl(fd, STMF_IOCTL_ADD_VIEW_ENTRY, &stmfIoctl);
675fcf3ce44SJohn Forte if (ioctlRet != 0) {
676fcf3ce44SJohn Forte switch (errno) {
677fcf3ce44SJohn Forte case EBUSY:
678fcf3ce44SJohn Forte ret = STMF_ERROR_BUSY;
679fcf3ce44SJohn Forte break;
6808fe96085Stim szeto case EPERM:
6818fe96085Stim szeto ret = STMF_ERROR_PERM;
6828fe96085Stim szeto break;
683fcf3ce44SJohn Forte case EACCES:
684fcf3ce44SJohn Forte switch (stmfIoctl.stmf_error) {
685fcf3ce44SJohn Forte case STMF_IOCERR_UPDATE_NEED_CFG_INIT:
686fcf3ce44SJohn Forte ret = STMF_ERROR_CONFIG_NONE;
687fcf3ce44SJohn Forte break;
688fcf3ce44SJohn Forte default:
689fcf3ce44SJohn Forte ret = STMF_ERROR_PERM;
690fcf3ce44SJohn Forte break;
691fcf3ce44SJohn Forte }
692fcf3ce44SJohn Forte break;
693fcf3ce44SJohn Forte default:
694fcf3ce44SJohn Forte switch (stmfIoctl.stmf_error) {
695fcf3ce44SJohn Forte case STMF_IOCERR_LU_NUMBER_IN_USE:
696fcf3ce44SJohn Forte ret = STMF_ERROR_LUN_IN_USE;
697fcf3ce44SJohn Forte break;
698fcf3ce44SJohn Forte case STMF_IOCERR_VIEW_ENTRY_CONFLICT:
699fcf3ce44SJohn Forte ret = STMF_ERROR_VE_CONFLICT;
700fcf3ce44SJohn Forte break;
701fcf3ce44SJohn Forte case STMF_IOCERR_UPDATE_NEED_CFG_INIT:
702fcf3ce44SJohn Forte ret = STMF_ERROR_CONFIG_NONE;
703fcf3ce44SJohn Forte break;
704fcf3ce44SJohn Forte case STMF_IOCERR_INVALID_HG:
705fcf3ce44SJohn Forte ret = STMF_ERROR_INVALID_HG;
706fcf3ce44SJohn Forte break;
707fcf3ce44SJohn Forte case STMF_IOCERR_INVALID_TG:
708fcf3ce44SJohn Forte ret = STMF_ERROR_INVALID_TG;
709fcf3ce44SJohn Forte break;
710fcf3ce44SJohn Forte default:
711fcf3ce44SJohn Forte syslog(LOG_DEBUG,
712fcf3ce44SJohn Forte "addViewEntryIoctl"
713fcf3ce44SJohn Forte ":error(%d)",
714fcf3ce44SJohn Forte stmfIoctl.stmf_error);
715fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR;
716fcf3ce44SJohn Forte break;
717fcf3ce44SJohn Forte }
718fcf3ce44SJohn Forte break;
719fcf3ce44SJohn Forte }
720fcf3ce44SJohn Forte goto done;
721fcf3ce44SJohn Forte }
722fcf3ce44SJohn Forte
723fcf3ce44SJohn Forte /* copy lu nbr back to caller's view entry on success */
724fcf3ce44SJohn Forte viewEntry->veIndex = ioctlViewEntry.ve_ndx;
725fcf3ce44SJohn Forte if (ioctlViewEntry.ve_lu_number_valid) {
726fcf3ce44SJohn Forte bcopy(&ioctlViewEntry.ve_lu_nbr, viewEntry->luNbr,
727fcf3ce44SJohn Forte sizeof (ioctlViewEntry.ve_lu_nbr));
728fcf3ce44SJohn Forte }
729fcf3ce44SJohn Forte viewEntry->luNbrValid = B_TRUE;
730fcf3ce44SJohn Forte
731fcf3ce44SJohn Forte done:
732fcf3ce44SJohn Forte return (ret);
733fcf3ce44SJohn Forte }
734fcf3ce44SJohn Forte
735fcf3ce44SJohn Forte /*
736fcf3ce44SJohn Forte * stmfAddViewEntry
737fcf3ce44SJohn Forte *
738fcf3ce44SJohn Forte * Purpose: Adds a view entry to a logical unit
739fcf3ce44SJohn Forte *
740fcf3ce44SJohn Forte * lu - guid of the logical unit to which the view entry is added
741fcf3ce44SJohn Forte * viewEntry - view entry structure to add
742fcf3ce44SJohn Forte */
743fcf3ce44SJohn Forte int
stmfAddViewEntry(stmfGuid * lu,stmfViewEntry * viewEntry)744fcf3ce44SJohn Forte stmfAddViewEntry(stmfGuid *lu, stmfViewEntry *viewEntry)
745fcf3ce44SJohn Forte {
746fcf3ce44SJohn Forte int ret;
747fcf3ce44SJohn Forte int fd;
748fcf3ce44SJohn Forte stmfViewEntry iViewEntry;
749fcf3ce44SJohn Forte
750fcf3ce44SJohn Forte if (lu == NULL || viewEntry == NULL) {
751fcf3ce44SJohn Forte return (STMF_ERROR_INVALID_ARG);
752fcf3ce44SJohn Forte }
753fcf3ce44SJohn Forte
754fcf3ce44SJohn Forte /* initialize and set internal view entry */
755fcf3ce44SJohn Forte bzero(&iViewEntry, sizeof (iViewEntry));
756fcf3ce44SJohn Forte
757fcf3ce44SJohn Forte if (!viewEntry->allHosts) {
758fcf3ce44SJohn Forte bcopy(viewEntry->hostGroup, iViewEntry.hostGroup,
759fcf3ce44SJohn Forte sizeof (iViewEntry.hostGroup));
760fcf3ce44SJohn Forte } else {
761fcf3ce44SJohn Forte iViewEntry.allHosts = B_TRUE;
762fcf3ce44SJohn Forte }
763fcf3ce44SJohn Forte
764fcf3ce44SJohn Forte if (!viewEntry->allTargets) {
765fcf3ce44SJohn Forte bcopy(viewEntry->targetGroup, iViewEntry.targetGroup,
766fcf3ce44SJohn Forte sizeof (iViewEntry.targetGroup));
767fcf3ce44SJohn Forte } else {
768fcf3ce44SJohn Forte iViewEntry.allTargets = B_TRUE;
769fcf3ce44SJohn Forte }
770fcf3ce44SJohn Forte
771fcf3ce44SJohn Forte if (viewEntry->luNbrValid) {
772fcf3ce44SJohn Forte iViewEntry.luNbrValid = B_TRUE;
773fcf3ce44SJohn Forte bcopy(viewEntry->luNbr, iViewEntry.luNbr,
774fcf3ce44SJohn Forte sizeof (iViewEntry.luNbr));
775fcf3ce44SJohn Forte }
776fcf3ce44SJohn Forte
777fcf3ce44SJohn Forte /*
778fcf3ce44SJohn Forte * set users return view entry index valid flag to false
779fcf3ce44SJohn Forte * in case of failure
780fcf3ce44SJohn Forte */
781fcf3ce44SJohn Forte viewEntry->veIndexValid = B_FALSE;
782fcf3ce44SJohn Forte
783fcf3ce44SJohn Forte /* Check to ensure service exists */
784fcf3ce44SJohn Forte if (psCheckService() != STMF_STATUS_SUCCESS) {
785fcf3ce44SJohn Forte return (STMF_ERROR_SERVICE_NOT_FOUND);
786fcf3ce44SJohn Forte }
787fcf3ce44SJohn Forte
788fcf3ce44SJohn Forte /* call init */
789fcf3ce44SJohn Forte ret = initializeConfig();
790fcf3ce44SJohn Forte if (ret != STMF_STATUS_SUCCESS) {
791fcf3ce44SJohn Forte return (ret);
792fcf3ce44SJohn Forte }
793fcf3ce44SJohn Forte
794fcf3ce44SJohn Forte /*
795fcf3ce44SJohn Forte * Open control node for stmf
796fcf3ce44SJohn Forte */
797fcf3ce44SJohn Forte if ((ret = openStmf(OPEN_STMF, &fd)) != STMF_STATUS_SUCCESS)
798fcf3ce44SJohn Forte return (ret);
799fcf3ce44SJohn Forte
800fcf3ce44SJohn Forte /*
801fcf3ce44SJohn Forte * First add the view entry to the driver
802fcf3ce44SJohn Forte */
803fcf3ce44SJohn Forte ret = addViewEntryIoctl(fd, lu, &iViewEntry);
804fcf3ce44SJohn Forte if (ret != STMF_STATUS_SUCCESS) {
805fcf3ce44SJohn Forte goto done;
806fcf3ce44SJohn Forte }
807fcf3ce44SJohn Forte
8088fe96085Stim szeto if (iGetPersistMethod() == STMF_PERSIST_NONE) {
8098fe96085Stim szeto goto done;
8108fe96085Stim szeto }
8118fe96085Stim szeto
812fcf3ce44SJohn Forte /*
813fcf3ce44SJohn Forte * If the add to driver was successful, add it to the persistent
814fcf3ce44SJohn Forte * store.
815fcf3ce44SJohn Forte */
816fcf3ce44SJohn Forte ret = psAddViewEntry(lu, &iViewEntry);
817fcf3ce44SJohn Forte switch (ret) {
818fcf3ce44SJohn Forte case STMF_PS_SUCCESS:
819fcf3ce44SJohn Forte ret = STMF_STATUS_SUCCESS;
820fcf3ce44SJohn Forte break;
821fcf3ce44SJohn Forte case STMF_PS_ERROR_NOT_FOUND:
822fcf3ce44SJohn Forte ret = STMF_ERROR_NOT_FOUND;
823fcf3ce44SJohn Forte break;
824fcf3ce44SJohn Forte case STMF_PS_ERROR_BUSY:
825fcf3ce44SJohn Forte ret = STMF_ERROR_BUSY;
826fcf3ce44SJohn Forte break;
827fcf3ce44SJohn Forte case STMF_PS_ERROR_SERVICE_NOT_FOUND:
828fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_NOT_FOUND;
829fcf3ce44SJohn Forte break;
830fcf3ce44SJohn Forte case STMF_PS_ERROR_VERSION_MISMATCH:
831fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_DATA_VERSION;
832fcf3ce44SJohn Forte break;
833fcf3ce44SJohn Forte default:
834fcf3ce44SJohn Forte syslog(LOG_DEBUG,
835fcf3ce44SJohn Forte "stmfAddViewEntry:psAddViewEntry:error(%d)", ret);
836fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR;
837fcf3ce44SJohn Forte break;
838fcf3ce44SJohn Forte }
839fcf3ce44SJohn Forte
840fcf3ce44SJohn Forte done:
841fcf3ce44SJohn Forte (void) close(fd);
842fcf3ce44SJohn Forte
843fcf3ce44SJohn Forte if (ret == STMF_STATUS_SUCCESS) {
844fcf3ce44SJohn Forte /* set caller's view entry on success */
845fcf3ce44SJohn Forte viewEntry->veIndexValid = iViewEntry.veIndexValid;
846fcf3ce44SJohn Forte viewEntry->veIndex = iViewEntry.veIndex;
847fcf3ce44SJohn Forte viewEntry->luNbrValid = B_TRUE;
848fcf3ce44SJohn Forte bcopy(iViewEntry.luNbr, viewEntry->luNbr,
849fcf3ce44SJohn Forte sizeof (iViewEntry.luNbr));
850fcf3ce44SJohn Forte }
851fcf3ce44SJohn Forte return (ret);
852fcf3ce44SJohn Forte }
853fcf3ce44SJohn Forte
854fcf3ce44SJohn Forte /*
855fcf3ce44SJohn Forte * stmfClearProviderData
856fcf3ce44SJohn Forte *
857fcf3ce44SJohn Forte * Purpose: delete all provider data for specified provider
858fcf3ce44SJohn Forte *
859fcf3ce44SJohn Forte * providerName - name of provider for which data should be deleted
860fcf3ce44SJohn Forte */
861fcf3ce44SJohn Forte int
stmfClearProviderData(char * providerName,int providerType)862fcf3ce44SJohn Forte stmfClearProviderData(char *providerName, int providerType)
863fcf3ce44SJohn Forte {
864fcf3ce44SJohn Forte int ret;
865fcf3ce44SJohn Forte int fd;
866fcf3ce44SJohn Forte int ioctlRet;
867fcf3ce44SJohn Forte int savedErrno;
868fcf3ce44SJohn Forte stmf_iocdata_t stmfIoctl;
869fcf3ce44SJohn Forte stmf_ppioctl_data_t ppi;
870fcf3ce44SJohn Forte
871fcf3ce44SJohn Forte /* call init */
872fcf3ce44SJohn Forte ret = initializeConfig();
873fcf3ce44SJohn Forte if (ret != STMF_STATUS_SUCCESS) {
874fcf3ce44SJohn Forte return (ret);
875fcf3ce44SJohn Forte }
876fcf3ce44SJohn Forte
877fcf3ce44SJohn Forte if (providerName == NULL) {
878fcf3ce44SJohn Forte return (STMF_ERROR_INVALID_ARG);
879fcf3ce44SJohn Forte }
880fcf3ce44SJohn Forte
881fcf3ce44SJohn Forte if (providerType != STMF_LU_PROVIDER_TYPE &&
882fcf3ce44SJohn Forte providerType != STMF_PORT_PROVIDER_TYPE) {
883fcf3ce44SJohn Forte return (STMF_ERROR_INVALID_ARG);
884fcf3ce44SJohn Forte }
885fcf3ce44SJohn Forte
886fcf3ce44SJohn Forte /*
887fcf3ce44SJohn Forte * Open control node for stmf
888fcf3ce44SJohn Forte */
889fcf3ce44SJohn Forte if ((ret = openStmf(OPEN_STMF, &fd)) != STMF_STATUS_SUCCESS)
890fcf3ce44SJohn Forte return (ret);
891fcf3ce44SJohn Forte
892fcf3ce44SJohn Forte bzero(&ppi, sizeof (ppi));
893fcf3ce44SJohn Forte
894fcf3ce44SJohn Forte (void) strncpy(ppi.ppi_name, providerName, sizeof (ppi.ppi_name));
895fcf3ce44SJohn Forte
896fcf3ce44SJohn Forte switch (providerType) {
897fcf3ce44SJohn Forte case STMF_LU_PROVIDER_TYPE:
898fcf3ce44SJohn Forte ppi.ppi_lu_provider = 1;
899fcf3ce44SJohn Forte break;
900fcf3ce44SJohn Forte case STMF_PORT_PROVIDER_TYPE:
901fcf3ce44SJohn Forte ppi.ppi_port_provider = 1;
902fcf3ce44SJohn Forte break;
903fcf3ce44SJohn Forte default:
904fcf3ce44SJohn Forte ret = STMF_ERROR_INVALID_ARG;
905fcf3ce44SJohn Forte goto done;
906fcf3ce44SJohn Forte }
907fcf3ce44SJohn Forte
908fcf3ce44SJohn Forte bzero(&stmfIoctl, sizeof (stmfIoctl));
909fcf3ce44SJohn Forte
910fcf3ce44SJohn Forte stmfIoctl.stmf_version = STMF_VERSION_1;
911fcf3ce44SJohn Forte stmfIoctl.stmf_ibuf_size = sizeof (stmf_ppioctl_data_t);
912fcf3ce44SJohn Forte stmfIoctl.stmf_ibuf = (uint64_t)(unsigned long)&ppi;
913fcf3ce44SJohn Forte
914fcf3ce44SJohn Forte ioctlRet = ioctl(fd, STMF_IOCTL_CLEAR_PP_DATA, &stmfIoctl);
915fcf3ce44SJohn Forte if (ioctlRet != 0) {
916fcf3ce44SJohn Forte savedErrno = errno;
917fcf3ce44SJohn Forte switch (savedErrno) {
918fcf3ce44SJohn Forte case EBUSY:
919fcf3ce44SJohn Forte ret = STMF_ERROR_BUSY;
920fcf3ce44SJohn Forte break;
9218fe96085Stim szeto case EPERM:
922fcf3ce44SJohn Forte case EACCES:
923fcf3ce44SJohn Forte ret = STMF_ERROR_PERM;
924fcf3ce44SJohn Forte break;
925fcf3ce44SJohn Forte default:
926fcf3ce44SJohn Forte syslog(LOG_DEBUG,
927fcf3ce44SJohn Forte "stmfClearProviderData:ioctl error(%d)",
928fcf3ce44SJohn Forte ioctlRet);
929fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR;
930fcf3ce44SJohn Forte break;
931fcf3ce44SJohn Forte }
932fcf3ce44SJohn Forte if (savedErrno != ENOENT) {
933fcf3ce44SJohn Forte goto done;
934fcf3ce44SJohn Forte }
935fcf3ce44SJohn Forte }
936fcf3ce44SJohn Forte
9378fe96085Stim szeto if (iGetPersistMethod() == STMF_PERSIST_NONE) {
9388fe96085Stim szeto goto done;
9398fe96085Stim szeto }
9408fe96085Stim szeto
941fcf3ce44SJohn Forte ret = psClearProviderData(providerName, providerType);
942fcf3ce44SJohn Forte switch (ret) {
943fcf3ce44SJohn Forte case STMF_PS_SUCCESS:
944fcf3ce44SJohn Forte ret = STMF_STATUS_SUCCESS;
945fcf3ce44SJohn Forte break;
946fcf3ce44SJohn Forte case STMF_PS_ERROR_NOT_FOUND:
947fcf3ce44SJohn Forte ret = STMF_ERROR_NOT_FOUND;
948fcf3ce44SJohn Forte break;
949fcf3ce44SJohn Forte case STMF_PS_ERROR_BUSY:
950fcf3ce44SJohn Forte ret = STMF_ERROR_BUSY;
951fcf3ce44SJohn Forte break;
952fcf3ce44SJohn Forte case STMF_PS_ERROR_SERVICE_NOT_FOUND:
953fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_NOT_FOUND;
954fcf3ce44SJohn Forte break;
955fcf3ce44SJohn Forte case STMF_PS_ERROR_VERSION_MISMATCH:
956fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_DATA_VERSION;
957fcf3ce44SJohn Forte break;
958fcf3ce44SJohn Forte default:
959fcf3ce44SJohn Forte syslog(LOG_DEBUG,
960fcf3ce44SJohn Forte "stmfClearProviderData:psClearProviderData"
961fcf3ce44SJohn Forte ":error(%d)", ret);
962fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR;
963fcf3ce44SJohn Forte break;
964fcf3ce44SJohn Forte }
965fcf3ce44SJohn Forte
966fcf3ce44SJohn Forte done:
967fcf3ce44SJohn Forte (void) close(fd);
968fcf3ce44SJohn Forte return (ret);
969fcf3ce44SJohn Forte }
970fcf3ce44SJohn Forte
971fcf3ce44SJohn Forte /*
972fcf3ce44SJohn Forte * stmfCreateHostGroup
973fcf3ce44SJohn Forte *
974fcf3ce44SJohn Forte * Purpose: Create a new initiator group
975fcf3ce44SJohn Forte *
976fcf3ce44SJohn Forte * hostGroupName - name of host group to create
977fcf3ce44SJohn Forte */
978fcf3ce44SJohn Forte int
stmfCreateHostGroup(stmfGroupName * hostGroupName)979fcf3ce44SJohn Forte stmfCreateHostGroup(stmfGroupName *hostGroupName)
980fcf3ce44SJohn Forte {
981fcf3ce44SJohn Forte int ret;
982fcf3ce44SJohn Forte int fd;
983fcf3ce44SJohn Forte
984fcf3ce44SJohn Forte if (hostGroupName == NULL ||
985fcf3ce44SJohn Forte (strnlen((char *)hostGroupName, sizeof (stmfGroupName))
986fcf3ce44SJohn Forte == sizeof (stmfGroupName))) {
987fcf3ce44SJohn Forte return (STMF_ERROR_INVALID_ARG);
988fcf3ce44SJohn Forte }
989fcf3ce44SJohn Forte
990fcf3ce44SJohn Forte /* Check to ensure service exists */
991fcf3ce44SJohn Forte if (psCheckService() != STMF_STATUS_SUCCESS) {
992fcf3ce44SJohn Forte return (STMF_ERROR_SERVICE_NOT_FOUND);
993fcf3ce44SJohn Forte }
994fcf3ce44SJohn Forte
995fcf3ce44SJohn Forte /* call init */
996fcf3ce44SJohn Forte ret = initializeConfig();
997fcf3ce44SJohn Forte if (ret != STMF_STATUS_SUCCESS) {
998fcf3ce44SJohn Forte return (ret);
999fcf3ce44SJohn Forte }
1000fcf3ce44SJohn Forte
1001fcf3ce44SJohn Forte /*
1002fcf3ce44SJohn Forte * Open control node for stmf
1003fcf3ce44SJohn Forte */
1004fcf3ce44SJohn Forte if ((ret = openStmf(OPEN_STMF, &fd)) != STMF_STATUS_SUCCESS)
1005fcf3ce44SJohn Forte return (ret);
1006fcf3ce44SJohn Forte
1007fcf3ce44SJohn Forte if ((ret = groupIoctl(fd, STMF_IOCTL_CREATE_HOST_GROUP,
1008fcf3ce44SJohn Forte hostGroupName)) != STMF_STATUS_SUCCESS) {
1009fcf3ce44SJohn Forte goto done;
1010fcf3ce44SJohn Forte }
1011fcf3ce44SJohn Forte
10128fe96085Stim szeto if (iGetPersistMethod() == STMF_PERSIST_NONE) {
10138fe96085Stim szeto goto done;
10148fe96085Stim szeto }
10158fe96085Stim szeto
1016fcf3ce44SJohn Forte ret = psCreateHostGroup((char *)hostGroupName);
1017fcf3ce44SJohn Forte switch (ret) {
1018fcf3ce44SJohn Forte case STMF_PS_SUCCESS:
1019fcf3ce44SJohn Forte ret = STMF_STATUS_SUCCESS;
1020fcf3ce44SJohn Forte break;
1021fcf3ce44SJohn Forte case STMF_PS_ERROR_EXISTS:
1022fcf3ce44SJohn Forte ret = STMF_ERROR_EXISTS;
1023fcf3ce44SJohn Forte break;
1024fcf3ce44SJohn Forte case STMF_PS_ERROR_BUSY:
1025fcf3ce44SJohn Forte ret = STMF_ERROR_BUSY;
1026fcf3ce44SJohn Forte break;
1027fcf3ce44SJohn Forte case STMF_PS_ERROR_SERVICE_NOT_FOUND:
1028fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_NOT_FOUND;
1029fcf3ce44SJohn Forte break;
1030fcf3ce44SJohn Forte case STMF_PS_ERROR_VERSION_MISMATCH:
1031fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_DATA_VERSION;
1032fcf3ce44SJohn Forte break;
1033fcf3ce44SJohn Forte default:
1034fcf3ce44SJohn Forte syslog(LOG_DEBUG,
1035fcf3ce44SJohn Forte "stmfCreateHostGroup:psCreateHostGroup:error(%d)",
1036fcf3ce44SJohn Forte ret);
1037fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR;
1038fcf3ce44SJohn Forte break;
1039fcf3ce44SJohn Forte }
1040fcf3ce44SJohn Forte
1041fcf3ce44SJohn Forte done:
1042fcf3ce44SJohn Forte (void) close(fd);
1043fcf3ce44SJohn Forte return (ret);
1044fcf3ce44SJohn Forte }
1045fcf3ce44SJohn Forte
1046fcf3ce44SJohn Forte /*
10478fe96085Stim szeto * stmfCreateLu
10488fe96085Stim szeto *
10498fe96085Stim szeto * Purpose: Create a logical unit
10508fe96085Stim szeto *
10518fe96085Stim szeto * hdl - handle to logical unit resource created via stmfCreateLuResource
10528fe96085Stim szeto *
10538fe96085Stim szeto * luGuid - If non-NULL, on success, contains the guid of the created logical
10548fe96085Stim szeto * unit
10558fe96085Stim szeto */
10568fe96085Stim szeto int
stmfCreateLu(luResource hdl,stmfGuid * luGuid)10578fe96085Stim szeto stmfCreateLu(luResource hdl, stmfGuid *luGuid)
10588fe96085Stim szeto {
10598fe96085Stim szeto int ret = STMF_STATUS_SUCCESS;
10608fe96085Stim szeto luResourceImpl *luPropsHdl = hdl;
10618fe96085Stim szeto
10628fe96085Stim szeto if (hdl == NULL) {
10638fe96085Stim szeto return (STMF_ERROR_INVALID_ARG);
10648fe96085Stim szeto }
10658fe96085Stim szeto
10668fe96085Stim szeto if (luPropsHdl->type == STMF_DISK) {
10678fe96085Stim szeto ret = createDiskLu((diskResource *)luPropsHdl->resource,
10688fe96085Stim szeto luGuid);
10698fe96085Stim szeto } else {
10708fe96085Stim szeto return (STMF_ERROR_INVALID_ARG);
10718fe96085Stim szeto }
10728fe96085Stim szeto
10738fe96085Stim szeto return (ret);
10748fe96085Stim szeto }
10758fe96085Stim szeto
10768fe96085Stim szeto /*
10778fe96085Stim szeto * stmfCreateLuResource
10788fe96085Stim szeto *
10798fe96085Stim szeto * Purpose: Create resource handle for a logical unit
10808fe96085Stim szeto *
10818fe96085Stim szeto * dType - Type of logical unit resource to create
10828fe96085Stim szeto * Can be: STMF_DISK
10838fe96085Stim szeto *
10848fe96085Stim szeto * hdl - pointer to luResource
10858fe96085Stim szeto */
10868fe96085Stim szeto int
stmfCreateLuResource(uint16_t dType,luResource * hdl)10878fe96085Stim szeto stmfCreateLuResource(uint16_t dType, luResource *hdl)
10888fe96085Stim szeto {
10898fe96085Stim szeto int ret = STMF_STATUS_SUCCESS;
10908fe96085Stim szeto
10918fe96085Stim szeto if (dType != STMF_DISK || hdl == NULL) {
10928fe96085Stim szeto return (STMF_ERROR_INVALID_ARG);
10938fe96085Stim szeto }
10948fe96085Stim szeto
10958fe96085Stim szeto *hdl = calloc(1, sizeof (luResourceImpl));
10968fe96085Stim szeto if (*hdl == NULL) {
10978fe96085Stim szeto return (STMF_ERROR_NOMEM);
10988fe96085Stim szeto }
10998fe96085Stim szeto
11008fe96085Stim szeto ret = createDiskResource((luResourceImpl *)*hdl);
11018fe96085Stim szeto if (ret != STMF_STATUS_SUCCESS) {
11028fe96085Stim szeto free(*hdl);
11038fe96085Stim szeto return (ret);
11048fe96085Stim szeto }
11058fe96085Stim szeto
11068fe96085Stim szeto return (STMF_STATUS_SUCCESS);
11078fe96085Stim szeto }
11088fe96085Stim szeto
11098fe96085Stim szeto /*
11108fe96085Stim szeto * Creates a disk logical unit
11118fe96085Stim szeto *
11128fe96085Stim szeto * disk - pointer to diskResource structure that represents the properties
11138fe96085Stim szeto * for the disk logical unit to be created.
11148fe96085Stim szeto */
11158fe96085Stim szeto static int
createDiskLu(diskResource * disk,stmfGuid * createdGuid)11168fe96085Stim szeto createDiskLu(diskResource *disk, stmfGuid *createdGuid)
11178fe96085Stim szeto {
11188fe96085Stim szeto int ret = STMF_STATUS_SUCCESS;
11198fe96085Stim szeto int dataFileNameLen = 0;
11208fe96085Stim szeto int metaFileNameLen = 0;
11218fe96085Stim szeto int serialNumLen = 0;
11228fe96085Stim szeto int luAliasLen = 0;
11232f624233SNattuvetty Bhavyan int luMgmtUrlLen = 0;
11248fe96085Stim szeto int sluBufSize = 0;
11258fe96085Stim szeto int bufOffset = 0;
11268fe96085Stim szeto int fd = 0;
11278fe96085Stim szeto int ioctlRet;
11288fe96085Stim szeto int savedErrno;
11298fe96085Stim szeto stmfGuid guid;
11308fe96085Stim szeto stmf_iocdata_t sbdIoctl = {0};
11318fe96085Stim szeto
11328fe96085Stim szeto sbd_create_and_reg_lu_t *sbdLu = NULL;
11338fe96085Stim szeto
11348fe96085Stim szeto /*
11358fe96085Stim szeto * Open control node for sbd
11368fe96085Stim szeto */
11378fe96085Stim szeto if ((ret = openSbd(OPEN_SBD, &fd)) != STMF_STATUS_SUCCESS)
11388fe96085Stim szeto return (ret);
11398fe96085Stim szeto
11408fe96085Stim szeto /* data file name must be specified */
11418fe96085Stim szeto if (disk->luDataFileNameValid) {
11428fe96085Stim szeto dataFileNameLen = strlen(disk->luDataFileName);
11438fe96085Stim szeto } else {
11448fe96085Stim szeto (void) close(fd);
11458fe96085Stim szeto return (STMF_ERROR_MISSING_PROP_VAL);
11468fe96085Stim szeto }
11478fe96085Stim szeto
11488fe96085Stim szeto sluBufSize += dataFileNameLen + 1;
11498fe96085Stim szeto
11508fe96085Stim szeto if (disk->luMetaFileNameValid) {
11518fe96085Stim szeto metaFileNameLen = strlen(disk->luMetaFileName);
11528fe96085Stim szeto sluBufSize += metaFileNameLen + 1;
11538fe96085Stim szeto }
11548fe96085Stim szeto
11558fe96085Stim szeto serialNumLen = strlen(disk->serialNum);
11568fe96085Stim szeto sluBufSize += serialNumLen;
11578fe96085Stim szeto
11588fe96085Stim szeto if (disk->luAliasValid) {
11598fe96085Stim szeto luAliasLen = strlen(disk->luAlias);
11608fe96085Stim szeto sluBufSize += luAliasLen + 1;
11618fe96085Stim szeto }
11628fe96085Stim szeto
11632f624233SNattuvetty Bhavyan if (disk->luMgmtUrlValid) {
11642f624233SNattuvetty Bhavyan luMgmtUrlLen = strlen(disk->luMgmtUrl);
11652f624233SNattuvetty Bhavyan sluBufSize += luMgmtUrlLen + 1;
11662f624233SNattuvetty Bhavyan }
11672f624233SNattuvetty Bhavyan
11688fe96085Stim szeto /*
11698fe96085Stim szeto * 8 is the size of the buffer set aside for
11708fe96085Stim szeto * concatenation of variable length fields
11718fe96085Stim szeto */
11728fe96085Stim szeto sbdLu = (sbd_create_and_reg_lu_t *)calloc(1,
11738fe96085Stim szeto sizeof (sbd_create_and_reg_lu_t) + sluBufSize - 8);
11748fe96085Stim szeto if (sbdLu == NULL) {
11758fe96085Stim szeto return (STMF_ERROR_NOMEM);
11768fe96085Stim szeto }
11778fe96085Stim szeto
11788fe96085Stim szeto sbdLu->slu_struct_size = sizeof (sbd_create_and_reg_lu_t) +
11798fe96085Stim szeto sluBufSize - 8;
11808fe96085Stim szeto
11818fe96085Stim szeto if (metaFileNameLen) {
11828fe96085Stim szeto sbdLu->slu_meta_fname_valid = 1;
11838fe96085Stim szeto sbdLu->slu_meta_fname_off = bufOffset;
11848fe96085Stim szeto bcopy(disk->luMetaFileName, &(sbdLu->slu_buf[bufOffset]),
11858fe96085Stim szeto metaFileNameLen + 1);
11868fe96085Stim szeto bufOffset += metaFileNameLen + 1;
11878fe96085Stim szeto }
11888fe96085Stim szeto
11898fe96085Stim szeto bcopy(disk->luDataFileName, &(sbdLu->slu_buf[bufOffset]),
11908fe96085Stim szeto dataFileNameLen + 1);
11918fe96085Stim szeto sbdLu->slu_data_fname_off = bufOffset;
11928fe96085Stim szeto bufOffset += dataFileNameLen + 1;
11938fe96085Stim szeto
11948fe96085Stim szeto /* currently, serial # is not passed null terminated to the driver */
11958fe96085Stim szeto if (disk->serialNumValid) {
11968fe96085Stim szeto sbdLu->slu_serial_valid = 1;
11978fe96085Stim szeto sbdLu->slu_serial_off = bufOffset;
11988fe96085Stim szeto sbdLu->slu_serial_size = serialNumLen;
11998fe96085Stim szeto bcopy(disk->serialNum, &(sbdLu->slu_buf[bufOffset]),
12008fe96085Stim szeto serialNumLen);
12018fe96085Stim szeto bufOffset += serialNumLen;
12028fe96085Stim szeto }
12038fe96085Stim szeto
12048fe96085Stim szeto if (disk->luAliasValid) {
12058fe96085Stim szeto sbdLu->slu_alias_valid = 1;
12068fe96085Stim szeto sbdLu->slu_alias_off = bufOffset;
12078fe96085Stim szeto bcopy(disk->luAlias, &(sbdLu->slu_buf[bufOffset]),
12088fe96085Stim szeto luAliasLen + 1);
12098fe96085Stim szeto bufOffset += luAliasLen + 1;
12108fe96085Stim szeto }
12118fe96085Stim szeto
12122f624233SNattuvetty Bhavyan if (disk->luMgmtUrlValid) {
12132f624233SNattuvetty Bhavyan sbdLu->slu_mgmt_url_valid = 1;
12142f624233SNattuvetty Bhavyan sbdLu->slu_mgmt_url_off = bufOffset;
12152f624233SNattuvetty Bhavyan bcopy(disk->luMgmtUrl, &(sbdLu->slu_buf[bufOffset]),
12162f624233SNattuvetty Bhavyan luMgmtUrlLen + 1);
12172f624233SNattuvetty Bhavyan bufOffset += luMgmtUrlLen + 1;
12182f624233SNattuvetty Bhavyan }
12192f624233SNattuvetty Bhavyan
12208fe96085Stim szeto if (disk->luSizeValid) {
12218fe96085Stim szeto sbdLu->slu_lu_size_valid = 1;
12228fe96085Stim szeto sbdLu->slu_lu_size = disk->luSize;
12238fe96085Stim szeto }
12248fe96085Stim szeto
12258fe96085Stim szeto if (disk->luGuidValid) {
12268fe96085Stim szeto sbdLu->slu_guid_valid = 1;
12278fe96085Stim szeto bcopy(disk->luGuid, sbdLu->slu_guid, sizeof (disk->luGuid));
12288fe96085Stim szeto }
12298fe96085Stim szeto
12308fe96085Stim szeto if (disk->vidValid) {
12318fe96085Stim szeto sbdLu->slu_vid_valid = 1;
12328fe96085Stim szeto bcopy(disk->vid, sbdLu->slu_vid, sizeof (disk->vid));
12338fe96085Stim szeto }
12348fe96085Stim szeto
12358fe96085Stim szeto if (disk->pidValid) {
12368fe96085Stim szeto sbdLu->slu_pid_valid = 1;
12378fe96085Stim szeto bcopy(disk->pid, sbdLu->slu_pid, sizeof (disk->pid));
12388fe96085Stim szeto }
12398fe96085Stim szeto
12408fe96085Stim szeto if (disk->revValid) {
12418fe96085Stim szeto sbdLu->slu_rev_valid = 1;
12428fe96085Stim szeto bcopy(disk->rev, sbdLu->slu_rev, sizeof (disk->rev));
12438fe96085Stim szeto }
12448fe96085Stim szeto
12458fe96085Stim szeto if (disk->companyIdValid) {
12468fe96085Stim szeto sbdLu->slu_company_id_valid = 1;
12478fe96085Stim szeto sbdLu->slu_company_id = disk->companyId;
12488fe96085Stim szeto }
12498fe96085Stim szeto
1250fdcc480aSJohn Forte if (disk->hostIdValid) {
1251fdcc480aSJohn Forte sbdLu->slu_host_id_valid = 1;
1252fdcc480aSJohn Forte sbdLu->slu_host_id = disk->hostId;
1253fdcc480aSJohn Forte }
1254fdcc480aSJohn Forte
12558fe96085Stim szeto if (disk->blkSizeValid) {
12568fe96085Stim szeto sbdLu->slu_blksize_valid = 1;
12578fe96085Stim szeto sbdLu->slu_blksize = disk->blkSize;
12588fe96085Stim szeto }
12598fe96085Stim szeto
12608fe96085Stim szeto if (disk->writeProtectEnableValid) {
12618fe96085Stim szeto if (disk->writeProtectEnable) {
12628fe96085Stim szeto sbdLu->slu_write_protected = 1;
12638fe96085Stim szeto }
12648fe96085Stim szeto }
12658fe96085Stim szeto
12668fe96085Stim szeto if (disk->writebackCacheDisableValid) {
12678fe96085Stim szeto sbdLu->slu_writeback_cache_disable_valid = 1;
12688fe96085Stim szeto if (disk->writebackCacheDisable) {
12698fe96085Stim szeto sbdLu->slu_writeback_cache_disable = 1;
12708fe96085Stim szeto }
12718fe96085Stim szeto }
12728fe96085Stim szeto
12738fe96085Stim szeto sbdIoctl.stmf_version = STMF_VERSION_1;
12748fe96085Stim szeto sbdIoctl.stmf_ibuf_size = sbdLu->slu_struct_size;
12758fe96085Stim szeto sbdIoctl.stmf_ibuf = (uint64_t)(unsigned long)sbdLu;
12768fe96085Stim szeto sbdIoctl.stmf_obuf_size = sbdLu->slu_struct_size;
12778fe96085Stim szeto sbdIoctl.stmf_obuf = (uint64_t)(unsigned long)sbdLu;
12788fe96085Stim szeto
12798fe96085Stim szeto ioctlRet = ioctl(fd, SBD_IOCTL_CREATE_AND_REGISTER_LU, &sbdIoctl);
12808fe96085Stim szeto if (ioctlRet != 0) {
12818fe96085Stim szeto savedErrno = errno;
12828fe96085Stim szeto switch (savedErrno) {
12838fe96085Stim szeto case EBUSY:
12848fe96085Stim szeto ret = STMF_ERROR_BUSY;
12858fe96085Stim szeto break;
12868fe96085Stim szeto case EPERM:
12878fe96085Stim szeto case EACCES:
12888fe96085Stim szeto ret = STMF_ERROR_PERM;
12898fe96085Stim szeto break;
12908fe96085Stim szeto default:
12918fe96085Stim szeto diskError(sbdIoctl.stmf_error, &ret);
12928fe96085Stim szeto if (ret == STMF_STATUS_ERROR) {
12938fe96085Stim szeto syslog(LOG_DEBUG,
12948fe96085Stim szeto "createDiskLu:ioctl "
12958fe96085Stim szeto "error(%d) (%d) (%d)", ioctlRet,
12968fe96085Stim szeto sbdIoctl.stmf_error, savedErrno);
12978fe96085Stim szeto }
12988fe96085Stim szeto break;
12998fe96085Stim szeto }
13008fe96085Stim szeto }
13018fe96085Stim szeto
13028fe96085Stim szeto if (ret != STMF_STATUS_SUCCESS) {
13038fe96085Stim szeto goto done;
13048fe96085Stim szeto }
13058fe96085Stim szeto
13068fe96085Stim szeto /*
13078fe96085Stim szeto * on success, copy the resulting guid into the caller's guid if not
13088fe96085Stim szeto * NULL
13098fe96085Stim szeto */
13108fe96085Stim szeto if (createdGuid) {
13118fe96085Stim szeto bcopy(sbdLu->slu_guid, createdGuid->guid,
13128fe96085Stim szeto sizeof (sbdLu->slu_guid));
13138fe96085Stim szeto }
13148fe96085Stim szeto
13158fe96085Stim szeto bcopy(sbdLu->slu_guid, guid.guid, sizeof (sbdLu->slu_guid));
13168fe96085Stim szeto if (disk->luMetaFileNameValid) {
13178fe96085Stim szeto ret = addGuidToDiskStore(&guid, disk->luMetaFileName);
13188fe96085Stim szeto } else {
13198fe96085Stim szeto ret = addGuidToDiskStore(&guid, disk->luDataFileName);
13208fe96085Stim szeto }
13218fe96085Stim szeto done:
13228fe96085Stim szeto free(sbdLu);
13238fe96085Stim szeto (void) close(fd);
13248fe96085Stim szeto return (ret);
13258fe96085Stim szeto }
13268fe96085Stim szeto
13278fe96085Stim szeto
13288fe96085Stim szeto /*
13298fe96085Stim szeto * stmfImportLu
13308fe96085Stim szeto *
13318fe96085Stim szeto * Purpose: Import a previously created logical unit
13328fe96085Stim szeto *
13338fe96085Stim szeto * dType - Type of logical unit
13348fe96085Stim szeto * Can be: STMF_DISK
13358fe96085Stim szeto *
13368fe96085Stim szeto * luGuid - If non-NULL, on success, contains the guid of the imported logical
13378fe96085Stim szeto * unit
13388fe96085Stim szeto *
13398fe96085Stim szeto * fname - A file name where the metadata resides
13408fe96085Stim szeto *
13418fe96085Stim szeto */
13428fe96085Stim szeto int
stmfImportLu(uint16_t dType,char * fname,stmfGuid * luGuid)13438fe96085Stim szeto stmfImportLu(uint16_t dType, char *fname, stmfGuid *luGuid)
13448fe96085Stim szeto {
13458fe96085Stim szeto int ret = STMF_STATUS_SUCCESS;
13468fe96085Stim szeto
13478fe96085Stim szeto if (dType == STMF_DISK) {
13488fe96085Stim szeto ret = importDiskLu(fname, luGuid);
13498fe96085Stim szeto } else {
13508fe96085Stim szeto return (STMF_ERROR_INVALID_ARG);
13518fe96085Stim szeto }
13528fe96085Stim szeto
13538fe96085Stim szeto return (ret);
13548fe96085Stim szeto }
13558fe96085Stim szeto
13568fe96085Stim szeto /*
13578fe96085Stim szeto * importDiskLu
13588fe96085Stim szeto *
13598fe96085Stim szeto * filename - filename to import
13608fe96085Stim szeto * createdGuid - if not NULL, on success contains the imported guid
13618fe96085Stim szeto *
13628fe96085Stim szeto */
13638fe96085Stim szeto static int
importDiskLu(char * fname,stmfGuid * createdGuid)13648fe96085Stim szeto importDiskLu(char *fname, stmfGuid *createdGuid)
13658fe96085Stim szeto {
13668fe96085Stim szeto int ret = STMF_STATUS_SUCCESS;
13678fe96085Stim szeto int fd = 0;
13688fe96085Stim szeto int ioctlRet;
13698fe96085Stim szeto int savedErrno;
13708fe96085Stim szeto int metaFileNameLen;
13718fe96085Stim szeto stmfGuid iGuid;
13728fe96085Stim szeto int iluBufSize = 0;
13738fe96085Stim szeto sbd_import_lu_t *sbdLu = NULL;
13748fe96085Stim szeto stmf_iocdata_t sbdIoctl = {0};
13758fe96085Stim szeto
13768fe96085Stim szeto if (fname == NULL) {
13778fe96085Stim szeto return (STMF_ERROR_INVALID_ARG);
13788fe96085Stim szeto }
13798fe96085Stim szeto
13808fe96085Stim szeto /*
13818fe96085Stim szeto * Open control node for sbd
13828fe96085Stim szeto */
13838fe96085Stim szeto if ((ret = openSbd(OPEN_SBD, &fd)) != STMF_STATUS_SUCCESS)
13848fe96085Stim szeto return (ret);
13858fe96085Stim szeto
13868fe96085Stim szeto metaFileNameLen = strlen(fname);
13878fe96085Stim szeto iluBufSize += metaFileNameLen + 1;
13888fe96085Stim szeto
13898fe96085Stim szeto /*
13908fe96085Stim szeto * 8 is the size of the buffer set aside for
13918fe96085Stim szeto * concatenation of variable length fields
13928fe96085Stim szeto */
13938fe96085Stim szeto sbdLu = (sbd_import_lu_t *)calloc(1,
13948fe96085Stim szeto sizeof (sbd_import_lu_t) + iluBufSize - 8);
13958fe96085Stim szeto if (sbdLu == NULL) {
13968fe96085Stim szeto (void) close(fd);
13978fe96085Stim szeto return (STMF_ERROR_NOMEM);
13988fe96085Stim szeto }
13998fe96085Stim szeto
14008fe96085Stim szeto /*
14018fe96085Stim szeto * Accept either a data file or meta data file.
14028fe96085Stim szeto * sbd will do the right thing here either way.
14038fe96085Stim szeto * i.e. if it's a data file, it assumes that the
14048fe96085Stim szeto * meta data is shared with the data.
14058fe96085Stim szeto */
14068fe96085Stim szeto (void) strncpy(sbdLu->ilu_meta_fname, fname, metaFileNameLen);
14078fe96085Stim szeto
14088fe96085Stim szeto sbdLu->ilu_struct_size = sizeof (sbd_import_lu_t) + iluBufSize - 8;
14098fe96085Stim szeto
14108fe96085Stim szeto sbdIoctl.stmf_version = STMF_VERSION_1;
14118fe96085Stim szeto sbdIoctl.stmf_ibuf_size = sbdLu->ilu_struct_size;
14128fe96085Stim szeto sbdIoctl.stmf_ibuf = (uint64_t)(unsigned long)sbdLu;
14138fe96085Stim szeto sbdIoctl.stmf_obuf_size = sbdLu->ilu_struct_size;
14148fe96085Stim szeto sbdIoctl.stmf_obuf = (uint64_t)(unsigned long)sbdLu;
14158fe96085Stim szeto
14168fe96085Stim szeto ioctlRet = ioctl(fd, SBD_IOCTL_IMPORT_LU, &sbdIoctl);
14178fe96085Stim szeto if (ioctlRet != 0) {
1418a1837c6dSsrivijitha dugganapalli
1419a1837c6dSsrivijitha dugganapalli if (createdGuid && sbdIoctl.stmf_error ==
1420a1837c6dSsrivijitha dugganapalli SBD_RET_FILE_ALREADY_REGISTERED) {
1421a1837c6dSsrivijitha dugganapalli bcopy(sbdLu->ilu_ret_guid, createdGuid->guid,
1422a1837c6dSsrivijitha dugganapalli sizeof (sbdLu->ilu_ret_guid));
1423a1837c6dSsrivijitha dugganapalli }
1424a1837c6dSsrivijitha dugganapalli
14258fe96085Stim szeto savedErrno = errno;
14268fe96085Stim szeto switch (savedErrno) {
14278fe96085Stim szeto case EBUSY:
14288fe96085Stim szeto ret = STMF_ERROR_BUSY;
14298fe96085Stim szeto break;
14308fe96085Stim szeto case EPERM:
14318fe96085Stim szeto case EACCES:
14328fe96085Stim szeto ret = STMF_ERROR_PERM;
14338fe96085Stim szeto break;
14348fe96085Stim szeto default:
14358fe96085Stim szeto diskError(sbdIoctl.stmf_error, &ret);
14368fe96085Stim szeto if (ret == STMF_STATUS_ERROR) {
14378fe96085Stim szeto syslog(LOG_DEBUG,
14388fe96085Stim szeto "importDiskLu:ioctl "
14398fe96085Stim szeto "error(%d) (%d) (%d)", ioctlRet,
14408fe96085Stim szeto sbdIoctl.stmf_error, savedErrno);
14418fe96085Stim szeto }
14428fe96085Stim szeto break;
14438fe96085Stim szeto }
14448fe96085Stim szeto }
14458fe96085Stim szeto
1446a1837c6dSsrivijitha dugganapalli
14478fe96085Stim szeto if (ret != STMF_STATUS_SUCCESS) {
14488fe96085Stim szeto goto done;
14498fe96085Stim szeto }
14508fe96085Stim szeto
14518fe96085Stim szeto /*
14528fe96085Stim szeto * on success, copy the resulting guid into the caller's guid if not
14538fe96085Stim szeto * NULL and add it to the persistent store for sbd
14548fe96085Stim szeto */
14558fe96085Stim szeto if (createdGuid) {
14568fe96085Stim szeto bcopy(sbdLu->ilu_ret_guid, createdGuid->guid,
14578fe96085Stim szeto sizeof (sbdLu->ilu_ret_guid));
14588fe96085Stim szeto ret = addGuidToDiskStore(createdGuid, fname);
14598fe96085Stim szeto } else {
14608fe96085Stim szeto bcopy(sbdLu->ilu_ret_guid, iGuid.guid,
14618fe96085Stim szeto sizeof (sbdLu->ilu_ret_guid));
14628fe96085Stim szeto ret = addGuidToDiskStore(&iGuid, fname);
14638fe96085Stim szeto }
14648fe96085Stim szeto done:
14658fe96085Stim szeto free(sbdLu);
14668fe96085Stim szeto (void) close(fd);
14678fe96085Stim szeto return (ret);
14688fe96085Stim szeto }
14698fe96085Stim szeto
14708fe96085Stim szeto /*
14718fe96085Stim szeto * diskError
14728fe96085Stim szeto *
14738fe96085Stim szeto * Purpose: Translate sbd driver error
14748fe96085Stim szeto */
14758fe96085Stim szeto static void
diskError(uint32_t stmfError,int * ret)14768fe96085Stim szeto diskError(uint32_t stmfError, int *ret)
14778fe96085Stim szeto {
14788fe96085Stim szeto switch (stmfError) {
14798fe96085Stim szeto case SBD_RET_META_CREATION_FAILED:
14808fe96085Stim szeto case SBD_RET_ZFS_META_CREATE_FAILED:
14818fe96085Stim szeto *ret = STMF_ERROR_META_CREATION;
14828fe96085Stim szeto break;
14838fe96085Stim szeto case SBD_RET_INVALID_BLKSIZE:
14848fe96085Stim szeto *ret = STMF_ERROR_INVALID_BLKSIZE;
14858fe96085Stim szeto break;
14868fe96085Stim szeto case SBD_RET_FILE_ALREADY_REGISTERED:
14878fe96085Stim szeto *ret = STMF_ERROR_FILE_IN_USE;
14888fe96085Stim szeto break;
14898fe96085Stim szeto case SBD_RET_GUID_ALREADY_REGISTERED:
14908fe96085Stim szeto *ret = STMF_ERROR_GUID_IN_USE;
14918fe96085Stim szeto break;
14928fe96085Stim szeto case SBD_RET_META_PATH_NOT_ABSOLUTE:
14938fe96085Stim szeto case SBD_RET_META_FILE_LOOKUP_FAILED:
14948fe96085Stim szeto case SBD_RET_META_FILE_OPEN_FAILED:
14958fe96085Stim szeto case SBD_RET_META_FILE_GETATTR_FAILED:
14968fe96085Stim szeto case SBD_RET_NO_META:
14978fe96085Stim szeto *ret = STMF_ERROR_META_FILE_NAME;
14988fe96085Stim szeto break;
14998fe96085Stim szeto case SBD_RET_DATA_PATH_NOT_ABSOLUTE:
15008fe96085Stim szeto case SBD_RET_DATA_FILE_LOOKUP_FAILED:
15018fe96085Stim szeto case SBD_RET_DATA_FILE_OPEN_FAILED:
15028fe96085Stim szeto case SBD_RET_DATA_FILE_GETATTR_FAILED:
15038fe96085Stim szeto *ret = STMF_ERROR_DATA_FILE_NAME;
15048fe96085Stim szeto break;
15058fe96085Stim szeto case SBD_RET_FILE_SIZE_ERROR:
15068fe96085Stim szeto *ret = STMF_ERROR_FILE_SIZE_INVALID;
15078fe96085Stim szeto break;
15088fe96085Stim szeto case SBD_RET_SIZE_OUT_OF_RANGE:
15098fe96085Stim szeto *ret = STMF_ERROR_SIZE_OUT_OF_RANGE;
15108fe96085Stim szeto break;
15118fe96085Stim szeto case SBD_RET_LU_BUSY:
15128fe96085Stim szeto *ret = STMF_ERROR_LU_BUSY;
15138fe96085Stim szeto break;
15148fe96085Stim szeto case SBD_RET_WRITE_CACHE_SET_FAILED:
15158fe96085Stim szeto *ret = STMF_ERROR_WRITE_CACHE_SET;
15168fe96085Stim szeto break;
151745039663SJohn Forte case SBD_RET_ACCESS_STATE_FAILED:
151845039663SJohn Forte *ret = STMF_ERROR_ACCESS_STATE_SET;
151945039663SJohn Forte break;
15208fe96085Stim szeto default:
15218fe96085Stim szeto *ret = STMF_STATUS_ERROR;
15228fe96085Stim szeto break;
15238fe96085Stim szeto }
15248fe96085Stim szeto }
15258fe96085Stim szeto
15268fe96085Stim szeto /*
15278fe96085Stim szeto * Creates a logical unit resource of type STMF_DISK.
15288fe96085Stim szeto *
15298fe96085Stim szeto * No defaults should be set here as all defaults are derived from the
15308fe96085Stim szeto * driver's default settings.
15318fe96085Stim szeto */
15328fe96085Stim szeto static int
createDiskResource(luResourceImpl * hdl)15338fe96085Stim szeto createDiskResource(luResourceImpl *hdl)
15348fe96085Stim szeto {
15358fe96085Stim szeto hdl->type = STMF_DISK;
15368fe96085Stim szeto
15378fe96085Stim szeto hdl->resource = calloc(1, sizeof (diskResource));
15388fe96085Stim szeto if (hdl->resource == NULL) {
15398fe96085Stim szeto return (STMF_ERROR_NOMEM);
15408fe96085Stim szeto }
15418fe96085Stim szeto
15428fe96085Stim szeto return (STMF_STATUS_SUCCESS);
15438fe96085Stim szeto }
15448fe96085Stim szeto
15458fe96085Stim szeto /*
15468fe96085Stim szeto * stmfDeleteLu
15478fe96085Stim szeto *
15488fe96085Stim szeto * Purpose: Delete a logical unit
15498fe96085Stim szeto *
15508fe96085Stim szeto * hdl - handle to logical unit resource created via stmfCreateLuResource
15518fe96085Stim szeto *
15528fe96085Stim szeto * luGuid - If non-NULL, on success, contains the guid of the created logical
15538fe96085Stim szeto * unit
15548fe96085Stim szeto */
15558fe96085Stim szeto int
stmfDeleteLu(stmfGuid * luGuid)15568fe96085Stim szeto stmfDeleteLu(stmfGuid *luGuid)
15578fe96085Stim szeto {
15588fe96085Stim szeto int ret = STMF_STATUS_SUCCESS;
15598fe96085Stim szeto stmfLogicalUnitProperties luProps;
15608fe96085Stim szeto
15618fe96085Stim szeto if (luGuid == NULL) {
15628fe96085Stim szeto return (STMF_ERROR_INVALID_ARG);
15638fe96085Stim szeto }
15648fe96085Stim szeto
15658fe96085Stim szeto /* Check logical unit provider name to call correct dtype function */
15668fe96085Stim szeto if ((ret = stmfGetLogicalUnitProperties(luGuid, &luProps))
15678fe96085Stim szeto != STMF_STATUS_SUCCESS) {
15688fe96085Stim szeto return (ret);
15698fe96085Stim szeto } else {
15708fe96085Stim szeto if (strcmp(luProps.providerName, "sbd") == 0) {
15718fe96085Stim szeto ret = deleteDiskLu(luGuid);
15728fe96085Stim szeto } else if (luProps.status == STMF_LOGICAL_UNIT_UNREGISTERED) {
15738fe96085Stim szeto return (STMF_ERROR_NOT_FOUND);
15748fe96085Stim szeto } else {
15758fe96085Stim szeto return (STMF_ERROR_INVALID_ARG);
15768fe96085Stim szeto }
15778fe96085Stim szeto }
15788fe96085Stim szeto
15798fe96085Stim szeto return (ret);
15808fe96085Stim szeto }
15818fe96085Stim szeto
15828fe96085Stim szeto static int
deleteDiskLu(stmfGuid * luGuid)15838fe96085Stim szeto deleteDiskLu(stmfGuid *luGuid)
15848fe96085Stim szeto {
15858fe96085Stim szeto int ret = STMF_STATUS_SUCCESS;
15868fe96085Stim szeto int fd;
15878fe96085Stim szeto int savedErrno;
15888fe96085Stim szeto int ioctlRet;
15898fe96085Stim szeto sbd_delete_lu_t deleteLu = {0};
15908fe96085Stim szeto
15918fe96085Stim szeto stmf_iocdata_t sbdIoctl = {0};
15928fe96085Stim szeto
15938fe96085Stim szeto /*
15948fe96085Stim szeto * Open control node for sbd
15958fe96085Stim szeto */
15968fe96085Stim szeto if ((ret = openSbd(OPEN_SBD, &fd)) != STMF_STATUS_SUCCESS)
15978fe96085Stim szeto return (ret);
15988fe96085Stim szeto
15998fe96085Stim szeto ret = removeGuidFromDiskStore(luGuid);
16008fe96085Stim szeto if (ret != STMF_STATUS_SUCCESS) {
16018fe96085Stim szeto goto done;
16028fe96085Stim szeto }
16038fe96085Stim szeto
16048fe96085Stim szeto bcopy(luGuid, deleteLu.dlu_guid, sizeof (deleteLu.dlu_guid));
16058fe96085Stim szeto deleteLu.dlu_by_guid = 1;
16068fe96085Stim szeto
16078fe96085Stim szeto sbdIoctl.stmf_version = STMF_VERSION_1;
16088fe96085Stim szeto sbdIoctl.stmf_ibuf_size = sizeof (deleteLu);
16098fe96085Stim szeto sbdIoctl.stmf_ibuf = (uint64_t)(unsigned long)&deleteLu;
16108fe96085Stim szeto ioctlRet = ioctl(fd, SBD_IOCTL_DELETE_LU, &sbdIoctl);
16118fe96085Stim szeto if (ioctlRet != 0) {
16128fe96085Stim szeto savedErrno = errno;
16138fe96085Stim szeto switch (savedErrno) {
16148fe96085Stim szeto case EBUSY:
16158fe96085Stim szeto ret = STMF_ERROR_BUSY;
16168fe96085Stim szeto break;
16178fe96085Stim szeto case EPERM:
16188fe96085Stim szeto case EACCES:
16198fe96085Stim szeto ret = STMF_ERROR_PERM;
16208fe96085Stim szeto break;
16218fe96085Stim szeto case ENOENT:
16228fe96085Stim szeto ret = STMF_ERROR_NOT_FOUND;
16238fe96085Stim szeto break;
16248fe96085Stim szeto default:
16258fe96085Stim szeto syslog(LOG_DEBUG,
16268fe96085Stim szeto "deleteDiskLu:ioctl error(%d) (%d) (%d)",
16278fe96085Stim szeto ioctlRet, sbdIoctl.stmf_error, savedErrno);
16288fe96085Stim szeto ret = STMF_STATUS_ERROR;
16298fe96085Stim szeto break;
16308fe96085Stim szeto }
16318fe96085Stim szeto }
16328fe96085Stim szeto
16338fe96085Stim szeto done:
16348fe96085Stim szeto (void) close(fd);
16358fe96085Stim szeto return (ret);
16368fe96085Stim szeto }
16378fe96085Stim szeto
16388fe96085Stim szeto /*
163945039663SJohn Forte * stmfLuStandby
164045039663SJohn Forte *
164145039663SJohn Forte * Purpose: Sets access state to standby
164245039663SJohn Forte *
164345039663SJohn Forte * luGuid - guid of registered logical unit
164445039663SJohn Forte *
164545039663SJohn Forte */
164645039663SJohn Forte int
stmfLuStandby(stmfGuid * luGuid)164745039663SJohn Forte stmfLuStandby(stmfGuid *luGuid)
164845039663SJohn Forte {
164945039663SJohn Forte int ret = STMF_STATUS_SUCCESS;
165045039663SJohn Forte stmfLogicalUnitProperties luProps;
165145039663SJohn Forte
165245039663SJohn Forte if (luGuid == NULL) {
165345039663SJohn Forte return (STMF_ERROR_INVALID_ARG);
165445039663SJohn Forte }
165545039663SJohn Forte
165645039663SJohn Forte /* Check logical unit provider name to call correct dtype function */
165745039663SJohn Forte if ((ret = stmfGetLogicalUnitProperties(luGuid, &luProps))
165845039663SJohn Forte != STMF_STATUS_SUCCESS) {
165945039663SJohn Forte return (ret);
166045039663SJohn Forte } else {
166145039663SJohn Forte if (strcmp(luProps.providerName, "sbd") == 0) {
166245039663SJohn Forte ret = setDiskStandby(luGuid);
166345039663SJohn Forte } else if (luProps.status == STMF_LOGICAL_UNIT_UNREGISTERED) {
166445039663SJohn Forte return (STMF_ERROR_NOT_FOUND);
166545039663SJohn Forte } else {
166645039663SJohn Forte return (STMF_ERROR_INVALID_ARG);
166745039663SJohn Forte }
166845039663SJohn Forte }
166945039663SJohn Forte
167045039663SJohn Forte return (ret);
167145039663SJohn Forte }
167245039663SJohn Forte
167345039663SJohn Forte static int
setDiskStandby(stmfGuid * luGuid)167445039663SJohn Forte setDiskStandby(stmfGuid *luGuid)
167545039663SJohn Forte {
167645039663SJohn Forte int ret = STMF_STATUS_SUCCESS;
167745039663SJohn Forte stmf_iocdata_t sbdIoctl = {0};
167845039663SJohn Forte sbd_set_lu_standby_t sbdLu = {0};
167945039663SJohn Forte int ioctlRet;
168045039663SJohn Forte int savedErrno;
168145039663SJohn Forte int fd = 0;
168245039663SJohn Forte
168345039663SJohn Forte /*
168445039663SJohn Forte * Open control node for sbd
168545039663SJohn Forte */
168645039663SJohn Forte if ((ret = openSbd(OPEN_SBD, &fd)) != STMF_STATUS_SUCCESS)
168745039663SJohn Forte return (ret);
168845039663SJohn Forte
168945039663SJohn Forte bcopy(luGuid, &sbdLu.stlu_guid, sizeof (stmfGuid));
169045039663SJohn Forte
169145039663SJohn Forte sbdIoctl.stmf_version = STMF_VERSION_1;
169245039663SJohn Forte sbdIoctl.stmf_ibuf_size = sizeof (sbd_set_lu_standby_t);
169345039663SJohn Forte sbdIoctl.stmf_ibuf = (uint64_t)(unsigned long)&sbdLu;
169445039663SJohn Forte
169545039663SJohn Forte ioctlRet = ioctl(fd, SBD_IOCTL_SET_LU_STANDBY, &sbdIoctl);
169645039663SJohn Forte if (ioctlRet != 0) {
169745039663SJohn Forte savedErrno = errno;
169845039663SJohn Forte switch (savedErrno) {
169945039663SJohn Forte case EBUSY:
170045039663SJohn Forte ret = STMF_ERROR_BUSY;
170145039663SJohn Forte break;
170245039663SJohn Forte case EPERM:
170345039663SJohn Forte case EACCES:
170445039663SJohn Forte ret = STMF_ERROR_PERM;
170545039663SJohn Forte break;
170645039663SJohn Forte default:
170745039663SJohn Forte diskError(sbdIoctl.stmf_error, &ret);
170845039663SJohn Forte if (ret == STMF_STATUS_ERROR) {
170945039663SJohn Forte syslog(LOG_DEBUG,
171045039663SJohn Forte "setDiskStandby:ioctl "
171145039663SJohn Forte "error(%d) (%d) (%d)", ioctlRet,
171245039663SJohn Forte sbdIoctl.stmf_error, savedErrno);
171345039663SJohn Forte }
171445039663SJohn Forte break;
171545039663SJohn Forte }
171645039663SJohn Forte }
17175b0f0869SJohn Forte (void) close(fd);
171845039663SJohn Forte return (ret);
171945039663SJohn Forte }
172045039663SJohn Forte
172145039663SJohn Forte /*
17228fe96085Stim szeto * stmfModifyLu
17238fe96085Stim szeto *
17248fe96085Stim szeto * Purpose: Modify properties of a logical unit
17258fe96085Stim szeto *
17268fe96085Stim szeto * luGuid - guid of registered logical unit
17278fe96085Stim szeto * prop - property to modify
17288fe96085Stim szeto * propVal - property value to set
17298fe96085Stim szeto *
17308fe96085Stim szeto */
17318fe96085Stim szeto int
stmfModifyLu(stmfGuid * luGuid,uint32_t prop,const char * propVal)17328fe96085Stim szeto stmfModifyLu(stmfGuid *luGuid, uint32_t prop, const char *propVal)
17338fe96085Stim szeto {
17348fe96085Stim szeto int ret = STMF_STATUS_SUCCESS;
17358fe96085Stim szeto stmfLogicalUnitProperties luProps;
17368fe96085Stim szeto
17378fe96085Stim szeto if (luGuid == NULL) {
17388fe96085Stim szeto return (STMF_ERROR_INVALID_ARG);
17398fe96085Stim szeto }
17408fe96085Stim szeto
17418fe96085Stim szeto /* Check logical unit provider name to call correct dtype function */
17428fe96085Stim szeto if ((ret = stmfGetLogicalUnitProperties(luGuid, &luProps))
17438fe96085Stim szeto != STMF_STATUS_SUCCESS) {
17448fe96085Stim szeto return (ret);
17458fe96085Stim szeto } else {
17468fe96085Stim szeto if (strcmp(luProps.providerName, "sbd") == 0) {
17478fe96085Stim szeto ret = modifyDiskLuProp(luGuid, NULL, prop, propVal);
17488fe96085Stim szeto } else if (luProps.status == STMF_LOGICAL_UNIT_UNREGISTERED) {
17498fe96085Stim szeto return (STMF_ERROR_NOT_FOUND);
17508fe96085Stim szeto } else {
17518fe96085Stim szeto return (STMF_ERROR_INVALID_ARG);
17528fe96085Stim szeto }
17538fe96085Stim szeto }
17548fe96085Stim szeto
17558fe96085Stim szeto return (ret);
17568fe96085Stim szeto }
17578fe96085Stim szeto
17588fe96085Stim szeto /*
17598fe96085Stim szeto * stmfModifyLuByFname
17608fe96085Stim szeto *
17618fe96085Stim szeto * Purpose: Modify a device by filename. Device does not need to be registered.
17628fe96085Stim szeto *
17638fe96085Stim szeto * dType - type of device to modify
17648fe96085Stim szeto * STMF_DISK
17658fe96085Stim szeto *
17668fe96085Stim szeto * fname - filename or meta filename
17678fe96085Stim szeto * prop - valid property identifier
17688fe96085Stim szeto * propVal - property value
17698fe96085Stim szeto *
17708fe96085Stim szeto */
17718fe96085Stim szeto int
stmfModifyLuByFname(uint16_t dType,const char * fname,uint32_t prop,const char * propVal)17728fe96085Stim szeto stmfModifyLuByFname(uint16_t dType, const char *fname, uint32_t prop,
17738fe96085Stim szeto const char *propVal)
17748fe96085Stim szeto {
17758fe96085Stim szeto int ret = STMF_STATUS_SUCCESS;
17768fe96085Stim szeto if (fname == NULL) {
17778fe96085Stim szeto return (STMF_ERROR_INVALID_ARG);
17788fe96085Stim szeto }
17798fe96085Stim szeto
17808fe96085Stim szeto if (dType == STMF_DISK) {
17818fe96085Stim szeto ret = modifyDiskLuProp(NULL, fname, prop, propVal);
17828fe96085Stim szeto } else {
17838fe96085Stim szeto return (STMF_ERROR_INVALID_ARG);
17848fe96085Stim szeto }
17858fe96085Stim szeto
17868fe96085Stim szeto return (ret);
17878fe96085Stim szeto }
17888fe96085Stim szeto
17898fe96085Stim szeto static int
modifyDiskLuProp(stmfGuid * luGuid,const char * fname,uint32_t prop,const char * propVal)17908fe96085Stim szeto modifyDiskLuProp(stmfGuid *luGuid, const char *fname, uint32_t prop,
17918fe96085Stim szeto const char *propVal)
17928fe96085Stim szeto {
17938fe96085Stim szeto int ret = STMF_STATUS_SUCCESS;
17948fe96085Stim szeto luResource hdl = NULL;
17958fe96085Stim szeto luResourceImpl *luPropsHdl;
17968fe96085Stim szeto
17978fe96085Stim szeto ret = stmfCreateLuResource(STMF_DISK, &hdl);
17988fe96085Stim szeto if (ret != STMF_STATUS_SUCCESS) {
17998fe96085Stim szeto return (ret);
18008fe96085Stim szeto }
18018fe96085Stim szeto ret = validateModifyDiskProp(prop);
18028fe96085Stim szeto if (ret != STMF_STATUS_SUCCESS) {
18038fe96085Stim szeto (void) stmfFreeLuResource(hdl);
18048fe96085Stim szeto return (STMF_ERROR_INVALID_PROP);
18058fe96085Stim szeto }
18068fe96085Stim szeto ret = stmfSetLuProp(hdl, prop, propVal);
18078fe96085Stim szeto if (ret != STMF_STATUS_SUCCESS) {
18088fe96085Stim szeto (void) stmfFreeLuResource(hdl);
18098fe96085Stim szeto return (ret);
18108fe96085Stim szeto }
18118fe96085Stim szeto luPropsHdl = hdl;
18128fe96085Stim szeto ret = modifyDiskLu((diskResource *)luPropsHdl->resource, luGuid, fname);
18138fe96085Stim szeto (void) stmfFreeLuResource(hdl);
18148fe96085Stim szeto return (ret);
18158fe96085Stim szeto }
18168fe96085Stim szeto
18178fe96085Stim szeto static int
validateModifyDiskProp(uint32_t prop)18188fe96085Stim szeto validateModifyDiskProp(uint32_t prop)
18198fe96085Stim szeto {
18208fe96085Stim szeto switch (prop) {
18218fe96085Stim szeto case STMF_LU_PROP_ALIAS:
18228fe96085Stim szeto case STMF_LU_PROP_SIZE:
18232f624233SNattuvetty Bhavyan case STMF_LU_PROP_MGMT_URL:
18248fe96085Stim szeto case STMF_LU_PROP_WRITE_PROTECT:
18258fe96085Stim szeto case STMF_LU_PROP_WRITE_CACHE_DISABLE:
18268fe96085Stim szeto return (STMF_STATUS_SUCCESS);
18278fe96085Stim szeto default:
18288fe96085Stim szeto return (STMF_STATUS_ERROR);
18298fe96085Stim szeto }
18308fe96085Stim szeto }
18318fe96085Stim szeto
18328fe96085Stim szeto static int
modifyDiskLu(diskResource * disk,stmfGuid * luGuid,const char * fname)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
removeGuidFromDiskStore(stmfGuid * guid)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
addGuidToDiskStore(stmfGuid * guid,char * filename)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
persistDiskGuid(stmfGuid * guid,char * filename,boolean_t persist)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
stmfGetLuProp(luResource hdl,uint32_t prop,char * propVal,size_t * propLen)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
stmfGetLuResource(stmfGuid * luGuid,luResource * hdl)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
getDiskAllProps(stmfGuid * luGuid,luResource * hdl)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
loadDiskPropsFromDriver(luResourceImpl * hdl,sbd_lu_props_t * sbdProps)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
stmfGetGlobalLuProp(uint16_t dType,uint32_t prop,char * propVal,size_t * propLen)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
getDiskGlobalProp(uint32_t prop,char * propVal,size_t * propLen)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
stmfSetGlobalLuProp(uint16_t dType,uint32_t prop,const char * propVal)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
setDiskGlobalProp(uint32_t resourceProp,const char * propVal)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 }
25487beff157SJohn Forte
25497beff157SJohn Forte /*
25507beff157SJohn Forte * Open control node for sbd
25517beff157SJohn Forte */
25527beff157SJohn Forte if ((ret = openSbd(OPEN_SBD, &fd)) != STMF_STATUS_SUCCESS)
25537beff157SJohn Forte return (ret);
25547beff157SJohn Forte
25557beff157SJohn Forte propLen = strlen(propVal);
25567beff157SJohn Forte mluBufSize += propLen + 1;
25577beff157SJohn Forte sbdGlobalPropsSize += sizeof (sbd_global_props_t) - 8 +
25587beff157SJohn Forte max(8, mluBufSize);
25597beff157SJohn Forte /*
25607beff157SJohn Forte * 8 is the size of the buffer set aside for
25617beff157SJohn Forte * concatenation of variable length fields
25627beff157SJohn Forte */
25637beff157SJohn Forte sbdGlobalProps = (sbd_global_props_t *)calloc(1, sbdGlobalPropsSize);
25647beff157SJohn Forte if (sbdGlobalProps == NULL) {
25657beff157SJohn Forte (void) close(fd);
25667beff157SJohn Forte return (STMF_ERROR_NOMEM);
25677beff157SJohn Forte }
25687beff157SJohn Forte
25697beff157SJohn Forte sbdGlobalProps->mlu_struct_size = sbdGlobalPropsSize;
25707beff157SJohn Forte
25717beff157SJohn Forte switch (resourceProp) {
25727beff157SJohn Forte case STMF_LU_PROP_MGMT_URL:
25737beff157SJohn Forte sbdGlobalProps->mlu_mgmt_url_valid = 1;
25747beff157SJohn Forte bcopy(propVal, &(sbdGlobalProps->mlu_buf),
25757beff157SJohn Forte propLen + 1);
25767beff157SJohn Forte break;
25777beff157SJohn Forte default:
25787beff157SJohn Forte ret = STMF_ERROR_NO_PROP;
25797beff157SJohn Forte goto done;
25807beff157SJohn Forte }
25817beff157SJohn Forte
25827beff157SJohn Forte sbdIoctl.stmf_version = STMF_VERSION_1;
25837beff157SJohn Forte sbdIoctl.stmf_ibuf_size = sbdGlobalProps->mlu_struct_size;
25847beff157SJohn Forte sbdIoctl.stmf_ibuf = (uint64_t)(unsigned long)sbdGlobalProps;
25857beff157SJohn Forte
25867beff157SJohn Forte ioctlRet = ioctl(fd, SBD_IOCTL_SET_GLOBAL_LU, &sbdIoctl);
25877beff157SJohn Forte if (ioctlRet != 0) {
25887beff157SJohn Forte savedErrno = errno;
25897beff157SJohn Forte switch (savedErrno) {
25907beff157SJohn Forte case EBUSY:
25917beff157SJohn Forte ret = STMF_ERROR_BUSY;
25927beff157SJohn Forte break;
25937beff157SJohn Forte case EPERM:
25947beff157SJohn Forte case EACCES:
25957beff157SJohn Forte ret = STMF_ERROR_PERM;
25967beff157SJohn Forte break;
25977beff157SJohn Forte default:
25987beff157SJohn Forte diskError(sbdIoctl.stmf_error, &ret);
25997beff157SJohn Forte if (ret == STMF_STATUS_ERROR) {
26007beff157SJohn Forte syslog(LOG_DEBUG,
26017beff157SJohn Forte "modifyDiskLu:ioctl "
26027beff157SJohn Forte "error(%d) (%d) (%d)", ioctlRet,
26037beff157SJohn Forte sbdIoctl.stmf_error, savedErrno);
26047beff157SJohn Forte }
26057beff157SJohn Forte break;
26067beff157SJohn Forte }
26077beff157SJohn Forte }
26087beff157SJohn Forte
26097beff157SJohn Forte done:
26107beff157SJohn Forte free(sbdGlobalProps);
26117beff157SJohn Forte (void) close(fd);
26127beff157SJohn Forte return (ret);
26137beff157SJohn Forte }
26147beff157SJohn Forte
26158fe96085Stim szeto
26168fe96085Stim szeto /*
26178fe96085Stim szeto * stmfSetLuProp
26188fe96085Stim szeto *
26198fe96085Stim szeto * Purpose: set a property on an luResource
26208fe96085Stim szeto *
26218fe96085Stim szeto * hdl - allocated luResource
26228fe96085Stim szeto * prop - property identifier
26238fe96085Stim szeto * propVal - property value to be set
26248fe96085Stim szeto */
26258fe96085Stim szeto int
stmfSetLuProp(luResource hdl,uint32_t prop,const char * propVal)26268fe96085Stim szeto stmfSetLuProp(luResource hdl, uint32_t prop, const char *propVal)
26278fe96085Stim szeto {
26288fe96085Stim szeto int ret = STMF_STATUS_SUCCESS;
26298fe96085Stim szeto luResourceImpl *luPropsHdl = hdl;
26308fe96085Stim szeto if (hdl == NULL) {
26318fe96085Stim szeto return (STMF_ERROR_INVALID_ARG);
26328fe96085Stim szeto }
26338fe96085Stim szeto
26348fe96085Stim szeto if (luPropsHdl->type == STMF_DISK) {
26358fe96085Stim szeto ret = setDiskProp(luPropsHdl, prop, propVal);
26368fe96085Stim szeto } else {
26378fe96085Stim szeto return (STMF_ERROR_INVALID_ARG);
26388fe96085Stim szeto }
26398fe96085Stim szeto
26408fe96085Stim szeto return (ret);
26418fe96085Stim szeto }
26428fe96085Stim szeto
26438fe96085Stim szeto /*
26448fe96085Stim szeto * getDiskProp
26458fe96085Stim szeto *
26468fe96085Stim szeto * Purpose: retrieve a given property from a logical unit resource of type disk
26478fe96085Stim szeto *
26488fe96085Stim szeto * hdl - allocated luResourceImpl
26498fe96085Stim szeto * prop - property identifier
26508fe96085Stim szeto * propVal - pointer to character to contain the retrieved property value
26518fe96085Stim szeto * propLen - On input this is the length of propVal. On failure, it contains the
26528fe96085Stim szeto * number of bytes required for propVal
26538fe96085Stim szeto */
26548fe96085Stim szeto static int
getDiskProp(luResourceImpl * hdl,uint32_t prop,char * propVal,size_t * propLen)26558fe96085Stim szeto getDiskProp(luResourceImpl *hdl, uint32_t prop, char *propVal, size_t *propLen)
26568fe96085Stim szeto {
26578fe96085Stim szeto int ret = STMF_STATUS_SUCCESS;
26588fe96085Stim szeto diskResource *diskLu = hdl->resource;
265945039663SJohn Forte char accessState[20];
26608fe96085Stim szeto size_t reqLen;
26618fe96085Stim szeto
266245039663SJohn Forte if (prop == STMF_LU_PROP_ACCESS_STATE) {
266345039663SJohn Forte if (diskLu->accessState == SBD_LU_ACTIVE) {
266445039663SJohn Forte (void) strlcpy(accessState, STMF_ACCESS_ACTIVE,
266545039663SJohn Forte sizeof (accessState));
266645039663SJohn Forte } else if (diskLu->accessState == SBD_LU_TRANSITION_TO_ACTIVE) {
266745039663SJohn Forte (void) strlcpy(accessState,
266845039663SJohn Forte STMF_ACCESS_STANDBY_TO_ACTIVE,
266945039663SJohn Forte sizeof (accessState));
267045039663SJohn Forte } else if (diskLu->accessState == SBD_LU_STANDBY) {
267145039663SJohn Forte (void) strlcpy(accessState, STMF_ACCESS_STANDBY,
267245039663SJohn Forte sizeof (accessState));
267345039663SJohn Forte } else if (diskLu->accessState ==
267445039663SJohn Forte SBD_LU_TRANSITION_TO_STANDBY) {
267545039663SJohn Forte (void) strlcpy(accessState,
267645039663SJohn Forte STMF_ACCESS_ACTIVE_TO_STANDBY,
267745039663SJohn Forte sizeof (accessState));
267845039663SJohn Forte }
267945039663SJohn Forte if ((reqLen = strlcpy(propVal, accessState,
268045039663SJohn Forte *propLen)) >= *propLen) {
268145039663SJohn Forte *propLen = reqLen + 1;
268245039663SJohn Forte return (STMF_ERROR_INVALID_ARG);
268345039663SJohn Forte }
268445039663SJohn Forte return (0);
268545039663SJohn Forte }
268645039663SJohn Forte
268745039663SJohn Forte if (diskLu->accessState != SBD_LU_ACTIVE) {
268845039663SJohn Forte return (STMF_ERROR_NO_PROP_STANDBY);
268945039663SJohn Forte }
269045039663SJohn Forte
26918fe96085Stim szeto switch (prop) {
26928fe96085Stim szeto case STMF_LU_PROP_BLOCK_SIZE:
26938fe96085Stim szeto if (diskLu->blkSizeValid == B_FALSE) {
26948fe96085Stim szeto return (STMF_ERROR_NO_PROP);
26958fe96085Stim szeto }
26968fe96085Stim szeto reqLen = snprintf(propVal, *propLen, "%llu",
26978fe96085Stim szeto (u_longlong_t)diskLu->blkSize);
26988fe96085Stim szeto if (reqLen >= *propLen) {
26998fe96085Stim szeto *propLen = reqLen + 1;
27008fe96085Stim szeto return (STMF_ERROR_INVALID_ARG);
27018fe96085Stim szeto }
27028fe96085Stim szeto break;
27038fe96085Stim szeto case STMF_LU_PROP_FILENAME:
27048fe96085Stim szeto if (diskLu->luDataFileNameValid == B_FALSE) {
27058fe96085Stim szeto return (STMF_ERROR_NO_PROP);
27068fe96085Stim szeto }
27078fe96085Stim szeto if ((reqLen = strlcpy(propVal, diskLu->luDataFileName,
27088fe96085Stim szeto *propLen)) >= *propLen) {
27098fe96085Stim szeto *propLen = reqLen + 1;
27108fe96085Stim szeto return (STMF_ERROR_INVALID_ARG);
27118fe96085Stim szeto }
27128fe96085Stim szeto break;
27138fe96085Stim szeto case STMF_LU_PROP_META_FILENAME:
27148fe96085Stim szeto if (diskLu->luMetaFileNameValid == B_FALSE) {
27158fe96085Stim szeto return (STMF_ERROR_NO_PROP);
27168fe96085Stim szeto }
27178fe96085Stim szeto if ((reqLen = strlcpy(propVal, diskLu->luMetaFileName,
27188fe96085Stim szeto *propLen)) >= *propLen) {
27198fe96085Stim szeto *propLen = reqLen + 1;
27208fe96085Stim szeto return (STMF_ERROR_INVALID_ARG);
27218fe96085Stim szeto }
27228fe96085Stim szeto break;
27232f624233SNattuvetty Bhavyan case STMF_LU_PROP_MGMT_URL:
27242f624233SNattuvetty Bhavyan if (diskLu->luMgmtUrlValid == B_FALSE) {
27252f624233SNattuvetty Bhavyan return (STMF_ERROR_NO_PROP);
27262f624233SNattuvetty Bhavyan }
27272f624233SNattuvetty Bhavyan if ((reqLen = strlcpy(propVal, diskLu->luMgmtUrl,
27282f624233SNattuvetty Bhavyan *propLen)) >= *propLen) {
27292f624233SNattuvetty Bhavyan *propLen = reqLen + 1;
27302f624233SNattuvetty Bhavyan return (STMF_ERROR_INVALID_ARG);
27312f624233SNattuvetty Bhavyan }
27322f624233SNattuvetty Bhavyan break;
27338fe96085Stim szeto case STMF_LU_PROP_GUID:
27348fe96085Stim szeto if (diskLu->luGuidValid == B_FALSE) {
27358fe96085Stim szeto return (STMF_ERROR_NO_PROP);
27368fe96085Stim szeto }
27378fe96085Stim szeto reqLen = snprintf(propVal, *propLen,
27388fe96085Stim szeto "%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X"
27398fe96085Stim szeto "%02X%02X%02X%02X",
27408fe96085Stim szeto diskLu->luGuid[0], diskLu->luGuid[1],
27418fe96085Stim szeto diskLu->luGuid[2], diskLu->luGuid[3],
27428fe96085Stim szeto diskLu->luGuid[4], diskLu->luGuid[5],
27438fe96085Stim szeto diskLu->luGuid[6], diskLu->luGuid[7],
27448fe96085Stim szeto diskLu->luGuid[8], diskLu->luGuid[9],
27458fe96085Stim szeto diskLu->luGuid[10], diskLu->luGuid[11],
27468fe96085Stim szeto diskLu->luGuid[12], diskLu->luGuid[13],
27478fe96085Stim szeto diskLu->luGuid[14], diskLu->luGuid[15]);
27488fe96085Stim szeto if (reqLen >= *propLen) {
27498fe96085Stim szeto *propLen = reqLen + 1;
27508fe96085Stim szeto return (STMF_ERROR_INVALID_ARG);
27518fe96085Stim szeto }
27528fe96085Stim szeto break;
27538fe96085Stim szeto case STMF_LU_PROP_SERIAL_NUM:
27548fe96085Stim szeto if (diskLu->serialNumValid == B_FALSE) {
27558fe96085Stim szeto return (STMF_ERROR_NO_PROP);
27568fe96085Stim szeto }
27578fe96085Stim szeto if ((reqLen = strlcpy(propVal, diskLu->serialNum,
27588fe96085Stim szeto *propLen)) >= *propLen) {
27598fe96085Stim szeto *propLen = reqLen + 1;
27608fe96085Stim szeto return (STMF_ERROR_INVALID_ARG);
27618fe96085Stim szeto }
27628fe96085Stim szeto break;
27638fe96085Stim szeto case STMF_LU_PROP_SIZE:
27648fe96085Stim szeto if (diskLu->luSizeValid == B_FALSE) {
27658fe96085Stim szeto return (STMF_ERROR_NO_PROP);
27668fe96085Stim szeto }
27678fe96085Stim szeto (void) snprintf(propVal, *propLen, "%llu",
27688fe96085Stim szeto (u_longlong_t)diskLu->luSize);
27698fe96085Stim szeto break;
27708fe96085Stim szeto case STMF_LU_PROP_ALIAS:
27718fe96085Stim szeto if (diskLu->luAliasValid == B_FALSE) {
27728fe96085Stim szeto return (STMF_ERROR_NO_PROP);
27738fe96085Stim szeto }
27748fe96085Stim szeto if ((reqLen = strlcpy(propVal, diskLu->luAlias,
27758fe96085Stim szeto *propLen)) >= *propLen) {
27768fe96085Stim szeto *propLen = reqLen + 1;
27778fe96085Stim szeto return (STMF_ERROR_INVALID_ARG);
27788fe96085Stim szeto }
27798fe96085Stim szeto break;
27808fe96085Stim szeto case STMF_LU_PROP_VID:
27818fe96085Stim szeto if (diskLu->vidValid == B_FALSE) {
27828fe96085Stim szeto return (STMF_ERROR_NO_PROP);
27838fe96085Stim szeto }
27848fe96085Stim szeto if (*propLen <= sizeof (diskLu->vid)) {
27858fe96085Stim szeto return (STMF_ERROR_INVALID_ARG);
27868fe96085Stim szeto }
27878fe96085Stim szeto bcopy(diskLu->vid, propVal, sizeof (diskLu->vid));
27888fe96085Stim szeto propVal[sizeof (diskLu->vid)] = 0;
27898fe96085Stim szeto break;
27908fe96085Stim szeto case STMF_LU_PROP_PID:
27918fe96085Stim szeto if (diskLu->pidValid == B_FALSE) {
27928fe96085Stim szeto return (STMF_ERROR_NO_PROP);
27938fe96085Stim szeto }
27948fe96085Stim szeto if (*propLen <= sizeof (diskLu->pid)) {
27958fe96085Stim szeto return (STMF_ERROR_INVALID_ARG);
27968fe96085Stim szeto }
27978fe96085Stim szeto bcopy(diskLu->pid, propVal, sizeof (diskLu->pid));
27988fe96085Stim szeto propVal[sizeof (diskLu->pid)] = 0;
27998fe96085Stim szeto break;
28008fe96085Stim szeto case STMF_LU_PROP_WRITE_PROTECT:
28018fe96085Stim szeto if (diskLu->writeProtectEnableValid == B_FALSE) {
28028fe96085Stim szeto return (STMF_ERROR_NO_PROP);
28038fe96085Stim szeto }
28048fe96085Stim szeto if (diskLu->writeProtectEnable) {
28058fe96085Stim szeto if ((reqLen = strlcpy(propVal, "true",
28068fe96085Stim szeto *propLen)) >= *propLen) {
28078fe96085Stim szeto *propLen = reqLen + 1;
28088fe96085Stim szeto return (STMF_ERROR_INVALID_ARG);
28098fe96085Stim szeto }
28108fe96085Stim szeto } else {
28118fe96085Stim szeto if ((reqLen = strlcpy(propVal, "false",
28128fe96085Stim szeto *propLen)) >= *propLen) {
28138fe96085Stim szeto *propLen = reqLen + 1;
28148fe96085Stim szeto return (STMF_ERROR_INVALID_ARG);
28158fe96085Stim szeto }
28168fe96085Stim szeto }
28178fe96085Stim szeto break;
28188fe96085Stim szeto case STMF_LU_PROP_WRITE_CACHE_DISABLE:
28198fe96085Stim szeto if (diskLu->writebackCacheDisableValid == B_FALSE) {
28208fe96085Stim szeto return (STMF_ERROR_NO_PROP);
28218fe96085Stim szeto }
28228fe96085Stim szeto if (diskLu->writebackCacheDisable) {
28238fe96085Stim szeto if ((reqLen = strlcpy(propVal, "true",
28248fe96085Stim szeto *propLen)) >= *propLen) {
28258fe96085Stim szeto *propLen = reqLen + 1;
28268fe96085Stim szeto return (STMF_ERROR_INVALID_ARG);
28278fe96085Stim szeto }
28288fe96085Stim szeto } else {
28298fe96085Stim szeto if ((reqLen = strlcpy(propVal, "false",
28308fe96085Stim szeto *propLen)) >= *propLen) {
28318fe96085Stim szeto *propLen = reqLen + 1;
28328fe96085Stim szeto return (STMF_ERROR_INVALID_ARG);
28338fe96085Stim szeto }
28348fe96085Stim szeto }
28358fe96085Stim szeto break;
28368fe96085Stim szeto default:
28377b506e25Ssrivijitha dugganapalli ret = STMF_ERROR_INVALID_PROP;
28388fe96085Stim szeto break;
28398fe96085Stim szeto }
28408fe96085Stim szeto
28418fe96085Stim szeto return (ret);
28428fe96085Stim szeto }
28438fe96085Stim szeto
28448fe96085Stim szeto /*
28458fe96085Stim szeto * setDiskProp
28468fe96085Stim szeto *
28478fe96085Stim szeto * Purpose: set properties for resource of type disk
28488fe96085Stim szeto *
28498fe96085Stim szeto * hdl - allocated luResourceImpl
28508fe96085Stim szeto * resourceProp - valid resource identifier
28518fe96085Stim szeto * propVal - valid resource value
28528fe96085Stim szeto */
28538fe96085Stim szeto static int
setDiskProp(luResourceImpl * hdl,uint32_t resourceProp,const char * propVal)28548fe96085Stim szeto setDiskProp(luResourceImpl *hdl, uint32_t resourceProp, const char *propVal)
28558fe96085Stim szeto {
28568fe96085Stim szeto int ret = STMF_STATUS_SUCCESS;
28578fe96085Stim szeto int i;
28588fe96085Stim szeto diskResource *diskLu = hdl->resource;
28598fe96085Stim szeto unsigned long long numericProp = 0;
28608fe96085Stim szeto char guidProp[LU_ASCII_GUID_SIZE + 1];
28618fe96085Stim szeto char ouiProp[OUI_ASCII_SIZE + 1];
2862fdcc480aSJohn Forte char hostIdProp[HOST_ID_ASCII_SIZE + 1];
28638fe96085Stim szeto unsigned int oui[OUI_SIZE];
2864fdcc480aSJohn Forte unsigned int hostId[HOST_ID_SIZE];
28658fe96085Stim szeto unsigned int guid[LU_GUID_SIZE];
28668fe96085Stim szeto int propSize;
28678fe96085Stim szeto
28688fe96085Stim szeto
28698fe96085Stim szeto if (propVal == NULL) {
28708fe96085Stim szeto return (STMF_ERROR_INVALID_ARG);
28718fe96085Stim szeto }
28728fe96085Stim szeto
28738fe96085Stim szeto switch (resourceProp) {
28748fe96085Stim szeto case STMF_LU_PROP_ALIAS:
28758fe96085Stim szeto if (strlcpy(diskLu->luAlias, propVal,
28768fe96085Stim szeto sizeof (diskLu->luAlias)) >=
28778fe96085Stim szeto sizeof (diskLu->luAlias)) {
28788fe96085Stim szeto return (STMF_ERROR_INVALID_PROPSIZE);
28798fe96085Stim szeto }
28808fe96085Stim szeto diskLu->luAliasValid = B_TRUE;
28818fe96085Stim szeto break;
288226717e15Ssrivijitha dugganapalli case STMF_LU_PROP_BLOCK_SIZE: {
288326717e15Ssrivijitha dugganapalli const char *tmp = propVal;
288426717e15Ssrivijitha dugganapalli while (*tmp) {
288526717e15Ssrivijitha dugganapalli if (!isdigit(*tmp++)) {
288626717e15Ssrivijitha dugganapalli return (STMF_ERROR_INVALID_ARG);
288726717e15Ssrivijitha dugganapalli }
288826717e15Ssrivijitha dugganapalli }
28898fe96085Stim szeto (void) sscanf(propVal, "%llu", &numericProp);
28908fe96085Stim szeto if (numericProp > UINT16_MAX) {
28918fe96085Stim szeto return (STMF_ERROR_INVALID_PROPSIZE);
28928fe96085Stim szeto }
28938fe96085Stim szeto diskLu->blkSize = numericProp;
28948fe96085Stim szeto diskLu->blkSizeValid = B_TRUE;
28958fe96085Stim szeto break;
289626717e15Ssrivijitha dugganapalli }
28978fe96085Stim szeto case STMF_LU_PROP_COMPANY_ID:
28988fe96085Stim szeto if ((strlcpy(ouiProp, propVal, sizeof (ouiProp))) >=
28998fe96085Stim szeto sizeof (ouiProp)) {
29008fe96085Stim szeto return (STMF_ERROR_INVALID_ARG);
29018fe96085Stim szeto }
29028fe96085Stim szeto if (checkHexUpper(ouiProp) != 0) {
29038fe96085Stim szeto return (STMF_ERROR_INVALID_ARG);
29048fe96085Stim szeto }
29058fe96085Stim szeto (void) sscanf(ouiProp, "%2X%2X%2X",
29068fe96085Stim szeto &oui[0], &oui[1], &oui[2]);
29078fe96085Stim szeto
29088fe96085Stim szeto diskLu->companyId = 0;
29098fe96085Stim szeto diskLu->companyId += oui[0] << 16;
29108fe96085Stim szeto diskLu->companyId += oui[1] << 8;
29118fe96085Stim szeto diskLu->companyId += oui[2];
2912fdcc480aSJohn Forte if (diskLu->companyId == 0) {
2913fdcc480aSJohn Forte return (STMF_ERROR_INVALID_ARG);
2914fdcc480aSJohn Forte }
29158fe96085Stim szeto diskLu->companyIdValid = B_TRUE;
29168fe96085Stim szeto break;
2917fdcc480aSJohn Forte case STMF_LU_PROP_HOST_ID:
2918fdcc480aSJohn Forte if ((strlcpy(hostIdProp, propVal,
2919fdcc480aSJohn Forte sizeof (hostIdProp))) >= sizeof (hostIdProp)) {
2920fdcc480aSJohn Forte return (STMF_ERROR_INVALID_ARG);
2921fdcc480aSJohn Forte }
2922fdcc480aSJohn Forte if (checkHexUpper(hostIdProp) != 0) {
2923fdcc480aSJohn Forte return (STMF_ERROR_INVALID_ARG);
2924fdcc480aSJohn Forte }
2925fdcc480aSJohn Forte (void) sscanf(hostIdProp, "%2X%2X%2X%2X",
2926fdcc480aSJohn Forte &hostId[0], &hostId[1], &hostId[2], &hostId[3]);
2927fdcc480aSJohn Forte
2928fdcc480aSJohn Forte diskLu->hostId = 0;
2929fdcc480aSJohn Forte diskLu->hostId += hostId[0] << 24;
2930fdcc480aSJohn Forte diskLu->hostId += hostId[1] << 16;
2931fdcc480aSJohn Forte diskLu->hostId += hostId[2] << 8;
2932fdcc480aSJohn Forte diskLu->hostId += hostId[3];
2933fdcc480aSJohn Forte if (diskLu->hostId == 0) {
2934fdcc480aSJohn Forte return (STMF_ERROR_INVALID_ARG);
2935fdcc480aSJohn Forte }
2936fdcc480aSJohn Forte diskLu->hostIdValid = B_TRUE;
2937fdcc480aSJohn Forte break;
29388fe96085Stim szeto case STMF_LU_PROP_GUID:
29398fe96085Stim szeto if (strlen(propVal) != LU_ASCII_GUID_SIZE) {
29408fe96085Stim szeto return (STMF_ERROR_INVALID_PROPSIZE);
29418fe96085Stim szeto }
29428fe96085Stim szeto
29438fe96085Stim szeto if ((strlcpy(guidProp, propVal, sizeof (guidProp))) >=
29448fe96085Stim szeto sizeof (guidProp)) {
29458fe96085Stim szeto return (STMF_ERROR_INVALID_ARG);
29468fe96085Stim szeto }
29478fe96085Stim szeto
29488fe96085Stim szeto if (checkHexUpper(guidProp) != 0) {
29498fe96085Stim szeto return (STMF_ERROR_INVALID_ARG);
29508fe96085Stim szeto }
29518fe96085Stim szeto
29528fe96085Stim szeto (void) sscanf(guidProp,
29538fe96085Stim szeto "%2X%2X%2X%2X%2X%2X%2X%2X%2X%2X%2X%2X%2X%2X%2X%2X",
29548fe96085Stim szeto &guid[0], &guid[1], &guid[2], &guid[3], &guid[4],
29558fe96085Stim szeto &guid[5], &guid[6], &guid[7], &guid[8], &guid[9],
29568fe96085Stim szeto &guid[10], &guid[11], &guid[12], &guid[13],
29578fe96085Stim szeto &guid[14], &guid[15]);
29588fe96085Stim szeto for (i = 0; i < sizeof (diskLu->luGuid); i++) {
29598fe96085Stim szeto diskLu->luGuid[i] = guid[i];
29608fe96085Stim szeto }
29618fe96085Stim szeto diskLu->luGuidValid = B_TRUE;
29628fe96085Stim szeto break;
29638fe96085Stim szeto case STMF_LU_PROP_FILENAME:
29648fe96085Stim szeto if ((strlcpy(diskLu->luDataFileName, propVal,
29658fe96085Stim szeto sizeof (diskLu->luDataFileName))) >=
29668fe96085Stim szeto sizeof (diskLu->luDataFileName)) {
29678fe96085Stim szeto return (STMF_ERROR_INVALID_PROPSIZE);
29688fe96085Stim szeto }
29698fe96085Stim szeto diskLu->luDataFileNameValid = B_TRUE;
29708fe96085Stim szeto break;
29718fe96085Stim szeto case STMF_LU_PROP_META_FILENAME:
29728fe96085Stim szeto if ((strlcpy(diskLu->luMetaFileName, propVal,
29738fe96085Stim szeto sizeof (diskLu->luMetaFileName))) >=
29748fe96085Stim szeto sizeof (diskLu->luMetaFileName)) {
29758fe96085Stim szeto return (STMF_ERROR_INVALID_PROPSIZE);
29768fe96085Stim szeto }
29778fe96085Stim szeto diskLu->luMetaFileNameValid = B_TRUE;
29788fe96085Stim szeto break;
29792f624233SNattuvetty Bhavyan case STMF_LU_PROP_MGMT_URL:
29802f624233SNattuvetty Bhavyan if ((strlcpy(diskLu->luMgmtUrl, propVal,
29812f624233SNattuvetty Bhavyan sizeof (diskLu->luMgmtUrl))) >=
29822f624233SNattuvetty Bhavyan sizeof (diskLu->luMgmtUrl)) {
29832f624233SNattuvetty Bhavyan return (STMF_ERROR_INVALID_PROPSIZE);
29842f624233SNattuvetty Bhavyan }
29852f624233SNattuvetty Bhavyan diskLu->luMgmtUrlValid = B_TRUE;
29862f624233SNattuvetty Bhavyan break;
29878fe96085Stim szeto case STMF_LU_PROP_PID:
29888fe96085Stim szeto if ((propSize = strlen(propVal)) >
29898fe96085Stim szeto sizeof (diskLu->pid)) {
29908fe96085Stim szeto return (STMF_ERROR_INVALID_PROPSIZE);
29918fe96085Stim szeto }
29928fe96085Stim szeto (void) strncpy(diskLu->pid, propVal, propSize);
29938fe96085Stim szeto diskLu->pidValid = B_TRUE;
29948fe96085Stim szeto break;
29958fe96085Stim szeto case STMF_LU_PROP_SERIAL_NUM:
29968fe96085Stim szeto if ((propSize = strlen(propVal)) >
29978fe96085Stim szeto (sizeof (diskLu->serialNum) - 1)) {
29988fe96085Stim szeto return (STMF_ERROR_INVALID_PROPSIZE);
29998fe96085Stim szeto }
30008fe96085Stim szeto (void) strncpy(diskLu->serialNum, propVal, propSize);
30018fe96085Stim szeto diskLu->serialNumValid = B_TRUE;
30028fe96085Stim szeto break;
30038fe96085Stim szeto case STMF_LU_PROP_SIZE:
30048fe96085Stim szeto if ((niceStrToNum(propVal, &diskLu->luSize) != 0)) {
30058fe96085Stim szeto return (STMF_ERROR_INVALID_ARG);
30068fe96085Stim szeto }
30078fe96085Stim szeto diskLu->luSizeValid = B_TRUE;
30088fe96085Stim szeto break;
30098fe96085Stim szeto case STMF_LU_PROP_VID:
30108fe96085Stim szeto if ((propSize = strlen(propVal)) >
30118fe96085Stim szeto sizeof (diskLu->vid)) {
30128fe96085Stim szeto return (STMF_ERROR_INVALID_PROPSIZE);
30138fe96085Stim szeto }
30148fe96085Stim szeto (void) strncpy(diskLu->vid, propVal, propSize);
30158fe96085Stim szeto diskLu->vidValid = B_TRUE;
30168fe96085Stim szeto break;
30178fe96085Stim szeto case STMF_LU_PROP_WRITE_PROTECT:
30188fe96085Stim szeto if (strcasecmp(propVal, "TRUE") == 0) {
30198fe96085Stim szeto diskLu->writeProtectEnable = B_TRUE;
30208fe96085Stim szeto } else if (strcasecmp(propVal, "FALSE") == 0) {
30218fe96085Stim szeto diskLu->writeProtectEnable = B_FALSE;
30228fe96085Stim szeto } else {
30238fe96085Stim szeto return (STMF_ERROR_INVALID_ARG);
30248fe96085Stim szeto }
30258fe96085Stim szeto diskLu->writeProtectEnableValid = B_TRUE;
30268fe96085Stim szeto break;
30278fe96085Stim szeto case STMF_LU_PROP_WRITE_CACHE_DISABLE:
30288fe96085Stim szeto if (strcasecmp(propVal, "TRUE") == 0) {
30298fe96085Stim szeto diskLu->writebackCacheDisable = B_TRUE;
30308fe96085Stim szeto } else if (strcasecmp(propVal, "FALSE") == 0) {
30318fe96085Stim szeto diskLu->writebackCacheDisable = B_FALSE;
30328fe96085Stim szeto } else {
30338fe96085Stim szeto return (STMF_ERROR_INVALID_ARG);
30348fe96085Stim szeto }
30358fe96085Stim szeto diskLu->writebackCacheDisableValid = B_TRUE;
30368fe96085Stim szeto break;
303745039663SJohn Forte case STMF_LU_PROP_ACCESS_STATE:
303845039663SJohn Forte ret = STMF_ERROR_INVALID_PROP;
303945039663SJohn Forte break;
30408fe96085Stim szeto default:
30417b506e25Ssrivijitha dugganapalli ret = STMF_ERROR_INVALID_PROP;
30428fe96085Stim szeto break;
30438fe96085Stim szeto }
30448fe96085Stim szeto return (ret);
30458fe96085Stim szeto }
30468fe96085Stim szeto
30478fe96085Stim szeto static int
checkHexUpper(char * buf)30488fe96085Stim szeto checkHexUpper(char *buf)
30498fe96085Stim szeto {
30508fe96085Stim szeto int i;
30518fe96085Stim szeto
30528fe96085Stim szeto for (i = 0; i < strlen(buf); i++) {
30538fe96085Stim szeto if (isxdigit(buf[i])) {
30548fe96085Stim szeto buf[i] = toupper(buf[i]);
30558fe96085Stim szeto continue;
30568fe96085Stim szeto }
30578fe96085Stim szeto return (-1);
30588fe96085Stim szeto }
30598fe96085Stim szeto
30608fe96085Stim szeto return (0);
30618fe96085Stim szeto }
30628fe96085Stim szeto
30638fe96085Stim szeto /*
30648fe96085Stim szeto * Given a numeric suffix, convert the value into a number of bits that the
30658fe96085Stim szeto * resulting value must be shifted.
30668fe96085Stim szeto * Code lifted from libzfs_util.c
30678fe96085Stim szeto */
30688fe96085Stim szeto static int
strToShift(const char * buf)30698fe96085Stim szeto strToShift(const char *buf)
30708fe96085Stim szeto {
30718fe96085Stim szeto const char *ends = "BKMGTPE";
30728fe96085Stim szeto int i;
30738fe96085Stim szeto
30748fe96085Stim szeto if (buf[0] == '\0')
30758fe96085Stim szeto return (0);
30768fe96085Stim szeto
30778fe96085Stim szeto for (i = 0; i < strlen(ends); i++) {
30788fe96085Stim szeto if (toupper(buf[0]) == ends[i])
30798fe96085Stim szeto return (10*i);
30808fe96085Stim szeto }
30818fe96085Stim szeto
30828fe96085Stim szeto return (-1);
30838fe96085Stim szeto }
30848fe96085Stim szeto
30858fe96085Stim szeto int
stmfFreeLuResource(luResource hdl)30868fe96085Stim szeto stmfFreeLuResource(luResource hdl)
30878fe96085Stim szeto {
30888fe96085Stim szeto int ret = STMF_STATUS_SUCCESS;
30898fe96085Stim szeto if (hdl == NULL) {
30908fe96085Stim szeto return (STMF_ERROR_INVALID_ARG);
30918fe96085Stim szeto }
30928fe96085Stim szeto
30938fe96085Stim szeto luResourceImpl *hdlImpl = hdl;
30948fe96085Stim szeto free(hdlImpl->resource);
30958fe96085Stim szeto free(hdlImpl);
30968fe96085Stim szeto return (ret);
30978fe96085Stim szeto }
30988fe96085Stim szeto
30998fe96085Stim szeto /*
31008fe96085Stim szeto * Convert a string of the form '100G' into a real number. Used when setting
31018fe96085Stim szeto * the size of a logical unit.
31028fe96085Stim szeto * Code lifted from libzfs_util.c
31038fe96085Stim szeto */
31048fe96085Stim szeto static int
niceStrToNum(const char * value,uint64_t * num)31058fe96085Stim szeto niceStrToNum(const char *value, uint64_t *num)
31068fe96085Stim szeto {
31078fe96085Stim szeto char *end;
31088fe96085Stim szeto int shift;
31098fe96085Stim szeto
31108fe96085Stim szeto *num = 0;
31118fe96085Stim szeto
31128fe96085Stim szeto /* Check to see if this looks like a number. */
31138fe96085Stim szeto if ((value[0] < '0' || value[0] > '9') && value[0] != '.') {
31148fe96085Stim szeto return (-1);
31158fe96085Stim szeto }
31168fe96085Stim szeto
31178fe96085Stim szeto /* Rely on stroull() to process the numeric portion. */
31188fe96085Stim szeto errno = 0;
31198fe96085Stim szeto *num = strtoull(value, &end, 10);
31208fe96085Stim szeto
31218fe96085Stim szeto /*
31228fe96085Stim szeto * Check for ERANGE, which indicates that the value is too large to fit
31238fe96085Stim szeto * in a 64-bit value.
31248fe96085Stim szeto */
31258fe96085Stim szeto if (errno == ERANGE) {
31268fe96085Stim szeto return (-1);
31278fe96085Stim szeto }
31288fe96085Stim szeto
31298fe96085Stim szeto /*
31308fe96085Stim szeto * If we have a decimal value, then do the computation with floating
31318fe96085Stim szeto * point arithmetic. Otherwise, use standard arithmetic.
31328fe96085Stim szeto */
31338fe96085Stim szeto if (*end == '.') {
31348fe96085Stim szeto double fval = strtod(value, &end);
31358fe96085Stim szeto
31368fe96085Stim szeto if ((shift = strToShift(end)) == -1) {
31378fe96085Stim szeto return (-1);
31388fe96085Stim szeto }
31398fe96085Stim szeto
31408fe96085Stim szeto fval *= pow(2, shift);
31418fe96085Stim szeto
31428fe96085Stim szeto if (fval > UINT64_MAX) {
31438fe96085Stim szeto return (-1);
31448fe96085Stim szeto }
31458fe96085Stim szeto
31468fe96085Stim szeto *num = (uint64_t)fval;
31478fe96085Stim szeto } else {
31488fe96085Stim szeto if ((shift = strToShift(end)) == -1) {
31498fe96085Stim szeto return (-1);
31508fe96085Stim szeto }
31518fe96085Stim szeto
31528fe96085Stim szeto /* Check for overflow */
31538fe96085Stim szeto if (shift >= 64 || (*num << shift) >> shift != *num) {
31548fe96085Stim szeto return (-1);
31558fe96085Stim szeto }
31568fe96085Stim szeto
31578fe96085Stim szeto *num <<= shift;
31588fe96085Stim szeto }
31598fe96085Stim szeto
31608fe96085Stim szeto return (0);
31618fe96085Stim szeto }
31628fe96085Stim szeto
31638fe96085Stim szeto /*
3164fcf3ce44SJohn Forte * stmfCreateTargetGroup
3165fcf3ce44SJohn Forte *
3166fcf3ce44SJohn Forte * Purpose: Create a local port group
3167fcf3ce44SJohn Forte *
3168fcf3ce44SJohn Forte * targetGroupName - name of local port group to create
3169fcf3ce44SJohn Forte */
3170fcf3ce44SJohn Forte int
stmfCreateTargetGroup(stmfGroupName * targetGroupName)3171fcf3ce44SJohn Forte stmfCreateTargetGroup(stmfGroupName *targetGroupName)
3172fcf3ce44SJohn Forte {
3173fcf3ce44SJohn Forte int ret;
3174fcf3ce44SJohn Forte int fd;
3175fcf3ce44SJohn Forte
3176fcf3ce44SJohn Forte if (targetGroupName == NULL ||
3177fcf3ce44SJohn Forte (strnlen((char *)targetGroupName, sizeof (stmfGroupName))
3178fcf3ce44SJohn Forte == sizeof (stmfGroupName))) {
3179fcf3ce44SJohn Forte return (STMF_ERROR_INVALID_ARG);
3180fcf3ce44SJohn Forte }
3181fcf3ce44SJohn Forte
3182fcf3ce44SJohn Forte /* Check to ensure service exists */
3183fcf3ce44SJohn Forte if (psCheckService() != STMF_STATUS_SUCCESS) {
3184fcf3ce44SJohn Forte return (STMF_ERROR_SERVICE_NOT_FOUND);
3185fcf3ce44SJohn Forte }
3186fcf3ce44SJohn Forte
3187fcf3ce44SJohn Forte /* call init */
3188fcf3ce44SJohn Forte ret = initializeConfig();
3189fcf3ce44SJohn Forte if (ret != STMF_STATUS_SUCCESS) {
3190fcf3ce44SJohn Forte return (ret);
3191fcf3ce44SJohn Forte }
3192fcf3ce44SJohn Forte
3193fcf3ce44SJohn Forte /*
3194fcf3ce44SJohn Forte * Open control node for stmf
3195fcf3ce44SJohn Forte */
3196fcf3ce44SJohn Forte if ((ret = openStmf(OPEN_STMF, &fd)) != STMF_STATUS_SUCCESS)
3197fcf3ce44SJohn Forte return (ret);
3198fcf3ce44SJohn Forte
3199fcf3ce44SJohn Forte /*
3200fcf3ce44SJohn Forte * Add the group to the driver
3201fcf3ce44SJohn Forte */
3202fcf3ce44SJohn Forte if ((ret = groupIoctl(fd, STMF_IOCTL_CREATE_TARGET_GROUP,
3203fcf3ce44SJohn Forte targetGroupName)) != STMF_STATUS_SUCCESS) {
3204fcf3ce44SJohn Forte goto done;
3205fcf3ce44SJohn Forte }
3206fcf3ce44SJohn Forte
32078fe96085Stim szeto if (iGetPersistMethod() == STMF_PERSIST_NONE) {
32088fe96085Stim szeto goto done;
32098fe96085Stim szeto }
32108fe96085Stim szeto
3211fcf3ce44SJohn Forte /*
3212fcf3ce44SJohn Forte * If the add to the driver was successful, add it to the persistent
3213fcf3ce44SJohn Forte * store.
3214fcf3ce44SJohn Forte */
3215fcf3ce44SJohn Forte ret = psCreateTargetGroup((char *)targetGroupName);
3216fcf3ce44SJohn Forte switch (ret) {
3217fcf3ce44SJohn Forte case STMF_PS_SUCCESS:
3218fcf3ce44SJohn Forte ret = STMF_STATUS_SUCCESS;
3219fcf3ce44SJohn Forte break;
3220fcf3ce44SJohn Forte case STMF_PS_ERROR_EXISTS:
3221fcf3ce44SJohn Forte ret = STMF_ERROR_EXISTS;
3222fcf3ce44SJohn Forte break;
3223fcf3ce44SJohn Forte case STMF_PS_ERROR_BUSY:
3224fcf3ce44SJohn Forte ret = STMF_ERROR_BUSY;
3225fcf3ce44SJohn Forte break;
3226fcf3ce44SJohn Forte case STMF_PS_ERROR_SERVICE_NOT_FOUND:
3227fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_NOT_FOUND;
3228fcf3ce44SJohn Forte break;
3229fcf3ce44SJohn Forte case STMF_PS_ERROR_VERSION_MISMATCH:
3230fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_DATA_VERSION;
3231fcf3ce44SJohn Forte break;
3232fcf3ce44SJohn Forte default:
3233fcf3ce44SJohn Forte syslog(LOG_DEBUG,
3234fcf3ce44SJohn Forte "stmfCreateTargetGroup:psCreateTargetGroup"
3235fcf3ce44SJohn Forte ":error(%d)", ret);
3236fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR;
3237fcf3ce44SJohn Forte break;
3238fcf3ce44SJohn Forte }
3239fcf3ce44SJohn Forte
3240fcf3ce44SJohn Forte done:
3241fcf3ce44SJohn Forte (void) close(fd);
3242fcf3ce44SJohn Forte return (ret);
3243fcf3ce44SJohn Forte }
3244fcf3ce44SJohn Forte
3245fcf3ce44SJohn Forte /*
3246fcf3ce44SJohn Forte * stmfDeleteHostGroup
3247fcf3ce44SJohn Forte *
3248fcf3ce44SJohn Forte * Purpose: Delete an initiator or local port group
3249fcf3ce44SJohn Forte *
3250fcf3ce44SJohn Forte * hostGroupName - group to delete
3251fcf3ce44SJohn Forte */
3252fcf3ce44SJohn Forte int
stmfDeleteHostGroup(stmfGroupName * hostGroupName)3253fcf3ce44SJohn Forte stmfDeleteHostGroup(stmfGroupName *hostGroupName)
3254fcf3ce44SJohn Forte {
3255fcf3ce44SJohn Forte int ret;
3256fcf3ce44SJohn Forte int fd;
3257fcf3ce44SJohn Forte
3258fcf3ce44SJohn Forte if (hostGroupName == NULL) {
3259fcf3ce44SJohn Forte return (STMF_ERROR_INVALID_ARG);
3260fcf3ce44SJohn Forte }
3261fcf3ce44SJohn Forte
3262fcf3ce44SJohn Forte /* Check to ensure service exists */
3263fcf3ce44SJohn Forte if (psCheckService() != STMF_STATUS_SUCCESS) {
3264fcf3ce44SJohn Forte return (STMF_ERROR_SERVICE_NOT_FOUND);
3265fcf3ce44SJohn Forte }
3266fcf3ce44SJohn Forte
3267fcf3ce44SJohn Forte /* call init */
3268fcf3ce44SJohn Forte ret = initializeConfig();
3269fcf3ce44SJohn Forte if (ret != STMF_STATUS_SUCCESS) {
3270fcf3ce44SJohn Forte return (ret);
3271fcf3ce44SJohn Forte }
3272fcf3ce44SJohn Forte
3273fcf3ce44SJohn Forte /*
3274fcf3ce44SJohn Forte * Open control node for stmf
3275fcf3ce44SJohn Forte */
3276fcf3ce44SJohn Forte if ((ret = openStmf(OPEN_STMF, &fd)) != STMF_STATUS_SUCCESS)
3277fcf3ce44SJohn Forte return (ret);
3278fcf3ce44SJohn Forte
3279fcf3ce44SJohn Forte /*
3280fcf3ce44SJohn Forte * Remove the group from the driver
3281fcf3ce44SJohn Forte */
3282fcf3ce44SJohn Forte if ((ret = groupIoctl(fd, STMF_IOCTL_REMOVE_HOST_GROUP,
3283fcf3ce44SJohn Forte hostGroupName)) != STMF_STATUS_SUCCESS) {
3284fcf3ce44SJohn Forte goto done;
3285fcf3ce44SJohn Forte }
3286fcf3ce44SJohn Forte
32878fe96085Stim szeto if (iGetPersistMethod() == STMF_PERSIST_NONE) {
32888fe96085Stim szeto goto done;
32898fe96085Stim szeto }
32908fe96085Stim szeto
3291fcf3ce44SJohn Forte /*
3292fcf3ce44SJohn Forte * If the remove from the driver was successful, remove it from the
3293fcf3ce44SJohn Forte * persistent store.
3294fcf3ce44SJohn Forte */
3295fcf3ce44SJohn Forte ret = psDeleteHostGroup((char *)hostGroupName);
3296fcf3ce44SJohn Forte switch (ret) {
3297fcf3ce44SJohn Forte case STMF_PS_SUCCESS:
3298fcf3ce44SJohn Forte ret = STMF_STATUS_SUCCESS;
3299fcf3ce44SJohn Forte break;
3300fcf3ce44SJohn Forte case STMF_PS_ERROR_NOT_FOUND:
3301fcf3ce44SJohn Forte ret = STMF_ERROR_NOT_FOUND;
3302fcf3ce44SJohn Forte break;
3303fcf3ce44SJohn Forte case STMF_PS_ERROR_BUSY:
3304fcf3ce44SJohn Forte ret = STMF_ERROR_BUSY;
3305fcf3ce44SJohn Forte break;
3306fcf3ce44SJohn Forte case STMF_PS_ERROR_SERVICE_NOT_FOUND:
3307fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_NOT_FOUND;
3308fcf3ce44SJohn Forte break;
3309fcf3ce44SJohn Forte case STMF_PS_ERROR_VERSION_MISMATCH:
3310fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_DATA_VERSION;
3311fcf3ce44SJohn Forte break;
3312fcf3ce44SJohn Forte default:
3313fcf3ce44SJohn Forte syslog(LOG_DEBUG,
3314fcf3ce44SJohn Forte "stmfDeleteHostGroup:psDeleteHostGroup:error(%d)",
3315fcf3ce44SJohn Forte ret);
3316fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR;
3317fcf3ce44SJohn Forte break;
3318fcf3ce44SJohn Forte }
3319fcf3ce44SJohn Forte
3320fcf3ce44SJohn Forte done:
3321fcf3ce44SJohn Forte (void) close(fd);
3322fcf3ce44SJohn Forte return (ret);
3323fcf3ce44SJohn Forte }
3324fcf3ce44SJohn Forte
3325fcf3ce44SJohn Forte /*
3326fcf3ce44SJohn Forte * stmfDeleteTargetGroup
3327fcf3ce44SJohn Forte *
3328fcf3ce44SJohn Forte * Purpose: Delete an initiator or local port group
3329fcf3ce44SJohn Forte *
3330fcf3ce44SJohn Forte * targetGroupName - group to delete
3331fcf3ce44SJohn Forte */
3332fcf3ce44SJohn Forte int
stmfDeleteTargetGroup(stmfGroupName * targetGroupName)3333fcf3ce44SJohn Forte stmfDeleteTargetGroup(stmfGroupName *targetGroupName)
3334fcf3ce44SJohn Forte {
3335fcf3ce44SJohn Forte int ret = STMF_STATUS_SUCCESS;
3336fcf3ce44SJohn Forte int fd;
3337fcf3ce44SJohn Forte
3338fcf3ce44SJohn Forte if (targetGroupName == NULL) {
3339fcf3ce44SJohn Forte return (STMF_ERROR_INVALID_ARG);
3340fcf3ce44SJohn Forte }
3341fcf3ce44SJohn Forte
3342fcf3ce44SJohn Forte /* Check to ensure service exists */
3343fcf3ce44SJohn Forte if (psCheckService() != STMF_STATUS_SUCCESS) {
3344fcf3ce44SJohn Forte return (STMF_ERROR_SERVICE_NOT_FOUND);
3345fcf3ce44SJohn Forte }
3346fcf3ce44SJohn Forte
3347fcf3ce44SJohn Forte /* call init */
3348fcf3ce44SJohn Forte ret = initializeConfig();
3349fcf3ce44SJohn Forte if (ret != STMF_STATUS_SUCCESS) {
3350fcf3ce44SJohn Forte return (ret);
3351fcf3ce44SJohn Forte }
3352fcf3ce44SJohn Forte
3353fcf3ce44SJohn Forte /*
3354fcf3ce44SJohn Forte * Open control node for stmf
3355fcf3ce44SJohn Forte */
3356fcf3ce44SJohn Forte if ((ret = openStmf(OPEN_STMF, &fd)) != STMF_STATUS_SUCCESS)
3357fcf3ce44SJohn Forte return (ret);
3358fcf3ce44SJohn Forte
3359fcf3ce44SJohn Forte /*
3360fcf3ce44SJohn Forte * Remove the group from the driver
3361fcf3ce44SJohn Forte */
3362fcf3ce44SJohn Forte if ((ret = groupIoctl(fd, STMF_IOCTL_REMOVE_TARGET_GROUP,
3363fcf3ce44SJohn Forte targetGroupName)) != STMF_STATUS_SUCCESS) {
3364fcf3ce44SJohn Forte goto done;
3365fcf3ce44SJohn Forte }
3366fcf3ce44SJohn Forte
33678fe96085Stim szeto if (iGetPersistMethod() == STMF_PERSIST_NONE) {
33688fe96085Stim szeto goto done;
33698fe96085Stim szeto }
33708fe96085Stim szeto
3371fcf3ce44SJohn Forte /*
3372fcf3ce44SJohn Forte * If the remove from the driver was successful, remove it from the
3373fcf3ce44SJohn Forte * persistent store.
3374fcf3ce44SJohn Forte */
3375fcf3ce44SJohn Forte ret = psDeleteTargetGroup((char *)targetGroupName);
3376fcf3ce44SJohn Forte switch (ret) {
3377fcf3ce44SJohn Forte case STMF_PS_SUCCESS:
3378fcf3ce44SJohn Forte ret = STMF_STATUS_SUCCESS;
3379fcf3ce44SJohn Forte break;
3380fcf3ce44SJohn Forte case STMF_PS_ERROR_NOT_FOUND:
3381fcf3ce44SJohn Forte ret = STMF_ERROR_NOT_FOUND;
3382fcf3ce44SJohn Forte break;
3383fcf3ce44SJohn Forte case STMF_PS_ERROR_BUSY:
3384fcf3ce44SJohn Forte ret = STMF_ERROR_BUSY;
3385fcf3ce44SJohn Forte break;
3386fcf3ce44SJohn Forte case STMF_PS_ERROR_SERVICE_NOT_FOUND:
3387fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_NOT_FOUND;
3388fcf3ce44SJohn Forte break;
3389fcf3ce44SJohn Forte case STMF_PS_ERROR_VERSION_MISMATCH:
3390fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_DATA_VERSION;
3391fcf3ce44SJohn Forte break;
3392fcf3ce44SJohn Forte default:
3393fcf3ce44SJohn Forte syslog(LOG_DEBUG,
3394fcf3ce44SJohn Forte "stmfDeleteTargetGroup:psDeleteTargetGroup"
3395fcf3ce44SJohn Forte ":error(%d)", ret);
3396fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR;
3397fcf3ce44SJohn Forte break;
3398fcf3ce44SJohn Forte }
3399fcf3ce44SJohn Forte
3400fcf3ce44SJohn Forte done:
3401fcf3ce44SJohn Forte (void) close(fd);
3402fcf3ce44SJohn Forte return (ret);
3403fcf3ce44SJohn Forte }
3404fcf3ce44SJohn Forte
3405fcf3ce44SJohn Forte /*
3406fcf3ce44SJohn Forte * stmfDevidFromIscsiName
3407fcf3ce44SJohn Forte *
3408fcf3ce44SJohn Forte * Purpose: convert an iSCSI name to an stmf devid
3409fcf3ce44SJohn Forte *
3410fcf3ce44SJohn Forte * iscsiName - unicode nul terminated utf-8 encoded iSCSI name
3411fcf3ce44SJohn Forte * devid - on success, contains the converted iscsi name
3412fcf3ce44SJohn Forte */
3413fcf3ce44SJohn Forte int
stmfDevidFromIscsiName(char * iscsiName,stmfDevid * devid)3414fcf3ce44SJohn Forte stmfDevidFromIscsiName(char *iscsiName, stmfDevid *devid)
3415fcf3ce44SJohn Forte {
3416fcf3ce44SJohn Forte if (devid == NULL || iscsiName == NULL)
3417fcf3ce44SJohn Forte return (STMF_ERROR_INVALID_ARG);
3418fcf3ce44SJohn Forte
3419fcf3ce44SJohn Forte bzero(devid, sizeof (stmfDevid));
3420fcf3ce44SJohn Forte
3421fcf3ce44SJohn Forte /* Validate size of target */
3422fcf3ce44SJohn Forte if ((devid->identLength = strlen(iscsiName)) > MAX_ISCSI_NAME ||
3423fcf3ce44SJohn Forte devid->identLength < strlen(EUI) ||
3424fcf3ce44SJohn Forte devid->identLength < strlen(IQN)) {
3425fcf3ce44SJohn Forte return (STMF_ERROR_INVALID_ARG);
3426fcf3ce44SJohn Forte }
3427fcf3ce44SJohn Forte
3428fcf3ce44SJohn Forte if ((strncmp(iscsiName, EUI, strlen(EUI)) != 0) &&
3429fcf3ce44SJohn Forte strncmp(iscsiName, IQN, strlen(IQN)) != 0) {
3430fcf3ce44SJohn Forte return (STMF_ERROR_INVALID_ARG);
3431fcf3ce44SJohn Forte }
3432fcf3ce44SJohn Forte
3433fcf3ce44SJohn Forte /* copy UTF-8 bytes to ident */
3434fcf3ce44SJohn Forte bcopy(iscsiName, devid->ident, devid->identLength);
3435fcf3ce44SJohn Forte
3436fcf3ce44SJohn Forte return (STMF_STATUS_SUCCESS);
3437fcf3ce44SJohn Forte }
3438fcf3ce44SJohn Forte
3439fcf3ce44SJohn Forte /*
3440fcf3ce44SJohn Forte * stmfDevidFromWwn
3441fcf3ce44SJohn Forte *
3442fcf3ce44SJohn Forte * Purpose: convert a WWN to an stmf devid
3443fcf3ce44SJohn Forte *
3444fcf3ce44SJohn Forte * wwn - 8-byte wwn identifier
3445fcf3ce44SJohn Forte * devid - on success, contains the converted wwn
3446fcf3ce44SJohn Forte */
3447fcf3ce44SJohn Forte int
stmfDevidFromWwn(uchar_t * wwn,stmfDevid * devid)3448fcf3ce44SJohn Forte stmfDevidFromWwn(uchar_t *wwn, stmfDevid *devid)
3449fcf3ce44SJohn Forte {
3450fcf3ce44SJohn Forte if (wwn == NULL || devid == NULL)
3451fcf3ce44SJohn Forte return (STMF_ERROR_INVALID_ARG);
3452fcf3ce44SJohn Forte
3453fcf3ce44SJohn Forte bzero(devid, sizeof (stmfDevid));
3454fcf3ce44SJohn Forte
3455fcf3ce44SJohn Forte /* Copy eui prefix */
3456fcf3ce44SJohn Forte (void) bcopy(WWN, devid->ident, strlen(WWN));
3457fcf3ce44SJohn Forte
3458fcf3ce44SJohn Forte /* Convert to ASCII uppercase hexadecimal string */
3459fcf3ce44SJohn Forte (void) snprintf((char *)&devid->ident[strlen(WWN)],
3460fcf3ce44SJohn Forte sizeof (devid->ident), "%02X%02X%02X%02X%02X%02X%02X%02X",
3461fcf3ce44SJohn Forte wwn[0], wwn[1], wwn[2], wwn[3], wwn[4], wwn[5], wwn[6], wwn[7]);
3462fcf3ce44SJohn Forte
3463fcf3ce44SJohn Forte devid->identLength = strlen((char *)devid->ident);
3464fcf3ce44SJohn Forte
3465fcf3ce44SJohn Forte return (STMF_STATUS_SUCCESS);
3466fcf3ce44SJohn Forte }
3467fcf3ce44SJohn Forte
3468fcf3ce44SJohn Forte /*
3469fcf3ce44SJohn Forte * stmfFreeMemory
3470fcf3ce44SJohn Forte *
3471fcf3ce44SJohn Forte * Purpose: Free memory allocated by this library
3472fcf3ce44SJohn Forte *
3473fcf3ce44SJohn Forte * memory - previously allocated pointer of memory managed by library
3474fcf3ce44SJohn Forte */
3475fcf3ce44SJohn Forte void
stmfFreeMemory(void * memory)3476fcf3ce44SJohn Forte stmfFreeMemory(void *memory)
3477fcf3ce44SJohn Forte {
3478fcf3ce44SJohn Forte free(memory);
3479fcf3ce44SJohn Forte }
3480fcf3ce44SJohn Forte
3481fcf3ce44SJohn Forte /*
34828fe96085Stim szeto * get host group, target group list from stmf
3483fcf3ce44SJohn Forte *
34848fe96085Stim szeto * groupType - HOST_GROUP, TARGET_GROUP
3485fcf3ce44SJohn Forte */
34868fe96085Stim szeto static int
groupListIoctl(stmfGroupList ** groupList,int groupType)34878fe96085Stim szeto groupListIoctl(stmfGroupList **groupList, int groupType)
3488fcf3ce44SJohn Forte {
3489fcf3ce44SJohn Forte int ret;
34908fe96085Stim szeto int fd;
34918fe96085Stim szeto int ioctlRet;
34928fe96085Stim szeto int i;
34938fe96085Stim szeto int cmd;
34948fe96085Stim szeto stmf_iocdata_t stmfIoctl;
34958fe96085Stim szeto /* framework group list */
34968fe96085Stim szeto stmf_group_name_t *iGroupList = NULL;
34978fe96085Stim szeto uint32_t groupListSize;
3498fcf3ce44SJohn Forte
34998fe96085Stim szeto if (groupList == NULL) {
3500fcf3ce44SJohn Forte return (STMF_ERROR_INVALID_ARG);
3501fcf3ce44SJohn Forte }
3502fcf3ce44SJohn Forte
35038fe96085Stim szeto if (groupType == HOST_GROUP) {
35048fe96085Stim szeto cmd = STMF_IOCTL_GET_HG_LIST;
35058fe96085Stim szeto } else if (groupType == TARGET_GROUP) {
35068fe96085Stim szeto cmd = STMF_IOCTL_GET_TG_LIST;
35078fe96085Stim szeto } else {
35088fe96085Stim szeto return (STMF_ERROR_INVALID_ARG);
35098fe96085Stim szeto }
35108fe96085Stim szeto
35118fe96085Stim szeto /* call init */
35128fe96085Stim szeto ret = initializeConfig();
35138fe96085Stim szeto if (ret != STMF_STATUS_SUCCESS) {
35148fe96085Stim szeto return (ret);
35158fe96085Stim szeto }
35168fe96085Stim szeto
35178fe96085Stim szeto /*
35188fe96085Stim szeto * Open control node for stmf
35198fe96085Stim szeto */
35208fe96085Stim szeto if ((ret = openStmf(OPEN_STMF, &fd)) != STMF_STATUS_SUCCESS)
35218fe96085Stim szeto return (ret);
35228fe96085Stim szeto
35238fe96085Stim szeto /*
35248fe96085Stim szeto * Allocate ioctl input buffer
35258fe96085Stim szeto */
35268fe96085Stim szeto groupListSize = ALLOC_GROUP;
35278fe96085Stim szeto groupListSize = groupListSize * (sizeof (stmf_group_name_t));
35288fe96085Stim szeto iGroupList = (stmf_group_name_t *)calloc(1, groupListSize);
35298fe96085Stim szeto if (iGroupList == NULL) {
35308fe96085Stim szeto ret = STMF_ERROR_NOMEM;
35318fe96085Stim szeto goto done;
35328fe96085Stim szeto }
35338fe96085Stim szeto
35348fe96085Stim szeto bzero(&stmfIoctl, sizeof (stmfIoctl));
35358fe96085Stim szeto /*
35368fe96085Stim szeto * Issue ioctl to get the group list
35378fe96085Stim szeto */
35388fe96085Stim szeto stmfIoctl.stmf_version = STMF_VERSION_1;
35398fe96085Stim szeto stmfIoctl.stmf_obuf_size = groupListSize;
35408fe96085Stim szeto stmfIoctl.stmf_obuf = (uint64_t)(unsigned long)iGroupList;
35418fe96085Stim szeto ioctlRet = ioctl(fd, cmd, &stmfIoctl);
35428fe96085Stim szeto if (ioctlRet != 0) {
35438fe96085Stim szeto switch (errno) {
35448fe96085Stim szeto case EBUSY:
35458fe96085Stim szeto ret = STMF_ERROR_BUSY;
35468fe96085Stim szeto break;
35478fe96085Stim szeto case EPERM:
35488fe96085Stim szeto case EACCES:
35498fe96085Stim szeto ret = STMF_ERROR_PERM;
35508fe96085Stim szeto break;
35518fe96085Stim szeto default:
35528fe96085Stim szeto syslog(LOG_DEBUG,
35538fe96085Stim szeto "groupListIoctl:ioctl errno(%d)",
35548fe96085Stim szeto errno);
35558fe96085Stim szeto ret = STMF_STATUS_ERROR;
35568fe96085Stim szeto break;
35578fe96085Stim szeto }
35588fe96085Stim szeto goto done;
35598fe96085Stim szeto }
35608fe96085Stim szeto /*
35618fe96085Stim szeto * Check whether input buffer was large enough
35628fe96085Stim szeto */
35638fe96085Stim szeto if (stmfIoctl.stmf_obuf_max_nentries > ALLOC_GROUP) {
35648fe96085Stim szeto groupListSize = stmfIoctl.stmf_obuf_max_nentries *
35658fe96085Stim szeto sizeof (stmf_group_name_t);
35668fe96085Stim szeto iGroupList = realloc(iGroupList, groupListSize);
35678fe96085Stim szeto if (iGroupList == NULL) {
35688fe96085Stim szeto ret = STMF_ERROR_NOMEM;
35698fe96085Stim szeto goto done;
35708fe96085Stim szeto }
35718fe96085Stim szeto stmfIoctl.stmf_obuf_size = groupListSize;
35728fe96085Stim szeto stmfIoctl.stmf_obuf = (uint64_t)(unsigned long)iGroupList;
35738fe96085Stim szeto ioctlRet = ioctl(fd, cmd, &stmfIoctl);
35748fe96085Stim szeto if (ioctlRet != 0) {
35758fe96085Stim szeto switch (errno) {
35768fe96085Stim szeto case EBUSY:
35778fe96085Stim szeto ret = STMF_ERROR_BUSY;
35788fe96085Stim szeto break;
35798fe96085Stim szeto case EPERM:
35808fe96085Stim szeto case EACCES:
35818fe96085Stim szeto ret = STMF_ERROR_PERM;
35828fe96085Stim szeto break;
35838fe96085Stim szeto default:
35848fe96085Stim szeto syslog(LOG_DEBUG,
35858fe96085Stim szeto "groupListIoctl:ioctl errno(%d)",
35868fe96085Stim szeto errno);
35878fe96085Stim szeto ret = STMF_STATUS_ERROR;
35888fe96085Stim szeto break;
35898fe96085Stim szeto }
35908fe96085Stim szeto goto done;
35918fe96085Stim szeto }
35928fe96085Stim szeto }
35938fe96085Stim szeto
35948fe96085Stim szeto /* allocate and copy to caller's buffer */
35954f2997b2Ssrivijitha dugganapalli *groupList = (stmfGroupList *)calloc(1, sizeof (stmfGroupList) +
35964f2997b2Ssrivijitha dugganapalli sizeof (stmfGroupName) * stmfIoctl.stmf_obuf_nentries);
35978fe96085Stim szeto if (*groupList == NULL) {
35988fe96085Stim szeto ret = STMF_ERROR_NOMEM;
35998fe96085Stim szeto goto done;
36008fe96085Stim szeto }
36018fe96085Stim szeto (*groupList)->cnt = stmfIoctl.stmf_obuf_nentries;
36028fe96085Stim szeto for (i = 0; i < stmfIoctl.stmf_obuf_nentries; i++) {
36032f624233SNattuvetty Bhavyan bcopy(iGroupList[i].name, (*groupList)->name[i],
36048fe96085Stim szeto sizeof (stmfGroupName));
36058fe96085Stim szeto }
36068fe96085Stim szeto
36078fe96085Stim szeto done:
36088fe96085Stim szeto free(iGroupList);
36098fe96085Stim szeto (void) close(fd);
36108fe96085Stim szeto return (ret);
36118fe96085Stim szeto }
36128fe96085Stim szeto
36138fe96085Stim szeto /*
36148fe96085Stim szeto * get host group members, target group members from stmf
36158fe96085Stim szeto *
36168fe96085Stim szeto * groupProps - allocated on success
36178fe96085Stim szeto *
36188fe96085Stim szeto * groupType - HOST_GROUP, TARGET_GROUP
36198fe96085Stim szeto */
36208fe96085Stim szeto static int
groupMemberListIoctl(stmfGroupName * groupName,stmfGroupProperties ** groupProps,int groupType)36218fe96085Stim szeto groupMemberListIoctl(stmfGroupName *groupName, stmfGroupProperties **groupProps,
36228fe96085Stim szeto int groupType)
36238fe96085Stim szeto {
36248fe96085Stim szeto int ret;
36258fe96085Stim szeto int fd;
36268fe96085Stim szeto int ioctlRet;
36278fe96085Stim szeto int i;
36288fe96085Stim szeto int cmd;
36298fe96085Stim szeto stmf_iocdata_t stmfIoctl;
36308fe96085Stim szeto /* framework group list */
36318fe96085Stim szeto stmf_group_name_t iGroupName;
36328fe96085Stim szeto stmf_ge_ident_t *iGroupMembers;
36338fe96085Stim szeto uint32_t groupListSize;
36348fe96085Stim szeto
36358fe96085Stim szeto if (groupName == NULL) {
36368fe96085Stim szeto return (STMF_ERROR_INVALID_ARG);
36378fe96085Stim szeto }
36388fe96085Stim szeto
36398fe96085Stim szeto if (groupType == HOST_GROUP) {
36408fe96085Stim szeto cmd = STMF_IOCTL_GET_HG_ENTRIES;
36418fe96085Stim szeto } else if (groupType == TARGET_GROUP) {
36428fe96085Stim szeto cmd = STMF_IOCTL_GET_TG_ENTRIES;
36438fe96085Stim szeto } else {
36448fe96085Stim szeto return (STMF_ERROR_INVALID_ARG);
36458fe96085Stim szeto }
36468fe96085Stim szeto
36478fe96085Stim szeto /* call init */
36488fe96085Stim szeto ret = initializeConfig();
36498fe96085Stim szeto if (ret != STMF_STATUS_SUCCESS) {
36508fe96085Stim szeto return (ret);
36518fe96085Stim szeto }
36528fe96085Stim szeto
36538fe96085Stim szeto /*
36548fe96085Stim szeto * Open control node for stmf
36558fe96085Stim szeto */
36568fe96085Stim szeto if ((ret = openStmf(OPEN_STMF, &fd)) != STMF_STATUS_SUCCESS)
36578fe96085Stim szeto return (ret);
36588fe96085Stim szeto
36598fe96085Stim szeto bzero(&iGroupName, sizeof (iGroupName));
36608fe96085Stim szeto
36618fe96085Stim szeto bcopy(groupName, &iGroupName.name, strlen((char *)groupName));
36628fe96085Stim szeto
36638fe96085Stim szeto iGroupName.name_size = strlen((char *)groupName);
36648fe96085Stim szeto
36658fe96085Stim szeto /*
36668fe96085Stim szeto * Allocate ioctl input buffer
36678fe96085Stim szeto */
36688fe96085Stim szeto groupListSize = ALLOC_GRP_MEMBER;
36698fe96085Stim szeto groupListSize = groupListSize * (sizeof (stmf_ge_ident_t));
36708fe96085Stim szeto iGroupMembers = (stmf_ge_ident_t *)calloc(1, groupListSize);
36718fe96085Stim szeto if (iGroupMembers == NULL) {
36728fe96085Stim szeto ret = STMF_ERROR_NOMEM;
36738fe96085Stim szeto goto done;
36748fe96085Stim szeto }
36758fe96085Stim szeto
36768fe96085Stim szeto bzero(&stmfIoctl, sizeof (stmfIoctl));
36778fe96085Stim szeto /*
36788fe96085Stim szeto * Issue ioctl to get the group list
36798fe96085Stim szeto */
36808fe96085Stim szeto stmfIoctl.stmf_version = STMF_VERSION_1;
36818fe96085Stim szeto stmfIoctl.stmf_ibuf = (uint64_t)(unsigned long)&iGroupName;
36828fe96085Stim szeto stmfIoctl.stmf_ibuf_size = sizeof (stmf_group_name_t);
36838fe96085Stim szeto stmfIoctl.stmf_obuf_size = groupListSize;
36848fe96085Stim szeto stmfIoctl.stmf_obuf = (uint64_t)(unsigned long)iGroupMembers;
36858fe96085Stim szeto ioctlRet = ioctl(fd, cmd, &stmfIoctl);
36868fe96085Stim szeto if (ioctlRet != 0) {
36878fe96085Stim szeto switch (errno) {
36888fe96085Stim szeto case EBUSY:
36898fe96085Stim szeto ret = STMF_ERROR_BUSY;
36908fe96085Stim szeto break;
36918fe96085Stim szeto case EPERM:
36928fe96085Stim szeto case EACCES:
36938fe96085Stim szeto ret = STMF_ERROR_PERM;
36948fe96085Stim szeto break;
36958fe96085Stim szeto default:
36968fe96085Stim szeto syslog(LOG_DEBUG,
36978fe96085Stim szeto "groupListIoctl:ioctl errno(%d)",
36988fe96085Stim szeto errno);
36998fe96085Stim szeto ret = STMF_STATUS_ERROR;
37008fe96085Stim szeto break;
37018fe96085Stim szeto }
37028fe96085Stim szeto goto done;
37038fe96085Stim szeto }
37048fe96085Stim szeto /*
37058fe96085Stim szeto * Check whether input buffer was large enough
37068fe96085Stim szeto */
37078fe96085Stim szeto if (stmfIoctl.stmf_obuf_max_nentries > ALLOC_GRP_MEMBER) {
37088fe96085Stim szeto groupListSize = stmfIoctl.stmf_obuf_max_nentries *
37098fe96085Stim szeto sizeof (stmf_ge_ident_t);
37108fe96085Stim szeto iGroupMembers = realloc(iGroupMembers, groupListSize);
37118fe96085Stim szeto if (iGroupMembers == NULL) {
37128fe96085Stim szeto ret = STMF_ERROR_NOMEM;
37138fe96085Stim szeto goto done;
37148fe96085Stim szeto }
37158fe96085Stim szeto stmfIoctl.stmf_ibuf = (uint64_t)(unsigned long)&iGroupName;
37168fe96085Stim szeto stmfIoctl.stmf_ibuf_size = sizeof (stmf_group_name_t);
37178fe96085Stim szeto stmfIoctl.stmf_obuf_size = groupListSize;
37188fe96085Stim szeto stmfIoctl.stmf_obuf = (uint64_t)(unsigned long)iGroupMembers;
37198fe96085Stim szeto ioctlRet = ioctl(fd, cmd, &stmfIoctl);
37208fe96085Stim szeto if (ioctlRet != 0) {
37218fe96085Stim szeto switch (errno) {
37228fe96085Stim szeto case EBUSY:
37238fe96085Stim szeto ret = STMF_ERROR_BUSY;
37248fe96085Stim szeto break;
37258fe96085Stim szeto case EPERM:
37268fe96085Stim szeto case EACCES:
37278fe96085Stim szeto ret = STMF_ERROR_PERM;
37288fe96085Stim szeto break;
37298fe96085Stim szeto default:
37308fe96085Stim szeto syslog(LOG_DEBUG,
37318fe96085Stim szeto "groupListIoctl:ioctl errno(%d)",
37328fe96085Stim szeto errno);
37338fe96085Stim szeto ret = STMF_STATUS_ERROR;
37348fe96085Stim szeto break;
37358fe96085Stim szeto }
37368fe96085Stim szeto goto done;
37378fe96085Stim szeto }
37388fe96085Stim szeto }
37398fe96085Stim szeto
37408fe96085Stim szeto /* allocate and copy to caller's buffer */
37418fe96085Stim szeto *groupProps = (stmfGroupProperties *)calloc(1,
37424f2997b2Ssrivijitha dugganapalli sizeof (stmfGroupProperties) +
37434f2997b2Ssrivijitha dugganapalli sizeof (stmfDevid) * stmfIoctl.stmf_obuf_nentries);
37448fe96085Stim szeto if (*groupProps == NULL) {
37458fe96085Stim szeto ret = STMF_ERROR_NOMEM;
37468fe96085Stim szeto goto done;
37478fe96085Stim szeto }
37488fe96085Stim szeto (*groupProps)->cnt = stmfIoctl.stmf_obuf_nentries;
37498fe96085Stim szeto for (i = 0; i < stmfIoctl.stmf_obuf_nentries; i++) {
37508fe96085Stim szeto (*groupProps)->name[i].identLength =
37512f624233SNattuvetty Bhavyan iGroupMembers[i].ident_size;
37522f624233SNattuvetty Bhavyan bcopy(iGroupMembers[i].ident, (*groupProps)->name[i].ident,
37532f624233SNattuvetty Bhavyan iGroupMembers[i].ident_size);
37548fe96085Stim szeto }
37558fe96085Stim szeto
37568fe96085Stim szeto done:
37578fe96085Stim szeto free(iGroupMembers);
37588fe96085Stim szeto (void) close(fd);
37598fe96085Stim szeto return (ret);
37608fe96085Stim szeto }
37618fe96085Stim szeto
37628fe96085Stim szeto /*
37638fe96085Stim szeto * Purpose: access persistent config data for host groups and target groups
37648fe96085Stim szeto */
37658fe96085Stim szeto static int
iLoadGroupFromPs(stmfGroupList ** groupList,int type)37668fe96085Stim szeto iLoadGroupFromPs(stmfGroupList **groupList, int type)
37678fe96085Stim szeto {
37688fe96085Stim szeto int ret;
37698fe96085Stim szeto
37708fe96085Stim szeto if (groupList == NULL) {
37718fe96085Stim szeto return (STMF_ERROR_INVALID_ARG);
37728fe96085Stim szeto }
37738fe96085Stim szeto
37748fe96085Stim szeto if (type == HOST_GROUP) {
37758fe96085Stim szeto ret = psGetHostGroupList(groupList);
37768fe96085Stim szeto } else if (type == TARGET_GROUP) {
37778fe96085Stim szeto ret = psGetTargetGroupList(groupList);
37788fe96085Stim szeto } else {
37798fe96085Stim szeto return (STMF_ERROR_INVALID_ARG);
37808fe96085Stim szeto }
3781fcf3ce44SJohn Forte switch (ret) {
3782fcf3ce44SJohn Forte case STMF_PS_SUCCESS:
3783fcf3ce44SJohn Forte ret = STMF_STATUS_SUCCESS;
3784fcf3ce44SJohn Forte break;
3785fcf3ce44SJohn Forte case STMF_PS_ERROR_NOT_FOUND:
3786fcf3ce44SJohn Forte ret = STMF_ERROR_NOT_FOUND;
3787fcf3ce44SJohn Forte break;
3788fcf3ce44SJohn Forte case STMF_PS_ERROR_BUSY:
3789fcf3ce44SJohn Forte ret = STMF_ERROR_BUSY;
3790fcf3ce44SJohn Forte break;
3791fcf3ce44SJohn Forte case STMF_PS_ERROR_SERVICE_NOT_FOUND:
3792fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_NOT_FOUND;
3793fcf3ce44SJohn Forte break;
3794fcf3ce44SJohn Forte case STMF_PS_ERROR_VERSION_MISMATCH:
3795fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_DATA_VERSION;
3796fcf3ce44SJohn Forte break;
3797fcf3ce44SJohn Forte default:
3798fcf3ce44SJohn Forte syslog(LOG_DEBUG,
3799fcf3ce44SJohn Forte "stmfGetHostGroupList:psGetHostGroupList:error(%d)",
3800fcf3ce44SJohn Forte ret);
3801fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR;
3802fcf3ce44SJohn Forte break;
3803fcf3ce44SJohn Forte }
3804fcf3ce44SJohn Forte
3805fcf3ce44SJohn Forte return (ret);
3806fcf3ce44SJohn Forte }
3807fcf3ce44SJohn Forte
3808fcf3ce44SJohn Forte /*
38098fe96085Stim szeto * stmfGetHostGroupList
3810fcf3ce44SJohn Forte *
38118fe96085Stim szeto * Purpose: Retrieves the list of initiator group oids
3812fcf3ce44SJohn Forte *
38138fe96085Stim szeto * hostGroupList - pointer to pointer to hostGroupList structure
38148fe96085Stim szeto * on success, this contains the host group list.
3815fcf3ce44SJohn Forte */
3816fcf3ce44SJohn Forte int
stmfGetHostGroupList(stmfGroupList ** hostGroupList)38178fe96085Stim szeto stmfGetHostGroupList(stmfGroupList **hostGroupList)
3818fcf3ce44SJohn Forte {
38198fe96085Stim szeto int ret = STMF_STATUS_ERROR;
3820fcf3ce44SJohn Forte
38218fe96085Stim szeto if (hostGroupList == NULL) {
3822fcf3ce44SJohn Forte return (STMF_ERROR_INVALID_ARG);
3823fcf3ce44SJohn Forte }
3824fcf3ce44SJohn Forte
38258fe96085Stim szeto ret = groupListIoctl(hostGroupList, HOST_GROUP);
38268fe96085Stim szeto return (ret);
38278fe96085Stim szeto }
38288fe96085Stim szeto
38298fe96085Stim szeto
38308fe96085Stim szeto /*
38318fe96085Stim szeto * Purpose: access persistent config data for host groups and target groups
38328fe96085Stim szeto */
38338fe96085Stim szeto static int
iLoadGroupMembersFromPs(stmfGroupName * groupName,stmfGroupProperties ** groupProp,int type)38348fe96085Stim szeto iLoadGroupMembersFromPs(stmfGroupName *groupName,
38358fe96085Stim szeto stmfGroupProperties **groupProp, int type)
38368fe96085Stim szeto {
38378fe96085Stim szeto int ret;
38388fe96085Stim szeto
38398fe96085Stim szeto if (groupName == NULL) {
38408fe96085Stim szeto return (STMF_ERROR_INVALID_ARG);
38418fe96085Stim szeto }
38428fe96085Stim szeto
38438fe96085Stim szeto if (type == HOST_GROUP) {
3844fcf3ce44SJohn Forte ret = psGetHostGroupMemberList((char *)groupName, groupProp);
38458fe96085Stim szeto } else if (type == TARGET_GROUP) {
38468fe96085Stim szeto ret = psGetTargetGroupMemberList((char *)groupName, groupProp);
38478fe96085Stim szeto } else {
38488fe96085Stim szeto return (STMF_ERROR_INVALID_ARG);
38498fe96085Stim szeto }
3850fcf3ce44SJohn Forte switch (ret) {
3851fcf3ce44SJohn Forte case STMF_PS_SUCCESS:
3852fcf3ce44SJohn Forte ret = STMF_STATUS_SUCCESS;
3853fcf3ce44SJohn Forte break;
3854fcf3ce44SJohn Forte case STMF_PS_ERROR_NOT_FOUND:
3855fcf3ce44SJohn Forte ret = STMF_ERROR_NOT_FOUND;
3856fcf3ce44SJohn Forte break;
3857fcf3ce44SJohn Forte case STMF_PS_ERROR_BUSY:
3858fcf3ce44SJohn Forte ret = STMF_ERROR_BUSY;
3859fcf3ce44SJohn Forte break;
3860fcf3ce44SJohn Forte case STMF_PS_ERROR_SERVICE_NOT_FOUND:
3861fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_NOT_FOUND;
3862fcf3ce44SJohn Forte break;
3863fcf3ce44SJohn Forte case STMF_PS_ERROR_VERSION_MISMATCH:
3864fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_DATA_VERSION;
3865fcf3ce44SJohn Forte break;
3866fcf3ce44SJohn Forte default:
3867fcf3ce44SJohn Forte syslog(LOG_DEBUG,
38688fe96085Stim szeto "iLoadGroupMembersFromPs:psGetHostGroupList:"
38698fe96085Stim szeto "error(%d)", ret);
3870fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR;
3871fcf3ce44SJohn Forte break;
3872fcf3ce44SJohn Forte }
3873fcf3ce44SJohn Forte
3874fcf3ce44SJohn Forte return (ret);
3875fcf3ce44SJohn Forte }
3876fcf3ce44SJohn Forte
3877fcf3ce44SJohn Forte /*
38788fe96085Stim szeto * stmfGetHostGroupMembers
38798fe96085Stim szeto *
38808fe96085Stim szeto * Purpose: Retrieves the group properties for a host group
38818fe96085Stim szeto *
38828fe96085Stim szeto * groupName - name of group for which to retrieve host group members.
38838fe96085Stim szeto * groupProp - pointer to pointer to stmfGroupProperties structure
38848fe96085Stim szeto * on success, this contains the list of group members.
38858fe96085Stim szeto */
38868fe96085Stim szeto int
stmfGetHostGroupMembers(stmfGroupName * groupName,stmfGroupProperties ** groupProp)38878fe96085Stim szeto stmfGetHostGroupMembers(stmfGroupName *groupName,
38888fe96085Stim szeto stmfGroupProperties **groupProp)
38898fe96085Stim szeto {
38908fe96085Stim szeto int ret;
38918fe96085Stim szeto
38928fe96085Stim szeto if (groupName == NULL || groupProp == NULL) {
38938fe96085Stim szeto return (STMF_ERROR_INVALID_ARG);
38948fe96085Stim szeto }
38958fe96085Stim szeto
38968fe96085Stim szeto ret = groupMemberListIoctl(groupName, groupProp, HOST_GROUP);
38978fe96085Stim szeto
38988fe96085Stim szeto return (ret);
38998fe96085Stim szeto }
39008fe96085Stim szeto
39018fe96085Stim szeto /*
3902fcf3ce44SJohn Forte * stmfGetProviderData
3903fcf3ce44SJohn Forte *
3904fcf3ce44SJohn Forte * Purpose: Get provider data list
3905fcf3ce44SJohn Forte *
3906fcf3ce44SJohn Forte * providerName - name of provider for which to retrieve the data
3907fcf3ce44SJohn Forte * nvl - pointer to nvlist_t pointer which will contain the nvlist data
3908fcf3ce44SJohn Forte * retrieved.
3909fcf3ce44SJohn Forte * providerType - type of provider for which to retrieve data.
3910fcf3ce44SJohn Forte * STMF_LU_PROVIDER_TYPE
3911fcf3ce44SJohn Forte * STMF_PORT_PROVIDER_TYPE
3912fcf3ce44SJohn Forte */
3913fcf3ce44SJohn Forte int
stmfGetProviderData(char * providerName,nvlist_t ** nvl,int providerType)3914fcf3ce44SJohn Forte stmfGetProviderData(char *providerName, nvlist_t **nvl, int providerType)
3915fcf3ce44SJohn Forte {
3916fcf3ce44SJohn Forte return (stmfGetProviderDataProt(providerName, nvl, providerType,
3917fcf3ce44SJohn Forte NULL));
3918fcf3ce44SJohn Forte }
3919fcf3ce44SJohn Forte
3920fcf3ce44SJohn Forte /*
3921fcf3ce44SJohn Forte * stmfGetProviderDataProt
3922fcf3ce44SJohn Forte *
3923fcf3ce44SJohn Forte * Purpose: Get provider data list with token
3924fcf3ce44SJohn Forte *
3925fcf3ce44SJohn Forte * providerName - name of provider for which to retrieve the data
3926fcf3ce44SJohn Forte * nvl - pointer to nvlist_t pointer which will contain the nvlist data
3927fcf3ce44SJohn Forte * retrieved.
3928fcf3ce44SJohn Forte * providerType - type of provider for which to retrieve data.
3929fcf3ce44SJohn Forte * STMF_LU_PROVIDER_TYPE
3930fcf3ce44SJohn Forte * STMF_PORT_PROVIDER_TYPE
3931fcf3ce44SJohn Forte * setToken - Returns the stale data token
3932fcf3ce44SJohn Forte */
3933fcf3ce44SJohn Forte int
stmfGetProviderDataProt(char * providerName,nvlist_t ** nvl,int providerType,uint64_t * setToken)3934fcf3ce44SJohn Forte stmfGetProviderDataProt(char *providerName, nvlist_t **nvl, int providerType,
3935fcf3ce44SJohn Forte uint64_t *setToken)
3936fcf3ce44SJohn Forte {
3937fcf3ce44SJohn Forte int ret;
3938fcf3ce44SJohn Forte
3939fcf3ce44SJohn Forte if (providerName == NULL || nvl == NULL) {
3940fcf3ce44SJohn Forte return (STMF_ERROR_INVALID_ARG);
3941fcf3ce44SJohn Forte }
3942fcf3ce44SJohn Forte if (providerType != STMF_LU_PROVIDER_TYPE &&
3943fcf3ce44SJohn Forte providerType != STMF_PORT_PROVIDER_TYPE) {
3944fcf3ce44SJohn Forte return (STMF_ERROR_INVALID_ARG);
3945fcf3ce44SJohn Forte }
3946fcf3ce44SJohn Forte /* call init */
3947fcf3ce44SJohn Forte ret = initializeConfig();
3948fcf3ce44SJohn Forte if (ret != STMF_STATUS_SUCCESS) {
3949fcf3ce44SJohn Forte return (ret);
3950fcf3ce44SJohn Forte }
39518fe96085Stim szeto return (getProviderData(providerName, nvl, providerType, setToken));
3952fcf3ce44SJohn Forte }
3953fcf3ce44SJohn Forte
3954fcf3ce44SJohn Forte /*
3955fcf3ce44SJohn Forte * stmfGetProviderDataList
3956fcf3ce44SJohn Forte *
3957fcf3ce44SJohn Forte * Purpose: Get the list of providers currently persisting data
3958fcf3ce44SJohn Forte *
3959fcf3ce44SJohn Forte * providerList - pointer to pointer to an stmfProviderList structure allocated
3960fcf3ce44SJohn Forte * by the caller. Will contain the list of providers on success.
3961fcf3ce44SJohn Forte */
3962fcf3ce44SJohn Forte int
stmfGetProviderDataList(stmfProviderList ** providerList)3963fcf3ce44SJohn Forte stmfGetProviderDataList(stmfProviderList **providerList)
3964fcf3ce44SJohn Forte {
3965fcf3ce44SJohn Forte int ret;
3966fcf3ce44SJohn Forte
3967fcf3ce44SJohn Forte ret = psGetProviderDataList(providerList);
3968fcf3ce44SJohn Forte switch (ret) {
3969fcf3ce44SJohn Forte case STMF_PS_SUCCESS:
3970fcf3ce44SJohn Forte ret = STMF_STATUS_SUCCESS;
3971fcf3ce44SJohn Forte break;
3972fcf3ce44SJohn Forte case STMF_PS_ERROR_BUSY:
3973fcf3ce44SJohn Forte ret = STMF_ERROR_BUSY;
3974fcf3ce44SJohn Forte break;
3975fcf3ce44SJohn Forte case STMF_PS_ERROR_SERVICE_NOT_FOUND:
3976fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_NOT_FOUND;
3977fcf3ce44SJohn Forte break;
3978fcf3ce44SJohn Forte case STMF_PS_ERROR_VERSION_MISMATCH:
3979fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_DATA_VERSION;
3980fcf3ce44SJohn Forte break;
3981fcf3ce44SJohn Forte default:
3982fcf3ce44SJohn Forte syslog(LOG_DEBUG,
3983fcf3ce44SJohn Forte "stmfGetProviderDataList:psGetProviderDataList"
3984fcf3ce44SJohn Forte ":error(%d)", ret);
3985fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR;
3986fcf3ce44SJohn Forte break;
3987fcf3ce44SJohn Forte }
3988fcf3ce44SJohn Forte
3989fcf3ce44SJohn Forte return (ret);
3990fcf3ce44SJohn Forte }
3991fcf3ce44SJohn Forte
3992fcf3ce44SJohn Forte
3993fcf3ce44SJohn Forte /*
3994fcf3ce44SJohn Forte * stmfGetSessionList
3995fcf3ce44SJohn Forte *
3996fcf3ce44SJohn Forte * Purpose: Retrieves the session list for a target (devid)
3997fcf3ce44SJohn Forte *
3998fcf3ce44SJohn Forte * devid - devid of target for which to retrieve session information.
3999fcf3ce44SJohn Forte * sessionList - pointer to pointer to stmfSessionList structure
4000fcf3ce44SJohn Forte * on success, this contains the list of initiator sessions.
4001fcf3ce44SJohn Forte */
4002fcf3ce44SJohn Forte int
stmfGetSessionList(stmfDevid * devid,stmfSessionList ** sessionList)4003fcf3ce44SJohn Forte stmfGetSessionList(stmfDevid *devid, stmfSessionList **sessionList)
4004fcf3ce44SJohn Forte {
4005fcf3ce44SJohn Forte int ret = STMF_STATUS_SUCCESS;
4006fcf3ce44SJohn Forte int fd;
4007fcf3ce44SJohn Forte int ioctlRet;
4008fcf3ce44SJohn Forte int cmd = STMF_IOCTL_SESSION_LIST;
4009fcf3ce44SJohn Forte int i;
4010fcf3ce44SJohn Forte stmf_iocdata_t stmfIoctl;
401156261083SCharles Ting slist_scsi_session_t *fSessionList, *fSessionListP = NULL;
4012fcf3ce44SJohn Forte uint8_t ident[260];
4013fcf3ce44SJohn Forte uint32_t fSessionListSize;
4014fcf3ce44SJohn Forte
4015fcf3ce44SJohn Forte if (sessionList == NULL || devid == NULL) {
4016fcf3ce44SJohn Forte ret = STMF_ERROR_INVALID_ARG;
4017fcf3ce44SJohn Forte }
4018fcf3ce44SJohn Forte
4019fcf3ce44SJohn Forte /* call init */
4020fcf3ce44SJohn Forte ret = initializeConfig();
4021fcf3ce44SJohn Forte if (ret != STMF_STATUS_SUCCESS) {
4022fcf3ce44SJohn Forte return (ret);
4023fcf3ce44SJohn Forte }
4024fcf3ce44SJohn Forte
4025fcf3ce44SJohn Forte /*
4026fcf3ce44SJohn Forte * Open control node for stmf
4027fcf3ce44SJohn Forte */
4028fcf3ce44SJohn Forte if ((ret = openStmf(OPEN_STMF, &fd)) != STMF_STATUS_SUCCESS)
4029fcf3ce44SJohn Forte return (ret);
4030fcf3ce44SJohn Forte
4031fcf3ce44SJohn Forte /*
4032fcf3ce44SJohn Forte * Allocate ioctl input buffer
4033fcf3ce44SJohn Forte */
40348fe96085Stim szeto fSessionListSize = ALLOC_SESSION;
4035fcf3ce44SJohn Forte fSessionListSize = fSessionListSize * (sizeof (slist_scsi_session_t));
4036fcf3ce44SJohn Forte fSessionList = (slist_scsi_session_t *)calloc(1, fSessionListSize);
403756261083SCharles Ting fSessionListP = fSessionList;
4038fcf3ce44SJohn Forte if (fSessionList == NULL) {
403956261083SCharles Ting ret = STMF_ERROR_NOMEM;
404056261083SCharles Ting goto done;
4041fcf3ce44SJohn Forte }
4042fcf3ce44SJohn Forte
4043fcf3ce44SJohn Forte ident[IDENT_LENGTH_BYTE] = devid->identLength;
4044fcf3ce44SJohn Forte bcopy(&(devid->ident), &ident[IDENT_LENGTH_BYTE + 1],
4045fcf3ce44SJohn Forte devid->identLength);
4046fcf3ce44SJohn Forte
4047fcf3ce44SJohn Forte bzero(&stmfIoctl, sizeof (stmfIoctl));
4048fcf3ce44SJohn Forte /*
4049fcf3ce44SJohn Forte * Issue ioctl to get the session list
4050fcf3ce44SJohn Forte */
4051fcf3ce44SJohn Forte stmfIoctl.stmf_version = STMF_VERSION_1;
4052fcf3ce44SJohn Forte stmfIoctl.stmf_ibuf = (uint64_t)(unsigned long)&ident;
4053fcf3ce44SJohn Forte stmfIoctl.stmf_ibuf_size = sizeof (ident);
4054fcf3ce44SJohn Forte stmfIoctl.stmf_obuf_size = fSessionListSize;
4055fcf3ce44SJohn Forte stmfIoctl.stmf_obuf = (uint64_t)(unsigned long)fSessionList;
4056fcf3ce44SJohn Forte ioctlRet = ioctl(fd, cmd, &stmfIoctl);
4057fcf3ce44SJohn Forte if (ioctlRet != 0) {
4058fcf3ce44SJohn Forte switch (errno) {
4059fcf3ce44SJohn Forte case EBUSY:
4060fcf3ce44SJohn Forte ret = STMF_ERROR_BUSY;
4061fcf3ce44SJohn Forte break;
40628fe96085Stim szeto case EPERM:
4063fcf3ce44SJohn Forte case EACCES:
4064fcf3ce44SJohn Forte ret = STMF_ERROR_PERM;
4065fcf3ce44SJohn Forte break;
4066fcf3ce44SJohn Forte default:
4067fcf3ce44SJohn Forte syslog(LOG_DEBUG,
4068fcf3ce44SJohn Forte "stmfGetSessionList:ioctl errno(%d)",
4069fcf3ce44SJohn Forte errno);
4070fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR;
4071fcf3ce44SJohn Forte break;
4072fcf3ce44SJohn Forte }
4073fcf3ce44SJohn Forte goto done;
4074fcf3ce44SJohn Forte }
4075fcf3ce44SJohn Forte /*
4076fcf3ce44SJohn Forte * Check whether input buffer was large enough
4077fcf3ce44SJohn Forte */
40788fe96085Stim szeto if (stmfIoctl.stmf_obuf_max_nentries > ALLOC_SESSION) {
4079fcf3ce44SJohn Forte fSessionListSize = stmfIoctl.stmf_obuf_max_nentries *
4080fcf3ce44SJohn Forte sizeof (slist_scsi_session_t);
4081fcf3ce44SJohn Forte fSessionList = realloc(fSessionList, fSessionListSize);
4082fcf3ce44SJohn Forte if (fSessionList == NULL) {
408356261083SCharles Ting ret = STMF_ERROR_NOMEM;
408456261083SCharles Ting goto done;
4085fcf3ce44SJohn Forte }
408656261083SCharles Ting fSessionListP = fSessionList;
4087fcf3ce44SJohn Forte stmfIoctl.stmf_obuf_size = fSessionListSize;
4088fcf3ce44SJohn Forte stmfIoctl.stmf_obuf = (uint64_t)(unsigned long)fSessionList;
4089fcf3ce44SJohn Forte ioctlRet = ioctl(fd, cmd, &stmfIoctl);
4090fcf3ce44SJohn Forte if (ioctlRet != 0) {
4091fcf3ce44SJohn Forte switch (errno) {
4092fcf3ce44SJohn Forte case EBUSY:
4093fcf3ce44SJohn Forte ret = STMF_ERROR_BUSY;
4094fcf3ce44SJohn Forte break;
40958fe96085Stim szeto case EPERM:
4096fcf3ce44SJohn Forte case EACCES:
4097fcf3ce44SJohn Forte ret = STMF_ERROR_PERM;
4098fcf3ce44SJohn Forte break;
4099fcf3ce44SJohn Forte default:
4100fcf3ce44SJohn Forte syslog(LOG_DEBUG,
4101fcf3ce44SJohn Forte "stmfGetSessionList:ioctl "
4102fcf3ce44SJohn Forte "errno(%d)", errno);
4103fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR;
4104fcf3ce44SJohn Forte break;
4105fcf3ce44SJohn Forte }
4106fcf3ce44SJohn Forte goto done;
4107fcf3ce44SJohn Forte }
4108fcf3ce44SJohn Forte }
4109fcf3ce44SJohn Forte
4110fcf3ce44SJohn Forte /*
4111fcf3ce44SJohn Forte * allocate caller's buffer with the final size
4112fcf3ce44SJohn Forte */
4113fcf3ce44SJohn Forte *sessionList = (stmfSessionList *)calloc(1, sizeof (stmfSessionList) +
4114fcf3ce44SJohn Forte stmfIoctl.stmf_obuf_max_nentries * sizeof (stmfSession));
4115fcf3ce44SJohn Forte if (*sessionList == NULL) {
4116fcf3ce44SJohn Forte ret = STMF_ERROR_NOMEM;
4117fcf3ce44SJohn Forte free(sessionList);
4118fcf3ce44SJohn Forte goto done;
4119fcf3ce44SJohn Forte }
4120fcf3ce44SJohn Forte
4121fcf3ce44SJohn Forte (*sessionList)->cnt = stmfIoctl.stmf_obuf_max_nentries;
4122fcf3ce44SJohn Forte
4123fcf3ce44SJohn Forte /*
4124fcf3ce44SJohn Forte * copy session info to caller's buffer
4125fcf3ce44SJohn Forte */
4126fcf3ce44SJohn Forte for (i = 0; i < (*sessionList)->cnt; i++) {
4127fcf3ce44SJohn Forte (*sessionList)->session[i].initiator.identLength =
4128fcf3ce44SJohn Forte fSessionList->initiator[IDENT_LENGTH_BYTE];
4129fcf3ce44SJohn Forte bcopy(&(fSessionList->initiator[IDENT_LENGTH_BYTE + 1]),
4130fcf3ce44SJohn Forte (*sessionList)->session[i].initiator.ident,
4131fcf3ce44SJohn Forte STMF_IDENT_LENGTH);
4132fcf3ce44SJohn Forte bcopy(&(fSessionList->alias),
4133fcf3ce44SJohn Forte &((*sessionList)->session[i].alias),
4134fcf3ce44SJohn Forte sizeof ((*sessionList)->session[i].alias));
4135fcf3ce44SJohn Forte bcopy(&(fSessionList++->creation_time),
4136fcf3ce44SJohn Forte &((*sessionList)->session[i].creationTime),
4137fcf3ce44SJohn Forte sizeof (time_t));
4138fcf3ce44SJohn Forte }
4139fcf3ce44SJohn Forte done:
4140fcf3ce44SJohn Forte (void) close(fd);
414156261083SCharles Ting free(fSessionListP);
4142fcf3ce44SJohn Forte return (ret);
4143fcf3ce44SJohn Forte }
4144fcf3ce44SJohn Forte
4145fcf3ce44SJohn Forte /*
4146fcf3ce44SJohn Forte * stmfGetTargetGroupList
4147fcf3ce44SJohn Forte *
4148fcf3ce44SJohn Forte * Purpose: Retrieves the list of target groups
4149fcf3ce44SJohn Forte *
4150fcf3ce44SJohn Forte * targetGroupList - pointer to a pointer to an stmfGroupList structure. On
4151fcf3ce44SJohn Forte * success, it contains the list of target groups.
4152fcf3ce44SJohn Forte */
4153fcf3ce44SJohn Forte int
stmfGetTargetGroupList(stmfGroupList ** targetGroupList)4154fcf3ce44SJohn Forte stmfGetTargetGroupList(stmfGroupList **targetGroupList)
4155fcf3ce44SJohn Forte {
4156fcf3ce44SJohn Forte int ret;
4157fcf3ce44SJohn Forte
4158fcf3ce44SJohn Forte if (targetGroupList == NULL) {
4159fcf3ce44SJohn Forte return (STMF_ERROR_INVALID_ARG);
4160fcf3ce44SJohn Forte }
4161fcf3ce44SJohn Forte
41628fe96085Stim szeto ret = groupListIoctl(targetGroupList, TARGET_GROUP);
4163fcf3ce44SJohn Forte return (ret);
4164fcf3ce44SJohn Forte }
4165fcf3ce44SJohn Forte
4166fcf3ce44SJohn Forte /*
4167fcf3ce44SJohn Forte * stmfGetTargetGroupMembers
4168fcf3ce44SJohn Forte *
4169fcf3ce44SJohn Forte * Purpose: Retrieves the group members for a target group
4170fcf3ce44SJohn Forte *
4171fcf3ce44SJohn Forte * groupName - name of target group for which to retrieve members.
4172fcf3ce44SJohn Forte * groupProp - pointer to pointer to stmfGroupProperties structure
4173fcf3ce44SJohn Forte * on success, this contains the list of group members.
4174fcf3ce44SJohn Forte */
4175fcf3ce44SJohn Forte int
stmfGetTargetGroupMembers(stmfGroupName * groupName,stmfGroupProperties ** groupProp)4176fcf3ce44SJohn Forte stmfGetTargetGroupMembers(stmfGroupName *groupName,
4177fcf3ce44SJohn Forte stmfGroupProperties **groupProp)
4178fcf3ce44SJohn Forte {
4179fcf3ce44SJohn Forte int ret;
4180fcf3ce44SJohn Forte
4181fcf3ce44SJohn Forte if (groupName == NULL || groupProp == NULL) {
4182fcf3ce44SJohn Forte return (STMF_ERROR_INVALID_ARG);
4183fcf3ce44SJohn Forte }
4184fcf3ce44SJohn Forte
41858fe96085Stim szeto ret = groupMemberListIoctl(groupName, groupProp, TARGET_GROUP);
4186fcf3ce44SJohn Forte
4187fcf3ce44SJohn Forte return (ret);
4188fcf3ce44SJohn Forte }
4189fcf3ce44SJohn Forte
4190fcf3ce44SJohn Forte /*
4191fcf3ce44SJohn Forte * stmfGetTargetList
4192fcf3ce44SJohn Forte *
4193fcf3ce44SJohn Forte * Purpose: Retrieves the list of target ports
4194fcf3ce44SJohn Forte *
4195fcf3ce44SJohn Forte * targetList - pointer to a pointer to an stmfDevidList structure.
4196fcf3ce44SJohn Forte * On success, it contains the list of local ports (target).
4197fcf3ce44SJohn Forte */
4198fcf3ce44SJohn Forte int
stmfGetTargetList(stmfDevidList ** targetList)4199fcf3ce44SJohn Forte stmfGetTargetList(stmfDevidList **targetList)
4200fcf3ce44SJohn Forte {
4201fcf3ce44SJohn Forte int ret;
4202fcf3ce44SJohn Forte int fd;
4203fcf3ce44SJohn Forte int ioctlRet;
4204fcf3ce44SJohn Forte int i;
4205fcf3ce44SJohn Forte stmf_iocdata_t stmfIoctl;
4206fcf3ce44SJohn Forte /* framework target port list */
42078fe96085Stim szeto slist_target_port_t *fTargetList, *fTargetListP = NULL;
4208fcf3ce44SJohn Forte uint32_t fTargetListSize;
4209fcf3ce44SJohn Forte
4210fcf3ce44SJohn Forte if (targetList == NULL) {
4211fcf3ce44SJohn Forte return (STMF_ERROR_INVALID_ARG);
4212fcf3ce44SJohn Forte }
4213fcf3ce44SJohn Forte
4214fcf3ce44SJohn Forte /* call init */
4215fcf3ce44SJohn Forte ret = initializeConfig();
4216fcf3ce44SJohn Forte if (ret != STMF_STATUS_SUCCESS) {
4217fcf3ce44SJohn Forte return (ret);
4218fcf3ce44SJohn Forte }
4219fcf3ce44SJohn Forte
4220fcf3ce44SJohn Forte /*
4221fcf3ce44SJohn Forte * Open control node for stmf
4222fcf3ce44SJohn Forte */
4223fcf3ce44SJohn Forte if ((ret = openStmf(OPEN_STMF, &fd)) != STMF_STATUS_SUCCESS)
4224fcf3ce44SJohn Forte return (ret);
4225fcf3ce44SJohn Forte
4226fcf3ce44SJohn Forte /*
4227fcf3ce44SJohn Forte * Allocate ioctl input buffer
4228fcf3ce44SJohn Forte */
42298fe96085Stim szeto fTargetListSize = ALLOC_TARGET_PORT * sizeof (slist_target_port_t);
42303e7352aeSJohn Forte fTargetListP = fTargetList =
42313e7352aeSJohn Forte (slist_target_port_t *)calloc(1, fTargetListSize);
4232fcf3ce44SJohn Forte if (fTargetList == NULL) {
42338fe96085Stim szeto ret = STMF_ERROR_NOMEM;
4234fcf3ce44SJohn Forte goto done;
4235fcf3ce44SJohn Forte }
4236fcf3ce44SJohn Forte
4237fcf3ce44SJohn Forte bzero(&stmfIoctl, sizeof (stmfIoctl));
4238fcf3ce44SJohn Forte /*
42393e7352aeSJohn Forte * Issue ioctl to retrieve target list
4240fcf3ce44SJohn Forte */
4241fcf3ce44SJohn Forte stmfIoctl.stmf_version = STMF_VERSION_1;
4242fcf3ce44SJohn Forte stmfIoctl.stmf_obuf_size = fTargetListSize;
4243fcf3ce44SJohn Forte stmfIoctl.stmf_obuf = (uint64_t)(unsigned long)fTargetList;
4244fcf3ce44SJohn Forte ioctlRet = ioctl(fd, STMF_IOCTL_TARGET_PORT_LIST, &stmfIoctl);
4245fcf3ce44SJohn Forte if (ioctlRet != 0) {
4246fcf3ce44SJohn Forte switch (errno) {
4247fcf3ce44SJohn Forte case EBUSY:
4248fcf3ce44SJohn Forte ret = STMF_ERROR_BUSY;
4249fcf3ce44SJohn Forte break;
42508fe96085Stim szeto case EPERM:
4251fcf3ce44SJohn Forte case EACCES:
4252fcf3ce44SJohn Forte ret = STMF_ERROR_PERM;
4253fcf3ce44SJohn Forte break;
4254fcf3ce44SJohn Forte default:
4255fcf3ce44SJohn Forte syslog(LOG_DEBUG,
4256fcf3ce44SJohn Forte "stmfGetTargetList:ioctl errno(%d)", errno);
4257fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR;
4258fcf3ce44SJohn Forte break;
4259fcf3ce44SJohn Forte }
4260fcf3ce44SJohn Forte goto done;
4261fcf3ce44SJohn Forte }
4262fcf3ce44SJohn Forte /*
4263fcf3ce44SJohn Forte * Check whether input buffer was large enough
4264fcf3ce44SJohn Forte */
42658fe96085Stim szeto if (stmfIoctl.stmf_obuf_max_nentries > ALLOC_TARGET_PORT) {
4266fcf3ce44SJohn Forte fTargetListSize = stmfIoctl.stmf_obuf_max_nentries *
426776602b8dSJohn Forte sizeof (slist_target_port_t);
42683e7352aeSJohn Forte fTargetListP = fTargetList =
42693e7352aeSJohn Forte realloc(fTargetList, fTargetListSize);
4270fcf3ce44SJohn Forte if (fTargetList == NULL) {
42718fe96085Stim szeto ret = STMF_ERROR_NOMEM;
42728fe96085Stim szeto goto done;
4273fcf3ce44SJohn Forte }
4274fcf3ce44SJohn Forte stmfIoctl.stmf_obuf_size = fTargetListSize;
4275fcf3ce44SJohn Forte stmfIoctl.stmf_obuf = (uint64_t)(unsigned long)fTargetList;
4276fcf3ce44SJohn Forte ioctlRet = ioctl(fd, STMF_IOCTL_TARGET_PORT_LIST,
4277fcf3ce44SJohn Forte &stmfIoctl);
4278fcf3ce44SJohn Forte if (ioctlRet != 0) {
4279fcf3ce44SJohn Forte switch (errno) {
4280fcf3ce44SJohn Forte case EBUSY:
4281fcf3ce44SJohn Forte ret = STMF_ERROR_BUSY;
4282fcf3ce44SJohn Forte break;
42838fe96085Stim szeto case EPERM:
4284fcf3ce44SJohn Forte case EACCES:
4285fcf3ce44SJohn Forte ret = STMF_ERROR_PERM;
4286fcf3ce44SJohn Forte break;
4287fcf3ce44SJohn Forte default:
4288fcf3ce44SJohn Forte syslog(LOG_DEBUG,
4289fcf3ce44SJohn Forte "stmfGetTargetList:ioctl errno(%d)",
4290fcf3ce44SJohn Forte errno);
4291fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR;
4292fcf3ce44SJohn Forte break;
4293fcf3ce44SJohn Forte }
4294fcf3ce44SJohn Forte goto done;
4295fcf3ce44SJohn Forte }
4296fcf3ce44SJohn Forte }
4297fcf3ce44SJohn Forte
4298fcf3ce44SJohn Forte *targetList = (stmfDevidList *)calloc(1,
4299fcf3ce44SJohn Forte stmfIoctl.stmf_obuf_max_nentries * sizeof (stmfDevid) +
4300fcf3ce44SJohn Forte sizeof (stmfDevidList));
43018fe96085Stim szeto if (*targetList == NULL) {
43028fe96085Stim szeto ret = STMF_ERROR_NOMEM;
43038fe96085Stim szeto goto done;
43048fe96085Stim szeto }
4305fcf3ce44SJohn Forte
4306fcf3ce44SJohn Forte (*targetList)->cnt = stmfIoctl.stmf_obuf_max_nentries;
4307fcf3ce44SJohn Forte for (i = 0; i < stmfIoctl.stmf_obuf_max_nentries; i++, fTargetList++) {
4308fcf3ce44SJohn Forte (*targetList)->devid[i].identLength =
4309fcf3ce44SJohn Forte fTargetList->target[IDENT_LENGTH_BYTE];
4310fcf3ce44SJohn Forte bcopy(&fTargetList->target[IDENT_LENGTH_BYTE + 1],
4311fcf3ce44SJohn Forte &(*targetList)->devid[i].ident,
4312fcf3ce44SJohn Forte fTargetList->target[IDENT_LENGTH_BYTE]);
4313fcf3ce44SJohn Forte }
4314fcf3ce44SJohn Forte
4315fcf3ce44SJohn Forte done:
4316fcf3ce44SJohn Forte (void) close(fd);
43173e7352aeSJohn Forte free(fTargetListP);
4318fcf3ce44SJohn Forte return (ret);
4319fcf3ce44SJohn Forte }
4320fcf3ce44SJohn Forte
4321fcf3ce44SJohn Forte /*
4322fcf3ce44SJohn Forte * stmfGetTargetProperties
4323fcf3ce44SJohn Forte *
4324fcf3ce44SJohn Forte * Purpose: Retrieves the properties for a logical unit
4325fcf3ce44SJohn Forte *
4326fcf3ce44SJohn Forte * devid - devid of the target for which to retrieve properties
4327fcf3ce44SJohn Forte * targetProps - pointer to an stmfTargetProperties structure.
4328fcf3ce44SJohn Forte * On success, it contains the target properties for
4329fcf3ce44SJohn Forte * the specified devid.
4330fcf3ce44SJohn Forte */
4331fcf3ce44SJohn Forte int
stmfGetTargetProperties(stmfDevid * devid,stmfTargetProperties * targetProps)4332fcf3ce44SJohn Forte stmfGetTargetProperties(stmfDevid *devid, stmfTargetProperties *targetProps)
4333fcf3ce44SJohn Forte {
4334fcf3ce44SJohn Forte int ret = STMF_STATUS_SUCCESS;
4335fcf3ce44SJohn Forte int fd;
4336fcf3ce44SJohn Forte int ioctlRet;
4337fcf3ce44SJohn Forte stmf_iocdata_t stmfIoctl;
4338fcf3ce44SJohn Forte sioc_target_port_props_t targetProperties;
433945039663SJohn Forte scsi_devid_desc_t *scsiDevid;
4340fcf3ce44SJohn Forte
4341fcf3ce44SJohn Forte if (devid == NULL || targetProps == NULL) {
4342fcf3ce44SJohn Forte return (STMF_ERROR_INVALID_ARG);
4343fcf3ce44SJohn Forte }
4344fcf3ce44SJohn Forte
4345fcf3ce44SJohn Forte /* call init */
4346fcf3ce44SJohn Forte ret = initializeConfig();
4347fcf3ce44SJohn Forte if (ret != STMF_STATUS_SUCCESS) {
4348fcf3ce44SJohn Forte return (ret);
4349fcf3ce44SJohn Forte }
4350fcf3ce44SJohn Forte
4351fcf3ce44SJohn Forte /*
4352fcf3ce44SJohn Forte * Open control node for stmf
4353fcf3ce44SJohn Forte */
4354fcf3ce44SJohn Forte if ((ret = openStmf(OPEN_STMF, &fd)) != STMF_STATUS_SUCCESS)
4355fcf3ce44SJohn Forte return (ret);
4356fcf3ce44SJohn Forte
4357fcf3ce44SJohn Forte targetProperties.tgt_id[IDENT_LENGTH_BYTE] = devid->identLength;
4358fcf3ce44SJohn Forte bcopy(&(devid->ident), &targetProperties.tgt_id[IDENT_LENGTH_BYTE + 1],
4359fcf3ce44SJohn Forte devid->identLength);
4360fcf3ce44SJohn Forte
4361fcf3ce44SJohn Forte bzero(&stmfIoctl, sizeof (stmfIoctl));
4362fcf3ce44SJohn Forte /*
4363fcf3ce44SJohn Forte * Issue ioctl to add to the host group
4364fcf3ce44SJohn Forte */
4365fcf3ce44SJohn Forte stmfIoctl.stmf_version = STMF_VERSION_1;
4366fcf3ce44SJohn Forte stmfIoctl.stmf_ibuf_size = sizeof (targetProperties.tgt_id);
4367fcf3ce44SJohn Forte stmfIoctl.stmf_ibuf = (uint64_t)(unsigned long)&targetProperties.tgt_id;
4368fcf3ce44SJohn Forte stmfIoctl.stmf_obuf = (uint64_t)(unsigned long)&targetProperties;
4369fcf3ce44SJohn Forte stmfIoctl.stmf_obuf_size = sizeof (targetProperties);
4370fcf3ce44SJohn Forte ioctlRet = ioctl(fd, STMF_IOCTL_GET_TARGET_PORT_PROPERTIES,
4371fcf3ce44SJohn Forte &stmfIoctl);
4372fcf3ce44SJohn Forte if (ioctlRet != 0) {
4373fcf3ce44SJohn Forte switch (errno) {
4374fcf3ce44SJohn Forte case EBUSY:
4375fcf3ce44SJohn Forte ret = STMF_ERROR_BUSY;
4376fcf3ce44SJohn Forte break;
43778fe96085Stim szeto case EPERM:
4378fcf3ce44SJohn Forte case EACCES:
4379fcf3ce44SJohn Forte ret = STMF_ERROR_PERM;
4380fcf3ce44SJohn Forte break;
4381fcf3ce44SJohn Forte case ENOENT:
4382fcf3ce44SJohn Forte ret = STMF_ERROR_NOT_FOUND;
4383fcf3ce44SJohn Forte break;
4384fcf3ce44SJohn Forte default:
4385fcf3ce44SJohn Forte syslog(LOG_DEBUG,
4386fcf3ce44SJohn Forte "stmfGetTargetProperties:ioctl errno(%d)",
4387fcf3ce44SJohn Forte errno);
4388fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR;
4389fcf3ce44SJohn Forte break;
4390fcf3ce44SJohn Forte }
4391fcf3ce44SJohn Forte goto done;
4392fcf3ce44SJohn Forte }
4393fcf3ce44SJohn Forte
4394fcf3ce44SJohn Forte bcopy(targetProperties.tgt_provider_name, targetProps->providerName,
4395fcf3ce44SJohn Forte sizeof (targetProperties.tgt_provider_name));
4396fcf3ce44SJohn Forte if (targetProperties.tgt_state == STMF_STATE_ONLINE) {
4397fcf3ce44SJohn Forte targetProps->status = STMF_TARGET_PORT_ONLINE;
4398fcf3ce44SJohn Forte } else if (targetProperties.tgt_state == STMF_STATE_OFFLINE) {
4399fcf3ce44SJohn Forte targetProps->status = STMF_TARGET_PORT_OFFLINE;
4400fcf3ce44SJohn Forte } else if (targetProperties.tgt_state == STMF_STATE_ONLINING) {
4401fcf3ce44SJohn Forte targetProps->status = STMF_TARGET_PORT_ONLINING;
4402fcf3ce44SJohn Forte } else if (targetProperties.tgt_state == STMF_STATE_OFFLINING) {
4403fcf3ce44SJohn Forte targetProps->status = STMF_TARGET_PORT_OFFLINING;
4404fcf3ce44SJohn Forte }
4405fcf3ce44SJohn Forte bcopy(targetProperties.tgt_alias, targetProps->alias,
4406fcf3ce44SJohn Forte sizeof (targetProps->alias));
440745039663SJohn Forte
440845039663SJohn Forte scsiDevid = (scsi_devid_desc_t *)&targetProperties.tgt_id;
440945039663SJohn Forte targetProps->protocol = scsiDevid->protocol_id;
441045039663SJohn Forte
4411fcf3ce44SJohn Forte done:
4412fcf3ce44SJohn Forte (void) close(fd);
4413fcf3ce44SJohn Forte return (ret);
4414fcf3ce44SJohn Forte }
4415fcf3ce44SJohn Forte
4416fcf3ce44SJohn Forte /*
4417fcf3ce44SJohn Forte * stmfGetLogicalUnitList
4418fcf3ce44SJohn Forte *
4419fcf3ce44SJohn Forte * Purpose: Retrieves list of logical unit Object IDs
4420fcf3ce44SJohn Forte *
4421fcf3ce44SJohn Forte * luList - pointer to a pointer to a stmfGuidList structure. On success,
4422fcf3ce44SJohn Forte * it contains the list of logical unit guids.
4423fcf3ce44SJohn Forte *
4424fcf3ce44SJohn Forte */
4425fcf3ce44SJohn Forte int
stmfGetLogicalUnitList(stmfGuidList ** luList)4426fcf3ce44SJohn Forte stmfGetLogicalUnitList(stmfGuidList **luList)
4427fcf3ce44SJohn Forte {
4428fcf3ce44SJohn Forte int ret;
4429fcf3ce44SJohn Forte int fd;
4430fcf3ce44SJohn Forte int ioctlRet;
4431fcf3ce44SJohn Forte int cmd = STMF_IOCTL_LU_LIST;
44328fe96085Stim szeto int i;
4433fcf3ce44SJohn Forte stmf_iocdata_t stmfIoctl;
4434fcf3ce44SJohn Forte slist_lu_t *fLuList;
4435fcf3ce44SJohn Forte uint32_t fLuListSize;
44368fe96085Stim szeto uint32_t listCnt;
4437fcf3ce44SJohn Forte
4438fcf3ce44SJohn Forte if (luList == NULL) {
4439fcf3ce44SJohn Forte return (STMF_ERROR_INVALID_ARG);
4440fcf3ce44SJohn Forte }
4441fcf3ce44SJohn Forte
4442fcf3ce44SJohn Forte /* call init */
4443fcf3ce44SJohn Forte ret = initializeConfig();
4444fcf3ce44SJohn Forte if (ret != STMF_STATUS_SUCCESS) {
4445fcf3ce44SJohn Forte return (ret);
4446fcf3ce44SJohn Forte }
4447fcf3ce44SJohn Forte
4448fcf3ce44SJohn Forte /*
4449fcf3ce44SJohn Forte * Open control node for stmf
4450fcf3ce44SJohn Forte */
4451fcf3ce44SJohn Forte if ((ret = openStmf(OPEN_STMF, &fd)) != STMF_STATUS_SUCCESS)
4452fcf3ce44SJohn Forte return (ret);
4453fcf3ce44SJohn Forte
4454fcf3ce44SJohn Forte /*
4455fcf3ce44SJohn Forte * Allocate ioctl input buffer
4456fcf3ce44SJohn Forte */
44578fe96085Stim szeto fLuListSize = ALLOC_LU;
4458fcf3ce44SJohn Forte fLuListSize = fLuListSize * (sizeof (slist_lu_t));
4459fcf3ce44SJohn Forte fLuList = (slist_lu_t *)calloc(1, fLuListSize);
4460fcf3ce44SJohn Forte if (fLuList == NULL) {
44618fe96085Stim szeto ret = STMF_ERROR_NOMEM;
44628fe96085Stim szeto goto done;
4463fcf3ce44SJohn Forte }
4464fcf3ce44SJohn Forte
4465fcf3ce44SJohn Forte bzero(&stmfIoctl, sizeof (stmfIoctl));
4466fcf3ce44SJohn Forte /*
4467fcf3ce44SJohn Forte * Issue ioctl to get the LU list
4468fcf3ce44SJohn Forte */
4469fcf3ce44SJohn Forte stmfIoctl.stmf_version = STMF_VERSION_1;
4470fcf3ce44SJohn Forte stmfIoctl.stmf_obuf_size = fLuListSize;
4471fcf3ce44SJohn Forte stmfIoctl.stmf_obuf = (uint64_t)(unsigned long)fLuList;
4472fcf3ce44SJohn Forte ioctlRet = ioctl(fd, cmd, &stmfIoctl);
4473fcf3ce44SJohn Forte if (ioctlRet != 0) {
4474fcf3ce44SJohn Forte switch (errno) {
4475fcf3ce44SJohn Forte case EBUSY:
4476fcf3ce44SJohn Forte ret = STMF_ERROR_BUSY;
4477fcf3ce44SJohn Forte break;
44788fe96085Stim szeto case EPERM:
4479fcf3ce44SJohn Forte case EACCES:
4480fcf3ce44SJohn Forte ret = STMF_ERROR_PERM;
4481fcf3ce44SJohn Forte break;
4482fcf3ce44SJohn Forte default:
4483fcf3ce44SJohn Forte syslog(LOG_DEBUG,
4484fcf3ce44SJohn Forte "stmfGetLogicalUnitList:ioctl errno(%d)",
4485fcf3ce44SJohn Forte errno);
4486fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR;
4487fcf3ce44SJohn Forte break;
4488fcf3ce44SJohn Forte }
4489fcf3ce44SJohn Forte goto done;
4490fcf3ce44SJohn Forte }
4491fcf3ce44SJohn Forte /*
4492fcf3ce44SJohn Forte * Check whether input buffer was large enough
4493fcf3ce44SJohn Forte */
44948fe96085Stim szeto if (stmfIoctl.stmf_obuf_max_nentries > ALLOC_LU) {
4495fcf3ce44SJohn Forte fLuListSize = stmfIoctl.stmf_obuf_max_nentries *
4496fcf3ce44SJohn Forte sizeof (slist_lu_t);
44978fe96085Stim szeto free(fLuList);
44988fe96085Stim szeto fLuList = (slist_lu_t *)calloc(1, fLuListSize);
4499fcf3ce44SJohn Forte if (fLuList == NULL) {
45008fe96085Stim szeto ret = STMF_ERROR_NOMEM;
45018fe96085Stim szeto goto done;
4502fcf3ce44SJohn Forte }
4503fcf3ce44SJohn Forte stmfIoctl.stmf_obuf_size = fLuListSize;
4504fcf3ce44SJohn Forte stmfIoctl.stmf_obuf = (uint64_t)(unsigned long)fLuList;
4505fcf3ce44SJohn Forte ioctlRet = ioctl(fd, cmd, &stmfIoctl);
4506fcf3ce44SJohn Forte if (ioctlRet != 0) {
4507fcf3ce44SJohn Forte switch (errno) {
4508fcf3ce44SJohn Forte case EBUSY:
4509fcf3ce44SJohn Forte ret = STMF_ERROR_BUSY;
4510fcf3ce44SJohn Forte break;
45118fe96085Stim szeto case EPERM:
4512fcf3ce44SJohn Forte case EACCES:
4513fcf3ce44SJohn Forte ret = STMF_ERROR_PERM;
4514fcf3ce44SJohn Forte break;
4515fcf3ce44SJohn Forte default:
4516fcf3ce44SJohn Forte syslog(LOG_DEBUG,
4517fcf3ce44SJohn Forte "stmfGetLogicalUnitList:"
4518fcf3ce44SJohn Forte "ioctl errno(%d)", errno);
4519fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR;
4520fcf3ce44SJohn Forte break;
4521fcf3ce44SJohn Forte }
4522fcf3ce44SJohn Forte goto done;
4523fcf3ce44SJohn Forte }
4524fcf3ce44SJohn Forte }
4525fcf3ce44SJohn Forte
4526fcf3ce44SJohn Forte if (ret != STMF_STATUS_SUCCESS) {
4527fcf3ce44SJohn Forte goto done;
4528fcf3ce44SJohn Forte }
4529fcf3ce44SJohn Forte
45308fe96085Stim szeto listCnt = stmfIoctl.stmf_obuf_nentries;
4531fcf3ce44SJohn Forte
4532fcf3ce44SJohn Forte /*
4533fcf3ce44SJohn Forte * allocate caller's buffer with the final size
4534fcf3ce44SJohn Forte */
4535fcf3ce44SJohn Forte *luList = (stmfGuidList *)calloc(1, sizeof (stmfGuidList) +
45368fe96085Stim szeto listCnt * sizeof (stmfGuid));
4537fcf3ce44SJohn Forte if (*luList == NULL) {
4538fcf3ce44SJohn Forte ret = STMF_ERROR_NOMEM;
4539fcf3ce44SJohn Forte goto done;
4540fcf3ce44SJohn Forte }
4541fcf3ce44SJohn Forte
45428fe96085Stim szeto (*luList)->cnt = listCnt;
45438fe96085Stim szeto
45448fe96085Stim szeto /* copy to caller's buffer */
45458fe96085Stim szeto for (i = 0; i < listCnt; i++) {
45468fe96085Stim szeto bcopy(&fLuList[i].lu_guid, (*luList)->guid[i].guid,
4547fcf3ce44SJohn Forte sizeof (stmfGuid));
4548fcf3ce44SJohn Forte }
4549fcf3ce44SJohn Forte
45508fe96085Stim szeto /*
45518fe96085Stim szeto * sort the list. This gives a consistent view across gets
45528fe96085Stim szeto */
45538fe96085Stim szeto qsort((void *)&((*luList)->guid[0]), (*luList)->cnt,
45548fe96085Stim szeto sizeof (stmfGuid), guidCompare);
4555fcf3ce44SJohn Forte
4556fcf3ce44SJohn Forte done:
4557fcf3ce44SJohn Forte (void) close(fd);
4558fcf3ce44SJohn Forte /*
4559fcf3ce44SJohn Forte * free internal buffers
4560fcf3ce44SJohn Forte */
4561fcf3ce44SJohn Forte free(fLuList);
4562fcf3ce44SJohn Forte return (ret);
4563fcf3ce44SJohn Forte }
4564fcf3ce44SJohn Forte
4565fcf3ce44SJohn Forte /*
4566fcf3ce44SJohn Forte * stmfGetLogicalUnitProperties
4567fcf3ce44SJohn Forte *
4568fcf3ce44SJohn Forte * Purpose: Retrieves the properties for a logical unit
4569fcf3ce44SJohn Forte *
4570fcf3ce44SJohn Forte * lu - guid of the logical unit for which to retrieve properties
4571fcf3ce44SJohn Forte * stmfLuProps - pointer to an stmfLogicalUnitProperties structure. On success,
4572fcf3ce44SJohn Forte * it contains the logical unit properties for the specified guid.
4573fcf3ce44SJohn Forte */
4574fcf3ce44SJohn Forte int
stmfGetLogicalUnitProperties(stmfGuid * lu,stmfLogicalUnitProperties * luProps)4575fcf3ce44SJohn Forte stmfGetLogicalUnitProperties(stmfGuid *lu, stmfLogicalUnitProperties *luProps)
4576fcf3ce44SJohn Forte {
4577fcf3ce44SJohn Forte int ret = STMF_STATUS_SUCCESS;
4578fcf3ce44SJohn Forte int stmfRet;
4579fcf3ce44SJohn Forte int fd;
4580fcf3ce44SJohn Forte int ioctlRet;
4581fcf3ce44SJohn Forte int cmd = STMF_IOCTL_GET_LU_PROPERTIES;
4582fcf3ce44SJohn Forte stmfViewEntryList *viewEntryList = NULL;
4583fcf3ce44SJohn Forte stmf_iocdata_t stmfIoctl;
4584fcf3ce44SJohn Forte sioc_lu_props_t fLuProps;
4585fcf3ce44SJohn Forte
45868fe96085Stim szeto if (lu == NULL || luProps == NULL) {
45878fe96085Stim szeto return (STMF_ERROR_INVALID_ARG);
4588fcf3ce44SJohn Forte }
4589fcf3ce44SJohn Forte
4590fcf3ce44SJohn Forte bzero(luProps, sizeof (stmfLogicalUnitProperties));
4591fcf3ce44SJohn Forte
4592fcf3ce44SJohn Forte /* call init */
4593fcf3ce44SJohn Forte ret = initializeConfig();
4594fcf3ce44SJohn Forte if (ret != STMF_STATUS_SUCCESS) {
4595fcf3ce44SJohn Forte return (ret);
4596fcf3ce44SJohn Forte }
4597fcf3ce44SJohn Forte
4598fcf3ce44SJohn Forte /*
4599fcf3ce44SJohn Forte * Open control node for stmf
4600fcf3ce44SJohn Forte */
4601fcf3ce44SJohn Forte if ((ret = openStmf(OPEN_STMF, &fd)) != STMF_STATUS_SUCCESS)
4602fcf3ce44SJohn Forte return (ret);
4603fcf3ce44SJohn Forte
4604fcf3ce44SJohn Forte bzero(&stmfIoctl, sizeof (stmfIoctl));
4605fcf3ce44SJohn Forte /*
4606fcf3ce44SJohn Forte * Issue ioctl to add to the host group
4607fcf3ce44SJohn Forte */
4608fcf3ce44SJohn Forte stmfIoctl.stmf_version = STMF_VERSION_1;
4609fcf3ce44SJohn Forte stmfIoctl.stmf_ibuf_size = sizeof (stmfGuid);
4610fcf3ce44SJohn Forte stmfIoctl.stmf_ibuf = (uint64_t)(unsigned long)lu;
4611fcf3ce44SJohn Forte stmfIoctl.stmf_obuf = (uint64_t)(unsigned long)&fLuProps;
4612fcf3ce44SJohn Forte stmfIoctl.stmf_obuf_size = sizeof (fLuProps);
4613fcf3ce44SJohn Forte ioctlRet = ioctl(fd, cmd, &stmfIoctl);
4614fcf3ce44SJohn Forte if (ioctlRet != 0) {
4615fcf3ce44SJohn Forte switch (errno) {
4616fcf3ce44SJohn Forte case EBUSY:
4617fcf3ce44SJohn Forte ret = STMF_ERROR_BUSY;
4618fcf3ce44SJohn Forte break;
46198fe96085Stim szeto case EPERM:
4620fcf3ce44SJohn Forte case EACCES:
4621fcf3ce44SJohn Forte ret = STMF_ERROR_PERM;
4622fcf3ce44SJohn Forte break;
4623fcf3ce44SJohn Forte case ENOENT:
4624fcf3ce44SJohn Forte stmfRet = stmfGetViewEntryList(lu,
4625fcf3ce44SJohn Forte &viewEntryList);
4626fcf3ce44SJohn Forte if (stmfRet == STMF_STATUS_SUCCESS) {
4627fcf3ce44SJohn Forte luProps->status =
4628fcf3ce44SJohn Forte STMF_LOGICAL_UNIT_UNREGISTERED;
4629fcf3ce44SJohn Forte if (viewEntryList->cnt > 0) {
4630fcf3ce44SJohn Forte ret = STMF_STATUS_SUCCESS;
4631fcf3ce44SJohn Forte } else {
4632fcf3ce44SJohn Forte ret = STMF_ERROR_NOT_FOUND;
4633fcf3ce44SJohn Forte }
4634fcf3ce44SJohn Forte } else {
4635fcf3ce44SJohn Forte ret = STMF_ERROR_NOT_FOUND;
4636fcf3ce44SJohn Forte }
4637fcf3ce44SJohn Forte stmfFreeMemory(viewEntryList);
4638fcf3ce44SJohn Forte break;
4639fcf3ce44SJohn Forte default:
4640fcf3ce44SJohn Forte syslog(LOG_DEBUG,
4641fcf3ce44SJohn Forte "stmfGetLogicalUnit:ioctl errno(%d)",
4642fcf3ce44SJohn Forte errno);
4643fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR;
4644fcf3ce44SJohn Forte break;
4645fcf3ce44SJohn Forte }
4646fcf3ce44SJohn Forte goto done;
4647fcf3ce44SJohn Forte }
4648fcf3ce44SJohn Forte
4649fcf3ce44SJohn Forte bcopy(fLuProps.lu_provider_name, luProps->providerName,
4650fcf3ce44SJohn Forte sizeof (fLuProps.lu_provider_name));
4651fcf3ce44SJohn Forte if (fLuProps.lu_state == STMF_STATE_ONLINE) {
4652fcf3ce44SJohn Forte luProps->status = STMF_LOGICAL_UNIT_ONLINE;
4653fcf3ce44SJohn Forte } else if (fLuProps.lu_state == STMF_STATE_OFFLINE) {
4654fcf3ce44SJohn Forte luProps->status = STMF_LOGICAL_UNIT_OFFLINE;
4655fcf3ce44SJohn Forte } else if (fLuProps.lu_state == STMF_STATE_ONLINING) {
4656fcf3ce44SJohn Forte luProps->status = STMF_LOGICAL_UNIT_ONLINING;
4657fcf3ce44SJohn Forte } else if (fLuProps.lu_state == STMF_STATE_OFFLINING) {
4658fcf3ce44SJohn Forte luProps->status = STMF_LOGICAL_UNIT_OFFLINING;
4659fcf3ce44SJohn Forte }
4660fcf3ce44SJohn Forte bcopy(fLuProps.lu_alias, luProps->alias, sizeof (luProps->alias));
4661fcf3ce44SJohn Forte done:
4662fcf3ce44SJohn Forte (void) close(fd);
4663fcf3ce44SJohn Forte return (ret);
4664fcf3ce44SJohn Forte }
4665fcf3ce44SJohn Forte
4666fcf3ce44SJohn Forte /*
4667fcf3ce44SJohn Forte * stmfGetState
4668fcf3ce44SJohn Forte *
4669fcf3ce44SJohn Forte * Purpose: retrieve the current state of the stmf module
4670fcf3ce44SJohn Forte *
4671fcf3ce44SJohn Forte * state - pointer to stmfState structure allocated by the caller
4672fcf3ce44SJohn Forte * On success, contains the state of stmf
4673fcf3ce44SJohn Forte */
4674fcf3ce44SJohn Forte int
stmfGetState(stmfState * state)4675fcf3ce44SJohn Forte stmfGetState(stmfState *state)
4676fcf3ce44SJohn Forte {
4677fcf3ce44SJohn Forte int ret;
4678fcf3ce44SJohn Forte stmf_state_desc_t iState;
4679fcf3ce44SJohn Forte
4680fcf3ce44SJohn Forte if (state == NULL) {
4681fcf3ce44SJohn Forte return (STMF_ERROR_INVALID_ARG);
4682fcf3ce44SJohn Forte }
4683fcf3ce44SJohn Forte
4684fcf3ce44SJohn Forte ret = getStmfState(&iState);
4685fcf3ce44SJohn Forte if (ret != STMF_STATUS_SUCCESS) {
4686fcf3ce44SJohn Forte return (ret);
4687fcf3ce44SJohn Forte }
4688fcf3ce44SJohn Forte switch (iState.state) {
4689fcf3ce44SJohn Forte case STMF_STATE_ONLINE:
4690fcf3ce44SJohn Forte state->operationalState =
4691fcf3ce44SJohn Forte STMF_SERVICE_STATE_ONLINE;
4692fcf3ce44SJohn Forte break;
4693fcf3ce44SJohn Forte case STMF_STATE_OFFLINE:
4694fcf3ce44SJohn Forte state->operationalState =
4695fcf3ce44SJohn Forte STMF_SERVICE_STATE_OFFLINE;
4696fcf3ce44SJohn Forte break;
4697fcf3ce44SJohn Forte case STMF_STATE_ONLINING:
4698fcf3ce44SJohn Forte state->operationalState =
4699fcf3ce44SJohn Forte STMF_SERVICE_STATE_ONLINING;
4700fcf3ce44SJohn Forte break;
4701fcf3ce44SJohn Forte case STMF_STATE_OFFLINING:
4702fcf3ce44SJohn Forte state->operationalState =
4703fcf3ce44SJohn Forte STMF_SERVICE_STATE_OFFLINING;
4704fcf3ce44SJohn Forte break;
4705fcf3ce44SJohn Forte default:
4706fcf3ce44SJohn Forte state->operationalState =
4707fcf3ce44SJohn Forte STMF_SERVICE_STATE_UNKNOWN;
4708fcf3ce44SJohn Forte break;
4709fcf3ce44SJohn Forte }
4710fcf3ce44SJohn Forte switch (iState.config_state) {
4711fcf3ce44SJohn Forte case STMF_CONFIG_NONE:
4712fcf3ce44SJohn Forte state->configState = STMF_CONFIG_STATE_NONE;
4713fcf3ce44SJohn Forte break;
4714fcf3ce44SJohn Forte case STMF_CONFIG_INIT:
4715fcf3ce44SJohn Forte state->configState = STMF_CONFIG_STATE_INIT;
4716fcf3ce44SJohn Forte break;
4717fcf3ce44SJohn Forte case STMF_CONFIG_INIT_DONE:
4718fcf3ce44SJohn Forte state->configState =
4719fcf3ce44SJohn Forte STMF_CONFIG_STATE_INIT_DONE;
4720fcf3ce44SJohn Forte break;
4721fcf3ce44SJohn Forte default:
4722fcf3ce44SJohn Forte state->configState =
4723fcf3ce44SJohn Forte STMF_CONFIG_STATE_UNKNOWN;
4724fcf3ce44SJohn Forte break;
4725fcf3ce44SJohn Forte }
4726fcf3ce44SJohn Forte return (STMF_STATUS_SUCCESS);
4727fcf3ce44SJohn Forte }
4728fcf3ce44SJohn Forte
4729fcf3ce44SJohn Forte /*
4730fcf3ce44SJohn Forte * stmfGetViewEntryList
4731fcf3ce44SJohn Forte *
4732fcf3ce44SJohn Forte * Purpose: Retrieves the list of view entries for the specified
4733fcf3ce44SJohn Forte * logical unit.
4734fcf3ce44SJohn Forte *
4735fcf3ce44SJohn Forte * lu - the guid of the logical unit for which to retrieve the view entry list
4736fcf3ce44SJohn Forte * viewEntryList - a pointer to a pointer to a stmfViewEntryList structure. On
4737fcf3ce44SJohn Forte * success, contains the list of view entries.
4738fcf3ce44SJohn Forte */
4739fcf3ce44SJohn Forte int
stmfGetViewEntryList(stmfGuid * lu,stmfViewEntryList ** viewEntryList)4740fcf3ce44SJohn Forte stmfGetViewEntryList(stmfGuid *lu, stmfViewEntryList **viewEntryList)
4741fcf3ce44SJohn Forte {
4742fcf3ce44SJohn Forte int ret;
47438fe96085Stim szeto int fd;
47448fe96085Stim szeto int ioctlRet;
47458fe96085Stim szeto int cmd = STMF_IOCTL_LU_VE_LIST;
47468fe96085Stim szeto int i;
47478fe96085Stim szeto stmf_iocdata_t stmfIoctl;
47488fe96085Stim szeto stmf_view_op_entry_t *fVeList;
47498fe96085Stim szeto uint32_t fVeListSize;
47508fe96085Stim szeto uint32_t listCnt;
4751fcf3ce44SJohn Forte
4752fcf3ce44SJohn Forte if (lu == NULL || viewEntryList == NULL) {
4753fcf3ce44SJohn Forte return (STMF_ERROR_INVALID_ARG);
4754fcf3ce44SJohn Forte }
4755fcf3ce44SJohn Forte
47568fe96085Stim szeto /* call init */
47578fe96085Stim szeto ret = initializeConfig();
47588fe96085Stim szeto if (ret != STMF_STATUS_SUCCESS) {
47598fe96085Stim szeto return (ret);
47608fe96085Stim szeto }
47618fe96085Stim szeto
47628fe96085Stim szeto /*
47638fe96085Stim szeto * Open control node for stmf
47648fe96085Stim szeto */
47658fe96085Stim szeto if ((ret = openStmf(OPEN_STMF, &fd)) != STMF_STATUS_SUCCESS)
47668fe96085Stim szeto return (ret);
47678fe96085Stim szeto
47688fe96085Stim szeto /*
47698fe96085Stim szeto * Allocate ioctl input buffer
47708fe96085Stim szeto */
47718fe96085Stim szeto fVeListSize = ALLOC_VE;
47728fe96085Stim szeto fVeListSize = fVeListSize * (sizeof (stmf_view_op_entry_t));
47738fe96085Stim szeto fVeList = (stmf_view_op_entry_t *)calloc(1, fVeListSize);
47748fe96085Stim szeto if (fVeList == NULL) {
47758fe96085Stim szeto ret = STMF_ERROR_NOMEM;
47768fe96085Stim szeto goto done;
47778fe96085Stim szeto }
47788fe96085Stim szeto
47798fe96085Stim szeto bzero(&stmfIoctl, sizeof (stmfIoctl));
47808fe96085Stim szeto /*
47818fe96085Stim szeto * Issue ioctl to get the LU list
47828fe96085Stim szeto */
47838fe96085Stim szeto stmfIoctl.stmf_version = STMF_VERSION_1;
47848fe96085Stim szeto stmfIoctl.stmf_ibuf = (uint64_t)(unsigned long)lu;
47858fe96085Stim szeto stmfIoctl.stmf_ibuf_size = sizeof (stmfGuid);
47868fe96085Stim szeto stmfIoctl.stmf_obuf_size = fVeListSize;
47878fe96085Stim szeto stmfIoctl.stmf_obuf = (uint64_t)(unsigned long)fVeList;
47888fe96085Stim szeto ioctlRet = ioctl(fd, cmd, &stmfIoctl);
47898fe96085Stim szeto if (ioctlRet != 0) {
47908fe96085Stim szeto switch (errno) {
47918fe96085Stim szeto case EBUSY:
4792fcf3ce44SJohn Forte ret = STMF_ERROR_BUSY;
4793fcf3ce44SJohn Forte break;
47948fe96085Stim szeto case EPERM:
47958fe96085Stim szeto case EACCES:
47968fe96085Stim szeto ret = STMF_ERROR_PERM;
4797fcf3ce44SJohn Forte break;
4798fcf3ce44SJohn Forte default:
4799fcf3ce44SJohn Forte syslog(LOG_DEBUG,
48008fe96085Stim szeto "stmfGetViewEntryList:ioctl errno(%d)",
48018fe96085Stim szeto errno);
4802fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR;
4803fcf3ce44SJohn Forte break;
4804fcf3ce44SJohn Forte }
48058fe96085Stim szeto goto done;
48068fe96085Stim szeto }
48078fe96085Stim szeto /*
48088fe96085Stim szeto * Check whether input buffer was large enough
48098fe96085Stim szeto */
48108fe96085Stim szeto if (stmfIoctl.stmf_obuf_max_nentries > ALLOC_VE) {
48118fe96085Stim szeto bzero(&stmfIoctl, sizeof (stmfIoctl));
48128fe96085Stim szeto fVeListSize = stmfIoctl.stmf_obuf_max_nentries *
48138fe96085Stim szeto sizeof (stmf_view_op_entry_t);
48148fe96085Stim szeto free(fVeList);
48158fe96085Stim szeto fVeList = (stmf_view_op_entry_t *)calloc(1, fVeListSize);
48168fe96085Stim szeto if (fVeList == NULL) {
48178fe96085Stim szeto return (STMF_ERROR_NOMEM);
48188fe96085Stim szeto }
48198fe96085Stim szeto stmfIoctl.stmf_obuf_size = fVeListSize;
48208fe96085Stim szeto stmfIoctl.stmf_obuf = (uint64_t)(unsigned long)fVeList;
48218fe96085Stim szeto ioctlRet = ioctl(fd, cmd, &stmfIoctl);
48228fe96085Stim szeto if (ioctlRet != 0) {
48238fe96085Stim szeto switch (errno) {
48248fe96085Stim szeto case EBUSY:
48258fe96085Stim szeto ret = STMF_ERROR_BUSY;
48268fe96085Stim szeto break;
48278fe96085Stim szeto case EPERM:
48288fe96085Stim szeto case EACCES:
48298fe96085Stim szeto ret = STMF_ERROR_PERM;
48308fe96085Stim szeto break;
48318fe96085Stim szeto default:
48328fe96085Stim szeto syslog(LOG_DEBUG,
48338fe96085Stim szeto "stmfGetLogicalUnitList:"
48348fe96085Stim szeto "ioctl errno(%d)", errno);
48358fe96085Stim szeto ret = STMF_STATUS_ERROR;
48368fe96085Stim szeto break;
48378fe96085Stim szeto }
48388fe96085Stim szeto goto done;
48398fe96085Stim szeto }
48408fe96085Stim szeto }
4841fcf3ce44SJohn Forte
48428fe96085Stim szeto if (ret != STMF_STATUS_SUCCESS) {
48438fe96085Stim szeto goto done;
48448fe96085Stim szeto }
48458fe96085Stim szeto
48468fe96085Stim szeto listCnt = stmfIoctl.stmf_obuf_nentries;
48478fe96085Stim szeto
48488fe96085Stim szeto /*
48498fe96085Stim szeto * allocate caller's buffer with the final size
48508fe96085Stim szeto */
48518fe96085Stim szeto *viewEntryList = (stmfViewEntryList *)calloc(1,
48528fe96085Stim szeto sizeof (stmfViewEntryList) + listCnt * sizeof (stmfViewEntry));
48538fe96085Stim szeto if (*viewEntryList == NULL) {
48548fe96085Stim szeto ret = STMF_ERROR_NOMEM;
48558fe96085Stim szeto goto done;
48568fe96085Stim szeto }
48578fe96085Stim szeto
48588fe96085Stim szeto (*viewEntryList)->cnt = listCnt;
48598fe96085Stim szeto
48608fe96085Stim szeto /* copy to caller's buffer */
48618fe96085Stim szeto for (i = 0; i < listCnt; i++) {
48628fe96085Stim szeto (*viewEntryList)->ve[i].veIndexValid = B_TRUE;
48638fe96085Stim szeto (*viewEntryList)->ve[i].veIndex = fVeList[i].ve_ndx;
48648fe96085Stim szeto if (fVeList[i].ve_all_hosts == 1) {
48658fe96085Stim szeto (*viewEntryList)->ve[i].allHosts = B_TRUE;
48668fe96085Stim szeto } else {
48678fe96085Stim szeto bcopy(fVeList[i].ve_host_group.name,
48688fe96085Stim szeto (*viewEntryList)->ve[i].hostGroup,
48698fe96085Stim szeto fVeList[i].ve_host_group.name_size);
48708fe96085Stim szeto }
48718fe96085Stim szeto if (fVeList[i].ve_all_targets == 1) {
48728fe96085Stim szeto (*viewEntryList)->ve[i].allTargets = B_TRUE;
48738fe96085Stim szeto } else {
48748fe96085Stim szeto bcopy(fVeList[i].ve_target_group.name,
48758fe96085Stim szeto (*viewEntryList)->ve[i].targetGroup,
48768fe96085Stim szeto fVeList[i].ve_target_group.name_size);
48778fe96085Stim szeto }
48788fe96085Stim szeto bcopy(fVeList[i].ve_lu_nbr, (*viewEntryList)->ve[i].luNbr,
48798fe96085Stim szeto sizeof ((*viewEntryList)->ve[i].luNbr));
48808fe96085Stim szeto (*viewEntryList)->ve[i].luNbrValid = B_TRUE;
48818fe96085Stim szeto }
48828fe96085Stim szeto
48838fe96085Stim szeto /*
48848fe96085Stim szeto * sort the list. This gives a consistent view across gets
48858fe96085Stim szeto */
48868fe96085Stim szeto qsort((void *)&((*viewEntryList)->ve[0]), (*viewEntryList)->cnt,
48878fe96085Stim szeto sizeof (stmfViewEntry), viewEntryCompare);
48888fe96085Stim szeto
48898fe96085Stim szeto done:
48908fe96085Stim szeto (void) close(fd);
48918fe96085Stim szeto /*
48928fe96085Stim szeto * free internal buffers
48938fe96085Stim szeto */
48948fe96085Stim szeto free(fVeList);
4895fcf3ce44SJohn Forte return (ret);
4896fcf3ce44SJohn Forte }
4897fcf3ce44SJohn Forte
48988fe96085Stim szeto
4899fcf3ce44SJohn Forte /*
4900fcf3ce44SJohn Forte * loadHostGroups
4901fcf3ce44SJohn Forte *
4902fcf3ce44SJohn Forte * Purpose - issues the ioctl to load the host groups into stmf
4903fcf3ce44SJohn Forte *
4904fcf3ce44SJohn Forte * fd - file descriptor for the control node of stmf.
4905fcf3ce44SJohn Forte * groupList - populated host group list
4906fcf3ce44SJohn Forte */
4907fcf3ce44SJohn Forte static int
loadHostGroups(int fd,stmfGroupList * groupList)4908fcf3ce44SJohn Forte loadHostGroups(int fd, stmfGroupList *groupList)
4909fcf3ce44SJohn Forte {
4910fcf3ce44SJohn Forte int i, j;
4911fcf3ce44SJohn Forte int ret = STMF_STATUS_SUCCESS;
4912fcf3ce44SJohn Forte stmfGroupProperties *groupProps = NULL;
4913fcf3ce44SJohn Forte
4914fcf3ce44SJohn Forte for (i = 0; i < groupList->cnt; i++) {
4915fcf3ce44SJohn Forte if ((ret = groupIoctl(fd, STMF_IOCTL_CREATE_HOST_GROUP,
4916fcf3ce44SJohn Forte &(groupList->name[i]))) != STMF_STATUS_SUCCESS) {
4917fcf3ce44SJohn Forte goto out;
4918fcf3ce44SJohn Forte }
49198fe96085Stim szeto ret = iLoadGroupMembersFromPs(&(groupList->name[i]),
49208fe96085Stim szeto &groupProps, HOST_GROUP);
4921fcf3ce44SJohn Forte for (j = 0; j < groupProps->cnt; j++) {
4922fcf3ce44SJohn Forte if ((ret = groupMemberIoctl(fd, STMF_IOCTL_ADD_HG_ENTRY,
4923fcf3ce44SJohn Forte &(groupList->name[i]), &(groupProps->name[j])))
4924fcf3ce44SJohn Forte != STMF_STATUS_SUCCESS) {
4925fcf3ce44SJohn Forte goto out;
4926fcf3ce44SJohn Forte }
4927fcf3ce44SJohn Forte }
4928fcf3ce44SJohn Forte }
4929fcf3ce44SJohn Forte
4930fcf3ce44SJohn Forte
4931fcf3ce44SJohn Forte out:
4932fcf3ce44SJohn Forte stmfFreeMemory(groupProps);
4933fcf3ce44SJohn Forte return (ret);
4934fcf3ce44SJohn Forte }
4935fcf3ce44SJohn Forte
4936fcf3ce44SJohn Forte /*
4937fcf3ce44SJohn Forte * loadTargetGroups
4938fcf3ce44SJohn Forte *
4939fcf3ce44SJohn Forte * Purpose - issues the ioctl to load the target groups into stmf
4940fcf3ce44SJohn Forte *
4941fcf3ce44SJohn Forte * fd - file descriptor for the control node of stmf.
4942fcf3ce44SJohn Forte * groupList - populated target group list.
4943fcf3ce44SJohn Forte */
4944fcf3ce44SJohn Forte static int
loadTargetGroups(int fd,stmfGroupList * groupList)4945fcf3ce44SJohn Forte loadTargetGroups(int fd, stmfGroupList *groupList)
4946fcf3ce44SJohn Forte {
4947fcf3ce44SJohn Forte int i, j;
4948fcf3ce44SJohn Forte int ret = STMF_STATUS_SUCCESS;
4949fcf3ce44SJohn Forte stmfGroupProperties *groupProps = NULL;
4950fcf3ce44SJohn Forte
4951fcf3ce44SJohn Forte for (i = 0; i < groupList->cnt; i++) {
4952fcf3ce44SJohn Forte if ((ret = groupIoctl(fd, STMF_IOCTL_CREATE_TARGET_GROUP,
4953fcf3ce44SJohn Forte &(groupList->name[i]))) != STMF_STATUS_SUCCESS) {
4954fcf3ce44SJohn Forte goto out;
4955fcf3ce44SJohn Forte }
49568fe96085Stim szeto ret = iLoadGroupMembersFromPs(&(groupList->name[i]),
49578fe96085Stim szeto &groupProps, TARGET_GROUP);
4958fcf3ce44SJohn Forte for (j = 0; j < groupProps->cnt; j++) {
4959fcf3ce44SJohn Forte if ((ret = groupMemberIoctl(fd, STMF_IOCTL_ADD_TG_ENTRY,
4960fcf3ce44SJohn Forte &(groupList->name[i]), &(groupProps->name[j])))
4961fcf3ce44SJohn Forte != STMF_STATUS_SUCCESS) {
4962fcf3ce44SJohn Forte goto out;
4963fcf3ce44SJohn Forte }
4964fcf3ce44SJohn Forte }
4965fcf3ce44SJohn Forte }
4966fcf3ce44SJohn Forte
4967fcf3ce44SJohn Forte
4968fcf3ce44SJohn Forte out:
4969fcf3ce44SJohn Forte stmfFreeMemory(groupProps);
4970fcf3ce44SJohn Forte return (ret);
4971fcf3ce44SJohn Forte }
4972fcf3ce44SJohn Forte
4973fcf3ce44SJohn Forte
4974fcf3ce44SJohn Forte /*
4975fcf3ce44SJohn Forte * loadStore
4976fcf3ce44SJohn Forte *
4977fcf3ce44SJohn Forte * Purpose: Load the configuration data from the store
4978fcf3ce44SJohn Forte *
4979fcf3ce44SJohn Forte * First load the host groups and target groups, then the view entries
4980fcf3ce44SJohn Forte * and finally the provider data
4981fcf3ce44SJohn Forte *
4982fcf3ce44SJohn Forte * fd - file descriptor of control node for stmf.
4983fcf3ce44SJohn Forte */
4984fcf3ce44SJohn Forte static int
loadStore(int fd)4985fcf3ce44SJohn Forte loadStore(int fd)
4986fcf3ce44SJohn Forte {
4987fcf3ce44SJohn Forte int ret;
4988fcf3ce44SJohn Forte int i, j;
4989fcf3ce44SJohn Forte stmfGroupList *groupList = NULL;
4990fcf3ce44SJohn Forte stmfGuidList *guidList = NULL;
4991fcf3ce44SJohn Forte stmfViewEntryList *viewEntryList = NULL;
4992fcf3ce44SJohn Forte stmfProviderList *providerList = NULL;
4993fcf3ce44SJohn Forte int providerType;
4994fcf3ce44SJohn Forte nvlist_t *nvl = NULL;
4995fcf3ce44SJohn Forte
4996fcf3ce44SJohn Forte
4997fcf3ce44SJohn Forte
4998fcf3ce44SJohn Forte /* load host groups */
49998fe96085Stim szeto ret = iLoadGroupFromPs(&groupList, HOST_GROUP);
5000fcf3ce44SJohn Forte if (ret != STMF_STATUS_SUCCESS) {
5001fcf3ce44SJohn Forte return (ret);
5002fcf3ce44SJohn Forte }
5003fcf3ce44SJohn Forte ret = loadHostGroups(fd, groupList);
5004fcf3ce44SJohn Forte if (ret != STMF_STATUS_SUCCESS) {
5005fcf3ce44SJohn Forte goto out;
5006fcf3ce44SJohn Forte }
5007fcf3ce44SJohn Forte
5008fcf3ce44SJohn Forte stmfFreeMemory(groupList);
5009fcf3ce44SJohn Forte groupList = NULL;
5010fcf3ce44SJohn Forte
5011fcf3ce44SJohn Forte /* load target groups */
50128fe96085Stim szeto ret = iLoadGroupFromPs(&groupList, TARGET_GROUP);
5013fcf3ce44SJohn Forte if (ret != STMF_STATUS_SUCCESS) {
5014fcf3ce44SJohn Forte goto out;
5015fcf3ce44SJohn Forte }
5016fcf3ce44SJohn Forte ret = loadTargetGroups(fd, groupList);
5017fcf3ce44SJohn Forte if (ret != STMF_STATUS_SUCCESS) {
5018fcf3ce44SJohn Forte goto out;
5019fcf3ce44SJohn Forte }
5020fcf3ce44SJohn Forte
5021fcf3ce44SJohn Forte stmfFreeMemory(groupList);
5022fcf3ce44SJohn Forte groupList = NULL;
5023fcf3ce44SJohn Forte
5024fcf3ce44SJohn Forte /* Get the guid list */
5025fcf3ce44SJohn Forte ret = psGetLogicalUnitList(&guidList);
5026fcf3ce44SJohn Forte switch (ret) {
5027fcf3ce44SJohn Forte case STMF_PS_SUCCESS:
5028fcf3ce44SJohn Forte ret = STMF_STATUS_SUCCESS;
5029fcf3ce44SJohn Forte break;
5030fcf3ce44SJohn Forte case STMF_PS_ERROR_NOT_FOUND:
5031fcf3ce44SJohn Forte ret = STMF_ERROR_NOT_FOUND;
5032fcf3ce44SJohn Forte break;
5033fcf3ce44SJohn Forte case STMF_PS_ERROR_BUSY:
5034fcf3ce44SJohn Forte ret = STMF_ERROR_BUSY;
5035fcf3ce44SJohn Forte break;
5036fcf3ce44SJohn Forte case STMF_PS_ERROR_SERVICE_NOT_FOUND:
5037fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_NOT_FOUND;
5038fcf3ce44SJohn Forte break;
5039fcf3ce44SJohn Forte case STMF_PS_ERROR_VERSION_MISMATCH:
5040fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_DATA_VERSION;
5041fcf3ce44SJohn Forte break;
5042fcf3ce44SJohn Forte default:
5043fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR;
5044fcf3ce44SJohn Forte break;
5045fcf3ce44SJohn Forte }
5046fcf3ce44SJohn Forte
5047fcf3ce44SJohn Forte if (ret != STMF_STATUS_SUCCESS) {
5048fcf3ce44SJohn Forte goto out;
5049fcf3ce44SJohn Forte }
5050fcf3ce44SJohn Forte
5051fcf3ce44SJohn Forte /*
5052fcf3ce44SJohn Forte * We have the guid list, now get the corresponding
5053fcf3ce44SJohn Forte * view entries for each guid
5054fcf3ce44SJohn Forte */
5055fcf3ce44SJohn Forte for (i = 0; i < guidList->cnt; i++) {
5056fcf3ce44SJohn Forte ret = psGetViewEntryList(&guidList->guid[i], &viewEntryList);
5057fcf3ce44SJohn Forte switch (ret) {
5058fcf3ce44SJohn Forte case STMF_PS_SUCCESS:
5059fcf3ce44SJohn Forte ret = STMF_STATUS_SUCCESS;
5060fcf3ce44SJohn Forte break;
5061fcf3ce44SJohn Forte case STMF_PS_ERROR_NOT_FOUND:
5062fcf3ce44SJohn Forte ret = STMF_ERROR_NOT_FOUND;
5063fcf3ce44SJohn Forte break;
5064fcf3ce44SJohn Forte case STMF_PS_ERROR_BUSY:
5065fcf3ce44SJohn Forte ret = STMF_ERROR_BUSY;
5066fcf3ce44SJohn Forte break;
5067fcf3ce44SJohn Forte case STMF_PS_ERROR_SERVICE_NOT_FOUND:
5068fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_NOT_FOUND;
5069fcf3ce44SJohn Forte break;
5070fcf3ce44SJohn Forte case STMF_PS_ERROR_VERSION_MISMATCH:
5071fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_DATA_VERSION;
5072fcf3ce44SJohn Forte break;
5073fcf3ce44SJohn Forte default:
5074fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR;
5075fcf3ce44SJohn Forte break;
5076fcf3ce44SJohn Forte }
5077fcf3ce44SJohn Forte if (ret != STMF_STATUS_SUCCESS) {
5078fcf3ce44SJohn Forte goto out;
5079fcf3ce44SJohn Forte }
5080fcf3ce44SJohn Forte for (j = 0; j < viewEntryList->cnt; j++) {
5081fcf3ce44SJohn Forte ret = addViewEntryIoctl(fd, &guidList->guid[i],
5082fcf3ce44SJohn Forte &viewEntryList->ve[j]);
5083fcf3ce44SJohn Forte if (ret != STMF_STATUS_SUCCESS) {
5084fcf3ce44SJohn Forte goto out;
5085fcf3ce44SJohn Forte }
5086fcf3ce44SJohn Forte }
5087fcf3ce44SJohn Forte }
5088fcf3ce44SJohn Forte
5089fcf3ce44SJohn Forte /* get the list of providers that have data */
5090fcf3ce44SJohn Forte ret = psGetProviderDataList(&providerList);
5091fcf3ce44SJohn Forte switch (ret) {
5092fcf3ce44SJohn Forte case STMF_PS_SUCCESS:
5093fcf3ce44SJohn Forte ret = STMF_STATUS_SUCCESS;
5094fcf3ce44SJohn Forte break;
5095fcf3ce44SJohn Forte case STMF_PS_ERROR_NOT_FOUND:
5096fcf3ce44SJohn Forte ret = STMF_ERROR_NOT_FOUND;
5097fcf3ce44SJohn Forte break;
5098fcf3ce44SJohn Forte case STMF_PS_ERROR_BUSY:
5099fcf3ce44SJohn Forte ret = STMF_ERROR_BUSY;
5100fcf3ce44SJohn Forte break;
5101fcf3ce44SJohn Forte case STMF_PS_ERROR_SERVICE_NOT_FOUND:
5102fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_NOT_FOUND;
5103fcf3ce44SJohn Forte break;
5104fcf3ce44SJohn Forte case STMF_PS_ERROR_VERSION_MISMATCH:
5105fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_DATA_VERSION;
5106fcf3ce44SJohn Forte break;
5107fcf3ce44SJohn Forte default:
5108fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR;
5109fcf3ce44SJohn Forte break;
5110fcf3ce44SJohn Forte }
5111fcf3ce44SJohn Forte if (ret != STMF_STATUS_SUCCESS) {
5112fcf3ce44SJohn Forte goto out;
5113fcf3ce44SJohn Forte }
5114fcf3ce44SJohn Forte
5115fcf3ce44SJohn Forte for (i = 0; i < providerList->cnt; i++) {
5116fcf3ce44SJohn Forte providerType = providerList->provider[i].providerType;
5117fcf3ce44SJohn Forte ret = psGetProviderData(providerList->provider[i].name,
5118fcf3ce44SJohn Forte &nvl, providerType, NULL);
5119fcf3ce44SJohn Forte switch (ret) {
5120fcf3ce44SJohn Forte case STMF_PS_SUCCESS:
5121fcf3ce44SJohn Forte ret = STMF_STATUS_SUCCESS;
5122fcf3ce44SJohn Forte break;
5123fcf3ce44SJohn Forte case STMF_PS_ERROR_NOT_FOUND:
5124fcf3ce44SJohn Forte ret = STMF_ERROR_NOT_FOUND;
5125fcf3ce44SJohn Forte break;
5126fcf3ce44SJohn Forte case STMF_PS_ERROR_BUSY:
5127fcf3ce44SJohn Forte ret = STMF_ERROR_BUSY;
5128fcf3ce44SJohn Forte break;
5129fcf3ce44SJohn Forte case STMF_PS_ERROR_SERVICE_NOT_FOUND:
5130fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_NOT_FOUND;
5131fcf3ce44SJohn Forte break;
5132fcf3ce44SJohn Forte case STMF_PS_ERROR_VERSION_MISMATCH:
5133fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_DATA_VERSION;
5134fcf3ce44SJohn Forte break;
5135fcf3ce44SJohn Forte default:
5136fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR;
5137fcf3ce44SJohn Forte break;
5138fcf3ce44SJohn Forte }
5139fcf3ce44SJohn Forte if (ret != STMF_STATUS_SUCCESS) {
5140fcf3ce44SJohn Forte goto out;
5141fcf3ce44SJohn Forte }
5142fcf3ce44SJohn Forte
5143fcf3ce44SJohn Forte /* call setProviderData */
5144fcf3ce44SJohn Forte ret = setProviderData(fd, providerList->provider[i].name, nvl,
51458fe96085Stim szeto providerType, NULL);
5146fcf3ce44SJohn Forte switch (ret) {
5147fcf3ce44SJohn Forte case STMF_PS_SUCCESS:
5148fcf3ce44SJohn Forte ret = STMF_STATUS_SUCCESS;
5149fcf3ce44SJohn Forte break;
5150fcf3ce44SJohn Forte case STMF_PS_ERROR_NOT_FOUND:
5151fcf3ce44SJohn Forte ret = STMF_ERROR_NOT_FOUND;
5152fcf3ce44SJohn Forte break;
5153fcf3ce44SJohn Forte case STMF_PS_ERROR_BUSY:
5154fcf3ce44SJohn Forte ret = STMF_ERROR_BUSY;
5155fcf3ce44SJohn Forte break;
5156fcf3ce44SJohn Forte case STMF_PS_ERROR_SERVICE_NOT_FOUND:
5157fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_NOT_FOUND;
5158fcf3ce44SJohn Forte break;
5159fcf3ce44SJohn Forte case STMF_PS_ERROR_VERSION_MISMATCH:
5160fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_DATA_VERSION;
5161fcf3ce44SJohn Forte break;
5162fcf3ce44SJohn Forte default:
5163fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR;
5164fcf3ce44SJohn Forte break;
5165fcf3ce44SJohn Forte }
5166fcf3ce44SJohn Forte if (ret != STMF_STATUS_SUCCESS) {
5167fcf3ce44SJohn Forte goto out;
5168fcf3ce44SJohn Forte }
5169fcf3ce44SJohn Forte
5170fcf3ce44SJohn Forte nvlist_free(nvl);
5171fcf3ce44SJohn Forte nvl = NULL;
5172fcf3ce44SJohn Forte }
5173fcf3ce44SJohn Forte out:
5174fcf3ce44SJohn Forte if (groupList != NULL) {
5175fcf3ce44SJohn Forte free(groupList);
5176fcf3ce44SJohn Forte }
5177fcf3ce44SJohn Forte if (guidList != NULL) {
5178fcf3ce44SJohn Forte free(guidList);
5179fcf3ce44SJohn Forte }
5180fcf3ce44SJohn Forte if (viewEntryList != NULL) {
5181fcf3ce44SJohn Forte free(viewEntryList);
5182fcf3ce44SJohn Forte }
5183fcf3ce44SJohn Forte if (nvl != NULL) {
5184fcf3ce44SJohn Forte nvlist_free(nvl);
5185fcf3ce44SJohn Forte }
5186fcf3ce44SJohn Forte return (ret);
5187fcf3ce44SJohn Forte }
5188fcf3ce44SJohn Forte
5189fcf3ce44SJohn Forte /*
519045039663SJohn Forte * stmfGetAluaState
519145039663SJohn Forte *
519245039663SJohn Forte * Purpose - Get the alua state
519345039663SJohn Forte *
519445039663SJohn Forte */
519545039663SJohn Forte int
stmfGetAluaState(boolean_t * enabled,uint32_t * node)519645039663SJohn Forte stmfGetAluaState(boolean_t *enabled, uint32_t *node)
519745039663SJohn Forte {
519845039663SJohn Forte int ret = STMF_STATUS_SUCCESS;
519945039663SJohn Forte int fd;
520045039663SJohn Forte stmf_iocdata_t stmfIoctl = {0};
520145039663SJohn Forte stmf_alua_state_desc_t alua_state = {0};
520245039663SJohn Forte int ioctlRet;
520345039663SJohn Forte
520445039663SJohn Forte if (enabled == NULL || node == NULL) {
520545039663SJohn Forte return (STMF_ERROR_INVALID_ARG);
520645039663SJohn Forte }
520745039663SJohn Forte
520845039663SJohn Forte /*
520945039663SJohn Forte * Open control node for stmf
521045039663SJohn Forte */
521145039663SJohn Forte if ((ret = openStmf(OPEN_STMF, &fd)) != STMF_STATUS_SUCCESS)
521245039663SJohn Forte return (ret);
521345039663SJohn Forte
521445039663SJohn Forte /*
521545039663SJohn Forte * Issue ioctl to get the stmf state
521645039663SJohn Forte */
521745039663SJohn Forte stmfIoctl.stmf_version = STMF_VERSION_1;
521845039663SJohn Forte stmfIoctl.stmf_obuf_size = sizeof (alua_state);
521945039663SJohn Forte stmfIoctl.stmf_obuf = (uint64_t)(unsigned long)&alua_state;
522045039663SJohn Forte ioctlRet = ioctl(fd, STMF_IOCTL_GET_ALUA_STATE, &stmfIoctl);
522145039663SJohn Forte
522245039663SJohn Forte (void) close(fd);
522345039663SJohn Forte
522445039663SJohn Forte if (ioctlRet != 0) {
522545039663SJohn Forte switch (errno) {
522645039663SJohn Forte case EBUSY:
522745039663SJohn Forte ret = STMF_ERROR_BUSY;
522845039663SJohn Forte break;
522945039663SJohn Forte case EPERM:
523045039663SJohn Forte case EACCES:
523145039663SJohn Forte ret = STMF_ERROR_PERM;
523245039663SJohn Forte break;
523345039663SJohn Forte default:
523445039663SJohn Forte syslog(LOG_DEBUG,
523545039663SJohn Forte "getStmfState:ioctl errno(%d)", errno);
523645039663SJohn Forte ret = STMF_STATUS_ERROR;
523745039663SJohn Forte break;
523845039663SJohn Forte }
523945039663SJohn Forte } else {
524045039663SJohn Forte if (alua_state.alua_state == 1) {
524145039663SJohn Forte *enabled = B_TRUE;
524245039663SJohn Forte } else {
524345039663SJohn Forte *enabled = B_FALSE;
524445039663SJohn Forte }
524545039663SJohn Forte *node = alua_state.alua_node;
524645039663SJohn Forte }
524745039663SJohn Forte
524845039663SJohn Forte return (ret);
524945039663SJohn Forte }
525045039663SJohn Forte
525145039663SJohn Forte /*
525245039663SJohn Forte * stmfSetAluaState
525345039663SJohn Forte *
525445039663SJohn Forte * Purpose - set the alua state to enabled/disabled
525545039663SJohn Forte *
525645039663SJohn Forte */
525745039663SJohn Forte int
stmfSetAluaState(boolean_t enabled,uint32_t node)525845039663SJohn Forte stmfSetAluaState(boolean_t enabled, uint32_t node)
525945039663SJohn Forte {
526045039663SJohn Forte int ret = STMF_STATUS_SUCCESS;
526145039663SJohn Forte int fd;
526245039663SJohn Forte stmf_iocdata_t stmfIoctl = {0};
526345039663SJohn Forte stmf_alua_state_desc_t alua_state = {0};
526445039663SJohn Forte int ioctlRet;
526545039663SJohn Forte
526645039663SJohn Forte if ((enabled != B_TRUE && enabled != B_FALSE) || (node > 1)) {
526745039663SJohn Forte return (STMF_ERROR_INVALID_ARG);
526845039663SJohn Forte }
526945039663SJohn Forte
527045039663SJohn Forte if (enabled) {
527145039663SJohn Forte alua_state.alua_state = 1;
527245039663SJohn Forte }
527345039663SJohn Forte
527445039663SJohn Forte alua_state.alua_node = node;
527545039663SJohn Forte
527645039663SJohn Forte /*
527745039663SJohn Forte * Open control node for stmf
527845039663SJohn Forte */
527945039663SJohn Forte if ((ret = openStmf(OPEN_STMF, &fd)) != STMF_STATUS_SUCCESS)
528045039663SJohn Forte return (ret);
528145039663SJohn Forte
528245039663SJohn Forte /*
528345039663SJohn Forte * Issue ioctl to get the stmf state
528445039663SJohn Forte */
528545039663SJohn Forte stmfIoctl.stmf_version = STMF_VERSION_1;
528645039663SJohn Forte stmfIoctl.stmf_ibuf_size = sizeof (alua_state);
528745039663SJohn Forte stmfIoctl.stmf_ibuf = (uint64_t)(unsigned long)&alua_state;
528845039663SJohn Forte ioctlRet = ioctl(fd, STMF_IOCTL_SET_ALUA_STATE, &stmfIoctl);
528945039663SJohn Forte
529045039663SJohn Forte (void) close(fd);
529145039663SJohn Forte
529245039663SJohn Forte if (ioctlRet != 0) {
529345039663SJohn Forte switch (errno) {
529445039663SJohn Forte case EBUSY:
529545039663SJohn Forte ret = STMF_ERROR_BUSY;
529645039663SJohn Forte break;
529745039663SJohn Forte case EPERM:
529845039663SJohn Forte case EACCES:
529945039663SJohn Forte ret = STMF_ERROR_PERM;
530045039663SJohn Forte break;
530145039663SJohn Forte default:
530245039663SJohn Forte syslog(LOG_DEBUG,
530345039663SJohn Forte "getStmfState:ioctl errno(%d)", errno);
530445039663SJohn Forte ret = STMF_STATUS_ERROR;
530545039663SJohn Forte break;
530645039663SJohn Forte }
530745039663SJohn Forte }
5308cd36db67SJohn Forte if (!enabled && ret == STMF_STATUS_SUCCESS) {
530945039663SJohn Forte deleteNonActiveLus();
531045039663SJohn Forte }
531145039663SJohn Forte
531245039663SJohn Forte return (ret);
531345039663SJohn Forte }
531445039663SJohn Forte
531545039663SJohn Forte static void
deleteNonActiveLus()531645039663SJohn Forte deleteNonActiveLus()
531745039663SJohn Forte {
531845039663SJohn Forte int stmfRet;
531945039663SJohn Forte int i;
532045039663SJohn Forte stmfGuidList *luList;
532145039663SJohn Forte luResource hdl = NULL;
532245039663SJohn Forte char propVal[10];
532345039663SJohn Forte size_t propValSize = sizeof (propVal);
532445039663SJohn Forte
532545039663SJohn Forte stmfRet = stmfGetLogicalUnitList(&luList);
532645039663SJohn Forte if (stmfRet != STMF_STATUS_SUCCESS) {
532745039663SJohn Forte return;
532845039663SJohn Forte }
532945039663SJohn Forte
533045039663SJohn Forte for (i = 0; i < luList->cnt; i++) {
533145039663SJohn Forte stmfRet = stmfGetLuResource(&luList->guid[i], &hdl);
533245039663SJohn Forte if (stmfRet != STMF_STATUS_SUCCESS) {
533345039663SJohn Forte goto err;
533445039663SJohn Forte }
533545039663SJohn Forte stmfRet = stmfGetLuProp(hdl, STMF_LU_PROP_ACCESS_STATE, propVal,
533645039663SJohn Forte &propValSize);
533745039663SJohn Forte if (stmfRet != STMF_STATUS_SUCCESS) {
533845039663SJohn Forte goto err;
533945039663SJohn Forte }
534045039663SJohn Forte if (propVal[0] == '0') {
534145039663SJohn Forte (void) stmfFreeLuResource(hdl);
534245039663SJohn Forte hdl = NULL;
534345039663SJohn Forte continue;
534445039663SJohn Forte }
534545039663SJohn Forte (void) stmfDeleteLu(&luList->guid[i]);
534645039663SJohn Forte (void) stmfFreeLuResource(hdl);
534745039663SJohn Forte hdl = NULL;
534845039663SJohn Forte }
534945039663SJohn Forte
535045039663SJohn Forte err:
535145039663SJohn Forte stmfFreeMemory(luList);
535245039663SJohn Forte (void) stmfFreeLuResource(hdl);
535345039663SJohn Forte }
535445039663SJohn Forte
535545039663SJohn Forte /*
5356fcf3ce44SJohn Forte * stmfLoadConfig
5357fcf3ce44SJohn Forte *
5358fcf3ce44SJohn Forte * Purpose - load the configuration data from smf into stmf
5359fcf3ce44SJohn Forte *
5360fcf3ce44SJohn Forte */
5361fcf3ce44SJohn Forte int
stmfLoadConfig(void)5362fcf3ce44SJohn Forte stmfLoadConfig(void)
5363fcf3ce44SJohn Forte {
53648fe96085Stim szeto int ret = STMF_STATUS_SUCCESS;
5365fcf3ce44SJohn Forte int fd;
5366fcf3ce44SJohn Forte stmf_state_desc_t stmfStateSet;
5367fcf3ce44SJohn Forte stmfState state;
5368fcf3ce44SJohn Forte
53698fe96085Stim szeto if (iGetPersistMethod() == STMF_PERSIST_NONE) {
53708fe96085Stim szeto stmfStateSet.state = STMF_STATE_OFFLINE;
5371640428aeSSue Gleeson
53728fe96085Stim szeto if ((ret = openStmf(OPEN_EXCL_STMF, &fd))
53738fe96085Stim szeto != STMF_STATUS_SUCCESS) {
53748fe96085Stim szeto return (ret);
53758fe96085Stim szeto }
5376640428aeSSue Gleeson /*
5377640428aeSSue Gleeson * Configuration not stored persistently; nothing to
5378640428aeSSue Gleeson * initialize so do not set to STMF_CONFIG_INIT.
5379640428aeSSue Gleeson */
53808fe96085Stim szeto stmfStateSet.config_state = STMF_CONFIG_INIT_DONE;
53818fe96085Stim szeto goto done;
53828fe96085Stim szeto }
5383fcf3ce44SJohn Forte
5384fcf3ce44SJohn Forte /* Check to ensure service exists */
5385fcf3ce44SJohn Forte if (psCheckService() != STMF_STATUS_SUCCESS) {
5386fcf3ce44SJohn Forte return (STMF_ERROR_SERVICE_NOT_FOUND);
5387fcf3ce44SJohn Forte }
5388fcf3ce44SJohn Forte
5389fcf3ce44SJohn Forte ret = stmfGetState(&state);
5390fcf3ce44SJohn Forte if (ret == STMF_STATUS_SUCCESS) {
5391fcf3ce44SJohn Forte if (state.operationalState != STMF_SERVICE_STATE_OFFLINE) {
5392fcf3ce44SJohn Forte return (STMF_ERROR_SERVICE_ONLINE);
5393fcf3ce44SJohn Forte }
5394fcf3ce44SJohn Forte } else {
5395fcf3ce44SJohn Forte return (STMF_STATUS_ERROR);
5396fcf3ce44SJohn Forte }
5397fcf3ce44SJohn Forte
5398fcf3ce44SJohn Forte
5399fcf3ce44SJohn Forte stmfStateSet.state = STMF_STATE_OFFLINE;
5400fcf3ce44SJohn Forte stmfStateSet.config_state = STMF_CONFIG_INIT;
5401fcf3ce44SJohn Forte
5402fcf3ce44SJohn Forte /*
5403fcf3ce44SJohn Forte * Open control node for stmf
5404fcf3ce44SJohn Forte */
5405fcf3ce44SJohn Forte if ((ret = openStmf(OPEN_EXCL_STMF, &fd)) != STMF_STATUS_SUCCESS)
5406fcf3ce44SJohn Forte return (ret);
5407fcf3ce44SJohn Forte
5408fcf3ce44SJohn Forte ret = setStmfState(fd, &stmfStateSet, STMF_SERVICE_TYPE);
5409fcf3ce44SJohn Forte if (ret != STMF_STATUS_SUCCESS) {
5410fcf3ce44SJohn Forte goto done;
5411fcf3ce44SJohn Forte }
5412fcf3ce44SJohn Forte
5413fcf3ce44SJohn Forte /* Load the persistent configuration data */
5414fcf3ce44SJohn Forte ret = loadStore(fd);
5415fcf3ce44SJohn Forte if (ret != 0) {
5416fcf3ce44SJohn Forte goto done;
5417fcf3ce44SJohn Forte }
5418fcf3ce44SJohn Forte
5419fcf3ce44SJohn Forte stmfStateSet.state = STMF_STATE_OFFLINE;
5420fcf3ce44SJohn Forte stmfStateSet.config_state = STMF_CONFIG_INIT_DONE;
5421fcf3ce44SJohn Forte
5422fcf3ce44SJohn Forte done:
5423fcf3ce44SJohn Forte if (ret == STMF_STATUS_SUCCESS) {
5424fcf3ce44SJohn Forte ret = setStmfState(fd, &stmfStateSet, STMF_SERVICE_TYPE);
5425fcf3ce44SJohn Forte }
5426fcf3ce44SJohn Forte (void) close(fd);
5427fcf3ce44SJohn Forte return (ret);
5428fcf3ce44SJohn Forte }
5429fcf3ce44SJohn Forte
54308fe96085Stim szeto
5431fcf3ce44SJohn Forte /*
5432fcf3ce44SJohn Forte * getStmfState
5433fcf3ce44SJohn Forte *
5434fcf3ce44SJohn Forte * stmfState - pointer to stmf_state_desc_t structure. Will contain the state
5435fcf3ce44SJohn Forte * information of the stmf service on success.
5436fcf3ce44SJohn Forte */
5437fcf3ce44SJohn Forte static int
getStmfState(stmf_state_desc_t * stmfState)5438fcf3ce44SJohn Forte getStmfState(stmf_state_desc_t *stmfState)
5439fcf3ce44SJohn Forte {
5440fcf3ce44SJohn Forte int ret = STMF_STATUS_SUCCESS;
5441fcf3ce44SJohn Forte int fd;
5442fcf3ce44SJohn Forte int ioctlRet;
5443fcf3ce44SJohn Forte stmf_iocdata_t stmfIoctl;
5444fcf3ce44SJohn Forte
5445fcf3ce44SJohn Forte /*
5446fcf3ce44SJohn Forte * Open control node for stmf
5447fcf3ce44SJohn Forte */
5448fcf3ce44SJohn Forte if ((ret = openStmf(OPEN_STMF, &fd)) != STMF_STATUS_SUCCESS)
5449fcf3ce44SJohn Forte return (ret);
5450fcf3ce44SJohn Forte
5451fcf3ce44SJohn Forte bzero(&stmfIoctl, sizeof (stmfIoctl));
5452fcf3ce44SJohn Forte /*
5453fcf3ce44SJohn Forte * Issue ioctl to get the stmf state
5454fcf3ce44SJohn Forte */
5455fcf3ce44SJohn Forte stmfIoctl.stmf_version = STMF_VERSION_1;
5456fcf3ce44SJohn Forte stmfIoctl.stmf_ibuf_size = sizeof (stmf_state_desc_t);
5457fcf3ce44SJohn Forte stmfIoctl.stmf_ibuf = (uint64_t)(unsigned long)stmfState;
5458fcf3ce44SJohn Forte stmfIoctl.stmf_obuf_size = sizeof (stmf_state_desc_t);
5459fcf3ce44SJohn Forte stmfIoctl.stmf_obuf = (uint64_t)(unsigned long)stmfState;
5460fcf3ce44SJohn Forte ioctlRet = ioctl(fd, STMF_IOCTL_GET_STMF_STATE, &stmfIoctl);
5461fcf3ce44SJohn Forte
5462fcf3ce44SJohn Forte (void) close(fd);
5463fcf3ce44SJohn Forte
5464fcf3ce44SJohn Forte if (ioctlRet != 0) {
5465fcf3ce44SJohn Forte switch (errno) {
5466fcf3ce44SJohn Forte case EBUSY:
5467fcf3ce44SJohn Forte ret = STMF_ERROR_BUSY;
5468fcf3ce44SJohn Forte break;
5469fcf3ce44SJohn Forte case EPERM:
5470fcf3ce44SJohn Forte case EACCES:
5471fcf3ce44SJohn Forte ret = STMF_ERROR_PERM;
5472fcf3ce44SJohn Forte break;
5473fcf3ce44SJohn Forte default:
5474fcf3ce44SJohn Forte syslog(LOG_DEBUG,
5475fcf3ce44SJohn Forte "getStmfState:ioctl errno(%d)", errno);
5476fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR;
5477fcf3ce44SJohn Forte break;
5478fcf3ce44SJohn Forte }
5479fcf3ce44SJohn Forte }
5480fcf3ce44SJohn Forte return (ret);
5481fcf3ce44SJohn Forte }
5482fcf3ce44SJohn Forte
5483fcf3ce44SJohn Forte
5484fcf3ce44SJohn Forte /*
5485fcf3ce44SJohn Forte * setStmfState
5486fcf3ce44SJohn Forte *
5487fcf3ce44SJohn Forte * stmfState - pointer to caller set state structure
5488fcf3ce44SJohn Forte * objectType - one of:
5489fcf3ce44SJohn Forte * LOGICAL_UNIT_TYPE
5490fcf3ce44SJohn Forte * TARGET_TYPE
5491fcf3ce44SJohn Forte * STMF_SERVICE_TYPE
5492fcf3ce44SJohn Forte */
5493fcf3ce44SJohn Forte static int
setStmfState(int fd,stmf_state_desc_t * stmfState,int objectType)5494fcf3ce44SJohn Forte setStmfState(int fd, stmf_state_desc_t *stmfState, int objectType)
5495fcf3ce44SJohn Forte {
5496fcf3ce44SJohn Forte int ret = STMF_STATUS_SUCCESS;
5497fcf3ce44SJohn Forte int ioctlRet;
5498fcf3ce44SJohn Forte int cmd;
5499fcf3ce44SJohn Forte stmf_iocdata_t stmfIoctl;
5500fcf3ce44SJohn Forte
5501fcf3ce44SJohn Forte switch (objectType) {
5502fcf3ce44SJohn Forte case LOGICAL_UNIT_TYPE:
5503fcf3ce44SJohn Forte cmd = STMF_IOCTL_SET_LU_STATE;
5504fcf3ce44SJohn Forte break;
5505fcf3ce44SJohn Forte case TARGET_TYPE:
5506fcf3ce44SJohn Forte cmd = STMF_IOCTL_SET_TARGET_PORT_STATE;
5507fcf3ce44SJohn Forte break;
5508fcf3ce44SJohn Forte case STMF_SERVICE_TYPE:
5509fcf3ce44SJohn Forte cmd = STMF_IOCTL_SET_STMF_STATE;
5510fcf3ce44SJohn Forte break;
5511fcf3ce44SJohn Forte default:
5512fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR;
5513fcf3ce44SJohn Forte goto done;
5514fcf3ce44SJohn Forte }
5515fcf3ce44SJohn Forte
5516fcf3ce44SJohn Forte bzero(&stmfIoctl, sizeof (stmfIoctl));
5517fcf3ce44SJohn Forte /*
5518fcf3ce44SJohn Forte * Issue ioctl to set the stmf state
5519fcf3ce44SJohn Forte */
5520fcf3ce44SJohn Forte stmfIoctl.stmf_version = STMF_VERSION_1;
5521fcf3ce44SJohn Forte stmfIoctl.stmf_ibuf_size = sizeof (stmf_state_desc_t);
5522fcf3ce44SJohn Forte stmfIoctl.stmf_ibuf = (uint64_t)(unsigned long)stmfState;
5523fcf3ce44SJohn Forte ioctlRet = ioctl(fd, cmd, &stmfIoctl);
5524fcf3ce44SJohn Forte if (ioctlRet != 0) {
5525fcf3ce44SJohn Forte switch (errno) {
5526fcf3ce44SJohn Forte case EBUSY:
5527fcf3ce44SJohn Forte ret = STMF_ERROR_BUSY;
5528fcf3ce44SJohn Forte break;
55298fe96085Stim szeto case EPERM:
5530fcf3ce44SJohn Forte case EACCES:
5531fcf3ce44SJohn Forte ret = STMF_ERROR_PERM;
5532fcf3ce44SJohn Forte break;
5533fcf3ce44SJohn Forte case ENOENT:
5534fcf3ce44SJohn Forte ret = STMF_ERROR_NOT_FOUND;
5535fcf3ce44SJohn Forte break;
5536fcf3ce44SJohn Forte default:
5537fcf3ce44SJohn Forte syslog(LOG_DEBUG,
5538fcf3ce44SJohn Forte "setStmfState:ioctl errno(%d)", errno);
5539fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR;
5540fcf3ce44SJohn Forte break;
5541fcf3ce44SJohn Forte }
5542fcf3ce44SJohn Forte }
5543fcf3ce44SJohn Forte done:
5544fcf3ce44SJohn Forte return (ret);
5545fcf3ce44SJohn Forte }
55464b31676fSsrivijitha dugganapalli int
stmfSetStmfProp(uint8_t propType,char * propVal)55474b31676fSsrivijitha dugganapalli stmfSetStmfProp(uint8_t propType, char *propVal)
55484b31676fSsrivijitha dugganapalli {
55494b31676fSsrivijitha dugganapalli int ret = STMF_STATUS_SUCCESS;
55504b31676fSsrivijitha dugganapalli switch (propType) {
55514b31676fSsrivijitha dugganapalli case STMF_DEFAULT_LU_STATE:
55524b31676fSsrivijitha dugganapalli break;
55534b31676fSsrivijitha dugganapalli case STMF_DEFAULT_TARGET_PORT_STATE:
55544b31676fSsrivijitha dugganapalli break;
55554b31676fSsrivijitha dugganapalli default:
55564b31676fSsrivijitha dugganapalli return (STMF_ERROR_INVALID_ARG);
55574b31676fSsrivijitha dugganapalli }
55584b31676fSsrivijitha dugganapalli ret = psSetStmfProp(propType, propVal);
55594b31676fSsrivijitha dugganapalli switch (ret) {
55604b31676fSsrivijitha dugganapalli case STMF_PS_SUCCESS:
55614b31676fSsrivijitha dugganapalli ret = STMF_STATUS_SUCCESS;
55624b31676fSsrivijitha dugganapalli break;
55634b31676fSsrivijitha dugganapalli case STMF_PS_ERROR_BUSY:
55644b31676fSsrivijitha dugganapalli ret = STMF_ERROR_BUSY;
55654b31676fSsrivijitha dugganapalli break;
55664b31676fSsrivijitha dugganapalli default:
55674b31676fSsrivijitha dugganapalli syslog(LOG_DEBUG,
55684b31676fSsrivijitha dugganapalli "stmfSetStmfProp:psSetStmfProp:error(%d)",
55694b31676fSsrivijitha dugganapalli ret);
55704b31676fSsrivijitha dugganapalli ret = STMF_STATUS_ERROR;
55714b31676fSsrivijitha dugganapalli break;
55724b31676fSsrivijitha dugganapalli }
55734b31676fSsrivijitha dugganapalli return (ret);
55744b31676fSsrivijitha dugganapalli }
55754b31676fSsrivijitha dugganapalli
55764b31676fSsrivijitha dugganapalli
55774b31676fSsrivijitha dugganapalli int
stmfGetStmfProp(uint8_t propType,char * propVal,size_t * propLen)55784b31676fSsrivijitha dugganapalli stmfGetStmfProp(uint8_t propType, char *propVal, size_t *propLen)
55794b31676fSsrivijitha dugganapalli {
55804b31676fSsrivijitha dugganapalli int ret = STMF_STATUS_SUCCESS;
55814b31676fSsrivijitha dugganapalli char prop[MAXNAMELEN] = {0};
55824b31676fSsrivijitha dugganapalli size_t reqLen;
55834b31676fSsrivijitha dugganapalli
55844b31676fSsrivijitha dugganapalli if (propVal == NULL || propLen == NULL) {
55854b31676fSsrivijitha dugganapalli return (STMF_ERROR_INVALID_ARG);
55864b31676fSsrivijitha dugganapalli }
55874b31676fSsrivijitha dugganapalli switch (propType) {
55884b31676fSsrivijitha dugganapalli case STMF_DEFAULT_LU_STATE:
55894b31676fSsrivijitha dugganapalli break;
55904b31676fSsrivijitha dugganapalli case STMF_DEFAULT_TARGET_PORT_STATE:
55914b31676fSsrivijitha dugganapalli break;
55924b31676fSsrivijitha dugganapalli default:
55934b31676fSsrivijitha dugganapalli return (STMF_ERROR_INVALID_ARG);
55944b31676fSsrivijitha dugganapalli }
55954b31676fSsrivijitha dugganapalli ret = psGetStmfProp(propType, prop);
55964b31676fSsrivijitha dugganapalli if ((reqLen = strlcpy(propVal, prop, *propLen)) >= *propLen) {
55974b31676fSsrivijitha dugganapalli *propLen = reqLen + 1;
55984b31676fSsrivijitha dugganapalli return (STMF_ERROR_INVALID_ARG);
55994b31676fSsrivijitha dugganapalli }
56004b31676fSsrivijitha dugganapalli
56014b31676fSsrivijitha dugganapalli switch (ret) {
56024b31676fSsrivijitha dugganapalli case STMF_PS_SUCCESS:
56034b31676fSsrivijitha dugganapalli ret = STMF_STATUS_SUCCESS;
56044b31676fSsrivijitha dugganapalli break;
56054b31676fSsrivijitha dugganapalli case STMF_PS_ERROR_BUSY:
56064b31676fSsrivijitha dugganapalli ret = STMF_ERROR_BUSY;
56074b31676fSsrivijitha dugganapalli break;
56084b31676fSsrivijitha dugganapalli case STMF_PS_ERROR_NOT_FOUND:
56094b31676fSsrivijitha dugganapalli ret = STMF_ERROR_NOT_FOUND;
56104b31676fSsrivijitha dugganapalli break;
56114b31676fSsrivijitha dugganapalli default:
56124b31676fSsrivijitha dugganapalli syslog(LOG_DEBUG,
56134b31676fSsrivijitha dugganapalli "stmfGetStmfProp:psGetStmfProp:error(%d)",
56144b31676fSsrivijitha dugganapalli ret);
56154b31676fSsrivijitha dugganapalli ret = STMF_STATUS_ERROR;
56164b31676fSsrivijitha dugganapalli break;
56174b31676fSsrivijitha dugganapalli }
56184b31676fSsrivijitha dugganapalli return (ret);
56194b31676fSsrivijitha dugganapalli }
56204b31676fSsrivijitha dugganapalli
56214b31676fSsrivijitha dugganapalli static int
setStmfProp(stmf_set_props_t * stmf_set_props)56224b31676fSsrivijitha dugganapalli setStmfProp(stmf_set_props_t *stmf_set_props)
56234b31676fSsrivijitha dugganapalli {
56244b31676fSsrivijitha dugganapalli char propVal[MAXNAMELEN] = {0};
56254b31676fSsrivijitha dugganapalli int ret;
56264b31676fSsrivijitha dugganapalli if ((ret = psGetStmfProp(STMF_DEFAULT_LU_STATE, propVal)) ==
56274b31676fSsrivijitha dugganapalli STMF_PS_SUCCESS) {
56284b31676fSsrivijitha dugganapalli if (strncmp(propVal, "offline", strlen(propVal)) == 0) {
56294b31676fSsrivijitha dugganapalli stmf_set_props->default_lu_state_value =
56304b31676fSsrivijitha dugganapalli STMF_STATE_OFFLINE;
56314b31676fSsrivijitha dugganapalli } else {
56324b31676fSsrivijitha dugganapalli stmf_set_props->default_lu_state_value =
56334b31676fSsrivijitha dugganapalli STMF_STATE_ONLINE;
56344b31676fSsrivijitha dugganapalli }
56354b31676fSsrivijitha dugganapalli } else {
56364b31676fSsrivijitha dugganapalli syslog(LOG_DEBUG,
56374b31676fSsrivijitha dugganapalli "DefaultLuState:psSetStmfProp:error(%d)", ret);
56384b31676fSsrivijitha dugganapalli goto done;
56394b31676fSsrivijitha dugganapalli }
56404b31676fSsrivijitha dugganapalli
56414b31676fSsrivijitha dugganapalli if ((ret = psGetStmfProp(STMF_DEFAULT_TARGET_PORT_STATE, propVal)) ==
56424b31676fSsrivijitha dugganapalli STMF_PS_SUCCESS) {
56434b31676fSsrivijitha dugganapalli if (strncmp(propVal, "offline", strlen(propVal)) == 0) {
56444b31676fSsrivijitha dugganapalli stmf_set_props->default_target_state_value =
56454b31676fSsrivijitha dugganapalli STMF_STATE_OFFLINE;
56464b31676fSsrivijitha dugganapalli } else {
56474b31676fSsrivijitha dugganapalli stmf_set_props->default_target_state_value =
56484b31676fSsrivijitha dugganapalli STMF_STATE_ONLINE;
56494b31676fSsrivijitha dugganapalli }
56504b31676fSsrivijitha dugganapalli } else {
56514b31676fSsrivijitha dugganapalli syslog(LOG_DEBUG,
56524b31676fSsrivijitha dugganapalli "DefaultTargetPortState:psSetStmfProp:error(%d)", ret);
56534b31676fSsrivijitha dugganapalli goto done;
56544b31676fSsrivijitha dugganapalli }
56554b31676fSsrivijitha dugganapalli done:
56564b31676fSsrivijitha dugganapalli switch (ret) {
56574b31676fSsrivijitha dugganapalli case STMF_PS_SUCCESS:
56584b31676fSsrivijitha dugganapalli ret = STMF_STATUS_SUCCESS;
56594b31676fSsrivijitha dugganapalli break;
56604b31676fSsrivijitha dugganapalli case STMF_PS_ERROR_NOT_FOUND:
56614b31676fSsrivijitha dugganapalli ret = STMF_ERROR_NOT_FOUND;
56624b31676fSsrivijitha dugganapalli break;
56634b31676fSsrivijitha dugganapalli case STMF_PS_ERROR_BUSY:
56644b31676fSsrivijitha dugganapalli ret = STMF_ERROR_BUSY;
56654b31676fSsrivijitha dugganapalli break;
56664b31676fSsrivijitha dugganapalli default:
56674b31676fSsrivijitha dugganapalli ret = STMF_STATUS_ERROR;
56684b31676fSsrivijitha dugganapalli break;
56694b31676fSsrivijitha dugganapalli }
56704b31676fSsrivijitha dugganapalli return (ret);
56714b31676fSsrivijitha dugganapalli }
56724b31676fSsrivijitha dugganapalli
56734b31676fSsrivijitha dugganapalli static int
loadStmfProp(int fd)56744b31676fSsrivijitha dugganapalli loadStmfProp(int fd)
56754b31676fSsrivijitha dugganapalli {
56764b31676fSsrivijitha dugganapalli int ret = STMF_STATUS_SUCCESS;
56774b31676fSsrivijitha dugganapalli int ioctlRet;
56784b31676fSsrivijitha dugganapalli stmf_iocdata_t stmfIoctl = {0};
56794b31676fSsrivijitha dugganapalli stmf_set_props_t *stmf_set_props = NULL;
56804b31676fSsrivijitha dugganapalli
56814b31676fSsrivijitha dugganapalli stmf_set_props = (stmf_set_props_t *)
56824b31676fSsrivijitha dugganapalli calloc(1, (sizeof (stmf_set_props_t)));
56834b31676fSsrivijitha dugganapalli if (stmf_set_props == NULL) {
56844b31676fSsrivijitha dugganapalli ret = STMF_ERROR_NOMEM;
56854b31676fSsrivijitha dugganapalli goto done;
56864b31676fSsrivijitha dugganapalli }
56874b31676fSsrivijitha dugganapalli
56884b31676fSsrivijitha dugganapalli /* Loading the default property values from smf */
56894b31676fSsrivijitha dugganapalli
56904b31676fSsrivijitha dugganapalli if ((ret = setStmfProp(stmf_set_props)) != STMF_STATUS_SUCCESS)
56914b31676fSsrivijitha dugganapalli goto done;
56924b31676fSsrivijitha dugganapalli
56934b31676fSsrivijitha dugganapalli stmfIoctl.stmf_version = STMF_VERSION_1;
56944b31676fSsrivijitha dugganapalli stmfIoctl.stmf_ibuf_size = sizeof (stmf_set_props_t);
56954b31676fSsrivijitha dugganapalli stmfIoctl.stmf_ibuf =
56964b31676fSsrivijitha dugganapalli (uint64_t)(unsigned long)stmf_set_props;
56974b31676fSsrivijitha dugganapalli
56984b31676fSsrivijitha dugganapalli ioctlRet = ioctl(fd, STMF_IOCTL_SET_STMF_PROPS,
56994b31676fSsrivijitha dugganapalli &stmfIoctl);
57004b31676fSsrivijitha dugganapalli
57014b31676fSsrivijitha dugganapalli if (ioctlRet != 0) {
57024b31676fSsrivijitha dugganapalli switch (errno) {
57034b31676fSsrivijitha dugganapalli case EBUSY:
57044b31676fSsrivijitha dugganapalli ret = STMF_ERROR_BUSY;
57054b31676fSsrivijitha dugganapalli break;
57064b31676fSsrivijitha dugganapalli case EPERM:
57074b31676fSsrivijitha dugganapalli case EACCES:
57084b31676fSsrivijitha dugganapalli ret = STMF_ERROR_PERM;
57094b31676fSsrivijitha dugganapalli break;
57104b31676fSsrivijitha dugganapalli case ENOENT:
57114b31676fSsrivijitha dugganapalli ret = STMF_ERROR_NOT_FOUND;
57124b31676fSsrivijitha dugganapalli break;
57134b31676fSsrivijitha dugganapalli default:
57144b31676fSsrivijitha dugganapalli syslog(LOG_DEBUG,
57154b31676fSsrivijitha dugganapalli "setDefaultStmfState:"
57164b31676fSsrivijitha dugganapalli "ioctl errno(%d)", errno);
57174b31676fSsrivijitha dugganapalli ret = STMF_STATUS_ERROR;
57184b31676fSsrivijitha dugganapalli break;
57194b31676fSsrivijitha dugganapalli }
57204b31676fSsrivijitha dugganapalli }
57214b31676fSsrivijitha dugganapalli done:
57224b31676fSsrivijitha dugganapalli if (stmf_set_props != NULL) {
57234b31676fSsrivijitha dugganapalli free(stmf_set_props);
57244b31676fSsrivijitha dugganapalli }
57254b31676fSsrivijitha dugganapalli return (ret);
57264b31676fSsrivijitha dugganapalli }
57274b31676fSsrivijitha dugganapalli
57284b31676fSsrivijitha dugganapalli int
stmfLoadStmfProps(void)57294b31676fSsrivijitha dugganapalli stmfLoadStmfProps(void)
57304b31676fSsrivijitha dugganapalli {
57314b31676fSsrivijitha dugganapalli int ret = STMF_STATUS_SUCCESS;
57324b31676fSsrivijitha dugganapalli int fd;
57334b31676fSsrivijitha dugganapalli /* open control node for stmf */
57344b31676fSsrivijitha dugganapalli if ((ret = openStmf(OPEN_EXCL_STMF, &fd))
57354b31676fSsrivijitha dugganapalli != STMF_STATUS_SUCCESS) {
57364b31676fSsrivijitha dugganapalli goto done;
57374b31676fSsrivijitha dugganapalli }
57384b31676fSsrivijitha dugganapalli ret = loadStmfProp(fd);
57394b31676fSsrivijitha dugganapalli
57404b31676fSsrivijitha dugganapalli (void) close(fd);
57414b31676fSsrivijitha dugganapalli done:
57424b31676fSsrivijitha dugganapalli if (ret != STMF_STATUS_SUCCESS) {
57434b31676fSsrivijitha dugganapalli syslog(LOG_DEBUG,
57444b31676fSsrivijitha dugganapalli "stmfLoadStmfProps:Failed");
57454b31676fSsrivijitha dugganapalli }
57464b31676fSsrivijitha dugganapalli return (ret);
57474b31676fSsrivijitha dugganapalli }
5748fcf3ce44SJohn Forte
5749fcf3ce44SJohn Forte /*
5750fcf3ce44SJohn Forte * stmfOnline
5751fcf3ce44SJohn Forte *
5752fcf3ce44SJohn Forte * Purpose: Online stmf service
5753fcf3ce44SJohn Forte *
5754fcf3ce44SJohn Forte */
5755fcf3ce44SJohn Forte int
stmfOnline(void)5756fcf3ce44SJohn Forte stmfOnline(void)
5757fcf3ce44SJohn Forte {
5758fcf3ce44SJohn Forte int ret;
5759fcf3ce44SJohn Forte int fd;
5760fcf3ce44SJohn Forte stmfState state;
5761fcf3ce44SJohn Forte stmf_state_desc_t iState;
5762fcf3ce44SJohn Forte
5763fcf3ce44SJohn Forte ret = stmfGetState(&state);
5764fcf3ce44SJohn Forte if (ret == STMF_STATUS_SUCCESS) {
5765fcf3ce44SJohn Forte if (state.operationalState == STMF_SERVICE_STATE_ONLINE) {
5766fcf3ce44SJohn Forte return (STMF_ERROR_SERVICE_ONLINE);
5767fcf3ce44SJohn Forte }
5768fcf3ce44SJohn Forte } else {
5769fcf3ce44SJohn Forte return (STMF_STATUS_ERROR);
5770fcf3ce44SJohn Forte }
5771fcf3ce44SJohn Forte iState.state = STMF_STATE_ONLINE;
5772fcf3ce44SJohn Forte iState.config_state = STMF_CONFIG_NONE;
5773fcf3ce44SJohn Forte /*
5774fcf3ce44SJohn Forte * Open control node for stmf
5775fcf3ce44SJohn Forte * to make call to setStmfState()
5776fcf3ce44SJohn Forte */
5777fcf3ce44SJohn Forte if ((ret = openStmf(OPEN_EXCL_STMF, &fd)) != STMF_STATUS_SUCCESS)
5778fcf3ce44SJohn Forte return (ret);
5779fcf3ce44SJohn Forte ret = setStmfState(fd, &iState, STMF_SERVICE_TYPE);
5780fcf3ce44SJohn Forte (void) close(fd);
5781fcf3ce44SJohn Forte return (ret);
5782fcf3ce44SJohn Forte }
5783fcf3ce44SJohn Forte
5784fcf3ce44SJohn Forte /*
5785fcf3ce44SJohn Forte * stmfOffline
5786fcf3ce44SJohn Forte *
5787fcf3ce44SJohn Forte * Purpose: Offline stmf service
5788fcf3ce44SJohn Forte *
5789fcf3ce44SJohn Forte */
5790fcf3ce44SJohn Forte int
stmfOffline(void)5791fcf3ce44SJohn Forte stmfOffline(void)
5792fcf3ce44SJohn Forte {
5793fcf3ce44SJohn Forte int ret;
5794fcf3ce44SJohn Forte int fd;
5795fcf3ce44SJohn Forte stmfState state;
5796fcf3ce44SJohn Forte stmf_state_desc_t iState;
5797fcf3ce44SJohn Forte
5798fcf3ce44SJohn Forte ret = stmfGetState(&state);
5799fcf3ce44SJohn Forte if (ret == STMF_STATUS_SUCCESS) {
5800fcf3ce44SJohn Forte if (state.operationalState == STMF_SERVICE_STATE_OFFLINE) {
5801fcf3ce44SJohn Forte return (STMF_ERROR_SERVICE_OFFLINE);
5802fcf3ce44SJohn Forte }
5803fcf3ce44SJohn Forte } else {
5804fcf3ce44SJohn Forte return (STMF_STATUS_ERROR);
5805fcf3ce44SJohn Forte }
5806fcf3ce44SJohn Forte iState.state = STMF_STATE_OFFLINE;
5807fcf3ce44SJohn Forte iState.config_state = STMF_CONFIG_NONE;
5808fcf3ce44SJohn Forte
5809fcf3ce44SJohn Forte /*
5810fcf3ce44SJohn Forte * Open control node for stmf
5811fcf3ce44SJohn Forte * to make call to setStmfState()
5812fcf3ce44SJohn Forte */
5813fcf3ce44SJohn Forte if ((ret = openStmf(OPEN_EXCL_STMF, &fd)) != STMF_STATUS_SUCCESS)
5814fcf3ce44SJohn Forte return (ret);
5815fcf3ce44SJohn Forte ret = setStmfState(fd, &iState, STMF_SERVICE_TYPE);
5816fcf3ce44SJohn Forte (void) close(fd);
5817fcf3ce44SJohn Forte return (ret);
5818fcf3ce44SJohn Forte }
5819fcf3ce44SJohn Forte
5820fcf3ce44SJohn Forte
5821fcf3ce44SJohn Forte /*
5822fcf3ce44SJohn Forte * stmfOfflineTarget
5823fcf3ce44SJohn Forte *
5824fcf3ce44SJohn Forte * Purpose: Change state of target to offline
5825fcf3ce44SJohn Forte *
5826fcf3ce44SJohn Forte * devid - devid of the target to offline
5827fcf3ce44SJohn Forte */
5828fcf3ce44SJohn Forte int
stmfOfflineTarget(stmfDevid * devid)5829fcf3ce44SJohn Forte stmfOfflineTarget(stmfDevid *devid)
5830fcf3ce44SJohn Forte {
5831fcf3ce44SJohn Forte stmf_state_desc_t targetState;
5832fcf3ce44SJohn Forte int ret = STMF_STATUS_SUCCESS;
5833fcf3ce44SJohn Forte int fd;
5834fcf3ce44SJohn Forte
5835fcf3ce44SJohn Forte if (devid == NULL) {
5836fcf3ce44SJohn Forte return (STMF_ERROR_INVALID_ARG);
5837fcf3ce44SJohn Forte }
5838fcf3ce44SJohn Forte bzero(&targetState, sizeof (targetState));
5839fcf3ce44SJohn Forte
5840fcf3ce44SJohn Forte targetState.state = STMF_STATE_OFFLINE;
5841fcf3ce44SJohn Forte targetState.ident[IDENT_LENGTH_BYTE] = devid->identLength;
5842fcf3ce44SJohn Forte bcopy(&(devid->ident), &targetState.ident[IDENT_LENGTH_BYTE + 1],
5843fcf3ce44SJohn Forte devid->identLength);
5844fcf3ce44SJohn Forte /*
5845fcf3ce44SJohn Forte * Open control node for stmf
5846fcf3ce44SJohn Forte * to make call to setStmfState()
5847fcf3ce44SJohn Forte */
5848fcf3ce44SJohn Forte if ((ret = openStmf(OPEN_EXCL_STMF, &fd)) != STMF_STATUS_SUCCESS)
5849fcf3ce44SJohn Forte return (ret);
5850fcf3ce44SJohn Forte ret = setStmfState(fd, &targetState, TARGET_TYPE);
5851fcf3ce44SJohn Forte (void) close(fd);
5852fcf3ce44SJohn Forte return (ret);
5853fcf3ce44SJohn Forte }
5854fcf3ce44SJohn Forte
5855fcf3ce44SJohn Forte /*
5856fcf3ce44SJohn Forte * stmfOfflineLogicalUnit
5857fcf3ce44SJohn Forte *
5858fcf3ce44SJohn Forte * Purpose: Change state of logical unit to offline
5859fcf3ce44SJohn Forte *
5860fcf3ce44SJohn Forte * lu - guid of the logical unit to offline
5861fcf3ce44SJohn Forte */
5862fcf3ce44SJohn Forte int
stmfOfflineLogicalUnit(stmfGuid * lu)5863fcf3ce44SJohn Forte stmfOfflineLogicalUnit(stmfGuid *lu)
5864fcf3ce44SJohn Forte {
5865fcf3ce44SJohn Forte stmf_state_desc_t luState;
5866fcf3ce44SJohn Forte int ret = STMF_STATUS_SUCCESS;
5867fcf3ce44SJohn Forte int fd;
5868fcf3ce44SJohn Forte
5869fcf3ce44SJohn Forte if (lu == NULL) {
5870fcf3ce44SJohn Forte return (STMF_ERROR_INVALID_ARG);
5871fcf3ce44SJohn Forte }
5872fcf3ce44SJohn Forte
5873fcf3ce44SJohn Forte bzero(&luState, sizeof (luState));
5874fcf3ce44SJohn Forte
5875fcf3ce44SJohn Forte luState.state = STMF_STATE_OFFLINE;
5876fcf3ce44SJohn Forte bcopy(lu, &luState.ident, sizeof (stmfGuid));
5877fcf3ce44SJohn Forte /*
5878fcf3ce44SJohn Forte * Open control node for stmf
5879fcf3ce44SJohn Forte * to make call to setStmfState()
5880fcf3ce44SJohn Forte */
5881fcf3ce44SJohn Forte if ((ret = openStmf(OPEN_EXCL_STMF, &fd)) != STMF_STATUS_SUCCESS)
5882fcf3ce44SJohn Forte return (ret);
5883fcf3ce44SJohn Forte ret = setStmfState(fd, &luState, LOGICAL_UNIT_TYPE);
5884fcf3ce44SJohn Forte (void) close(fd);
5885fcf3ce44SJohn Forte return (ret);
5886fcf3ce44SJohn Forte }
5887fcf3ce44SJohn Forte
5888fcf3ce44SJohn Forte /*
5889fcf3ce44SJohn Forte * stmfOnlineTarget
5890fcf3ce44SJohn Forte *
5891fcf3ce44SJohn Forte * Purpose: Change state of target to online
5892fcf3ce44SJohn Forte *
5893fcf3ce44SJohn Forte * devid - devid of the target to online
5894fcf3ce44SJohn Forte */
5895fcf3ce44SJohn Forte int
stmfOnlineTarget(stmfDevid * devid)5896fcf3ce44SJohn Forte stmfOnlineTarget(stmfDevid *devid)
5897fcf3ce44SJohn Forte {
5898fcf3ce44SJohn Forte stmf_state_desc_t targetState;
5899fcf3ce44SJohn Forte int ret = STMF_STATUS_SUCCESS;
5900fcf3ce44SJohn Forte int fd;
5901fcf3ce44SJohn Forte
5902fcf3ce44SJohn Forte if (devid == NULL) {
5903fcf3ce44SJohn Forte return (STMF_ERROR_INVALID_ARG);
5904fcf3ce44SJohn Forte }
5905fcf3ce44SJohn Forte bzero(&targetState, sizeof (targetState));
5906fcf3ce44SJohn Forte
5907fcf3ce44SJohn Forte targetState.state = STMF_STATE_ONLINE;
5908fcf3ce44SJohn Forte targetState.ident[IDENT_LENGTH_BYTE] = devid->identLength;
5909fcf3ce44SJohn Forte bcopy(&(devid->ident), &targetState.ident[IDENT_LENGTH_BYTE + 1],
5910fcf3ce44SJohn Forte devid->identLength);
5911fcf3ce44SJohn Forte /*
5912fcf3ce44SJohn Forte * Open control node for stmf
5913fcf3ce44SJohn Forte * to make call to setStmfState()
5914fcf3ce44SJohn Forte */
5915fcf3ce44SJohn Forte if ((ret = openStmf(OPEN_EXCL_STMF, &fd)) != STMF_STATUS_SUCCESS)
5916fcf3ce44SJohn Forte return (ret);
5917fcf3ce44SJohn Forte ret = setStmfState(fd, &targetState, TARGET_TYPE);
5918fcf3ce44SJohn Forte (void) close(fd);
5919fcf3ce44SJohn Forte return (ret);
5920fcf3ce44SJohn Forte }
5921fcf3ce44SJohn Forte
5922fcf3ce44SJohn Forte /*
5923fcf3ce44SJohn Forte * stmfOnlineLogicalUnit
5924fcf3ce44SJohn Forte *
5925fcf3ce44SJohn Forte * Purpose: Change state of logical unit to online
5926fcf3ce44SJohn Forte *
5927fcf3ce44SJohn Forte * lu - guid of the logical unit to online
5928fcf3ce44SJohn Forte */
5929fcf3ce44SJohn Forte int
stmfOnlineLogicalUnit(stmfGuid * lu)5930fcf3ce44SJohn Forte stmfOnlineLogicalUnit(stmfGuid *lu)
5931fcf3ce44SJohn Forte {
5932fcf3ce44SJohn Forte stmf_state_desc_t luState;
5933fcf3ce44SJohn Forte int ret = STMF_STATUS_SUCCESS;
5934fcf3ce44SJohn Forte int fd;
5935fcf3ce44SJohn Forte
5936fcf3ce44SJohn Forte if (lu == NULL) {
5937fcf3ce44SJohn Forte return (STMF_ERROR_INVALID_ARG);
5938fcf3ce44SJohn Forte }
5939fcf3ce44SJohn Forte
5940fcf3ce44SJohn Forte bzero(&luState, sizeof (luState));
5941fcf3ce44SJohn Forte
5942fcf3ce44SJohn Forte luState.state = STMF_STATE_ONLINE;
5943fcf3ce44SJohn Forte bcopy(lu, &luState.ident, sizeof (stmfGuid));
5944fcf3ce44SJohn Forte /*
5945fcf3ce44SJohn Forte * Open control node for stmf
5946fcf3ce44SJohn Forte * to make call to setStmfState()
5947fcf3ce44SJohn Forte */
5948fcf3ce44SJohn Forte if ((ret = openStmf(OPEN_EXCL_STMF, &fd)) != STMF_STATUS_SUCCESS)
5949fcf3ce44SJohn Forte return (ret);
5950fcf3ce44SJohn Forte ret = setStmfState(fd, &luState, LOGICAL_UNIT_TYPE);
5951fcf3ce44SJohn Forte (void) close(fd);
5952fcf3ce44SJohn Forte return (ret);
5953fcf3ce44SJohn Forte }
5954fcf3ce44SJohn Forte
5955fcf3ce44SJohn Forte /*
5956fcf3ce44SJohn Forte * stmfRemoveFromHostGroup
5957fcf3ce44SJohn Forte *
5958fcf3ce44SJohn Forte * Purpose: Removes an initiator from an initiator group
5959fcf3ce44SJohn Forte *
5960fcf3ce44SJohn Forte * hostGroupName - name of an initiator group
5961fcf3ce44SJohn Forte * hostName - name of host group member to remove
5962fcf3ce44SJohn Forte */
5963fcf3ce44SJohn Forte int
stmfRemoveFromHostGroup(stmfGroupName * hostGroupName,stmfDevid * hostName)5964fcf3ce44SJohn Forte stmfRemoveFromHostGroup(stmfGroupName *hostGroupName, stmfDevid *hostName)
5965fcf3ce44SJohn Forte {
5966fcf3ce44SJohn Forte int ret;
5967fcf3ce44SJohn Forte int fd;
5968fcf3ce44SJohn Forte
5969fcf3ce44SJohn Forte if (hostGroupName == NULL ||
5970fcf3ce44SJohn Forte (strnlen((char *)hostGroupName, sizeof (stmfGroupName))
5971fcf3ce44SJohn Forte == sizeof (stmfGroupName)) || hostName == NULL) {
5972fcf3ce44SJohn Forte return (STMF_ERROR_INVALID_ARG);
5973fcf3ce44SJohn Forte }
5974fcf3ce44SJohn Forte
5975fcf3ce44SJohn Forte /* call init */
5976fcf3ce44SJohn Forte ret = initializeConfig();
5977fcf3ce44SJohn Forte if (ret != STMF_STATUS_SUCCESS) {
5978fcf3ce44SJohn Forte return (ret);
5979fcf3ce44SJohn Forte }
5980fcf3ce44SJohn Forte
5981fcf3ce44SJohn Forte /*
5982fcf3ce44SJohn Forte * Open control node for stmf
5983fcf3ce44SJohn Forte */
5984fcf3ce44SJohn Forte if ((ret = openStmf(OPEN_STMF, &fd)) != STMF_STATUS_SUCCESS)
5985fcf3ce44SJohn Forte return (ret);
5986fcf3ce44SJohn Forte
5987fcf3ce44SJohn Forte if ((ret = groupMemberIoctl(fd, STMF_IOCTL_REMOVE_HG_ENTRY,
5988fcf3ce44SJohn Forte hostGroupName, hostName)) != STMF_STATUS_SUCCESS) {
5989fcf3ce44SJohn Forte goto done;
5990fcf3ce44SJohn Forte }
5991fcf3ce44SJohn Forte
59928fe96085Stim szeto if (iGetPersistMethod() == STMF_PERSIST_NONE) {
59938fe96085Stim szeto goto done;
59948fe96085Stim szeto }
59958fe96085Stim szeto
5996fcf3ce44SJohn Forte ret = psRemoveHostGroupMember((char *)hostGroupName,
5997fcf3ce44SJohn Forte (char *)hostName->ident);
5998fcf3ce44SJohn Forte switch (ret) {
5999fcf3ce44SJohn Forte case STMF_PS_SUCCESS:
6000fcf3ce44SJohn Forte ret = STMF_STATUS_SUCCESS;
6001fcf3ce44SJohn Forte break;
6002fcf3ce44SJohn Forte case STMF_PS_ERROR_MEMBER_NOT_FOUND:
6003fcf3ce44SJohn Forte ret = STMF_ERROR_MEMBER_NOT_FOUND;
6004fcf3ce44SJohn Forte break;
6005fcf3ce44SJohn Forte case STMF_PS_ERROR_GROUP_NOT_FOUND:
6006fcf3ce44SJohn Forte ret = STMF_ERROR_GROUP_NOT_FOUND;
6007fcf3ce44SJohn Forte break;
6008fcf3ce44SJohn Forte case STMF_PS_ERROR_BUSY:
6009fcf3ce44SJohn Forte ret = STMF_ERROR_BUSY;
6010fcf3ce44SJohn Forte break;
6011fcf3ce44SJohn Forte case STMF_PS_ERROR_SERVICE_NOT_FOUND:
6012fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_NOT_FOUND;
6013fcf3ce44SJohn Forte break;
6014fcf3ce44SJohn Forte case STMF_PS_ERROR_VERSION_MISMATCH:
6015fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_DATA_VERSION;
6016fcf3ce44SJohn Forte break;
6017fcf3ce44SJohn Forte default:
6018fcf3ce44SJohn Forte syslog(LOG_DEBUG,
6019fcf3ce44SJohn Forte "stmfRemoveFromHostGroup"
6020fcf3ce44SJohn Forte "psRemoveHostGroupMember:error(%d)", ret);
6021fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR;
6022fcf3ce44SJohn Forte break;
6023fcf3ce44SJohn Forte }
6024fcf3ce44SJohn Forte
6025fcf3ce44SJohn Forte done:
6026fcf3ce44SJohn Forte (void) close(fd);
6027fcf3ce44SJohn Forte return (ret);
6028fcf3ce44SJohn Forte }
6029fcf3ce44SJohn Forte
6030fcf3ce44SJohn Forte /*
6031fcf3ce44SJohn Forte * stmfRemoveFromTargetGroup
6032fcf3ce44SJohn Forte *
6033fcf3ce44SJohn Forte * Purpose: Removes a local port from a local port group
6034fcf3ce44SJohn Forte *
6035fcf3ce44SJohn Forte * targetGroupName - name of a target group
6036fcf3ce44SJohn Forte * targetName - name of target to remove
6037fcf3ce44SJohn Forte */
6038fcf3ce44SJohn Forte int
stmfRemoveFromTargetGroup(stmfGroupName * targetGroupName,stmfDevid * targetName)6039fcf3ce44SJohn Forte stmfRemoveFromTargetGroup(stmfGroupName *targetGroupName, stmfDevid *targetName)
6040fcf3ce44SJohn Forte {
6041fcf3ce44SJohn Forte int ret;
6042fcf3ce44SJohn Forte int fd;
6043fcf3ce44SJohn Forte
6044fcf3ce44SJohn Forte if (targetGroupName == NULL ||
6045fcf3ce44SJohn Forte (strnlen((char *)targetGroupName, sizeof (stmfGroupName))
6046fcf3ce44SJohn Forte == sizeof (stmfGroupName)) || targetName == NULL) {
6047fcf3ce44SJohn Forte return (STMF_ERROR_INVALID_ARG);
6048fcf3ce44SJohn Forte }
6049fcf3ce44SJohn Forte
6050fcf3ce44SJohn Forte /* call init */
6051fcf3ce44SJohn Forte ret = initializeConfig();
6052fcf3ce44SJohn Forte if (ret != STMF_STATUS_SUCCESS) {
6053fcf3ce44SJohn Forte return (ret);
6054fcf3ce44SJohn Forte }
6055fcf3ce44SJohn Forte
6056fcf3ce44SJohn Forte /*
6057fcf3ce44SJohn Forte * Open control node for stmf
6058fcf3ce44SJohn Forte */
6059fcf3ce44SJohn Forte if ((ret = openStmf(OPEN_STMF, &fd)) != STMF_STATUS_SUCCESS)
6060fcf3ce44SJohn Forte return (ret);
6061fcf3ce44SJohn Forte
6062fcf3ce44SJohn Forte if ((ret = groupMemberIoctl(fd, STMF_IOCTL_REMOVE_TG_ENTRY,
6063fcf3ce44SJohn Forte targetGroupName, targetName)) != STMF_STATUS_SUCCESS) {
6064fcf3ce44SJohn Forte goto done;
6065fcf3ce44SJohn Forte }
6066fcf3ce44SJohn Forte
60678fe96085Stim szeto if (iGetPersistMethod() == STMF_PERSIST_NONE) {
60688fe96085Stim szeto goto done;
60698fe96085Stim szeto }
60708fe96085Stim szeto
6071fcf3ce44SJohn Forte ret = psRemoveTargetGroupMember((char *)targetGroupName,
6072fcf3ce44SJohn Forte (char *)targetName->ident);
6073fcf3ce44SJohn Forte switch (ret) {
6074fcf3ce44SJohn Forte case STMF_PS_SUCCESS:
6075fcf3ce44SJohn Forte ret = STMF_STATUS_SUCCESS;
6076fcf3ce44SJohn Forte break;
6077fcf3ce44SJohn Forte case STMF_PS_ERROR_MEMBER_NOT_FOUND:
6078fcf3ce44SJohn Forte ret = STMF_ERROR_MEMBER_NOT_FOUND;
6079fcf3ce44SJohn Forte break;
6080fcf3ce44SJohn Forte case STMF_PS_ERROR_GROUP_NOT_FOUND:
6081fcf3ce44SJohn Forte ret = STMF_ERROR_GROUP_NOT_FOUND;
6082fcf3ce44SJohn Forte break;
6083fcf3ce44SJohn Forte case STMF_PS_ERROR_BUSY:
6084fcf3ce44SJohn Forte ret = STMF_ERROR_BUSY;
6085fcf3ce44SJohn Forte break;
6086fcf3ce44SJohn Forte case STMF_PS_ERROR_SERVICE_NOT_FOUND:
6087fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_NOT_FOUND;
6088fcf3ce44SJohn Forte break;
6089fcf3ce44SJohn Forte case STMF_PS_ERROR_VERSION_MISMATCH:
6090fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_DATA_VERSION;
6091fcf3ce44SJohn Forte break;
6092fcf3ce44SJohn Forte default:
6093fcf3ce44SJohn Forte syslog(LOG_DEBUG,
6094fcf3ce44SJohn Forte "stmfRemoveFromTargetGroup"
6095fcf3ce44SJohn Forte "psRemoveTargetGroupMember:error(%d)", ret);
6096fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR;
6097fcf3ce44SJohn Forte break;
6098fcf3ce44SJohn Forte }
6099fcf3ce44SJohn Forte
6100fcf3ce44SJohn Forte done:
6101fcf3ce44SJohn Forte (void) close(fd);
6102fcf3ce44SJohn Forte return (ret);
6103fcf3ce44SJohn Forte }
6104fcf3ce44SJohn Forte
6105fcf3ce44SJohn Forte /*
6106fcf3ce44SJohn Forte * stmfRemoveViewEntry
6107fcf3ce44SJohn Forte *
6108fcf3ce44SJohn Forte * Purpose: Removes a view entry from a logical unit
6109fcf3ce44SJohn Forte *
6110fcf3ce44SJohn Forte * lu - guid of lu for which view entry is being removed
6111fcf3ce44SJohn Forte * viewEntryIndex - index of view entry to remove
6112fcf3ce44SJohn Forte *
6113fcf3ce44SJohn Forte */
6114fcf3ce44SJohn Forte int
stmfRemoveViewEntry(stmfGuid * lu,uint32_t viewEntryIndex)6115fcf3ce44SJohn Forte stmfRemoveViewEntry(stmfGuid *lu, uint32_t viewEntryIndex)
6116fcf3ce44SJohn Forte {
6117fcf3ce44SJohn Forte int ret = STMF_STATUS_SUCCESS;
6118fcf3ce44SJohn Forte int fd;
6119fcf3ce44SJohn Forte int ioctlRet;
6120fcf3ce44SJohn Forte stmf_iocdata_t stmfIoctl;
6121fcf3ce44SJohn Forte stmf_view_op_entry_t ioctlViewEntry;
6122fcf3ce44SJohn Forte
6123fcf3ce44SJohn Forte if (lu == NULL) {
6124fcf3ce44SJohn Forte return (STMF_ERROR_INVALID_ARG);
6125fcf3ce44SJohn Forte }
6126fcf3ce44SJohn Forte
6127fcf3ce44SJohn Forte /* call init */
6128fcf3ce44SJohn Forte ret = initializeConfig();
6129fcf3ce44SJohn Forte if (ret != STMF_STATUS_SUCCESS) {
6130fcf3ce44SJohn Forte return (ret);
6131fcf3ce44SJohn Forte }
6132fcf3ce44SJohn Forte
6133fcf3ce44SJohn Forte /*
6134fcf3ce44SJohn Forte * Open control node for stmf
6135fcf3ce44SJohn Forte */
6136fcf3ce44SJohn Forte if ((ret = openStmf(OPEN_STMF, &fd)) != STMF_STATUS_SUCCESS)
6137fcf3ce44SJohn Forte return (ret);
6138fcf3ce44SJohn Forte
6139fcf3ce44SJohn Forte bzero(&ioctlViewEntry, sizeof (ioctlViewEntry));
6140fcf3ce44SJohn Forte ioctlViewEntry.ve_ndx_valid = B_TRUE;
6141fcf3ce44SJohn Forte ioctlViewEntry.ve_ndx = viewEntryIndex;
6142fcf3ce44SJohn Forte bcopy(lu, &ioctlViewEntry.ve_guid, sizeof (stmfGuid));
6143fcf3ce44SJohn Forte
6144fcf3ce44SJohn Forte bzero(&stmfIoctl, sizeof (stmfIoctl));
6145fcf3ce44SJohn Forte /*
6146fcf3ce44SJohn Forte * Issue ioctl to add to the view entry
6147fcf3ce44SJohn Forte */
6148fcf3ce44SJohn Forte stmfIoctl.stmf_version = STMF_VERSION_1;
6149fcf3ce44SJohn Forte stmfIoctl.stmf_ibuf_size = sizeof (ioctlViewEntry);
6150fcf3ce44SJohn Forte stmfIoctl.stmf_ibuf = (uint64_t)(unsigned long)&ioctlViewEntry;
6151fcf3ce44SJohn Forte ioctlRet = ioctl(fd, STMF_IOCTL_REMOVE_VIEW_ENTRY, &stmfIoctl);
6152fcf3ce44SJohn Forte if (ioctlRet != 0) {
6153fcf3ce44SJohn Forte switch (errno) {
6154fcf3ce44SJohn Forte case EBUSY:
6155fcf3ce44SJohn Forte ret = STMF_ERROR_BUSY;
6156fcf3ce44SJohn Forte break;
61578fe96085Stim szeto case EPERM:
61588fe96085Stim szeto ret = STMF_ERROR_PERM;
61598fe96085Stim szeto break;
6160fcf3ce44SJohn Forte case EACCES:
6161fcf3ce44SJohn Forte switch (stmfIoctl.stmf_error) {
6162fcf3ce44SJohn Forte case STMF_IOCERR_UPDATE_NEED_CFG_INIT:
6163fcf3ce44SJohn Forte ret = STMF_ERROR_CONFIG_NONE;
6164fcf3ce44SJohn Forte break;
6165fcf3ce44SJohn Forte default:
6166fcf3ce44SJohn Forte ret = STMF_ERROR_PERM;
6167fcf3ce44SJohn Forte break;
6168fcf3ce44SJohn Forte }
6169fcf3ce44SJohn Forte break;
6170fcf3ce44SJohn Forte case ENODEV:
6171fcf3ce44SJohn Forte case ENOENT:
6172fcf3ce44SJohn Forte ret = STMF_ERROR_NOT_FOUND;
6173fcf3ce44SJohn Forte break;
6174fcf3ce44SJohn Forte default:
6175fcf3ce44SJohn Forte syslog(LOG_DEBUG,
6176fcf3ce44SJohn Forte "stmfRemoveViewEntry:ioctl errno(%d)",
6177fcf3ce44SJohn Forte errno);
6178fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR;
6179fcf3ce44SJohn Forte break;
6180fcf3ce44SJohn Forte }
6181fcf3ce44SJohn Forte goto done;
6182fcf3ce44SJohn Forte }
6183fcf3ce44SJohn Forte
61848fe96085Stim szeto if (iGetPersistMethod() == STMF_PERSIST_NONE) {
61858fe96085Stim szeto goto done;
61868fe96085Stim szeto }
61878fe96085Stim szeto
6188fcf3ce44SJohn Forte ret = psRemoveViewEntry(lu, viewEntryIndex);
6189fcf3ce44SJohn Forte switch (ret) {
6190fcf3ce44SJohn Forte case STMF_PS_SUCCESS:
6191fcf3ce44SJohn Forte ret = STMF_STATUS_SUCCESS;
6192fcf3ce44SJohn Forte break;
6193fcf3ce44SJohn Forte case STMF_PS_ERROR_NOT_FOUND:
6194fcf3ce44SJohn Forte ret = STMF_ERROR_NOT_FOUND;
6195fcf3ce44SJohn Forte break;
6196fcf3ce44SJohn Forte case STMF_PS_ERROR_BUSY:
6197fcf3ce44SJohn Forte ret = STMF_ERROR_BUSY;
6198fcf3ce44SJohn Forte break;
6199fcf3ce44SJohn Forte case STMF_PS_ERROR_SERVICE_NOT_FOUND:
6200fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_NOT_FOUND;
6201fcf3ce44SJohn Forte break;
6202fcf3ce44SJohn Forte case STMF_PS_ERROR_VERSION_MISMATCH:
6203fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_DATA_VERSION;
6204fcf3ce44SJohn Forte break;
6205fcf3ce44SJohn Forte default:
6206fcf3ce44SJohn Forte syslog(LOG_DEBUG,
6207fcf3ce44SJohn Forte "stmfRemoveViewEntry" "psRemoveViewEntry:error(%d)",
6208fcf3ce44SJohn Forte ret);
6209fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR;
6210fcf3ce44SJohn Forte break;
6211fcf3ce44SJohn Forte }
6212fcf3ce44SJohn Forte
6213fcf3ce44SJohn Forte done:
6214fcf3ce44SJohn Forte (void) close(fd);
6215fcf3ce44SJohn Forte return (ret);
6216fcf3ce44SJohn Forte }
6217fcf3ce44SJohn Forte
6218fcf3ce44SJohn Forte /*
6219fcf3ce44SJohn Forte * stmfSetProviderData
6220fcf3ce44SJohn Forte *
6221fcf3ce44SJohn Forte * Purpose: set the provider data
6222fcf3ce44SJohn Forte *
6223fcf3ce44SJohn Forte * providerName - unique name of provider
6224fcf3ce44SJohn Forte * nvl - nvlist to set
6225fcf3ce44SJohn Forte * providerType - type of provider for which to set data
6226fcf3ce44SJohn Forte * STMF_LU_PROVIDER_TYPE
6227fcf3ce44SJohn Forte * STMF_PORT_PROVIDER_TYPE
6228fcf3ce44SJohn Forte */
6229fcf3ce44SJohn Forte int
stmfSetProviderData(char * providerName,nvlist_t * nvl,int providerType)6230fcf3ce44SJohn Forte stmfSetProviderData(char *providerName, nvlist_t *nvl, int providerType)
6231fcf3ce44SJohn Forte {
6232fcf3ce44SJohn Forte return (stmfSetProviderDataProt(providerName, nvl, providerType,
6233fcf3ce44SJohn Forte NULL));
6234fcf3ce44SJohn Forte }
6235fcf3ce44SJohn Forte
6236fcf3ce44SJohn Forte /*
6237fcf3ce44SJohn Forte * stmfSetProviderDataProt
6238fcf3ce44SJohn Forte *
6239fcf3ce44SJohn Forte * Purpose: set the provider data
6240fcf3ce44SJohn Forte *
6241fcf3ce44SJohn Forte * providerName - unique name of provider
6242fcf3ce44SJohn Forte * nvl - nvlist to set
6243fcf3ce44SJohn Forte * providerType - type of provider for which to set data
6244fcf3ce44SJohn Forte * STMF_LU_PROVIDER_TYPE
6245fcf3ce44SJohn Forte * STMF_PORT_PROVIDER_TYPE
6246fcf3ce44SJohn Forte * setToken - Stale data token returned in the stmfGetProviderDataProt()
6247fcf3ce44SJohn Forte * call or NULL.
6248fcf3ce44SJohn Forte */
6249fcf3ce44SJohn Forte int
stmfSetProviderDataProt(char * providerName,nvlist_t * nvl,int providerType,uint64_t * setToken)6250fcf3ce44SJohn Forte stmfSetProviderDataProt(char *providerName, nvlist_t *nvl, int providerType,
6251fcf3ce44SJohn Forte uint64_t *setToken)
6252fcf3ce44SJohn Forte {
6253fcf3ce44SJohn Forte int ret;
6254fcf3ce44SJohn Forte int fd;
6255fcf3ce44SJohn Forte
6256fcf3ce44SJohn Forte if (providerName == NULL || nvl == NULL) {
6257fcf3ce44SJohn Forte return (STMF_ERROR_INVALID_ARG);
6258fcf3ce44SJohn Forte }
6259fcf3ce44SJohn Forte
6260fcf3ce44SJohn Forte if (providerType != STMF_LU_PROVIDER_TYPE &&
6261fcf3ce44SJohn Forte providerType != STMF_PORT_PROVIDER_TYPE) {
6262fcf3ce44SJohn Forte return (STMF_ERROR_INVALID_ARG);
6263fcf3ce44SJohn Forte }
6264fcf3ce44SJohn Forte
6265fcf3ce44SJohn Forte /* call init */
6266fcf3ce44SJohn Forte ret = initializeConfig();
6267fcf3ce44SJohn Forte if (ret != STMF_STATUS_SUCCESS) {
6268fcf3ce44SJohn Forte return (ret);
6269fcf3ce44SJohn Forte }
6270fcf3ce44SJohn Forte
6271fcf3ce44SJohn Forte /*
6272fcf3ce44SJohn Forte * Open control node for stmf
6273fcf3ce44SJohn Forte */
6274fcf3ce44SJohn Forte if ((ret = openStmf(OPEN_STMF, &fd)) != STMF_STATUS_SUCCESS)
6275fcf3ce44SJohn Forte return (ret);
6276fcf3ce44SJohn Forte
62778fe96085Stim szeto ret = setProviderData(fd, providerName, nvl, providerType, setToken);
6278fcf3ce44SJohn Forte
6279fcf3ce44SJohn Forte (void) close(fd);
6280fcf3ce44SJohn Forte
6281fcf3ce44SJohn Forte if (ret != STMF_STATUS_SUCCESS) {
6282fcf3ce44SJohn Forte goto done;
6283fcf3ce44SJohn Forte }
6284fcf3ce44SJohn Forte
62858fe96085Stim szeto if (iGetPersistMethod() == STMF_PERSIST_NONE) {
62868fe96085Stim szeto goto done;
62878fe96085Stim szeto }
62888fe96085Stim szeto
6289fcf3ce44SJohn Forte /* setting driver provider data successful. Now persist it */
62908fe96085Stim szeto ret = psSetProviderData(providerName, nvl, providerType, NULL);
6291fcf3ce44SJohn Forte switch (ret) {
6292fcf3ce44SJohn Forte case STMF_PS_SUCCESS:
6293fcf3ce44SJohn Forte ret = STMF_STATUS_SUCCESS;
6294fcf3ce44SJohn Forte break;
6295fcf3ce44SJohn Forte case STMF_PS_ERROR_EXISTS:
6296fcf3ce44SJohn Forte ret = STMF_ERROR_EXISTS;
6297fcf3ce44SJohn Forte break;
6298fcf3ce44SJohn Forte case STMF_PS_ERROR_BUSY:
6299fcf3ce44SJohn Forte ret = STMF_ERROR_BUSY;
6300fcf3ce44SJohn Forte break;
6301fcf3ce44SJohn Forte case STMF_PS_ERROR_SERVICE_NOT_FOUND:
6302fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_NOT_FOUND;
6303fcf3ce44SJohn Forte break;
6304fcf3ce44SJohn Forte case STMF_PS_ERROR_VERSION_MISMATCH:
6305fcf3ce44SJohn Forte ret = STMF_ERROR_SERVICE_DATA_VERSION;
6306fcf3ce44SJohn Forte break;
6307fcf3ce44SJohn Forte case STMF_PS_ERROR_PROV_DATA_STALE:
6308fcf3ce44SJohn Forte ret = STMF_ERROR_PROV_DATA_STALE;
6309fcf3ce44SJohn Forte break;
6310fcf3ce44SJohn Forte default:
6311fcf3ce44SJohn Forte syslog(LOG_DEBUG,
6312fcf3ce44SJohn Forte "stmfSetProviderData"
6313fcf3ce44SJohn Forte "psSetProviderData:error(%d)", ret);
6314fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR;
6315fcf3ce44SJohn Forte break;
6316fcf3ce44SJohn Forte }
6317fcf3ce44SJohn Forte
6318fcf3ce44SJohn Forte done:
6319fcf3ce44SJohn Forte return (ret);
6320fcf3ce44SJohn Forte }
6321fcf3ce44SJohn Forte
6322fcf3ce44SJohn Forte /*
63238fe96085Stim szeto * getProviderData
63248fe96085Stim szeto *
63258fe96085Stim szeto * Purpose: set the provider data from stmf
63268fe96085Stim szeto *
63278fe96085Stim szeto * providerName - unique name of provider
63288fe96085Stim szeto * nvl - nvlist to load/retrieve
63298fe96085Stim szeto * providerType - logical unit or port provider
63308fe96085Stim szeto * setToken - returned stale data token
63318fe96085Stim szeto */
63328fe96085Stim szeto int
getProviderData(char * providerName,nvlist_t ** nvl,int providerType,uint64_t * setToken)63338fe96085Stim szeto getProviderData(char *providerName, nvlist_t **nvl, int providerType,
63348fe96085Stim szeto uint64_t *setToken)
63358fe96085Stim szeto {
63368fe96085Stim szeto int ret = STMF_STATUS_SUCCESS;
63378fe96085Stim szeto int fd;
63388fe96085Stim szeto int ioctlRet;
63398fe96085Stim szeto size_t nvlistSize = ALLOC_PP_DATA_SIZE;
63408fe96085Stim szeto int retryCnt = 0;
63418fe96085Stim szeto int retryCntMax = MAX_PROVIDER_RETRY;
63428fe96085Stim szeto stmf_ppioctl_data_t ppi = {0}, *ppi_out = NULL;
63438fe96085Stim szeto boolean_t retry = B_TRUE;
63448fe96085Stim szeto stmf_iocdata_t stmfIoctl;
63458fe96085Stim szeto
63468fe96085Stim szeto if (providerName == NULL) {
63478fe96085Stim szeto return (STMF_ERROR_INVALID_ARG);
63488fe96085Stim szeto }
63498fe96085Stim szeto
63508fe96085Stim szeto /*
63518fe96085Stim szeto * Open control node for stmf
63528fe96085Stim szeto */
63538fe96085Stim szeto if ((ret = openStmf(OPEN_STMF, &fd)) != STMF_STATUS_SUCCESS)
63548fe96085Stim szeto return (ret);
63558fe96085Stim szeto
63568fe96085Stim szeto /* set provider name and provider type */
63578fe96085Stim szeto if (strlcpy(ppi.ppi_name, providerName,
63588fe96085Stim szeto sizeof (ppi.ppi_name)) >=
63598fe96085Stim szeto sizeof (ppi.ppi_name)) {
63608fe96085Stim szeto ret = STMF_ERROR_INVALID_ARG;
63618fe96085Stim szeto goto done;
63628fe96085Stim szeto }
63638fe96085Stim szeto switch (providerType) {
63648fe96085Stim szeto case STMF_LU_PROVIDER_TYPE:
63658fe96085Stim szeto ppi.ppi_lu_provider = 1;
63668fe96085Stim szeto break;
63678fe96085Stim szeto case STMF_PORT_PROVIDER_TYPE:
63688fe96085Stim szeto ppi.ppi_port_provider = 1;
63698fe96085Stim szeto break;
63708fe96085Stim szeto default:
63718fe96085Stim szeto ret = STMF_ERROR_INVALID_ARG;
63728fe96085Stim szeto goto done;
63738fe96085Stim szeto }
63748fe96085Stim szeto
63758fe96085Stim szeto do {
63768fe96085Stim szeto /* allocate memory for ioctl */
63778fe96085Stim szeto ppi_out = (stmf_ppioctl_data_t *)calloc(1, nvlistSize +
63788fe96085Stim szeto sizeof (stmf_ppioctl_data_t));
63798fe96085Stim szeto if (ppi_out == NULL) {
63808fe96085Stim szeto ret = STMF_ERROR_NOMEM;
63818fe96085Stim szeto goto done;
63828fe96085Stim szeto
63838fe96085Stim szeto }
63848fe96085Stim szeto
63858fe96085Stim szeto /* set the size of the ioctl data to allocated buffer */
63868fe96085Stim szeto ppi.ppi_data_size = nvlistSize;
63878fe96085Stim szeto
63888fe96085Stim szeto bzero(&stmfIoctl, sizeof (stmfIoctl));
63898fe96085Stim szeto
63908fe96085Stim szeto stmfIoctl.stmf_version = STMF_VERSION_1;
63918fe96085Stim szeto stmfIoctl.stmf_ibuf_size = sizeof (stmf_ppioctl_data_t);
63928fe96085Stim szeto stmfIoctl.stmf_ibuf = (uint64_t)(unsigned long)&ppi;
63938fe96085Stim szeto stmfIoctl.stmf_obuf_size = sizeof (stmf_ppioctl_data_t) +
63948fe96085Stim szeto nvlistSize;
63958fe96085Stim szeto stmfIoctl.stmf_obuf = (uint64_t)(unsigned long)ppi_out;
63968fe96085Stim szeto ioctlRet = ioctl(fd, STMF_IOCTL_GET_PP_DATA, &stmfIoctl);
63978fe96085Stim szeto if (ioctlRet != 0) {
63988fe96085Stim szeto switch (errno) {
63998fe96085Stim szeto case EBUSY:
64008fe96085Stim szeto ret = STMF_ERROR_BUSY;
64018fe96085Stim szeto break;
64028fe96085Stim szeto case EPERM:
64038fe96085Stim szeto case EACCES:
64048fe96085Stim szeto ret = STMF_ERROR_PERM;
64058fe96085Stim szeto break;
64068fe96085Stim szeto case EINVAL:
64078fe96085Stim szeto if (stmfIoctl.stmf_error ==
64088fe96085Stim szeto STMF_IOCERR_INSUFFICIENT_BUF) {
64098fe96085Stim szeto nvlistSize =
64108fe96085Stim szeto ppi_out->ppi_data_size;
64118fe96085Stim szeto free(ppi_out);
64128fe96085Stim szeto ppi_out = NULL;
64138fe96085Stim szeto if (retryCnt++ > retryCntMax) {
64148fe96085Stim szeto retry = B_FALSE;
64158fe96085Stim szeto ret = STMF_ERROR_BUSY;
64168fe96085Stim szeto } else {
64178fe96085Stim szeto ret =
64188fe96085Stim szeto STMF_STATUS_SUCCESS;
64198fe96085Stim szeto }
64208fe96085Stim szeto } else {
64218fe96085Stim szeto syslog(LOG_DEBUG,
64228fe96085Stim szeto "getProviderData:ioctl"
64238fe96085Stim szeto "unable to retrieve "
64248fe96085Stim szeto "nvlist");
64258fe96085Stim szeto ret = STMF_STATUS_ERROR;
64268fe96085Stim szeto }
64278fe96085Stim szeto break;
64288fe96085Stim szeto case ENOENT:
64298fe96085Stim szeto ret = STMF_ERROR_NOT_FOUND;
64308fe96085Stim szeto break;
64318fe96085Stim szeto default:
64328fe96085Stim szeto syslog(LOG_DEBUG,
64338fe96085Stim szeto "getProviderData:ioctl errno(%d)",
64348fe96085Stim szeto errno);
64358fe96085Stim szeto ret = STMF_STATUS_ERROR;
64368fe96085Stim szeto break;
64378fe96085Stim szeto }
64388fe96085Stim szeto if (ret != STMF_STATUS_SUCCESS)
64398fe96085Stim szeto goto done;
64408fe96085Stim szeto }
64418fe96085Stim szeto } while (retry && stmfIoctl.stmf_error == STMF_IOCERR_INSUFFICIENT_BUF);
64428fe96085Stim szeto
64438fe96085Stim szeto if ((ret = nvlist_unpack((char *)ppi_out->ppi_data,
64448fe96085Stim szeto ppi_out->ppi_data_size, nvl, 0)) != 0) {
64458fe96085Stim szeto ret = STMF_STATUS_ERROR;
64468fe96085Stim szeto goto done;
64478fe96085Stim szeto }
64488fe96085Stim szeto
64498fe96085Stim szeto /* caller has asked for new token */
64508fe96085Stim szeto if (setToken) {
64518fe96085Stim szeto *setToken = ppi_out->ppi_token;
64528fe96085Stim szeto }
64538fe96085Stim szeto done:
64548fe96085Stim szeto free(ppi_out);
64558fe96085Stim szeto (void) close(fd);
64568fe96085Stim szeto return (ret);
64578fe96085Stim szeto }
64588fe96085Stim szeto
64598fe96085Stim szeto /*
6460fcf3ce44SJohn Forte * setProviderData
6461fcf3ce44SJohn Forte *
64628fe96085Stim szeto * Purpose: set the provider data in stmf
6463fcf3ce44SJohn Forte *
6464fcf3ce44SJohn Forte * providerName - unique name of provider
6465fcf3ce44SJohn Forte * nvl - nvlist to set
6466fcf3ce44SJohn Forte * providerType - logical unit or port provider
64678fe96085Stim szeto * setToken - stale data token to check if not NULL
6468fcf3ce44SJohn Forte */
6469fcf3ce44SJohn Forte static int
setProviderData(int fd,char * providerName,nvlist_t * nvl,int providerType,uint64_t * setToken)64708fe96085Stim szeto setProviderData(int fd, char *providerName, nvlist_t *nvl, int providerType,
64718fe96085Stim szeto uint64_t *setToken)
6472fcf3ce44SJohn Forte {
6473fcf3ce44SJohn Forte int ret = STMF_STATUS_SUCCESS;
6474fcf3ce44SJohn Forte int ioctlRet;
6475fcf3ce44SJohn Forte size_t nvlistEncodedSize;
6476fcf3ce44SJohn Forte stmf_ppioctl_data_t *ppi = NULL;
64778fe96085Stim szeto uint64_t outToken;
6478fcf3ce44SJohn Forte char *allocatedNvBuffer;
6479fcf3ce44SJohn Forte stmf_iocdata_t stmfIoctl;
6480fcf3ce44SJohn Forte
6481fcf3ce44SJohn Forte if (providerName == NULL) {
6482fcf3ce44SJohn Forte return (STMF_ERROR_INVALID_ARG);
6483fcf3ce44SJohn Forte }
6484fcf3ce44SJohn Forte
6485fcf3ce44SJohn Forte /* get size of encoded nvlist */
6486fcf3ce44SJohn Forte if (nvlist_size(nvl, &nvlistEncodedSize, NV_ENCODE_XDR) != 0) {
6487fcf3ce44SJohn Forte return (STMF_STATUS_ERROR);
6488fcf3ce44SJohn Forte }
6489fcf3ce44SJohn Forte
6490fcf3ce44SJohn Forte /* allocate memory for ioctl */
6491fcf3ce44SJohn Forte ppi = (stmf_ppioctl_data_t *)calloc(1, nvlistEncodedSize +
6492fcf3ce44SJohn Forte sizeof (stmf_ppioctl_data_t));
6493fcf3ce44SJohn Forte if (ppi == NULL) {
6494fcf3ce44SJohn Forte return (STMF_ERROR_NOMEM);
6495fcf3ce44SJohn Forte }
6496fcf3ce44SJohn Forte
64978fe96085Stim szeto if (setToken) {
64988fe96085Stim szeto ppi->ppi_token_valid = 1;
64998fe96085Stim szeto ppi->ppi_token = *setToken;
65008fe96085Stim szeto }
65018fe96085Stim szeto
6502fcf3ce44SJohn Forte allocatedNvBuffer = (char *)&ppi->ppi_data;
6503fcf3ce44SJohn Forte if (nvlist_pack(nvl, &allocatedNvBuffer, &nvlistEncodedSize,
6504fcf3ce44SJohn Forte NV_ENCODE_XDR, 0) != 0) {
6505fcf3ce44SJohn Forte return (STMF_STATUS_ERROR);
6506fcf3ce44SJohn Forte }
6507fcf3ce44SJohn Forte
6508fcf3ce44SJohn Forte /* set provider name and provider type */
6509fcf3ce44SJohn Forte (void) strncpy(ppi->ppi_name, providerName, sizeof (ppi->ppi_name));
6510fcf3ce44SJohn Forte switch (providerType) {
6511fcf3ce44SJohn Forte case STMF_LU_PROVIDER_TYPE:
6512fcf3ce44SJohn Forte ppi->ppi_lu_provider = 1;
6513fcf3ce44SJohn Forte break;
6514fcf3ce44SJohn Forte case STMF_PORT_PROVIDER_TYPE:
6515fcf3ce44SJohn Forte ppi->ppi_port_provider = 1;
6516fcf3ce44SJohn Forte break;
6517fcf3ce44SJohn Forte default:
6518fcf3ce44SJohn Forte return (STMF_ERROR_INVALID_ARG);
6519fcf3ce44SJohn Forte }
6520fcf3ce44SJohn Forte
6521fcf3ce44SJohn Forte /* set the size of the ioctl data to packed data size */
6522fcf3ce44SJohn Forte ppi->ppi_data_size = nvlistEncodedSize;
6523fcf3ce44SJohn Forte
6524fcf3ce44SJohn Forte bzero(&stmfIoctl, sizeof (stmfIoctl));
6525fcf3ce44SJohn Forte
6526fcf3ce44SJohn Forte stmfIoctl.stmf_version = STMF_VERSION_1;
6527fcf3ce44SJohn Forte /*
6528fcf3ce44SJohn Forte * Subtracting 8 from the size as that is the size of the last member
6529fcf3ce44SJohn Forte * of the structure where the packed data resides
6530fcf3ce44SJohn Forte */
6531fcf3ce44SJohn Forte stmfIoctl.stmf_ibuf_size = nvlistEncodedSize +
6532fcf3ce44SJohn Forte sizeof (stmf_ppioctl_data_t) - 8;
6533fcf3ce44SJohn Forte stmfIoctl.stmf_ibuf = (uint64_t)(unsigned long)ppi;
65348fe96085Stim szeto stmfIoctl.stmf_obuf_size = sizeof (uint64_t);
65358fe96085Stim szeto stmfIoctl.stmf_obuf = (uint64_t)(unsigned long)&outToken;
6536fcf3ce44SJohn Forte ioctlRet = ioctl(fd, STMF_IOCTL_LOAD_PP_DATA, &stmfIoctl);
6537fcf3ce44SJohn Forte if (ioctlRet != 0) {
6538fcf3ce44SJohn Forte switch (errno) {
6539fcf3ce44SJohn Forte case EBUSY:
6540fcf3ce44SJohn Forte ret = STMF_ERROR_BUSY;
6541fcf3ce44SJohn Forte break;
65428fe96085Stim szeto case EPERM:
6543fcf3ce44SJohn Forte case EACCES:
6544fcf3ce44SJohn Forte ret = STMF_ERROR_PERM;
6545fcf3ce44SJohn Forte break;
65468fe96085Stim szeto case EINVAL:
65478fe96085Stim szeto if (stmfIoctl.stmf_error ==
65488fe96085Stim szeto STMF_IOCERR_PPD_UPDATED) {
65498fe96085Stim szeto ret = STMF_ERROR_PROV_DATA_STALE;
65508fe96085Stim szeto } else {
65518fe96085Stim szeto ret = STMF_STATUS_ERROR;
65528fe96085Stim szeto }
65538fe96085Stim szeto break;
6554fcf3ce44SJohn Forte default:
6555fcf3ce44SJohn Forte syslog(LOG_DEBUG,
6556fcf3ce44SJohn Forte "setProviderData:ioctl errno(%d)", errno);
6557fcf3ce44SJohn Forte ret = STMF_STATUS_ERROR;
6558fcf3ce44SJohn Forte break;
6559fcf3ce44SJohn Forte }
6560fcf3ce44SJohn Forte if (ret != STMF_STATUS_SUCCESS)
6561fcf3ce44SJohn Forte goto done;
6562fcf3ce44SJohn Forte }
6563fcf3ce44SJohn Forte
65648fe96085Stim szeto /* caller has asked for new token */
65658fe96085Stim szeto if (setToken) {
65668fe96085Stim szeto *setToken = outToken;
65678fe96085Stim szeto }
6568fcf3ce44SJohn Forte done:
6569fcf3ce44SJohn Forte free(ppi);
6570fcf3ce44SJohn Forte return (ret);
6571fcf3ce44SJohn Forte }
65728fe96085Stim szeto
65738fe96085Stim szeto /*
65748fe96085Stim szeto * set the persistence method in the library only or library and service
65758fe96085Stim szeto */
65768fe96085Stim szeto int
stmfSetPersistMethod(uint8_t persistType,boolean_t serviceSet)65778fe96085Stim szeto stmfSetPersistMethod(uint8_t persistType, boolean_t serviceSet)
65788fe96085Stim szeto {
65798fe96085Stim szeto int ret = STMF_STATUS_SUCCESS;
65808fe96085Stim szeto int oldPersist;
65818fe96085Stim szeto
65828fe96085Stim szeto (void) pthread_mutex_lock(&persistenceTypeLock);
65838fe96085Stim szeto oldPersist = iPersistType;
65848fe96085Stim szeto if (persistType == STMF_PERSIST_NONE ||
65858fe96085Stim szeto persistType == STMF_PERSIST_SMF) {
65868fe96085Stim szeto iLibSetPersist = B_TRUE;
65878fe96085Stim szeto iPersistType = persistType;
65888fe96085Stim szeto } else {
65898fe96085Stim szeto (void) pthread_mutex_unlock(&persistenceTypeLock);
65908fe96085Stim szeto return (STMF_ERROR_INVALID_ARG);
65918fe96085Stim szeto }
65928fe96085Stim szeto /* Is this for this library open or in SMF */
65938fe96085Stim szeto if (serviceSet == B_TRUE) {
65948fe96085Stim szeto ret = psSetServicePersist(persistType);
65958fe96085Stim szeto if (ret != STMF_PS_SUCCESS) {
65968fe96085Stim szeto ret = STMF_ERROR_PERSIST_TYPE;
65978fe96085Stim szeto /* Set to old value */
65988fe96085Stim szeto iPersistType = oldPersist;
65998fe96085Stim szeto }
66008fe96085Stim szeto }
66018fe96085Stim szeto (void) pthread_mutex_unlock(&persistenceTypeLock);
66028fe96085Stim szeto
66038fe96085Stim szeto return (ret);
66048fe96085Stim szeto }
66058fe96085Stim szeto
66068fe96085Stim szeto /*
66078fe96085Stim szeto * Only returns internal state for persist. If unset, goes to ps. If that
66088fe96085Stim szeto * fails, returns default setting
66098fe96085Stim szeto */
66108fe96085Stim szeto static uint8_t
iGetPersistMethod()66118fe96085Stim szeto iGetPersistMethod()
66128fe96085Stim szeto {
66138fe96085Stim szeto
66148fe96085Stim szeto uint8_t persistType = 0;
66158fe96085Stim szeto
66168fe96085Stim szeto (void) pthread_mutex_lock(&persistenceTypeLock);
66178fe96085Stim szeto if (iLibSetPersist) {
66188fe96085Stim szeto persistType = iPersistType;
66198fe96085Stim szeto } else {
66208fe96085Stim szeto int ret;
66218fe96085Stim szeto ret = psGetServicePersist(&persistType);
66228fe96085Stim szeto if (ret != STMF_PS_SUCCESS) {
66238fe96085Stim szeto /* set to default */
66248fe96085Stim szeto persistType = STMF_DEFAULT_PERSIST;
66258fe96085Stim szeto }
66268fe96085Stim szeto }
66278fe96085Stim szeto (void) pthread_mutex_unlock(&persistenceTypeLock);
66288fe96085Stim szeto return (persistType);
66298fe96085Stim szeto }
66308fe96085Stim szeto
66318fe96085Stim szeto /*
66328fe96085Stim szeto * Returns either library state or persistent config state depending on
66338fe96085Stim szeto * serviceState
66348fe96085Stim szeto */
66358fe96085Stim szeto int
stmfGetPersistMethod(uint8_t * persistType,boolean_t serviceState)66368fe96085Stim szeto stmfGetPersistMethod(uint8_t *persistType, boolean_t serviceState)
66378fe96085Stim szeto {
66388fe96085Stim szeto int ret = STMF_STATUS_SUCCESS;
66398fe96085Stim szeto
66408fe96085Stim szeto if (persistType == NULL) {
66418fe96085Stim szeto return (STMF_ERROR_INVALID_ARG);
66428fe96085Stim szeto }
66438fe96085Stim szeto if (serviceState) {
66448fe96085Stim szeto ret = psGetServicePersist(persistType);
66458fe96085Stim szeto if (ret != STMF_PS_SUCCESS) {
66468fe96085Stim szeto ret = STMF_ERROR_PERSIST_TYPE;
66478fe96085Stim szeto }
66488fe96085Stim szeto } else {
66498fe96085Stim szeto (void) pthread_mutex_lock(&persistenceTypeLock);
66508fe96085Stim szeto if (iLibSetPersist) {
66518fe96085Stim szeto *persistType = iPersistType;
66528fe96085Stim szeto } else {
66538fe96085Stim szeto *persistType = STMF_DEFAULT_PERSIST;
66548fe96085Stim szeto }
66558fe96085Stim szeto (void) pthread_mutex_unlock(&persistenceTypeLock);
66568fe96085Stim szeto }
66578fe96085Stim szeto
66588fe96085Stim szeto return (ret);
66598fe96085Stim szeto }
666063ed874aStim szeto
666163ed874aStim szeto /*
666245039663SJohn Forte * stmfPostProxyMsg
666345039663SJohn Forte *
666445039663SJohn Forte * Purpose: Post a message to the proxy port provider
666545039663SJohn Forte *
666645039663SJohn Forte * buf - buffer containing message to post
666745039663SJohn Forte * buflen - buffer length
666845039663SJohn Forte */
666945039663SJohn Forte int
stmfPostProxyMsg(int hdl,void * buf,uint32_t buflen)667045039663SJohn Forte stmfPostProxyMsg(int hdl, void *buf, uint32_t buflen)
667145039663SJohn Forte {
667245039663SJohn Forte int ret = STMF_STATUS_SUCCESS;
667345039663SJohn Forte int ioctlRet;
667445039663SJohn Forte pppt_iocdata_t ppptIoctl = {0};
667545039663SJohn Forte
667645039663SJohn Forte if (buf == NULL) {
667745039663SJohn Forte return (STMF_ERROR_INVALID_ARG);
667845039663SJohn Forte }
667945039663SJohn Forte
668045039663SJohn Forte /*
668145039663SJohn Forte * Issue ioctl to post the message
668245039663SJohn Forte */
668345039663SJohn Forte ppptIoctl.pppt_version = PPPT_VERSION_1;
668445039663SJohn Forte ppptIoctl.pppt_buf_size = buflen;
668545039663SJohn Forte ppptIoctl.pppt_buf = (uint64_t)(unsigned long)buf;
668645039663SJohn Forte ioctlRet = ioctl(hdl, PPPT_MESSAGE, &ppptIoctl);
668745039663SJohn Forte if (ioctlRet != 0) {
668845039663SJohn Forte switch (errno) {
668945039663SJohn Forte case EPERM:
669045039663SJohn Forte case EACCES:
669145039663SJohn Forte ret = STMF_ERROR_PERM;
669245039663SJohn Forte break;
669345039663SJohn Forte default:
669445039663SJohn Forte ret = STMF_ERROR_POST_MSG_FAILED;
669545039663SJohn Forte break;
669645039663SJohn Forte }
669745039663SJohn Forte }
669845039663SJohn Forte
669945039663SJohn Forte return (ret);
670045039663SJohn Forte }
670145039663SJohn Forte
670245039663SJohn Forte /*
670345039663SJohn Forte * stmfInitProxyDoor
670445039663SJohn Forte *
670545039663SJohn Forte * Purpose: Install door in proxy
670645039663SJohn Forte *
670745039663SJohn Forte * hdl - pointer to returned handle
670845039663SJohn Forte * fd - door from door_create()
670945039663SJohn Forte */
671045039663SJohn Forte int
stmfInitProxyDoor(int * hdl,int door)671145039663SJohn Forte stmfInitProxyDoor(int *hdl, int door)
671245039663SJohn Forte {
671345039663SJohn Forte int ret = STMF_STATUS_SUCCESS;
671445039663SJohn Forte int ioctlRet;
671545039663SJohn Forte int fd;
671645039663SJohn Forte pppt_iocdata_t ppptIoctl = {0};
671745039663SJohn Forte
671845039663SJohn Forte if (hdl == NULL) {
671945039663SJohn Forte return (STMF_ERROR_INVALID_ARG);
672045039663SJohn Forte }
672145039663SJohn Forte
672245039663SJohn Forte /*
672345039663SJohn Forte * Open control node for pppt
672445039663SJohn Forte */
672545039663SJohn Forte if ((ret = openPppt(OPEN_PPPT, &fd)) != STMF_STATUS_SUCCESS) {
672645039663SJohn Forte return (ret);
672745039663SJohn Forte }
672845039663SJohn Forte
672945039663SJohn Forte /*
673045039663SJohn Forte * Issue ioctl to install the door
673145039663SJohn Forte */
673245039663SJohn Forte ppptIoctl.pppt_version = PPPT_VERSION_1;
673345039663SJohn Forte ppptIoctl.pppt_door_fd = (uint32_t)door;
673445039663SJohn Forte ioctlRet = ioctl(fd, PPPT_INSTALL_DOOR, &ppptIoctl);
673545039663SJohn Forte if (ioctlRet != 0) {
673645039663SJohn Forte switch (errno) {
673745039663SJohn Forte case EPERM:
673845039663SJohn Forte case EACCES:
673945039663SJohn Forte ret = STMF_ERROR_PERM;
674045039663SJohn Forte break;
674145039663SJohn Forte case EINVAL:
674245039663SJohn Forte ret = STMF_ERROR_INVALID_ARG;
674345039663SJohn Forte break;
674445039663SJohn Forte case EBUSY:
674545039663SJohn Forte ret = STMF_ERROR_DOOR_INSTALLED;
674645039663SJohn Forte break;
674745039663SJohn Forte default:
674845039663SJohn Forte ret = STMF_STATUS_ERROR;
674945039663SJohn Forte break;
675045039663SJohn Forte }
675145039663SJohn Forte }
675245039663SJohn Forte
675345039663SJohn Forte /* return driver fd to caller */
675445039663SJohn Forte *hdl = fd;
675545039663SJohn Forte return (ret);
675645039663SJohn Forte }
675745039663SJohn Forte
675845039663SJohn Forte void
stmfDestroyProxyDoor(int hdl)675945039663SJohn Forte stmfDestroyProxyDoor(int hdl)
676045039663SJohn Forte {
676145039663SJohn Forte (void) close(hdl);
676245039663SJohn Forte }
676345039663SJohn Forte
676445039663SJohn Forte /*
676563ed874aStim szeto * validateLunNumIoctl
676663ed874aStim szeto *
676763ed874aStim szeto * Purpose: Issues ioctl to check and get available lun# in view entry
676863ed874aStim szeto *
676963ed874aStim szeto * viewEntry - view entry to use
677063ed874aStim szeto */
677163ed874aStim szeto static int
validateLunNumIoctl(int fd,stmfViewEntry * viewEntry)677263ed874aStim szeto validateLunNumIoctl(int fd, stmfViewEntry *viewEntry)
677363ed874aStim szeto {
677463ed874aStim szeto int ret = STMF_STATUS_SUCCESS;
677563ed874aStim szeto int ioctlRet;
677663ed874aStim szeto stmf_iocdata_t stmfIoctl;
677763ed874aStim szeto stmf_view_op_entry_t ioctlViewEntry;
677863ed874aStim szeto
677963ed874aStim szeto bzero(&ioctlViewEntry, sizeof (ioctlViewEntry));
678063ed874aStim szeto /*
678163ed874aStim szeto * don't set ve_ndx or ve_ndx_valid as ve_ndx_valid should be
678263ed874aStim szeto * false on input
678363ed874aStim szeto */
678463ed874aStim szeto ioctlViewEntry.ve_lu_number_valid = viewEntry->luNbrValid;
678563ed874aStim szeto ioctlViewEntry.ve_all_hosts = viewEntry->allHosts;
678663ed874aStim szeto ioctlViewEntry.ve_all_targets = viewEntry->allTargets;
678763ed874aStim szeto
678863ed874aStim szeto if (viewEntry->allHosts == B_FALSE) {
678963ed874aStim szeto bcopy(viewEntry->hostGroup, &ioctlViewEntry.ve_host_group.name,
679063ed874aStim szeto sizeof (stmfGroupName));
679163ed874aStim szeto ioctlViewEntry.ve_host_group.name_size =
679263ed874aStim szeto strlen((char *)viewEntry->hostGroup);
679363ed874aStim szeto }
679463ed874aStim szeto if (viewEntry->allTargets == B_FALSE) {
679563ed874aStim szeto bcopy(viewEntry->targetGroup,
679663ed874aStim szeto &ioctlViewEntry.ve_target_group.name,
679763ed874aStim szeto sizeof (stmfGroupName));
679863ed874aStim szeto ioctlViewEntry.ve_target_group.name_size =
679963ed874aStim szeto strlen((char *)viewEntry->targetGroup);
680063ed874aStim szeto }
680163ed874aStim szeto /* Validating the lun number */
680263ed874aStim szeto if (viewEntry->luNbrValid) {
680363ed874aStim szeto bcopy(viewEntry->luNbr, &ioctlViewEntry.ve_lu_nbr,
680463ed874aStim szeto sizeof (ioctlViewEntry.ve_lu_nbr));
680563ed874aStim szeto }
680663ed874aStim szeto
680763ed874aStim szeto bzero(&stmfIoctl, sizeof (stmfIoctl));
680863ed874aStim szeto /*
680963ed874aStim szeto * Issue ioctl to validate lun# in the view entry
681063ed874aStim szeto */
681163ed874aStim szeto stmfIoctl.stmf_version = STMF_VERSION_1;
681263ed874aStim szeto stmfIoctl.stmf_ibuf_size = sizeof (ioctlViewEntry);
681363ed874aStim szeto stmfIoctl.stmf_ibuf = (uint64_t)(unsigned long)&ioctlViewEntry;
681463ed874aStim szeto stmfIoctl.stmf_obuf_size = sizeof (ioctlViewEntry);
681563ed874aStim szeto stmfIoctl.stmf_obuf = (uint64_t)(unsigned long)&ioctlViewEntry;
681663ed874aStim szeto ioctlRet = ioctl(fd, STMF_IOCTL_VALIDATE_VIEW, &stmfIoctl);
681763ed874aStim szeto
681863ed874aStim szeto /* save available lun number */
681963ed874aStim szeto if (!viewEntry->luNbrValid) {
682063ed874aStim szeto bcopy(ioctlViewEntry.ve_lu_nbr, viewEntry->luNbr,
682163ed874aStim szeto sizeof (ioctlViewEntry.ve_lu_nbr));
682263ed874aStim szeto }
682363ed874aStim szeto if (ioctlRet != 0) {
682463ed874aStim szeto switch (errno) {
682563ed874aStim szeto case EBUSY:
682663ed874aStim szeto ret = STMF_ERROR_BUSY;
682763ed874aStim szeto break;
682863ed874aStim szeto case EPERM:
682963ed874aStim szeto ret = STMF_ERROR_PERM;
683063ed874aStim szeto break;
683163ed874aStim szeto case EACCES:
683263ed874aStim szeto switch (stmfIoctl.stmf_error) {
683363ed874aStim szeto case STMF_IOCERR_UPDATE_NEED_CFG_INIT:
683463ed874aStim szeto ret = STMF_ERROR_CONFIG_NONE;
683563ed874aStim szeto break;
683663ed874aStim szeto default:
683763ed874aStim szeto ret = STMF_ERROR_PERM;
683863ed874aStim szeto break;
683963ed874aStim szeto }
684063ed874aStim szeto break;
684163ed874aStim szeto default:
684263ed874aStim szeto switch (stmfIoctl.stmf_error) {
684363ed874aStim szeto case STMF_IOCERR_LU_NUMBER_IN_USE:
684463ed874aStim szeto ret = STMF_ERROR_LUN_IN_USE;
684563ed874aStim szeto break;
684663ed874aStim szeto case STMF_IOCERR_VIEW_ENTRY_CONFLICT:
684763ed874aStim szeto ret = STMF_ERROR_VE_CONFLICT;
684863ed874aStim szeto break;
684963ed874aStim szeto case STMF_IOCERR_UPDATE_NEED_CFG_INIT:
685063ed874aStim szeto ret = STMF_ERROR_CONFIG_NONE;
685163ed874aStim szeto break;
685263ed874aStim szeto case STMF_IOCERR_INVALID_HG:
685363ed874aStim szeto ret = STMF_ERROR_INVALID_HG;
685463ed874aStim szeto break;
685563ed874aStim szeto case STMF_IOCERR_INVALID_TG:
685663ed874aStim szeto ret = STMF_ERROR_INVALID_TG;
685763ed874aStim szeto break;
685863ed874aStim szeto default:
685963ed874aStim szeto syslog(LOG_DEBUG,
686063ed874aStim szeto "addViewEntryIoctl"
686163ed874aStim szeto ":error(%d)",
686263ed874aStim szeto stmfIoctl.stmf_error);
686363ed874aStim szeto ret = STMF_STATUS_ERROR;
686463ed874aStim szeto break;
686563ed874aStim szeto }
686663ed874aStim szeto break;
686763ed874aStim szeto }
686863ed874aStim szeto }
686963ed874aStim szeto return (ret);
687063ed874aStim szeto }
687163ed874aStim szeto
687263ed874aStim szeto /*
687363ed874aStim szeto * stmfValidateView
687463ed874aStim szeto *
687563ed874aStim szeto * Purpose: Validate or get lun # base on TG, HG of view entry
687663ed874aStim szeto *
687763ed874aStim szeto * viewEntry - view entry structure to use
687863ed874aStim szeto */
687963ed874aStim szeto int
stmfValidateView(stmfViewEntry * viewEntry)688063ed874aStim szeto stmfValidateView(stmfViewEntry *viewEntry)
688163ed874aStim szeto {
688263ed874aStim szeto int ret;
688363ed874aStim szeto int fd;
688463ed874aStim szeto stmfViewEntry iViewEntry;
688563ed874aStim szeto
688663ed874aStim szeto if (viewEntry == NULL) {
688763ed874aStim szeto return (STMF_ERROR_INVALID_ARG);
688863ed874aStim szeto }
688963ed874aStim szeto
689063ed874aStim szeto /* initialize and set internal view entry */
689163ed874aStim szeto bzero(&iViewEntry, sizeof (iViewEntry));
689263ed874aStim szeto
689363ed874aStim szeto if (!viewEntry->allHosts) {
689463ed874aStim szeto bcopy(viewEntry->hostGroup, iViewEntry.hostGroup,
689563ed874aStim szeto sizeof (iViewEntry.hostGroup));
689663ed874aStim szeto } else {
689763ed874aStim szeto iViewEntry.allHosts = B_TRUE;
689863ed874aStim szeto }
689963ed874aStim szeto
690063ed874aStim szeto if (!viewEntry->allTargets) {
690163ed874aStim szeto bcopy(viewEntry->targetGroup, iViewEntry.targetGroup,
690263ed874aStim szeto sizeof (iViewEntry.targetGroup));
690363ed874aStim szeto } else {
690463ed874aStim szeto iViewEntry.allTargets = B_TRUE;
690563ed874aStim szeto }
690663ed874aStim szeto
690763ed874aStim szeto if (viewEntry->luNbrValid) {
690863ed874aStim szeto iViewEntry.luNbrValid = B_TRUE;
690963ed874aStim szeto bcopy(viewEntry->luNbr, iViewEntry.luNbr,
691063ed874aStim szeto sizeof (iViewEntry.luNbr));
691163ed874aStim szeto }
691263ed874aStim szeto
691363ed874aStim szeto /*
691463ed874aStim szeto * set users return view entry index valid flag to false
691563ed874aStim szeto * in case of failure
691663ed874aStim szeto */
691763ed874aStim szeto viewEntry->veIndexValid = B_FALSE;
691863ed874aStim szeto
691963ed874aStim szeto /* Check to ensure service exists */
692063ed874aStim szeto if (psCheckService() != STMF_STATUS_SUCCESS) {
692163ed874aStim szeto return (STMF_ERROR_SERVICE_NOT_FOUND);
692263ed874aStim szeto }
692363ed874aStim szeto
692463ed874aStim szeto /* call init */
692563ed874aStim szeto ret = initializeConfig();
692663ed874aStim szeto if (ret != STMF_STATUS_SUCCESS) {
692763ed874aStim szeto return (ret);
692863ed874aStim szeto }
692963ed874aStim szeto
693063ed874aStim szeto /*
693163ed874aStim szeto * Open control node for stmf
693263ed874aStim szeto */
693363ed874aStim szeto if ((ret = openStmf(OPEN_STMF, &fd)) != STMF_STATUS_SUCCESS)
693463ed874aStim szeto return (ret);
693563ed874aStim szeto
693663ed874aStim szeto /*
693763ed874aStim szeto * Validate lun# in the view entry from the driver
693863ed874aStim szeto */
693963ed874aStim szeto ret = validateLunNumIoctl(fd, &iViewEntry);
694063ed874aStim szeto (void) close(fd);
694163ed874aStim szeto
694263ed874aStim szeto /* save available lun number */
694363ed874aStim szeto if (!viewEntry->luNbrValid) {
694463ed874aStim szeto bcopy(iViewEntry.luNbr, viewEntry->luNbr,
694563ed874aStim szeto sizeof (iViewEntry.luNbr));
694663ed874aStim szeto }
694763ed874aStim szeto
694863ed874aStim szeto return (ret);
694963ed874aStim szeto }
6950