1 /*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21
22 /*
23 * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
24 * Use is subject to license terms.
25 */
26
27 #include <stdio.h>
28 #include <stdlib.h>
29
30 #include "isns_server.h"
31 #include "isns_cache.h"
32 #include "isns_obj.h"
33 #include "isns_dsapi.h"
34 #include "isns_dseng.h"
35 #include "isns_msgq.h"
36 #include "isns_log.h"
37 #include "isns_scn.h"
38 #include "isns_esi.h"
39
40 /*
41 * extern variables
42 */
43 extern const int NUM_OF_CHILD[MAX_OBJ_TYPE];
44 extern const int TYPE_OF_PARENT[MAX_OBJ_TYPE_FOR_SIZE];
45
46 int
init_data()47 init_data(
48 )
49 {
50 return (target_init_data());
51 }
52
53 int
load_data()54 load_data(
55 )
56 {
57 int ec = 0;
58 void *prev = NULL;
59 isns_obj_t *obj;
60 uint32_t uid = 0, type = 0;
61 uint32_t puid = 0;
62 isns_type_t ptype = 0;
63 void const **child[MAX_CHILD_TYPE] = { NULL };
64 uchar_t phase;
65
66 isns_attr_t *scn_bitmap;
67 isns_attr_t *scn_name;
68
69 isns_attr_t *eid_attr;
70
71 /* lock the cache */
72 (void) cache_lock_write();
73
74 ec = target_load_obj(&prev, &obj, &phase);
75 while (ec == 0 && obj != NULL) {
76 scn_bitmap = NULL;
77 switch (obj->type) {
78 case OBJ_DD:
79 case OBJ_DDS:
80 ptype = obj->type;
81 ec = register_object(obj, &puid, NULL);
82 break;
83 case OBJ_ENTITY:
84 ptype = OBJ_ENTITY;
85 ec = register_object(obj, &puid, NULL);
86 if (ec == 0) {
87 eid_attr = &obj->attrs[
88 ATTR_INDEX_ENTITY(ISNS_EID_ATTR_ID)];
89 ec = esi_load(puid,
90 eid_attr->value.ptr,
91 eid_attr->len);
92 }
93 break;
94 case OBJ_ISCSI:
95 scn_bitmap = &obj->attrs[ATTR_INDEX_ISCSI(
96 ISNS_ISCSI_SCN_BITMAP_ATTR_ID)];
97 scn_name = &obj->attrs[ATTR_INDEX_ISCSI(
98 ISNS_ISCSI_NAME_ATTR_ID)];
99 case OBJ_PORTAL:
100 if (puid != 0 &&
101 TYPE_OF_PARENT[obj->type] == ptype) {
102 (void) set_parent_obj(obj, puid);
103 type = obj->type;
104 ec = register_object(obj, &uid, NULL);
105 } else {
106 ec = ISNS_RSP_INTERNAL_ERROR;
107 }
108 if (ec == 0) {
109 ec = buff_child_obj(ptype, type,
110 (void *)uid, child);
111 }
112 if (ec == 0 && scn_bitmap != NULL) {
113 /* register scn */
114 ec = scn_list_load(
115 uid,
116 scn_name->value.ptr,
117 scn_name->len,
118 scn_bitmap->value.ui);
119 }
120 break;
121 case OBJ_PG:
122 if (puid != 0 &&
123 TYPE_OF_PARENT[OBJ_PG] == ptype) {
124 (void) set_parent_obj(obj, puid);
125 ec = register_object(obj, NULL, NULL);
126 } else {
127 ec = ISNS_RSP_INTERNAL_ERROR;
128 }
129 break;
130 case OBJ_ASSOC_ISCSI:
131 if (puid != 0 &&
132 TYPE_OF_PARENT[OBJ_ASSOC_ISCSI] == ptype) {
133 /* ignore adding member to default dd */
134 /* during loading objects from data store */
135 if (puid != ISNS_DEFAULT_DD_ID) {
136 (void) set_parent_obj(obj, puid);
137 ec = add_dd_member(obj);
138 }
139 } else {
140 ec = ISNS_RSP_INTERNAL_ERROR;
141 }
142 free_object(obj);
143 break;
144 case OBJ_ASSOC_DD:
145 if (puid != 0 &&
146 TYPE_OF_PARENT[OBJ_ASSOC_DD] == ptype) {
147 /* ignore adding member to default dd-set */
148 /* and adding default dd to any dd-set */
149 /* during loading objects from data store */
150 if (puid != ISNS_DEFAULT_DD_SET_ID &&
151 get_obj_uid(obj) != ISNS_DEFAULT_DD_ID) {
152 (void) set_parent_obj(obj, puid);
153 ec = add_dds_member(obj);
154 }
155 } else {
156 ec = ISNS_RSP_INTERNAL_ERROR;
157 }
158 free_object(obj);
159 break;
160 default:
161 ASSERT(0);
162 ec = ISNS_RSP_INTERNAL_ERROR;
163 break;
164 }
165 if (ec == 0) {
166 ec = target_load_obj(&prev, &obj, &phase);
167 }
168 if (ec == 0 &&
169 puid != 0 &&
170 NUM_OF_CHILD[ptype] > 0 &&
171 (obj == NULL ||
172 TYPE_OF_PARENT[obj->type] != ptype)) {
173 ec = update_child_obj(ptype, puid, child, 0);
174 }
175 }
176
177 /* unlock the cache */
178 (void) cache_unlock_sync(0);
179
180 /* free the child buffer */
181 uid = 0;
182 while (uid < MAX_CHILD_TYPE) {
183 if (child[uid] != NULL) {
184 free(child[uid]);
185 }
186 uid ++;
187 }
188
189 return (ec);
190 }
191
192 int
write_data(int op,const isns_obj_t * obj)193 write_data(
194 int op,
195 const isns_obj_t *obj
196 )
197 {
198 int ec = 0;
199
200 switch (op) {
201 case DATA_ADD:
202 ec = target_add_obj(obj);
203 break;
204 case DATA_UPDATE:
205 ec = target_modify_obj(obj);
206 break;
207 case DATA_DELETE:
208 ec = target_delete_obj(obj);
209 break;
210 case DATA_DELETE_ASSOC:
211 ec = target_delete_assoc(obj);
212 break;
213 case DATA_COMMIT:
214 ec = target_update_commit();
215 break;
216 case DATA_RETREAT:
217 ec = target_update_retreat();
218 break;
219 default:
220 break;
221 }
222
223 return (ec);
224 }
225