1*0Sstevel@tonic-gate /*
2*0Sstevel@tonic-gate * CDDL HEADER START
3*0Sstevel@tonic-gate *
4*0Sstevel@tonic-gate * The contents of this file are subject to the terms of the
5*0Sstevel@tonic-gate * Common Development and Distribution License, Version 1.0 only
6*0Sstevel@tonic-gate * (the "License"). You may not use this file except in compliance
7*0Sstevel@tonic-gate * with the License.
8*0Sstevel@tonic-gate *
9*0Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10*0Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing.
11*0Sstevel@tonic-gate * See the License for the specific language governing permissions
12*0Sstevel@tonic-gate * and limitations under the License.
13*0Sstevel@tonic-gate *
14*0Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each
15*0Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16*0Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the
17*0Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying
18*0Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner]
19*0Sstevel@tonic-gate *
20*0Sstevel@tonic-gate * CDDL HEADER END
21*0Sstevel@tonic-gate */
22*0Sstevel@tonic-gate /*
23*0Sstevel@tonic-gate * Copyright 2003 Sun Microsystems, Inc. All rights reserved.
24*0Sstevel@tonic-gate * Use is subject to license terms.
25*0Sstevel@tonic-gate */
26*0Sstevel@tonic-gate
27*0Sstevel@tonic-gate #pragma ident "%Z%%M% %I% %E% SMI"
28*0Sstevel@tonic-gate
29*0Sstevel@tonic-gate #include <string.h>
30*0Sstevel@tonic-gate #include <libintl.h>
31*0Sstevel@tonic-gate #include "volume_defaults.h"
32*0Sstevel@tonic-gate #include "volume_error.h"
33*0Sstevel@tonic-gate
34*0Sstevel@tonic-gate /*
35*0Sstevel@tonic-gate * Methods which manipulate a defaults_t struct
36*0Sstevel@tonic-gate */
37*0Sstevel@tonic-gate
38*0Sstevel@tonic-gate static int defaults_get_singleton_component(
39*0Sstevel@tonic-gate defaults_t *defaults, char *disksetname,
40*0Sstevel@tonic-gate component_type_t type, devconfig_t **component, boolean_t create);
41*0Sstevel@tonic-gate
42*0Sstevel@tonic-gate /*
43*0Sstevel@tonic-gate * Constructor: Create a defaults_t struct populated with default
44*0Sstevel@tonic-gate * values. This defaults_t must be freed.
45*0Sstevel@tonic-gate *
46*0Sstevel@tonic-gate * @param defaults
47*0Sstevel@tonic-gate * RETURN: a pointer to a new defaults_t
48*0Sstevel@tonic-gate *
49*0Sstevel@tonic-gate * @return 0
50*0Sstevel@tonic-gate * if successful
51*0Sstevel@tonic-gate *
52*0Sstevel@tonic-gate * @return non-zero
53*0Sstevel@tonic-gate * if an error occurred. Use get_error_string() to
54*0Sstevel@tonic-gate * retrieve the associated error message.
55*0Sstevel@tonic-gate */
56*0Sstevel@tonic-gate int
new_defaults(defaults_t ** defaults)57*0Sstevel@tonic-gate new_defaults(
58*0Sstevel@tonic-gate defaults_t **defaults)
59*0Sstevel@tonic-gate {
60*0Sstevel@tonic-gate devconfig_t *diskset;
61*0Sstevel@tonic-gate int error = 0;
62*0Sstevel@tonic-gate
63*0Sstevel@tonic-gate *defaults = (defaults_t *)calloc(1, sizeof (defaults_t));
64*0Sstevel@tonic-gate if (*defaults == NULL) {
65*0Sstevel@tonic-gate volume_set_error(gettext("new_defaults calloc() failed"));
66*0Sstevel@tonic-gate return (-1);
67*0Sstevel@tonic-gate }
68*0Sstevel@tonic-gate
69*0Sstevel@tonic-gate /*
70*0Sstevel@tonic-gate * Create initial "global" (disk set-independent) defaults, as
71*0Sstevel@tonic-gate * a devconfig_t of type disk set with NULL name
72*0Sstevel@tonic-gate */
73*0Sstevel@tonic-gate if ((error = new_devconfig(&diskset, TYPE_DISKSET)) != 0) {
74*0Sstevel@tonic-gate free_defaults(*defaults);
75*0Sstevel@tonic-gate return (error);
76*0Sstevel@tonic-gate }
77*0Sstevel@tonic-gate
78*0Sstevel@tonic-gate /* Append global defaults disk set to disksets */
79*0Sstevel@tonic-gate defaults_set_disksets(
80*0Sstevel@tonic-gate *defaults, dlist_append(dlist_new_item(diskset),
81*0Sstevel@tonic-gate defaults_get_disksets(*defaults), AT_TAIL));
82*0Sstevel@tonic-gate
83*0Sstevel@tonic-gate /* Set defaults */
84*0Sstevel@tonic-gate if ((error = defaults_set_mirror_nsubs(
85*0Sstevel@tonic-gate *defaults, NULL, DEFAULT_MIRROR_NSUBS)) != 0 ||
86*0Sstevel@tonic-gate
87*0Sstevel@tonic-gate (error = defaults_set_mirror_read(
88*0Sstevel@tonic-gate *defaults, NULL, DEFAULT_MIRROR_READ)) != 0 ||
89*0Sstevel@tonic-gate
90*0Sstevel@tonic-gate (error = defaults_set_mirror_write(
91*0Sstevel@tonic-gate *defaults, NULL, DEFAULT_MIRROR_WRITE)) != 0 ||
92*0Sstevel@tonic-gate
93*0Sstevel@tonic-gate (error = defaults_set_mirror_pass(
94*0Sstevel@tonic-gate *defaults, NULL, DEFAULT_MIRROR_PASS)) != 0 ||
95*0Sstevel@tonic-gate
96*0Sstevel@tonic-gate (error = defaults_set_mirror_usehsp(
97*0Sstevel@tonic-gate *defaults, NULL, DEFAULT_MIRROR_USEHSP)) != 0 ||
98*0Sstevel@tonic-gate
99*0Sstevel@tonic-gate (error = defaults_set_concat_usehsp(
100*0Sstevel@tonic-gate *defaults, NULL, DEFAULT_CONCAT_USEHSP)) != 0 ||
101*0Sstevel@tonic-gate
102*0Sstevel@tonic-gate (error = defaults_set_stripe_interlace(
103*0Sstevel@tonic-gate *defaults, NULL, DEFAULT_STRIPE_INTERLACE)) != 0 ||
104*0Sstevel@tonic-gate
105*0Sstevel@tonic-gate (error = defaults_set_stripe_mincomp(
106*0Sstevel@tonic-gate *defaults, NULL, DEFAULT_STRIPE_MINCOMP)) != 0 ||
107*0Sstevel@tonic-gate
108*0Sstevel@tonic-gate (error = defaults_set_stripe_maxcomp(
109*0Sstevel@tonic-gate *defaults, NULL, DEFAULT_STRIPE_MAXCOMP)) != 0 ||
110*0Sstevel@tonic-gate
111*0Sstevel@tonic-gate (error = defaults_set_stripe_usehsp(
112*0Sstevel@tonic-gate *defaults, NULL, DEFAULT_STRIPE_USEHSP)) != 0 ||
113*0Sstevel@tonic-gate
114*0Sstevel@tonic-gate (error = defaults_set_volume_redundancy_level(
115*0Sstevel@tonic-gate *defaults, NULL, DEFAULT_VOLUME_REDUND_LEVEL)) != 0 ||
116*0Sstevel@tonic-gate
117*0Sstevel@tonic-gate (error = defaults_set_volume_npaths(
118*0Sstevel@tonic-gate *defaults, NULL, DEFAULT_VOLUME_NPATHS)) != 0 ||
119*0Sstevel@tonic-gate
120*0Sstevel@tonic-gate (error = defaults_set_volume_usehsp(
121*0Sstevel@tonic-gate *defaults, NULL, DEFAULT_VOLUME_USEHSP)) != 0) {
122*0Sstevel@tonic-gate
123*0Sstevel@tonic-gate free_defaults(*defaults);
124*0Sstevel@tonic-gate return (error);
125*0Sstevel@tonic-gate }
126*0Sstevel@tonic-gate
127*0Sstevel@tonic-gate return (0);
128*0Sstevel@tonic-gate }
129*0Sstevel@tonic-gate
130*0Sstevel@tonic-gate /*
131*0Sstevel@tonic-gate * Free memory (recursively) allocated to a defaults_t struct
132*0Sstevel@tonic-gate *
133*0Sstevel@tonic-gate * @param arg
134*0Sstevel@tonic-gate * pointer to the defaults_t struct to free
135*0Sstevel@tonic-gate */
136*0Sstevel@tonic-gate void
free_defaults(void * arg)137*0Sstevel@tonic-gate free_defaults(
138*0Sstevel@tonic-gate void *arg)
139*0Sstevel@tonic-gate {
140*0Sstevel@tonic-gate defaults_t *defaults = (defaults_t *)arg;
141*0Sstevel@tonic-gate
142*0Sstevel@tonic-gate if (defaults == NULL) {
143*0Sstevel@tonic-gate return;
144*0Sstevel@tonic-gate }
145*0Sstevel@tonic-gate
146*0Sstevel@tonic-gate /* Free the disksets */
147*0Sstevel@tonic-gate if (defaults->disksets != NULL) {
148*0Sstevel@tonic-gate dlist_free_items(defaults->disksets, free_devconfig);
149*0Sstevel@tonic-gate }
150*0Sstevel@tonic-gate
151*0Sstevel@tonic-gate /* Free the devconfig itself */
152*0Sstevel@tonic-gate free(defaults);
153*0Sstevel@tonic-gate }
154*0Sstevel@tonic-gate
155*0Sstevel@tonic-gate /*
156*0Sstevel@tonic-gate * Set list of diskset specific defaults
157*0Sstevel@tonic-gate *
158*0Sstevel@tonic-gate * @param defaults
159*0Sstevel@tonic-gate * a defaults_t hierarchy representing default settings
160*0Sstevel@tonic-gate * for all disk sets and specific disk sets
161*0Sstevel@tonic-gate *
162*0Sstevel@tonic-gate * @param disksets
163*0Sstevel@tonic-gate * a dlist_t representing the defaults for specific
164*0Sstevel@tonic-gate * named disk sets
165*0Sstevel@tonic-gate */
166*0Sstevel@tonic-gate void
defaults_set_disksets(defaults_t * defaults,dlist_t * disksets)167*0Sstevel@tonic-gate defaults_set_disksets(
168*0Sstevel@tonic-gate defaults_t *defaults,
169*0Sstevel@tonic-gate dlist_t *disksets)
170*0Sstevel@tonic-gate {
171*0Sstevel@tonic-gate defaults->disksets = disksets;
172*0Sstevel@tonic-gate }
173*0Sstevel@tonic-gate
174*0Sstevel@tonic-gate /*
175*0Sstevel@tonic-gate * Get list of diskset specific defaults
176*0Sstevel@tonic-gate *
177*0Sstevel@tonic-gate * @param defaults
178*0Sstevel@tonic-gate * a defaults_t hierarchy representing default settings
179*0Sstevel@tonic-gate * for all disk sets and specific disk sets
180*0Sstevel@tonic-gate *
181*0Sstevel@tonic-gate * @return a dlist_t representing the defaults for specific
182*0Sstevel@tonic-gate * named disk sets
183*0Sstevel@tonic-gate */
184*0Sstevel@tonic-gate dlist_t *
defaults_get_disksets(defaults_t * defaults)185*0Sstevel@tonic-gate defaults_get_disksets(
186*0Sstevel@tonic-gate defaults_t *defaults)
187*0Sstevel@tonic-gate {
188*0Sstevel@tonic-gate return (defaults->disksets);
189*0Sstevel@tonic-gate }
190*0Sstevel@tonic-gate
191*0Sstevel@tonic-gate /*
192*0Sstevel@tonic-gate * Get a disk set with the given name from the given defaults_t
193*0Sstevel@tonic-gate *
194*0Sstevel@tonic-gate * @param defaults
195*0Sstevel@tonic-gate * a defaults_t hierarchy representing default settings
196*0Sstevel@tonic-gate * for all disk sets and specific disk sets
197*0Sstevel@tonic-gate *
198*0Sstevel@tonic-gate * @param name
199*0Sstevel@tonic-gate * the name of the disk set whose defaults to retrieve,
200*0Sstevel@tonic-gate * or NULL to get the defaults for all disk sets
201*0Sstevel@tonic-gate *
202*0Sstevel@tonic-gate * @param diskset
203*0Sstevel@tonic-gate * RETURN: defaults for the given named disk set, or
204*0Sstevel@tonic-gate * defaults for all disk sets if name is NULL
205*0Sstevel@tonic-gate *
206*0Sstevel@tonic-gate * @return ENOENT
207*0Sstevel@tonic-gate * if the named disk set does not exist
208*0Sstevel@tonic-gate *
209*0Sstevel@tonic-gate * @return 0
210*0Sstevel@tonic-gate * if the named disk set exists
211*0Sstevel@tonic-gate */
212*0Sstevel@tonic-gate int
defaults_get_diskset_by_name(defaults_t * defaults,char * name,devconfig_t ** diskset)213*0Sstevel@tonic-gate defaults_get_diskset_by_name(
214*0Sstevel@tonic-gate defaults_t *defaults,
215*0Sstevel@tonic-gate char *name,
216*0Sstevel@tonic-gate devconfig_t **diskset)
217*0Sstevel@tonic-gate {
218*0Sstevel@tonic-gate dlist_t *list;
219*0Sstevel@tonic-gate *diskset = NULL;
220*0Sstevel@tonic-gate
221*0Sstevel@tonic-gate /* Get list of disk sets */
222*0Sstevel@tonic-gate list = defaults_get_disksets(defaults);
223*0Sstevel@tonic-gate if (list != NULL) {
224*0Sstevel@tonic-gate
225*0Sstevel@tonic-gate /* For each disk set-specific defaults... */
226*0Sstevel@tonic-gate for (; list != NULL; list = list->next) {
227*0Sstevel@tonic-gate
228*0Sstevel@tonic-gate char *dname = NULL;
229*0Sstevel@tonic-gate devconfig_t *d = (devconfig_t *)list->obj;
230*0Sstevel@tonic-gate
231*0Sstevel@tonic-gate /* Get the name if this disk set */
232*0Sstevel@tonic-gate devconfig_get_name(d, &dname);
233*0Sstevel@tonic-gate
234*0Sstevel@tonic-gate /* Do the names match? */
235*0Sstevel@tonic-gate if (
236*0Sstevel@tonic-gate /* Global defaults disk set */
237*0Sstevel@tonic-gate (name == NULL && dname == NULL) ||
238*0Sstevel@tonic-gate
239*0Sstevel@tonic-gate /* Named disk set */
240*0Sstevel@tonic-gate (name != NULL && dname != NULL &&
241*0Sstevel@tonic-gate strcmp(name, dname) == 0)) {
242*0Sstevel@tonic-gate
243*0Sstevel@tonic-gate *diskset = d;
244*0Sstevel@tonic-gate break;
245*0Sstevel@tonic-gate }
246*0Sstevel@tonic-gate }
247*0Sstevel@tonic-gate }
248*0Sstevel@tonic-gate
249*0Sstevel@tonic-gate /* Diskset doesn't exist */
250*0Sstevel@tonic-gate if (*diskset == NULL) {
251*0Sstevel@tonic-gate return (ENOENT);
252*0Sstevel@tonic-gate }
253*0Sstevel@tonic-gate
254*0Sstevel@tonic-gate return (0);
255*0Sstevel@tonic-gate }
256*0Sstevel@tonic-gate
257*0Sstevel@tonic-gate /*
258*0Sstevel@tonic-gate * Get the first component of the given type from the given disk set.
259*0Sstevel@tonic-gate * If not found, create the component if requested.
260*0Sstevel@tonic-gate *
261*0Sstevel@tonic-gate * @return ENOENT
262*0Sstevel@tonic-gate * if the given disk set does not exist, or it exists,
263*0Sstevel@tonic-gate * but the requested component does not exist under it
264*0Sstevel@tonic-gate * and its creation was not requested
265*0Sstevel@tonic-gate *
266*0Sstevel@tonic-gate * @return 0
267*0Sstevel@tonic-gate * if the requested component exists or was created
268*0Sstevel@tonic-gate *
269*0Sstevel@tonic-gate * @return non-zero
270*0Sstevel@tonic-gate * if the requested component does not exist and could
271*0Sstevel@tonic-gate * not be created
272*0Sstevel@tonic-gate */
273*0Sstevel@tonic-gate static int
defaults_get_singleton_component(defaults_t * defaults,char * disksetname,component_type_t type,devconfig_t ** component,boolean_t create)274*0Sstevel@tonic-gate defaults_get_singleton_component(
275*0Sstevel@tonic-gate defaults_t *defaults,
276*0Sstevel@tonic-gate char *disksetname,
277*0Sstevel@tonic-gate component_type_t type,
278*0Sstevel@tonic-gate devconfig_t **component,
279*0Sstevel@tonic-gate boolean_t create)
280*0Sstevel@tonic-gate {
281*0Sstevel@tonic-gate int error;
282*0Sstevel@tonic-gate devconfig_t *diskset;
283*0Sstevel@tonic-gate
284*0Sstevel@tonic-gate /* Get the disk set referred to */
285*0Sstevel@tonic-gate if ((error = defaults_get_diskset_by_name(
286*0Sstevel@tonic-gate defaults, disksetname, &diskset)) != 0) {
287*0Sstevel@tonic-gate
288*0Sstevel@tonic-gate volume_set_error(
289*0Sstevel@tonic-gate gettext("could not get defaults for disk set %s"),
290*0Sstevel@tonic-gate disksetname == NULL ? gettext("<NULL>") : disksetname);
291*0Sstevel@tonic-gate
292*0Sstevel@tonic-gate return (error);
293*0Sstevel@tonic-gate }
294*0Sstevel@tonic-gate
295*0Sstevel@tonic-gate /*
296*0Sstevel@tonic-gate * Get the singleton component under this disk set, create if
297*0Sstevel@tonic-gate * requested
298*0Sstevel@tonic-gate */
299*0Sstevel@tonic-gate return (devconfig_get_component(diskset, type, component, create));
300*0Sstevel@tonic-gate }
301*0Sstevel@tonic-gate
302*0Sstevel@tonic-gate /*
303*0Sstevel@tonic-gate * Set name of the the default HSP to use
304*0Sstevel@tonic-gate *
305*0Sstevel@tonic-gate * @param defaults
306*0Sstevel@tonic-gate * a defaults_t hierarchy representing default settings
307*0Sstevel@tonic-gate * for all disk sets and specific disk sets
308*0Sstevel@tonic-gate *
309*0Sstevel@tonic-gate * @param diskset
310*0Sstevel@tonic-gate * the name of the disk set to which to apply this
311*0Sstevel@tonic-gate * default setting, or NULL to apply default
312*0Sstevel@tonic-gate * setting to all disk sets
313*0Sstevel@tonic-gate *
314*0Sstevel@tonic-gate * @param name
315*0Sstevel@tonic-gate * the name of the default HSP to use
316*0Sstevel@tonic-gate *
317*0Sstevel@tonic-gate * @return 0
318*0Sstevel@tonic-gate * if successful
319*0Sstevel@tonic-gate *
320*0Sstevel@tonic-gate * @return non-zero
321*0Sstevel@tonic-gate * if an error occurred. Use get_error_string() to
322*0Sstevel@tonic-gate * retrieve the associated error message.
323*0Sstevel@tonic-gate */
324*0Sstevel@tonic-gate int
defaults_set_hsp_name(defaults_t * defaults,char * diskset,char * name)325*0Sstevel@tonic-gate defaults_set_hsp_name(
326*0Sstevel@tonic-gate defaults_t *defaults,
327*0Sstevel@tonic-gate char *diskset,
328*0Sstevel@tonic-gate char *name)
329*0Sstevel@tonic-gate {
330*0Sstevel@tonic-gate devconfig_t *hsp = NULL;
331*0Sstevel@tonic-gate int error = 0;
332*0Sstevel@tonic-gate
333*0Sstevel@tonic-gate /* Get/create singleton HSP element for this disk set */
334*0Sstevel@tonic-gate if ((error = defaults_get_singleton_component(
335*0Sstevel@tonic-gate defaults, diskset, TYPE_HSP, &hsp, TRUE)) != 0) {
336*0Sstevel@tonic-gate /* volume_set_error already called */
337*0Sstevel@tonic-gate return (error);
338*0Sstevel@tonic-gate }
339*0Sstevel@tonic-gate
340*0Sstevel@tonic-gate /* Set the name attribute */
341*0Sstevel@tonic-gate return (devconfig_set_hsp_name(hsp, name));
342*0Sstevel@tonic-gate }
343*0Sstevel@tonic-gate
344*0Sstevel@tonic-gate /*
345*0Sstevel@tonic-gate * Get the name of the default HSP to use
346*0Sstevel@tonic-gate *
347*0Sstevel@tonic-gate * @param defaults
348*0Sstevel@tonic-gate * a defaults_t hierarchy representing default settings
349*0Sstevel@tonic-gate * for all disk sets and specific disk sets
350*0Sstevel@tonic-gate *
351*0Sstevel@tonic-gate * @param diskset
352*0Sstevel@tonic-gate * the name of the disk set to which to apply this
353*0Sstevel@tonic-gate * default setting, or NULL to apply default
354*0Sstevel@tonic-gate * setting to all disk sets
355*0Sstevel@tonic-gate *
356*0Sstevel@tonic-gate * @param name
357*0Sstevel@tonic-gate * RETURN: the name of the default HSP to use
358*0Sstevel@tonic-gate *
359*0Sstevel@tonic-gate * @return 0
360*0Sstevel@tonic-gate * if successful
361*0Sstevel@tonic-gate *
362*0Sstevel@tonic-gate * @return non-zero
363*0Sstevel@tonic-gate * if an error occurred. Use get_error_string() to
364*0Sstevel@tonic-gate * retrieve the associated error message.
365*0Sstevel@tonic-gate */
366*0Sstevel@tonic-gate int
defaults_get_hsp_name(defaults_t * defaults,char * diskset,char ** name)367*0Sstevel@tonic-gate defaults_get_hsp_name(
368*0Sstevel@tonic-gate defaults_t *defaults,
369*0Sstevel@tonic-gate char *diskset,
370*0Sstevel@tonic-gate char **name)
371*0Sstevel@tonic-gate {
372*0Sstevel@tonic-gate char *disksets[2];
373*0Sstevel@tonic-gate devconfig_t *hsp;
374*0Sstevel@tonic-gate int error;
375*0Sstevel@tonic-gate int i = 0;
376*0Sstevel@tonic-gate
377*0Sstevel@tonic-gate /* Check both the given and global (NULL) disk sets for the value */
378*0Sstevel@tonic-gate disksets[0] = diskset;
379*0Sstevel@tonic-gate disksets[1] = NULL;
380*0Sstevel@tonic-gate do {
381*0Sstevel@tonic-gate /* Get/create singleton HSP element for this disk set */
382*0Sstevel@tonic-gate error = defaults_get_singleton_component(
383*0Sstevel@tonic-gate defaults, disksets[i], TYPE_HSP, &hsp, FALSE);
384*0Sstevel@tonic-gate
385*0Sstevel@tonic-gate switch (error) {
386*0Sstevel@tonic-gate /* HSP found for this disk set */
387*0Sstevel@tonic-gate case 0:
388*0Sstevel@tonic-gate /* Get the nsubs attribute */
389*0Sstevel@tonic-gate if ((error = devconfig_get_name(hsp, name)) == 0) {
390*0Sstevel@tonic-gate /* nsubs attribute found */
391*0Sstevel@tonic-gate return (0);
392*0Sstevel@tonic-gate }
393*0Sstevel@tonic-gate
394*0Sstevel@tonic-gate /* FALLTHROUGH */
395*0Sstevel@tonic-gate
396*0Sstevel@tonic-gate /* HSP not found for this disk set */
397*0Sstevel@tonic-gate case ENOENT:
398*0Sstevel@tonic-gate break;
399*0Sstevel@tonic-gate
400*0Sstevel@tonic-gate /* Invalid disk set, or HSP couldn't be created */
401*0Sstevel@tonic-gate default:
402*0Sstevel@tonic-gate /* volume_set_error already called */
403*0Sstevel@tonic-gate return (error);
404*0Sstevel@tonic-gate }
405*0Sstevel@tonic-gate
406*0Sstevel@tonic-gate /* Stop after the global (NULL) disk set has been searched */
407*0Sstevel@tonic-gate } while (disksets[i++] != NULL);
408*0Sstevel@tonic-gate
409*0Sstevel@tonic-gate return (ENOENT);
410*0Sstevel@tonic-gate }
411*0Sstevel@tonic-gate
412*0Sstevel@tonic-gate /*
413*0Sstevel@tonic-gate * Set the default number of submirrors for mirrored volumes
414*0Sstevel@tonic-gate *
415*0Sstevel@tonic-gate * @param defaults
416*0Sstevel@tonic-gate * a defaults_t hierarchy representing default settings
417*0Sstevel@tonic-gate * for all disk sets and specific disk sets
418*0Sstevel@tonic-gate *
419*0Sstevel@tonic-gate * @param diskset
420*0Sstevel@tonic-gate * the name of the disk set to which to apply this
421*0Sstevel@tonic-gate * default setting, or NULL to apply default
422*0Sstevel@tonic-gate * setting to all disk sets
423*0Sstevel@tonic-gate *
424*0Sstevel@tonic-gate * @param val
425*0Sstevel@tonic-gate * the value to set as the default number of submirrors
426*0Sstevel@tonic-gate * for mirrored volumes
427*0Sstevel@tonic-gate *
428*0Sstevel@tonic-gate * @return 0
429*0Sstevel@tonic-gate * if successful
430*0Sstevel@tonic-gate *
431*0Sstevel@tonic-gate * @return non-zero
432*0Sstevel@tonic-gate * if an error occurred. Use get_error_string() to
433*0Sstevel@tonic-gate * retrieve the associated error message.
434*0Sstevel@tonic-gate */
435*0Sstevel@tonic-gate int
defaults_set_mirror_nsubs(defaults_t * defaults,char * diskset,uint16_t val)436*0Sstevel@tonic-gate defaults_set_mirror_nsubs(
437*0Sstevel@tonic-gate defaults_t *defaults,
438*0Sstevel@tonic-gate char *diskset,
439*0Sstevel@tonic-gate uint16_t val)
440*0Sstevel@tonic-gate {
441*0Sstevel@tonic-gate devconfig_t *mirror = NULL;
442*0Sstevel@tonic-gate int error = 0;
443*0Sstevel@tonic-gate
444*0Sstevel@tonic-gate /* Get/create singleton mirror element for this disk set */
445*0Sstevel@tonic-gate if ((error = defaults_get_singleton_component(
446*0Sstevel@tonic-gate defaults, diskset, TYPE_MIRROR, &mirror, TRUE)) != 0) {
447*0Sstevel@tonic-gate /* volume_set_error already called */
448*0Sstevel@tonic-gate return (error);
449*0Sstevel@tonic-gate }
450*0Sstevel@tonic-gate
451*0Sstevel@tonic-gate /* Set the nsubs attribute */
452*0Sstevel@tonic-gate return (devconfig_set_mirror_nsubs(mirror, val));
453*0Sstevel@tonic-gate }
454*0Sstevel@tonic-gate
455*0Sstevel@tonic-gate /*
456*0Sstevel@tonic-gate * Get the default number of submirrors for mirrored volumes
457*0Sstevel@tonic-gate *
458*0Sstevel@tonic-gate * @param defaults
459*0Sstevel@tonic-gate * a defaults_t hierarchy representing default settings
460*0Sstevel@tonic-gate * for all disk sets and specific disk sets
461*0Sstevel@tonic-gate *
462*0Sstevel@tonic-gate * @param diskset
463*0Sstevel@tonic-gate * the name of the disk set to which to apply this
464*0Sstevel@tonic-gate * default setting, or NULL to apply default
465*0Sstevel@tonic-gate * setting to all disk sets
466*0Sstevel@tonic-gate *
467*0Sstevel@tonic-gate * @param val
468*0Sstevel@tonic-gate * RETURN: the default number of submirrors for mirrored
469*0Sstevel@tonic-gate * volumes
470*0Sstevel@tonic-gate *
471*0Sstevel@tonic-gate * @return 0
472*0Sstevel@tonic-gate * if successful
473*0Sstevel@tonic-gate *
474*0Sstevel@tonic-gate * @return non-zero
475*0Sstevel@tonic-gate * if an error occurred. Use get_error_string() to
476*0Sstevel@tonic-gate * retrieve the associated error message.
477*0Sstevel@tonic-gate */
478*0Sstevel@tonic-gate int
defaults_get_mirror_nsubs(defaults_t * defaults,char * diskset,uint16_t * val)479*0Sstevel@tonic-gate defaults_get_mirror_nsubs(
480*0Sstevel@tonic-gate defaults_t *defaults,
481*0Sstevel@tonic-gate char *diskset,
482*0Sstevel@tonic-gate uint16_t *val)
483*0Sstevel@tonic-gate {
484*0Sstevel@tonic-gate char *disksets[2];
485*0Sstevel@tonic-gate devconfig_t *mirror;
486*0Sstevel@tonic-gate int error;
487*0Sstevel@tonic-gate int i = 0;
488*0Sstevel@tonic-gate
489*0Sstevel@tonic-gate /* Check both the given and global (NULL) disk sets for the value */
490*0Sstevel@tonic-gate disksets[0] = diskset;
491*0Sstevel@tonic-gate disksets[1] = NULL;
492*0Sstevel@tonic-gate do {
493*0Sstevel@tonic-gate /* Get/create singleton mirror element for this disk set */
494*0Sstevel@tonic-gate error = defaults_get_singleton_component(
495*0Sstevel@tonic-gate defaults, disksets[i], TYPE_MIRROR, &mirror, FALSE);
496*0Sstevel@tonic-gate
497*0Sstevel@tonic-gate switch (error) {
498*0Sstevel@tonic-gate /* mirror found for this disk set */
499*0Sstevel@tonic-gate case 0:
500*0Sstevel@tonic-gate /* Get the nsubs attribute */
501*0Sstevel@tonic-gate if ((error = devconfig_get_mirror_nsubs(
502*0Sstevel@tonic-gate mirror, val)) == 0) {
503*0Sstevel@tonic-gate /* nsubs attribute found */
504*0Sstevel@tonic-gate return (0);
505*0Sstevel@tonic-gate }
506*0Sstevel@tonic-gate
507*0Sstevel@tonic-gate /* FALLTHROUGH */
508*0Sstevel@tonic-gate
509*0Sstevel@tonic-gate /* mirror not found for this disk set */
510*0Sstevel@tonic-gate case ENOENT:
511*0Sstevel@tonic-gate break;
512*0Sstevel@tonic-gate
513*0Sstevel@tonic-gate /* Invalid disk set, or mirror couldn't be created */
514*0Sstevel@tonic-gate default:
515*0Sstevel@tonic-gate /* volume_set_error already called */
516*0Sstevel@tonic-gate return (error);
517*0Sstevel@tonic-gate }
518*0Sstevel@tonic-gate
519*0Sstevel@tonic-gate /* Stop after the global (NULL) disk set has been searched */
520*0Sstevel@tonic-gate } while (disksets[i++] != NULL);
521*0Sstevel@tonic-gate
522*0Sstevel@tonic-gate return (ENOENT);
523*0Sstevel@tonic-gate }
524*0Sstevel@tonic-gate
525*0Sstevel@tonic-gate /*
526*0Sstevel@tonic-gate * Set the default read strategy for mirrored volumes
527*0Sstevel@tonic-gate *
528*0Sstevel@tonic-gate * @param defaults
529*0Sstevel@tonic-gate * a defaults_t hierarchy representing default settings
530*0Sstevel@tonic-gate * for all disk sets and specific disk sets
531*0Sstevel@tonic-gate *
532*0Sstevel@tonic-gate * @param diskset
533*0Sstevel@tonic-gate * the name of the disk set to which to apply this
534*0Sstevel@tonic-gate * default setting, or NULL to apply default
535*0Sstevel@tonic-gate * setting to all disk sets
536*0Sstevel@tonic-gate *
537*0Sstevel@tonic-gate * @param val
538*0Sstevel@tonic-gate * the value to set as the default read strategy for
539*0Sstevel@tonic-gate * mirrored volumes
540*0Sstevel@tonic-gate *
541*0Sstevel@tonic-gate * @return 0
542*0Sstevel@tonic-gate * if successful
543*0Sstevel@tonic-gate *
544*0Sstevel@tonic-gate * @return non-zero
545*0Sstevel@tonic-gate * if an error occurred. Use get_error_string() to
546*0Sstevel@tonic-gate * retrieve the associated error message.
547*0Sstevel@tonic-gate */
548*0Sstevel@tonic-gate int
defaults_set_mirror_read(defaults_t * defaults,char * diskset,mirror_read_strategy_t val)549*0Sstevel@tonic-gate defaults_set_mirror_read(
550*0Sstevel@tonic-gate defaults_t *defaults,
551*0Sstevel@tonic-gate char *diskset,
552*0Sstevel@tonic-gate mirror_read_strategy_t val)
553*0Sstevel@tonic-gate {
554*0Sstevel@tonic-gate devconfig_t *mirror = NULL;
555*0Sstevel@tonic-gate int error = 0;
556*0Sstevel@tonic-gate
557*0Sstevel@tonic-gate /* Get/create singleton mirror element for this disk set */
558*0Sstevel@tonic-gate if ((error = defaults_get_singleton_component(
559*0Sstevel@tonic-gate defaults, diskset, TYPE_MIRROR, &mirror, TRUE)) != 0) {
560*0Sstevel@tonic-gate /* volume_set_error already called */
561*0Sstevel@tonic-gate return (error);
562*0Sstevel@tonic-gate }
563*0Sstevel@tonic-gate
564*0Sstevel@tonic-gate /* Set the read attribute */
565*0Sstevel@tonic-gate return (devconfig_set_mirror_read(mirror, val));
566*0Sstevel@tonic-gate }
567*0Sstevel@tonic-gate
568*0Sstevel@tonic-gate /*
569*0Sstevel@tonic-gate * Get the default read strategy for mirrored volumes
570*0Sstevel@tonic-gate *
571*0Sstevel@tonic-gate * @param defaults
572*0Sstevel@tonic-gate * a defaults_t hierarchy representing default settings
573*0Sstevel@tonic-gate * for all disk sets and specific disk sets
574*0Sstevel@tonic-gate *
575*0Sstevel@tonic-gate * @param diskset
576*0Sstevel@tonic-gate * the name of the disk set to which to apply this
577*0Sstevel@tonic-gate * default setting, or NULL to apply default
578*0Sstevel@tonic-gate * setting to all disk sets
579*0Sstevel@tonic-gate *
580*0Sstevel@tonic-gate * @param val
581*0Sstevel@tonic-gate * RETURN: the default read strategy for mirrored volumes
582*0Sstevel@tonic-gate *
583*0Sstevel@tonic-gate * @return 0
584*0Sstevel@tonic-gate * if successful
585*0Sstevel@tonic-gate *
586*0Sstevel@tonic-gate * @return non-zero
587*0Sstevel@tonic-gate * if an error occurred. Use get_error_string() to
588*0Sstevel@tonic-gate * retrieve the associated error message.
589*0Sstevel@tonic-gate */
590*0Sstevel@tonic-gate int
defaults_get_mirror_read(defaults_t * defaults,char * diskset,mirror_read_strategy_t * val)591*0Sstevel@tonic-gate defaults_get_mirror_read(
592*0Sstevel@tonic-gate defaults_t *defaults,
593*0Sstevel@tonic-gate char *diskset,
594*0Sstevel@tonic-gate mirror_read_strategy_t *val)
595*0Sstevel@tonic-gate {
596*0Sstevel@tonic-gate char *disksets[2];
597*0Sstevel@tonic-gate devconfig_t *mirror;
598*0Sstevel@tonic-gate int error;
599*0Sstevel@tonic-gate int i = 0;
600*0Sstevel@tonic-gate
601*0Sstevel@tonic-gate /* Check both the given and global (NULL) disk sets for the value */
602*0Sstevel@tonic-gate disksets[0] = diskset;
603*0Sstevel@tonic-gate disksets[1] = NULL;
604*0Sstevel@tonic-gate do {
605*0Sstevel@tonic-gate /* Get/create singleton mirror element for this disk set */
606*0Sstevel@tonic-gate error = defaults_get_singleton_component(
607*0Sstevel@tonic-gate defaults, disksets[i], TYPE_MIRROR, &mirror, FALSE);
608*0Sstevel@tonic-gate
609*0Sstevel@tonic-gate switch (error) {
610*0Sstevel@tonic-gate /* mirror found for this disk set */
611*0Sstevel@tonic-gate case 0:
612*0Sstevel@tonic-gate /* Get the read attribute */
613*0Sstevel@tonic-gate if ((error = devconfig_get_mirror_read(mirror, val)) == 0) {
614*0Sstevel@tonic-gate /* read attribute found */
615*0Sstevel@tonic-gate return (0);
616*0Sstevel@tonic-gate }
617*0Sstevel@tonic-gate
618*0Sstevel@tonic-gate /* FALLTHROUGH */
619*0Sstevel@tonic-gate
620*0Sstevel@tonic-gate /* mirror not found for this disk set */
621*0Sstevel@tonic-gate case ENOENT:
622*0Sstevel@tonic-gate break;
623*0Sstevel@tonic-gate
624*0Sstevel@tonic-gate /* Invalid disk set, or mirror couldn't be created */
625*0Sstevel@tonic-gate default:
626*0Sstevel@tonic-gate /* volume_set_error already called */
627*0Sstevel@tonic-gate return (error);
628*0Sstevel@tonic-gate }
629*0Sstevel@tonic-gate
630*0Sstevel@tonic-gate /* Stop after the global (NULL) disk set has been searched */
631*0Sstevel@tonic-gate } while (disksets[i++] != NULL);
632*0Sstevel@tonic-gate
633*0Sstevel@tonic-gate return (ENOENT);
634*0Sstevel@tonic-gate }
635*0Sstevel@tonic-gate
636*0Sstevel@tonic-gate /*
637*0Sstevel@tonic-gate * Set the default write strategy for mirrored volumes
638*0Sstevel@tonic-gate *
639*0Sstevel@tonic-gate * @param defaults
640*0Sstevel@tonic-gate * a defaults_t hierarchy representing default settings
641*0Sstevel@tonic-gate * for all disk sets and specific disk sets
642*0Sstevel@tonic-gate *
643*0Sstevel@tonic-gate * @param diskset
644*0Sstevel@tonic-gate * the name of the disk set to which to apply this
645*0Sstevel@tonic-gate * default setting, or NULL to apply default
646*0Sstevel@tonic-gate * setting to all disk sets
647*0Sstevel@tonic-gate *
648*0Sstevel@tonic-gate * @param val
649*0Sstevel@tonic-gate * the value to set as the default write strategy for
650*0Sstevel@tonic-gate * mirrored volumes
651*0Sstevel@tonic-gate *
652*0Sstevel@tonic-gate * @return 0
653*0Sstevel@tonic-gate * if successful
654*0Sstevel@tonic-gate *
655*0Sstevel@tonic-gate * @return non-zero
656*0Sstevel@tonic-gate * if an error occurred. Use get_error_string() to
657*0Sstevel@tonic-gate * retrieve the associated error message.
658*0Sstevel@tonic-gate */
659*0Sstevel@tonic-gate int
defaults_set_mirror_write(defaults_t * defaults,char * diskset,mirror_write_strategy_t val)660*0Sstevel@tonic-gate defaults_set_mirror_write(
661*0Sstevel@tonic-gate defaults_t *defaults,
662*0Sstevel@tonic-gate char *diskset,
663*0Sstevel@tonic-gate mirror_write_strategy_t val)
664*0Sstevel@tonic-gate {
665*0Sstevel@tonic-gate devconfig_t *mirror = NULL;
666*0Sstevel@tonic-gate int error = 0;
667*0Sstevel@tonic-gate
668*0Sstevel@tonic-gate /* Get/create singleton mirror element for this disk set */
669*0Sstevel@tonic-gate if ((error = defaults_get_singleton_component(
670*0Sstevel@tonic-gate defaults, diskset, TYPE_MIRROR, &mirror, TRUE)) != 0) {
671*0Sstevel@tonic-gate /* volume_set_error already called */
672*0Sstevel@tonic-gate return (error);
673*0Sstevel@tonic-gate }
674*0Sstevel@tonic-gate
675*0Sstevel@tonic-gate /* Set the write attribute */
676*0Sstevel@tonic-gate return (devconfig_set_mirror_write(mirror, val));
677*0Sstevel@tonic-gate }
678*0Sstevel@tonic-gate
679*0Sstevel@tonic-gate /*
680*0Sstevel@tonic-gate * Get the default write strategy for mirrored volumes
681*0Sstevel@tonic-gate *
682*0Sstevel@tonic-gate * @param defaults
683*0Sstevel@tonic-gate * a defaults_t hierarchy representing default settings
684*0Sstevel@tonic-gate * for all disk sets and specific disk sets
685*0Sstevel@tonic-gate *
686*0Sstevel@tonic-gate * @param diskset
687*0Sstevel@tonic-gate * the name of the disk set to which to apply this
688*0Sstevel@tonic-gate * default setting, or NULL to apply default
689*0Sstevel@tonic-gate * setting to all disk sets
690*0Sstevel@tonic-gate *
691*0Sstevel@tonic-gate * @param val
692*0Sstevel@tonic-gate * RETURN: the default write strategy for mirrored
693*0Sstevel@tonic-gate * volumes
694*0Sstevel@tonic-gate *
695*0Sstevel@tonic-gate * @return 0
696*0Sstevel@tonic-gate * if successful
697*0Sstevel@tonic-gate *
698*0Sstevel@tonic-gate * @return non-zero
699*0Sstevel@tonic-gate * if an error occurred. Use get_error_string() to
700*0Sstevel@tonic-gate * retrieve the associated error message.
701*0Sstevel@tonic-gate */
702*0Sstevel@tonic-gate int
defaults_get_mirror_write(defaults_t * defaults,char * diskset,mirror_write_strategy_t * val)703*0Sstevel@tonic-gate defaults_get_mirror_write(
704*0Sstevel@tonic-gate defaults_t *defaults,
705*0Sstevel@tonic-gate char *diskset,
706*0Sstevel@tonic-gate mirror_write_strategy_t *val)
707*0Sstevel@tonic-gate {
708*0Sstevel@tonic-gate char *disksets[2];
709*0Sstevel@tonic-gate devconfig_t *mirror;
710*0Sstevel@tonic-gate int error;
711*0Sstevel@tonic-gate int i = 0;
712*0Sstevel@tonic-gate
713*0Sstevel@tonic-gate /* Check both the given and global (NULL) disk sets for the value */
714*0Sstevel@tonic-gate disksets[0] = diskset;
715*0Sstevel@tonic-gate disksets[1] = NULL;
716*0Sstevel@tonic-gate do {
717*0Sstevel@tonic-gate /* Get/create singleton mirror element for this disk set */
718*0Sstevel@tonic-gate error = defaults_get_singleton_component(
719*0Sstevel@tonic-gate defaults, disksets[i], TYPE_MIRROR, &mirror, FALSE);
720*0Sstevel@tonic-gate
721*0Sstevel@tonic-gate switch (error) {
722*0Sstevel@tonic-gate /* mirror found for this disk set */
723*0Sstevel@tonic-gate case 0:
724*0Sstevel@tonic-gate /* Get the write attribute */
725*0Sstevel@tonic-gate if ((error = devconfig_get_mirror_write(
726*0Sstevel@tonic-gate mirror, val)) == 0) {
727*0Sstevel@tonic-gate /* write attribute found */
728*0Sstevel@tonic-gate return (0);
729*0Sstevel@tonic-gate }
730*0Sstevel@tonic-gate
731*0Sstevel@tonic-gate /* FALLTHROUGH */
732*0Sstevel@tonic-gate
733*0Sstevel@tonic-gate /* mirror not found for this disk set */
734*0Sstevel@tonic-gate case ENOENT:
735*0Sstevel@tonic-gate break;
736*0Sstevel@tonic-gate
737*0Sstevel@tonic-gate /* Invalid disk set, or mirror couldn't be created */
738*0Sstevel@tonic-gate default:
739*0Sstevel@tonic-gate /* volume_set_error already called */
740*0Sstevel@tonic-gate return (error);
741*0Sstevel@tonic-gate }
742*0Sstevel@tonic-gate
743*0Sstevel@tonic-gate /* Stop after the global (NULL) disk set has been searched */
744*0Sstevel@tonic-gate } while (disksets[i++] != NULL);
745*0Sstevel@tonic-gate
746*0Sstevel@tonic-gate return (ENOENT);
747*0Sstevel@tonic-gate }
748*0Sstevel@tonic-gate
749*0Sstevel@tonic-gate /*
750*0Sstevel@tonic-gate * Set the default resync pass for mirrored volumes
751*0Sstevel@tonic-gate *
752*0Sstevel@tonic-gate * @param defaults
753*0Sstevel@tonic-gate * a defaults_t hierarchy representing default settings
754*0Sstevel@tonic-gate * for all disk sets and specific disk sets
755*0Sstevel@tonic-gate *
756*0Sstevel@tonic-gate * @param diskset
757*0Sstevel@tonic-gate * the name of the disk set to which to apply this
758*0Sstevel@tonic-gate * default setting, or NULL to apply default
759*0Sstevel@tonic-gate * setting to all disk sets
760*0Sstevel@tonic-gate *
761*0Sstevel@tonic-gate * @param val
762*0Sstevel@tonic-gate * the value to set as the default resync pass for
763*0Sstevel@tonic-gate * mirrored volumes
764*0Sstevel@tonic-gate *
765*0Sstevel@tonic-gate * @return 0
766*0Sstevel@tonic-gate * if successful
767*0Sstevel@tonic-gate *
768*0Sstevel@tonic-gate * @return non-zero
769*0Sstevel@tonic-gate * if an error occurred. Use get_error_string() to
770*0Sstevel@tonic-gate * retrieve the associated error message.
771*0Sstevel@tonic-gate */
772*0Sstevel@tonic-gate int
defaults_set_mirror_pass(defaults_t * defaults,char * diskset,uint16_t val)773*0Sstevel@tonic-gate defaults_set_mirror_pass(
774*0Sstevel@tonic-gate defaults_t *defaults,
775*0Sstevel@tonic-gate char *diskset,
776*0Sstevel@tonic-gate uint16_t val)
777*0Sstevel@tonic-gate {
778*0Sstevel@tonic-gate devconfig_t *mirror = NULL;
779*0Sstevel@tonic-gate int error = 0;
780*0Sstevel@tonic-gate
781*0Sstevel@tonic-gate /* Get/create singleton mirror element for this disk set */
782*0Sstevel@tonic-gate if ((error = defaults_get_singleton_component(
783*0Sstevel@tonic-gate defaults, diskset, TYPE_MIRROR, &mirror, TRUE)) != 0) {
784*0Sstevel@tonic-gate /* volume_set_error already called */
785*0Sstevel@tonic-gate return (error);
786*0Sstevel@tonic-gate }
787*0Sstevel@tonic-gate
788*0Sstevel@tonic-gate /* Set the pass attribute */
789*0Sstevel@tonic-gate return (devconfig_set_mirror_pass(mirror, val));
790*0Sstevel@tonic-gate }
791*0Sstevel@tonic-gate
792*0Sstevel@tonic-gate /*
793*0Sstevel@tonic-gate * Get the default resync pass for mirrored volumes
794*0Sstevel@tonic-gate *
795*0Sstevel@tonic-gate * @param defaults
796*0Sstevel@tonic-gate * a defaults_t hierarchy representing default settings
797*0Sstevel@tonic-gate * for all disk sets and specific disk sets
798*0Sstevel@tonic-gate *
799*0Sstevel@tonic-gate * @param diskset
800*0Sstevel@tonic-gate * the name of the disk set to which to apply this
801*0Sstevel@tonic-gate * default setting, or NULL to apply default
802*0Sstevel@tonic-gate * setting to all disk sets
803*0Sstevel@tonic-gate *
804*0Sstevel@tonic-gate * @param val
805*0Sstevel@tonic-gate * RETURN: the default resync pass for mirrored volumes
806*0Sstevel@tonic-gate *
807*0Sstevel@tonic-gate * @return 0
808*0Sstevel@tonic-gate * if successful
809*0Sstevel@tonic-gate *
810*0Sstevel@tonic-gate * @return non-zero
811*0Sstevel@tonic-gate * if an error occurred. Use get_error_string() to
812*0Sstevel@tonic-gate * retrieve the associated error message.
813*0Sstevel@tonic-gate */
814*0Sstevel@tonic-gate int
defaults_get_mirror_pass(defaults_t * defaults,char * diskset,uint16_t * val)815*0Sstevel@tonic-gate defaults_get_mirror_pass(
816*0Sstevel@tonic-gate defaults_t *defaults,
817*0Sstevel@tonic-gate char *diskset,
818*0Sstevel@tonic-gate uint16_t *val)
819*0Sstevel@tonic-gate {
820*0Sstevel@tonic-gate char *disksets[2];
821*0Sstevel@tonic-gate devconfig_t *mirror;
822*0Sstevel@tonic-gate int error;
823*0Sstevel@tonic-gate int i = 0;
824*0Sstevel@tonic-gate
825*0Sstevel@tonic-gate /* Check both the given and global (NULL) disk sets for the value */
826*0Sstevel@tonic-gate disksets[0] = diskset;
827*0Sstevel@tonic-gate disksets[1] = NULL;
828*0Sstevel@tonic-gate do {
829*0Sstevel@tonic-gate /* Get/create singleton mirror element for this disk set */
830*0Sstevel@tonic-gate error = defaults_get_singleton_component(
831*0Sstevel@tonic-gate defaults, disksets[i], TYPE_MIRROR, &mirror, FALSE);
832*0Sstevel@tonic-gate
833*0Sstevel@tonic-gate switch (error) {
834*0Sstevel@tonic-gate /* mirror found for this disk set */
835*0Sstevel@tonic-gate case 0:
836*0Sstevel@tonic-gate /* Get the pass attribute */
837*0Sstevel@tonic-gate if ((error = devconfig_get_mirror_pass(mirror, val)) == 0) {
838*0Sstevel@tonic-gate /* pass attribute found */
839*0Sstevel@tonic-gate return (0);
840*0Sstevel@tonic-gate }
841*0Sstevel@tonic-gate
842*0Sstevel@tonic-gate /* FALLTHROUGH */
843*0Sstevel@tonic-gate
844*0Sstevel@tonic-gate /* mirror not found for this disk set */
845*0Sstevel@tonic-gate case ENOENT:
846*0Sstevel@tonic-gate break;
847*0Sstevel@tonic-gate
848*0Sstevel@tonic-gate /* Invalid disk set, or mirror couldn't be created */
849*0Sstevel@tonic-gate default:
850*0Sstevel@tonic-gate /* volume_set_error already called */
851*0Sstevel@tonic-gate return (error);
852*0Sstevel@tonic-gate }
853*0Sstevel@tonic-gate
854*0Sstevel@tonic-gate /* Stop after the global (NULL) disk set has been searched */
855*0Sstevel@tonic-gate } while (disksets[i++] != NULL);
856*0Sstevel@tonic-gate
857*0Sstevel@tonic-gate return (ENOENT);
858*0Sstevel@tonic-gate }
859*0Sstevel@tonic-gate
860*0Sstevel@tonic-gate /*
861*0Sstevel@tonic-gate * Set the default HSP creation flag for mirrored volumes
862*0Sstevel@tonic-gate *
863*0Sstevel@tonic-gate * @param defaults
864*0Sstevel@tonic-gate * a defaults_t hierarchy representing default settings
865*0Sstevel@tonic-gate * for all disk sets and specific disk sets
866*0Sstevel@tonic-gate *
867*0Sstevel@tonic-gate * @param diskset
868*0Sstevel@tonic-gate * the name of the disk set to which to apply this
869*0Sstevel@tonic-gate * default setting, or NULL to apply default
870*0Sstevel@tonic-gate * setting to all disk sets
871*0Sstevel@tonic-gate *
872*0Sstevel@tonic-gate * @param val
873*0Sstevel@tonic-gate * the value to set as the default HSP creation flag for
874*0Sstevel@tonic-gate * mirrored volumes
875*0Sstevel@tonic-gate *
876*0Sstevel@tonic-gate * @return 0
877*0Sstevel@tonic-gate * if successful
878*0Sstevel@tonic-gate *
879*0Sstevel@tonic-gate * @return non-zero
880*0Sstevel@tonic-gate * if an error occurred. Use get_error_string() to
881*0Sstevel@tonic-gate * retrieve the associated error message.
882*0Sstevel@tonic-gate */
883*0Sstevel@tonic-gate int
defaults_set_mirror_usehsp(defaults_t * defaults,char * diskset,boolean_t val)884*0Sstevel@tonic-gate defaults_set_mirror_usehsp(
885*0Sstevel@tonic-gate defaults_t *defaults,
886*0Sstevel@tonic-gate char *diskset,
887*0Sstevel@tonic-gate boolean_t val)
888*0Sstevel@tonic-gate {
889*0Sstevel@tonic-gate devconfig_t *mirror = NULL;
890*0Sstevel@tonic-gate int error = 0;
891*0Sstevel@tonic-gate
892*0Sstevel@tonic-gate /* Get/create singleton mirror element for this disk set */
893*0Sstevel@tonic-gate if ((error = defaults_get_singleton_component(
894*0Sstevel@tonic-gate defaults, diskset, TYPE_MIRROR, &mirror, TRUE)) != 0) {
895*0Sstevel@tonic-gate /* volume_set_error already called */
896*0Sstevel@tonic-gate return (error);
897*0Sstevel@tonic-gate }
898*0Sstevel@tonic-gate
899*0Sstevel@tonic-gate /* Set the usehsp attribute */
900*0Sstevel@tonic-gate return (devconfig_set_volume_usehsp(mirror, val));
901*0Sstevel@tonic-gate }
902*0Sstevel@tonic-gate
903*0Sstevel@tonic-gate /*
904*0Sstevel@tonic-gate * Get the default HSP creation flag for mirrored volumes
905*0Sstevel@tonic-gate *
906*0Sstevel@tonic-gate * @param defaults
907*0Sstevel@tonic-gate * a defaults_t hierarchy representing default settings
908*0Sstevel@tonic-gate * for all disk sets and specific disk sets
909*0Sstevel@tonic-gate *
910*0Sstevel@tonic-gate * @param diskset
911*0Sstevel@tonic-gate * the name of the disk set to which to apply this
912*0Sstevel@tonic-gate * default setting, or NULL to apply default
913*0Sstevel@tonic-gate * setting to all disk sets
914*0Sstevel@tonic-gate *
915*0Sstevel@tonic-gate * @param val
916*0Sstevel@tonic-gate * RETURN: the default HSP creation flag for mirrored
917*0Sstevel@tonic-gate * volumes
918*0Sstevel@tonic-gate *
919*0Sstevel@tonic-gate * @return 0
920*0Sstevel@tonic-gate * if successful
921*0Sstevel@tonic-gate *
922*0Sstevel@tonic-gate * @return non-zero
923*0Sstevel@tonic-gate * if an error occurred. Use get_error_string() to
924*0Sstevel@tonic-gate * retrieve the associated error message.
925*0Sstevel@tonic-gate */
926*0Sstevel@tonic-gate int
defaults_get_mirror_usehsp(defaults_t * defaults,char * diskset,boolean_t * val)927*0Sstevel@tonic-gate defaults_get_mirror_usehsp(
928*0Sstevel@tonic-gate defaults_t *defaults,
929*0Sstevel@tonic-gate char *diskset,
930*0Sstevel@tonic-gate boolean_t *val)
931*0Sstevel@tonic-gate {
932*0Sstevel@tonic-gate char *disksets[2];
933*0Sstevel@tonic-gate devconfig_t *mirror;
934*0Sstevel@tonic-gate int error;
935*0Sstevel@tonic-gate int i = 0;
936*0Sstevel@tonic-gate
937*0Sstevel@tonic-gate /* Check both the given and global (NULL) disk sets for the value */
938*0Sstevel@tonic-gate disksets[0] = diskset;
939*0Sstevel@tonic-gate disksets[1] = NULL;
940*0Sstevel@tonic-gate do {
941*0Sstevel@tonic-gate /* Get/create singleton mirror element for this disk set */
942*0Sstevel@tonic-gate error = defaults_get_singleton_component(
943*0Sstevel@tonic-gate defaults, disksets[i], TYPE_MIRROR, &mirror, FALSE);
944*0Sstevel@tonic-gate
945*0Sstevel@tonic-gate switch (error) {
946*0Sstevel@tonic-gate /* mirror found for this disk set */
947*0Sstevel@tonic-gate case 0:
948*0Sstevel@tonic-gate /* Get the usehsp attribute */
949*0Sstevel@tonic-gate if ((error = devconfig_get_volume_usehsp(
950*0Sstevel@tonic-gate mirror, val)) == 0) {
951*0Sstevel@tonic-gate /* usehsp attribute found */
952*0Sstevel@tonic-gate return (0);
953*0Sstevel@tonic-gate }
954*0Sstevel@tonic-gate
955*0Sstevel@tonic-gate /* FALLTHROUGH */
956*0Sstevel@tonic-gate
957*0Sstevel@tonic-gate /* mirror not found for this disk set */
958*0Sstevel@tonic-gate case ENOENT:
959*0Sstevel@tonic-gate break;
960*0Sstevel@tonic-gate
961*0Sstevel@tonic-gate /* Invalid disk set, or mirror couldn't be created */
962*0Sstevel@tonic-gate default:
963*0Sstevel@tonic-gate /* volume_set_error already called */
964*0Sstevel@tonic-gate return (error);
965*0Sstevel@tonic-gate }
966*0Sstevel@tonic-gate
967*0Sstevel@tonic-gate /* Stop after the global (NULL) disk set has been searched */
968*0Sstevel@tonic-gate } while (disksets[i++] != NULL);
969*0Sstevel@tonic-gate
970*0Sstevel@tonic-gate return (ENOENT);
971*0Sstevel@tonic-gate }
972*0Sstevel@tonic-gate
973*0Sstevel@tonic-gate /*
974*0Sstevel@tonic-gate * Set the default HSP creation flag for concatenated volumes
975*0Sstevel@tonic-gate *
976*0Sstevel@tonic-gate * @param defaults
977*0Sstevel@tonic-gate * a defaults_t hierarchy representing default settings
978*0Sstevel@tonic-gate * for all disk sets and specific disk sets
979*0Sstevel@tonic-gate *
980*0Sstevel@tonic-gate * @param diskset
981*0Sstevel@tonic-gate * the name of the disk set to which to apply this
982*0Sstevel@tonic-gate * default setting, or NULL to apply default
983*0Sstevel@tonic-gate * setting to all disk sets
984*0Sstevel@tonic-gate *
985*0Sstevel@tonic-gate * @param val
986*0Sstevel@tonic-gate * the value to set as the default HSP creation flag for
987*0Sstevel@tonic-gate * concatenated volumes
988*0Sstevel@tonic-gate *
989*0Sstevel@tonic-gate * @return 0
990*0Sstevel@tonic-gate * if successful
991*0Sstevel@tonic-gate *
992*0Sstevel@tonic-gate * @return non-zero
993*0Sstevel@tonic-gate * if an error occurred. Use get_error_string() to
994*0Sstevel@tonic-gate * retrieve the associated error message.
995*0Sstevel@tonic-gate */
996*0Sstevel@tonic-gate int
defaults_set_concat_usehsp(defaults_t * defaults,char * diskset,boolean_t val)997*0Sstevel@tonic-gate defaults_set_concat_usehsp(
998*0Sstevel@tonic-gate defaults_t *defaults,
999*0Sstevel@tonic-gate char *diskset,
1000*0Sstevel@tonic-gate boolean_t val)
1001*0Sstevel@tonic-gate {
1002*0Sstevel@tonic-gate devconfig_t *concat = NULL;
1003*0Sstevel@tonic-gate int error = 0;
1004*0Sstevel@tonic-gate
1005*0Sstevel@tonic-gate /* Get/create singleton concat element for this disk set */
1006*0Sstevel@tonic-gate if ((error = defaults_get_singleton_component(
1007*0Sstevel@tonic-gate defaults, diskset, TYPE_CONCAT, &concat, TRUE)) != 0) {
1008*0Sstevel@tonic-gate /* volume_set_error already called */
1009*0Sstevel@tonic-gate return (error);
1010*0Sstevel@tonic-gate }
1011*0Sstevel@tonic-gate
1012*0Sstevel@tonic-gate /* Set the usehsp attribute */
1013*0Sstevel@tonic-gate return (devconfig_set_volume_usehsp(concat, val));
1014*0Sstevel@tonic-gate }
1015*0Sstevel@tonic-gate
1016*0Sstevel@tonic-gate /*
1017*0Sstevel@tonic-gate * Get the default HSP creation flag for concatenated volumes
1018*0Sstevel@tonic-gate *
1019*0Sstevel@tonic-gate * @param defaults
1020*0Sstevel@tonic-gate * a defaults_t hierarchy representing default settings
1021*0Sstevel@tonic-gate * for all disk sets and specific disk sets
1022*0Sstevel@tonic-gate *
1023*0Sstevel@tonic-gate * @param diskset
1024*0Sstevel@tonic-gate * the name of the disk set to which to apply this
1025*0Sstevel@tonic-gate * default setting, or NULL to apply default
1026*0Sstevel@tonic-gate * setting to all disk sets
1027*0Sstevel@tonic-gate *
1028*0Sstevel@tonic-gate * @param val
1029*0Sstevel@tonic-gate * RETURN: the default HSP creation flag for concatenated
1030*0Sstevel@tonic-gate * volumes
1031*0Sstevel@tonic-gate *
1032*0Sstevel@tonic-gate * @return 0
1033*0Sstevel@tonic-gate * if successful
1034*0Sstevel@tonic-gate *
1035*0Sstevel@tonic-gate * @return non-zero
1036*0Sstevel@tonic-gate * if an error occurred. Use get_error_string() to
1037*0Sstevel@tonic-gate * retrieve the associated error message.
1038*0Sstevel@tonic-gate */
1039*0Sstevel@tonic-gate int
defaults_get_concat_usehsp(defaults_t * defaults,char * diskset,boolean_t * val)1040*0Sstevel@tonic-gate defaults_get_concat_usehsp(
1041*0Sstevel@tonic-gate defaults_t *defaults,
1042*0Sstevel@tonic-gate char *diskset,
1043*0Sstevel@tonic-gate boolean_t *val)
1044*0Sstevel@tonic-gate {
1045*0Sstevel@tonic-gate char *disksets[2];
1046*0Sstevel@tonic-gate devconfig_t *concat;
1047*0Sstevel@tonic-gate int error;
1048*0Sstevel@tonic-gate int i = 0;
1049*0Sstevel@tonic-gate
1050*0Sstevel@tonic-gate /* Check both the given and global (NULL) disk sets for the value */
1051*0Sstevel@tonic-gate disksets[0] = diskset;
1052*0Sstevel@tonic-gate disksets[1] = NULL;
1053*0Sstevel@tonic-gate do {
1054*0Sstevel@tonic-gate /* Get/create singleton concat element for this disk set */
1055*0Sstevel@tonic-gate error = defaults_get_singleton_component(
1056*0Sstevel@tonic-gate defaults, disksets[i], TYPE_CONCAT, &concat, FALSE);
1057*0Sstevel@tonic-gate
1058*0Sstevel@tonic-gate switch (error) {
1059*0Sstevel@tonic-gate /* concat found for this disk set */
1060*0Sstevel@tonic-gate case 0:
1061*0Sstevel@tonic-gate /* Get the usehsp attribute */
1062*0Sstevel@tonic-gate if ((error = devconfig_get_volume_usehsp(
1063*0Sstevel@tonic-gate concat, val)) == 0) {
1064*0Sstevel@tonic-gate /* usehsp attribute found */
1065*0Sstevel@tonic-gate return (0);
1066*0Sstevel@tonic-gate }
1067*0Sstevel@tonic-gate
1068*0Sstevel@tonic-gate /* FALLTHROUGH */
1069*0Sstevel@tonic-gate
1070*0Sstevel@tonic-gate /* concat not found for this disk set */
1071*0Sstevel@tonic-gate case ENOENT:
1072*0Sstevel@tonic-gate break;
1073*0Sstevel@tonic-gate
1074*0Sstevel@tonic-gate /* Invalid disk set, or concat couldn't be created */
1075*0Sstevel@tonic-gate default:
1076*0Sstevel@tonic-gate /* volume_set_error already called */
1077*0Sstevel@tonic-gate return (error);
1078*0Sstevel@tonic-gate }
1079*0Sstevel@tonic-gate
1080*0Sstevel@tonic-gate /* Stop after the global (NULL) disk set has been searched */
1081*0Sstevel@tonic-gate } while (disksets[i++] != NULL);
1082*0Sstevel@tonic-gate
1083*0Sstevel@tonic-gate return (ENOENT);
1084*0Sstevel@tonic-gate }
1085*0Sstevel@tonic-gate
1086*0Sstevel@tonic-gate /*
1087*0Sstevel@tonic-gate * Set the default minimum number of components for striped volumes
1088*0Sstevel@tonic-gate *
1089*0Sstevel@tonic-gate * @param defaults
1090*0Sstevel@tonic-gate * a defaults_t hierarchy representing default settings
1091*0Sstevel@tonic-gate * for all disk sets and specific disk sets
1092*0Sstevel@tonic-gate *
1093*0Sstevel@tonic-gate * @param diskset
1094*0Sstevel@tonic-gate * the name of the disk set to which to apply this
1095*0Sstevel@tonic-gate * default setting, or NULL to apply default
1096*0Sstevel@tonic-gate * setting to all disk sets
1097*0Sstevel@tonic-gate *
1098*0Sstevel@tonic-gate * @param val
1099*0Sstevel@tonic-gate * the value to set as the default minimum number of
1100*0Sstevel@tonic-gate * components for striped volumes
1101*0Sstevel@tonic-gate *
1102*0Sstevel@tonic-gate * @return 0
1103*0Sstevel@tonic-gate * if successful
1104*0Sstevel@tonic-gate *
1105*0Sstevel@tonic-gate * @return non-zero
1106*0Sstevel@tonic-gate * if an error occurred. Use get_error_string() to
1107*0Sstevel@tonic-gate * retrieve the associated error message.
1108*0Sstevel@tonic-gate */
1109*0Sstevel@tonic-gate int
defaults_set_stripe_mincomp(defaults_t * defaults,char * diskset,uint16_t val)1110*0Sstevel@tonic-gate defaults_set_stripe_mincomp(
1111*0Sstevel@tonic-gate defaults_t *defaults,
1112*0Sstevel@tonic-gate char *diskset,
1113*0Sstevel@tonic-gate uint16_t val)
1114*0Sstevel@tonic-gate {
1115*0Sstevel@tonic-gate devconfig_t *stripe = NULL;
1116*0Sstevel@tonic-gate int error = 0;
1117*0Sstevel@tonic-gate
1118*0Sstevel@tonic-gate /* Get/create singleton stripe element for this disk set */
1119*0Sstevel@tonic-gate if ((error = defaults_get_singleton_component(
1120*0Sstevel@tonic-gate defaults, diskset, TYPE_STRIPE, &stripe, TRUE)) != 0) {
1121*0Sstevel@tonic-gate /* volume_set_error already called */
1122*0Sstevel@tonic-gate return (error);
1123*0Sstevel@tonic-gate }
1124*0Sstevel@tonic-gate
1125*0Sstevel@tonic-gate /* Set the mincomp attribute */
1126*0Sstevel@tonic-gate return (devconfig_set_stripe_mincomp(stripe, val));
1127*0Sstevel@tonic-gate }
1128*0Sstevel@tonic-gate
1129*0Sstevel@tonic-gate /*
1130*0Sstevel@tonic-gate * Get the default minimum number of components for striped volumes
1131*0Sstevel@tonic-gate *
1132*0Sstevel@tonic-gate * @param defaults
1133*0Sstevel@tonic-gate * a defaults_t hierarchy representing default settings
1134*0Sstevel@tonic-gate * for all disk sets and specific disk sets
1135*0Sstevel@tonic-gate *
1136*0Sstevel@tonic-gate * @param diskset
1137*0Sstevel@tonic-gate * the name of the disk set to which to apply this
1138*0Sstevel@tonic-gate * default setting, or NULL to apply default
1139*0Sstevel@tonic-gate * setting to all disk sets
1140*0Sstevel@tonic-gate *
1141*0Sstevel@tonic-gate * @param val
1142*0Sstevel@tonic-gate * RETURN: the default minimum number of components for
1143*0Sstevel@tonic-gate * striped volumes
1144*0Sstevel@tonic-gate *
1145*0Sstevel@tonic-gate * @return 0
1146*0Sstevel@tonic-gate * if successful
1147*0Sstevel@tonic-gate *
1148*0Sstevel@tonic-gate * @return non-zero
1149*0Sstevel@tonic-gate * if an error occurred. Use get_error_string() to
1150*0Sstevel@tonic-gate * retrieve the associated error message.
1151*0Sstevel@tonic-gate */
1152*0Sstevel@tonic-gate int
defaults_get_stripe_mincomp(defaults_t * defaults,char * diskset,uint16_t * val)1153*0Sstevel@tonic-gate defaults_get_stripe_mincomp(
1154*0Sstevel@tonic-gate defaults_t *defaults,
1155*0Sstevel@tonic-gate char *diskset,
1156*0Sstevel@tonic-gate uint16_t *val)
1157*0Sstevel@tonic-gate {
1158*0Sstevel@tonic-gate char *disksets[2];
1159*0Sstevel@tonic-gate devconfig_t *stripe;
1160*0Sstevel@tonic-gate int error;
1161*0Sstevel@tonic-gate int i = 0;
1162*0Sstevel@tonic-gate
1163*0Sstevel@tonic-gate /* Check both the given and global (NULL) disk sets for the value */
1164*0Sstevel@tonic-gate disksets[0] = diskset;
1165*0Sstevel@tonic-gate disksets[1] = NULL;
1166*0Sstevel@tonic-gate do {
1167*0Sstevel@tonic-gate /* Get/create singleton stripe element for this disk set */
1168*0Sstevel@tonic-gate error = defaults_get_singleton_component(
1169*0Sstevel@tonic-gate defaults, disksets[i], TYPE_STRIPE, &stripe, FALSE);
1170*0Sstevel@tonic-gate
1171*0Sstevel@tonic-gate switch (error) {
1172*0Sstevel@tonic-gate /* stripe found for this disk set */
1173*0Sstevel@tonic-gate case 0:
1174*0Sstevel@tonic-gate /* Get the mincomp attribute */
1175*0Sstevel@tonic-gate if ((error = devconfig_get_stripe_mincomp(
1176*0Sstevel@tonic-gate stripe, val)) == 0) {
1177*0Sstevel@tonic-gate /* mincomp attribute found */
1178*0Sstevel@tonic-gate return (0);
1179*0Sstevel@tonic-gate }
1180*0Sstevel@tonic-gate
1181*0Sstevel@tonic-gate /* FALLTHROUGH */
1182*0Sstevel@tonic-gate
1183*0Sstevel@tonic-gate /* stripe not found for this disk set */
1184*0Sstevel@tonic-gate case ENOENT:
1185*0Sstevel@tonic-gate break;
1186*0Sstevel@tonic-gate
1187*0Sstevel@tonic-gate /* Invalid disk set, or stripe couldn't be created */
1188*0Sstevel@tonic-gate default:
1189*0Sstevel@tonic-gate /* volume_set_error already called */
1190*0Sstevel@tonic-gate return (error);
1191*0Sstevel@tonic-gate }
1192*0Sstevel@tonic-gate
1193*0Sstevel@tonic-gate /* Stop after the global (NULL) disk set has been searched */
1194*0Sstevel@tonic-gate } while (disksets[i++] != NULL);
1195*0Sstevel@tonic-gate
1196*0Sstevel@tonic-gate return (ENOENT);
1197*0Sstevel@tonic-gate }
1198*0Sstevel@tonic-gate
1199*0Sstevel@tonic-gate /*
1200*0Sstevel@tonic-gate * Set the default maximum number of components for striped volumes
1201*0Sstevel@tonic-gate *
1202*0Sstevel@tonic-gate * @param defaults
1203*0Sstevel@tonic-gate * a defaults_t hierarchy representing default settings
1204*0Sstevel@tonic-gate * for all disk sets and specific disk sets
1205*0Sstevel@tonic-gate *
1206*0Sstevel@tonic-gate * @param diskset
1207*0Sstevel@tonic-gate * the name of the disk set to which to apply this
1208*0Sstevel@tonic-gate * default setting, or NULL to apply default
1209*0Sstevel@tonic-gate * setting to all disk sets
1210*0Sstevel@tonic-gate *
1211*0Sstevel@tonic-gate * @param val
1212*0Sstevel@tonic-gate * the value to set as the default maximum number of
1213*0Sstevel@tonic-gate * components for striped volumes
1214*0Sstevel@tonic-gate *
1215*0Sstevel@tonic-gate * @return 0
1216*0Sstevel@tonic-gate * if successful
1217*0Sstevel@tonic-gate *
1218*0Sstevel@tonic-gate * @return non-zero
1219*0Sstevel@tonic-gate * if an error occurred. Use get_error_string() to
1220*0Sstevel@tonic-gate * retrieve the associated error message.
1221*0Sstevel@tonic-gate */
1222*0Sstevel@tonic-gate int
defaults_set_stripe_maxcomp(defaults_t * defaults,char * diskset,uint16_t val)1223*0Sstevel@tonic-gate defaults_set_stripe_maxcomp(
1224*0Sstevel@tonic-gate defaults_t *defaults,
1225*0Sstevel@tonic-gate char *diskset,
1226*0Sstevel@tonic-gate uint16_t val)
1227*0Sstevel@tonic-gate {
1228*0Sstevel@tonic-gate devconfig_t *stripe = NULL;
1229*0Sstevel@tonic-gate int error = 0;
1230*0Sstevel@tonic-gate
1231*0Sstevel@tonic-gate /* Get/create singleton stripe element for this disk set */
1232*0Sstevel@tonic-gate if ((error = defaults_get_singleton_component(
1233*0Sstevel@tonic-gate defaults, diskset, TYPE_STRIPE, &stripe, TRUE)) != 0) {
1234*0Sstevel@tonic-gate /* volume_set_error already called */
1235*0Sstevel@tonic-gate return (error);
1236*0Sstevel@tonic-gate }
1237*0Sstevel@tonic-gate
1238*0Sstevel@tonic-gate /* Set the maxcomp attribute */
1239*0Sstevel@tonic-gate return (devconfig_set_stripe_maxcomp(stripe, val));
1240*0Sstevel@tonic-gate }
1241*0Sstevel@tonic-gate
1242*0Sstevel@tonic-gate /*
1243*0Sstevel@tonic-gate * Get the default maximum number of components for striped volumes
1244*0Sstevel@tonic-gate *
1245*0Sstevel@tonic-gate * @param defaults
1246*0Sstevel@tonic-gate * a defaults_t hierarchy representing default settings
1247*0Sstevel@tonic-gate * for all disk sets and specific disk sets
1248*0Sstevel@tonic-gate *
1249*0Sstevel@tonic-gate * @param diskset
1250*0Sstevel@tonic-gate * the name of the disk set to which to apply this
1251*0Sstevel@tonic-gate * default setting, or NULL to apply default
1252*0Sstevel@tonic-gate * setting to all disk sets
1253*0Sstevel@tonic-gate *
1254*0Sstevel@tonic-gate * @param val
1255*0Sstevel@tonic-gate * RETURN: the default maximum number of components for
1256*0Sstevel@tonic-gate * striped volumes
1257*0Sstevel@tonic-gate *
1258*0Sstevel@tonic-gate * @return 0
1259*0Sstevel@tonic-gate * if successful
1260*0Sstevel@tonic-gate *
1261*0Sstevel@tonic-gate * @return non-zero
1262*0Sstevel@tonic-gate * if an error occurred. Use get_error_string() to
1263*0Sstevel@tonic-gate * retrieve the associated error message.
1264*0Sstevel@tonic-gate */
1265*0Sstevel@tonic-gate int
defaults_get_stripe_maxcomp(defaults_t * defaults,char * diskset,uint16_t * val)1266*0Sstevel@tonic-gate defaults_get_stripe_maxcomp(
1267*0Sstevel@tonic-gate defaults_t *defaults,
1268*0Sstevel@tonic-gate char *diskset,
1269*0Sstevel@tonic-gate uint16_t *val)
1270*0Sstevel@tonic-gate {
1271*0Sstevel@tonic-gate char *disksets[2];
1272*0Sstevel@tonic-gate devconfig_t *stripe;
1273*0Sstevel@tonic-gate int error;
1274*0Sstevel@tonic-gate int i = 0;
1275*0Sstevel@tonic-gate
1276*0Sstevel@tonic-gate /* Check both the given and global (NULL) disk sets for the value */
1277*0Sstevel@tonic-gate disksets[0] = diskset;
1278*0Sstevel@tonic-gate disksets[1] = NULL;
1279*0Sstevel@tonic-gate do {
1280*0Sstevel@tonic-gate /* Get/create singleton stripe element for this disk set */
1281*0Sstevel@tonic-gate error = defaults_get_singleton_component(
1282*0Sstevel@tonic-gate defaults, disksets[i], TYPE_STRIPE, &stripe, FALSE);
1283*0Sstevel@tonic-gate
1284*0Sstevel@tonic-gate switch (error) {
1285*0Sstevel@tonic-gate /* stripe found for this disk set */
1286*0Sstevel@tonic-gate case 0:
1287*0Sstevel@tonic-gate /* Get the maxcomp attribute */
1288*0Sstevel@tonic-gate if ((error = devconfig_get_stripe_maxcomp(
1289*0Sstevel@tonic-gate stripe, val)) == 0) {
1290*0Sstevel@tonic-gate /* maxcomp attribute found */
1291*0Sstevel@tonic-gate return (0);
1292*0Sstevel@tonic-gate }
1293*0Sstevel@tonic-gate
1294*0Sstevel@tonic-gate /* FALLTHROUGH */
1295*0Sstevel@tonic-gate
1296*0Sstevel@tonic-gate /* stripe not found for this disk set */
1297*0Sstevel@tonic-gate case ENOENT:
1298*0Sstevel@tonic-gate break;
1299*0Sstevel@tonic-gate
1300*0Sstevel@tonic-gate /* Invalid disk set, or stripe couldn't be created */
1301*0Sstevel@tonic-gate default:
1302*0Sstevel@tonic-gate /* volume_set_error already called */
1303*0Sstevel@tonic-gate return (error);
1304*0Sstevel@tonic-gate }
1305*0Sstevel@tonic-gate
1306*0Sstevel@tonic-gate /* Stop after the global (NULL) disk set has been searched */
1307*0Sstevel@tonic-gate } while (disksets[i++] != NULL);
1308*0Sstevel@tonic-gate
1309*0Sstevel@tonic-gate return (ENOENT);
1310*0Sstevel@tonic-gate }
1311*0Sstevel@tonic-gate
1312*0Sstevel@tonic-gate /*
1313*0Sstevel@tonic-gate * Set the default interlace for striped volumes
1314*0Sstevel@tonic-gate *
1315*0Sstevel@tonic-gate * @param defaults
1316*0Sstevel@tonic-gate * a defaults_t hierarchy representing default settings
1317*0Sstevel@tonic-gate * for all disk sets and specific disk sets
1318*0Sstevel@tonic-gate *
1319*0Sstevel@tonic-gate * @param diskset
1320*0Sstevel@tonic-gate * the name of the disk set to which to apply this
1321*0Sstevel@tonic-gate * default setting, or NULL to apply default
1322*0Sstevel@tonic-gate * setting to all disk sets
1323*0Sstevel@tonic-gate *
1324*0Sstevel@tonic-gate * @param val
1325*0Sstevel@tonic-gate * the value to set as the default interlace for striped
1326*0Sstevel@tonic-gate * volumes
1327*0Sstevel@tonic-gate *
1328*0Sstevel@tonic-gate * @return 0
1329*0Sstevel@tonic-gate * if successful
1330*0Sstevel@tonic-gate *
1331*0Sstevel@tonic-gate * @return non-zero
1332*0Sstevel@tonic-gate * if an error occurred. Use get_error_string() to
1333*0Sstevel@tonic-gate * retrieve the associated error message.
1334*0Sstevel@tonic-gate */
1335*0Sstevel@tonic-gate int
defaults_set_stripe_interlace(defaults_t * defaults,char * diskset,uint64_t val)1336*0Sstevel@tonic-gate defaults_set_stripe_interlace(
1337*0Sstevel@tonic-gate defaults_t *defaults,
1338*0Sstevel@tonic-gate char *diskset,
1339*0Sstevel@tonic-gate uint64_t val)
1340*0Sstevel@tonic-gate {
1341*0Sstevel@tonic-gate devconfig_t *stripe = NULL;
1342*0Sstevel@tonic-gate int error = 0;
1343*0Sstevel@tonic-gate
1344*0Sstevel@tonic-gate /* Get/create singleton stripe element for this disk set */
1345*0Sstevel@tonic-gate if ((error = defaults_get_singleton_component(
1346*0Sstevel@tonic-gate defaults, diskset, TYPE_STRIPE, &stripe, TRUE)) != 0) {
1347*0Sstevel@tonic-gate /* volume_set_error already called */
1348*0Sstevel@tonic-gate return (error);
1349*0Sstevel@tonic-gate }
1350*0Sstevel@tonic-gate
1351*0Sstevel@tonic-gate /* Set the interlace attribute */
1352*0Sstevel@tonic-gate return (devconfig_set_stripe_interlace(stripe, val));
1353*0Sstevel@tonic-gate }
1354*0Sstevel@tonic-gate
1355*0Sstevel@tonic-gate /*
1356*0Sstevel@tonic-gate * Get the default interlace for striped volumes
1357*0Sstevel@tonic-gate *
1358*0Sstevel@tonic-gate * @param defaults
1359*0Sstevel@tonic-gate * a defaults_t hierarchy representing default settings
1360*0Sstevel@tonic-gate * for all disk sets and specific disk sets
1361*0Sstevel@tonic-gate *
1362*0Sstevel@tonic-gate * @param diskset
1363*0Sstevel@tonic-gate * the name of the disk set to which to apply this
1364*0Sstevel@tonic-gate * default setting, or NULL to apply default
1365*0Sstevel@tonic-gate * setting to all disk sets
1366*0Sstevel@tonic-gate *
1367*0Sstevel@tonic-gate * @param val
1368*0Sstevel@tonic-gate * RETURN: the default interlace for striped volumes
1369*0Sstevel@tonic-gate *
1370*0Sstevel@tonic-gate * @return 0
1371*0Sstevel@tonic-gate * if successful
1372*0Sstevel@tonic-gate *
1373*0Sstevel@tonic-gate * @return non-zero
1374*0Sstevel@tonic-gate * if an error occurred. Use get_error_string() to
1375*0Sstevel@tonic-gate * retrieve the associated error message.
1376*0Sstevel@tonic-gate */
1377*0Sstevel@tonic-gate int
defaults_get_stripe_interlace(defaults_t * defaults,char * diskset,uint64_t * val)1378*0Sstevel@tonic-gate defaults_get_stripe_interlace(
1379*0Sstevel@tonic-gate defaults_t *defaults,
1380*0Sstevel@tonic-gate char *diskset,
1381*0Sstevel@tonic-gate uint64_t *val)
1382*0Sstevel@tonic-gate {
1383*0Sstevel@tonic-gate char *disksets[2];
1384*0Sstevel@tonic-gate devconfig_t *stripe;
1385*0Sstevel@tonic-gate int error;
1386*0Sstevel@tonic-gate int i = 0;
1387*0Sstevel@tonic-gate
1388*0Sstevel@tonic-gate /* Check both the given and global (NULL) disk sets for the value */
1389*0Sstevel@tonic-gate disksets[0] = diskset;
1390*0Sstevel@tonic-gate disksets[1] = NULL;
1391*0Sstevel@tonic-gate do {
1392*0Sstevel@tonic-gate /* Get/create singleton stripe element for this disk set */
1393*0Sstevel@tonic-gate error = defaults_get_singleton_component(
1394*0Sstevel@tonic-gate defaults, disksets[i], TYPE_STRIPE, &stripe, FALSE);
1395*0Sstevel@tonic-gate
1396*0Sstevel@tonic-gate switch (error) {
1397*0Sstevel@tonic-gate /* stripe found for this disk set */
1398*0Sstevel@tonic-gate case 0:
1399*0Sstevel@tonic-gate /* Get the interlace attribute */
1400*0Sstevel@tonic-gate if ((error = devconfig_get_stripe_interlace(
1401*0Sstevel@tonic-gate stripe, val)) == 0) {
1402*0Sstevel@tonic-gate /* interlace attribute found */
1403*0Sstevel@tonic-gate return (0);
1404*0Sstevel@tonic-gate }
1405*0Sstevel@tonic-gate
1406*0Sstevel@tonic-gate /* FALLTHROUGH */
1407*0Sstevel@tonic-gate
1408*0Sstevel@tonic-gate /* stripe not found for this disk set */
1409*0Sstevel@tonic-gate case ENOENT:
1410*0Sstevel@tonic-gate break;
1411*0Sstevel@tonic-gate
1412*0Sstevel@tonic-gate /* Invalid disk set, or stripe couldn't be created */
1413*0Sstevel@tonic-gate default:
1414*0Sstevel@tonic-gate /* volume_set_error already called */
1415*0Sstevel@tonic-gate return (error);
1416*0Sstevel@tonic-gate }
1417*0Sstevel@tonic-gate
1418*0Sstevel@tonic-gate /* Stop after the global (NULL) disk set has been searched */
1419*0Sstevel@tonic-gate } while (disksets[i++] != NULL);
1420*0Sstevel@tonic-gate
1421*0Sstevel@tonic-gate return (ENOENT);
1422*0Sstevel@tonic-gate }
1423*0Sstevel@tonic-gate
1424*0Sstevel@tonic-gate /*
1425*0Sstevel@tonic-gate * Set the default HSP creation flag for striped volumes
1426*0Sstevel@tonic-gate *
1427*0Sstevel@tonic-gate * @param defaults
1428*0Sstevel@tonic-gate * a defaults_t hierarchy representing default settings
1429*0Sstevel@tonic-gate * for all disk sets and specific disk sets
1430*0Sstevel@tonic-gate *
1431*0Sstevel@tonic-gate * @param diskset
1432*0Sstevel@tonic-gate * the name of the disk set to which to apply this
1433*0Sstevel@tonic-gate * default setting, or NULL to apply default
1434*0Sstevel@tonic-gate * setting to all disk sets
1435*0Sstevel@tonic-gate *
1436*0Sstevel@tonic-gate * @param val
1437*0Sstevel@tonic-gate * the value to set as the default HSP creation flag for
1438*0Sstevel@tonic-gate * striped volumes
1439*0Sstevel@tonic-gate *
1440*0Sstevel@tonic-gate * @return 0
1441*0Sstevel@tonic-gate * if successful
1442*0Sstevel@tonic-gate *
1443*0Sstevel@tonic-gate * @return non-zero
1444*0Sstevel@tonic-gate * if an error occurred. Use get_error_string() to
1445*0Sstevel@tonic-gate * retrieve the associated error message.
1446*0Sstevel@tonic-gate */
1447*0Sstevel@tonic-gate int
defaults_set_stripe_usehsp(defaults_t * defaults,char * diskset,boolean_t val)1448*0Sstevel@tonic-gate defaults_set_stripe_usehsp(
1449*0Sstevel@tonic-gate defaults_t *defaults,
1450*0Sstevel@tonic-gate char *diskset,
1451*0Sstevel@tonic-gate boolean_t val)
1452*0Sstevel@tonic-gate {
1453*0Sstevel@tonic-gate devconfig_t *stripe = NULL;
1454*0Sstevel@tonic-gate int error = 0;
1455*0Sstevel@tonic-gate
1456*0Sstevel@tonic-gate /* Get/create singleton stripe element for this disk set */
1457*0Sstevel@tonic-gate if ((error = defaults_get_singleton_component(
1458*0Sstevel@tonic-gate defaults, diskset, TYPE_STRIPE, &stripe, TRUE)) != 0) {
1459*0Sstevel@tonic-gate /* volume_set_error already called */
1460*0Sstevel@tonic-gate return (error);
1461*0Sstevel@tonic-gate }
1462*0Sstevel@tonic-gate
1463*0Sstevel@tonic-gate /* Set the usehsp attribute */
1464*0Sstevel@tonic-gate return (devconfig_set_volume_usehsp(stripe, val));
1465*0Sstevel@tonic-gate }
1466*0Sstevel@tonic-gate
1467*0Sstevel@tonic-gate /*
1468*0Sstevel@tonic-gate * Get the default HSP creation flag for striped volumes
1469*0Sstevel@tonic-gate *
1470*0Sstevel@tonic-gate * @param defaults
1471*0Sstevel@tonic-gate * a defaults_t hierarchy representing default settings
1472*0Sstevel@tonic-gate * for all disk sets and specific disk sets
1473*0Sstevel@tonic-gate *
1474*0Sstevel@tonic-gate * @param diskset
1475*0Sstevel@tonic-gate * the name of the disk set to which to apply this
1476*0Sstevel@tonic-gate * default setting, or NULL to apply default
1477*0Sstevel@tonic-gate * setting to all disk sets
1478*0Sstevel@tonic-gate *
1479*0Sstevel@tonic-gate * @param val
1480*0Sstevel@tonic-gate * RETURN: the default HSP creation flag for striped
1481*0Sstevel@tonic-gate * volumes
1482*0Sstevel@tonic-gate *
1483*0Sstevel@tonic-gate * @return 0
1484*0Sstevel@tonic-gate * if successful
1485*0Sstevel@tonic-gate *
1486*0Sstevel@tonic-gate * @return non-zero
1487*0Sstevel@tonic-gate * if an error occurred. Use get_error_string() to
1488*0Sstevel@tonic-gate * retrieve the associated error message.
1489*0Sstevel@tonic-gate */
1490*0Sstevel@tonic-gate int
defaults_get_stripe_usehsp(defaults_t * defaults,char * diskset,boolean_t * val)1491*0Sstevel@tonic-gate defaults_get_stripe_usehsp(
1492*0Sstevel@tonic-gate defaults_t *defaults,
1493*0Sstevel@tonic-gate char *diskset,
1494*0Sstevel@tonic-gate boolean_t *val)
1495*0Sstevel@tonic-gate {
1496*0Sstevel@tonic-gate char *disksets[2];
1497*0Sstevel@tonic-gate devconfig_t *stripe;
1498*0Sstevel@tonic-gate int error;
1499*0Sstevel@tonic-gate int i = 0;
1500*0Sstevel@tonic-gate
1501*0Sstevel@tonic-gate /* Check both the given and global (NULL) disk sets for the value */
1502*0Sstevel@tonic-gate disksets[0] = diskset;
1503*0Sstevel@tonic-gate disksets[1] = NULL;
1504*0Sstevel@tonic-gate do {
1505*0Sstevel@tonic-gate /* Get/create singleton stripe element for this disk set */
1506*0Sstevel@tonic-gate error = defaults_get_singleton_component(
1507*0Sstevel@tonic-gate defaults, disksets[i], TYPE_STRIPE, &stripe, FALSE);
1508*0Sstevel@tonic-gate
1509*0Sstevel@tonic-gate switch (error) {
1510*0Sstevel@tonic-gate /* stripe found for this disk set */
1511*0Sstevel@tonic-gate case 0:
1512*0Sstevel@tonic-gate /* Get the usehsp attribute */
1513*0Sstevel@tonic-gate if ((error = devconfig_get_volume_usehsp(
1514*0Sstevel@tonic-gate stripe, val)) == 0) {
1515*0Sstevel@tonic-gate /* usehsp attribute found */
1516*0Sstevel@tonic-gate return (0);
1517*0Sstevel@tonic-gate }
1518*0Sstevel@tonic-gate
1519*0Sstevel@tonic-gate /* FALLTHROUGH */
1520*0Sstevel@tonic-gate
1521*0Sstevel@tonic-gate /* stripe not found for this disk set */
1522*0Sstevel@tonic-gate case ENOENT:
1523*0Sstevel@tonic-gate break;
1524*0Sstevel@tonic-gate
1525*0Sstevel@tonic-gate /* Invalid disk set, or stripe couldn't be created */
1526*0Sstevel@tonic-gate default:
1527*0Sstevel@tonic-gate /* volume_set_error already called */
1528*0Sstevel@tonic-gate return (error);
1529*0Sstevel@tonic-gate }
1530*0Sstevel@tonic-gate
1531*0Sstevel@tonic-gate /* Stop after the global (NULL) disk set has been searched */
1532*0Sstevel@tonic-gate } while (disksets[i++] != NULL);
1533*0Sstevel@tonic-gate
1534*0Sstevel@tonic-gate return (ENOENT);
1535*0Sstevel@tonic-gate }
1536*0Sstevel@tonic-gate
1537*0Sstevel@tonic-gate /*
1538*0Sstevel@tonic-gate * Set the default redundancy level for generic volumes.
1539*0Sstevel@tonic-gate *
1540*0Sstevel@tonic-gate * @param defaults
1541*0Sstevel@tonic-gate * a defaults_t hierarchy representing default settings
1542*0Sstevel@tonic-gate * for all disk sets and specific disk sets
1543*0Sstevel@tonic-gate *
1544*0Sstevel@tonic-gate * @param diskset
1545*0Sstevel@tonic-gate * the name of the disk set to which to apply this
1546*0Sstevel@tonic-gate * default setting, or NULL to apply default
1547*0Sstevel@tonic-gate * setting to all disk sets
1548*0Sstevel@tonic-gate *
1549*0Sstevel@tonic-gate * @param val
1550*0Sstevel@tonic-gate * If 0, a stripe will be created by default. If > 0, a
1551*0Sstevel@tonic-gate * mirror with this number of submirrors will be created
1552*0Sstevel@tonic-gate * by default.
1553*0Sstevel@tonic-gate *
1554*0Sstevel@tonic-gate * @return 0
1555*0Sstevel@tonic-gate * if successful
1556*0Sstevel@tonic-gate *
1557*0Sstevel@tonic-gate * @return non-zero
1558*0Sstevel@tonic-gate * if an error occurred. Use get_error_string() to
1559*0Sstevel@tonic-gate * retrieve the associated error message.
1560*0Sstevel@tonic-gate */
1561*0Sstevel@tonic-gate int
defaults_set_volume_redundancy_level(defaults_t * defaults,char * diskset,uint16_t val)1562*0Sstevel@tonic-gate defaults_set_volume_redundancy_level(
1563*0Sstevel@tonic-gate defaults_t *defaults,
1564*0Sstevel@tonic-gate char *diskset,
1565*0Sstevel@tonic-gate uint16_t val)
1566*0Sstevel@tonic-gate {
1567*0Sstevel@tonic-gate devconfig_t *volume = NULL;
1568*0Sstevel@tonic-gate int error = 0;
1569*0Sstevel@tonic-gate
1570*0Sstevel@tonic-gate /* Get/create singleton volume element for this disk set */
1571*0Sstevel@tonic-gate if ((error = defaults_get_singleton_component(
1572*0Sstevel@tonic-gate defaults, diskset, TYPE_VOLUME, &volume, TRUE)) != 0) {
1573*0Sstevel@tonic-gate /* volume_set_error already called */
1574*0Sstevel@tonic-gate return (error);
1575*0Sstevel@tonic-gate }
1576*0Sstevel@tonic-gate
1577*0Sstevel@tonic-gate /* Set the redundancy level */
1578*0Sstevel@tonic-gate return (devconfig_set_volume_redundancy_level(volume, val));
1579*0Sstevel@tonic-gate }
1580*0Sstevel@tonic-gate
1581*0Sstevel@tonic-gate /*
1582*0Sstevel@tonic-gate * Get the default redundancy level for generic volumes.
1583*0Sstevel@tonic-gate *
1584*0Sstevel@tonic-gate * @param defaults
1585*0Sstevel@tonic-gate * a defaults_t hierarchy representing default settings
1586*0Sstevel@tonic-gate * for all disk sets and specific disk sets
1587*0Sstevel@tonic-gate *
1588*0Sstevel@tonic-gate * @param diskset
1589*0Sstevel@tonic-gate * the name of the disk set to which to apply this
1590*0Sstevel@tonic-gate * default setting, or NULL to apply default
1591*0Sstevel@tonic-gate * setting to all disk sets
1592*0Sstevel@tonic-gate *
1593*0Sstevel@tonic-gate * @param val
1594*0Sstevel@tonic-gate * RETURN: the default redundancy level for generic
1595*0Sstevel@tonic-gate * volumes
1596*0Sstevel@tonic-gate *
1597*0Sstevel@tonic-gate * @return 0
1598*0Sstevel@tonic-gate * if successful
1599*0Sstevel@tonic-gate *
1600*0Sstevel@tonic-gate * @return non-zero
1601*0Sstevel@tonic-gate * if an error occurred. Use get_error_string() to
1602*0Sstevel@tonic-gate * retrieve the associated error message.
1603*0Sstevel@tonic-gate */
1604*0Sstevel@tonic-gate int
defaults_get_volume_redundancy_level(defaults_t * defaults,char * diskset,uint16_t * val)1605*0Sstevel@tonic-gate defaults_get_volume_redundancy_level(
1606*0Sstevel@tonic-gate defaults_t *defaults,
1607*0Sstevel@tonic-gate char *diskset,
1608*0Sstevel@tonic-gate uint16_t *val)
1609*0Sstevel@tonic-gate {
1610*0Sstevel@tonic-gate char *disksets[2];
1611*0Sstevel@tonic-gate devconfig_t *volume;
1612*0Sstevel@tonic-gate int error;
1613*0Sstevel@tonic-gate int i = 0;
1614*0Sstevel@tonic-gate
1615*0Sstevel@tonic-gate /* Check both the given and global (NULL) disk sets for the value */
1616*0Sstevel@tonic-gate disksets[0] = diskset;
1617*0Sstevel@tonic-gate disksets[1] = NULL;
1618*0Sstevel@tonic-gate do {
1619*0Sstevel@tonic-gate /* Get/create singleton volume element for this disk set */
1620*0Sstevel@tonic-gate error = defaults_get_singleton_component(
1621*0Sstevel@tonic-gate defaults, disksets[i], TYPE_VOLUME, &volume, FALSE);
1622*0Sstevel@tonic-gate
1623*0Sstevel@tonic-gate switch (error) {
1624*0Sstevel@tonic-gate /* volume found for this disk set */
1625*0Sstevel@tonic-gate case 0:
1626*0Sstevel@tonic-gate /* Get the redundancy level */
1627*0Sstevel@tonic-gate if ((error = devconfig_get_volume_redundancy_level(
1628*0Sstevel@tonic-gate volume, val)) == 0) {
1629*0Sstevel@tonic-gate /* redundancy level found */
1630*0Sstevel@tonic-gate return (0);
1631*0Sstevel@tonic-gate }
1632*0Sstevel@tonic-gate
1633*0Sstevel@tonic-gate /* FALLTHROUGH */
1634*0Sstevel@tonic-gate
1635*0Sstevel@tonic-gate /* volume not found for this disk set */
1636*0Sstevel@tonic-gate case ENOENT:
1637*0Sstevel@tonic-gate break;
1638*0Sstevel@tonic-gate
1639*0Sstevel@tonic-gate /* Invalid disk set, or volume couldn't be created */
1640*0Sstevel@tonic-gate default:
1641*0Sstevel@tonic-gate /* volume_set_error already called */
1642*0Sstevel@tonic-gate return (error);
1643*0Sstevel@tonic-gate }
1644*0Sstevel@tonic-gate
1645*0Sstevel@tonic-gate /* Stop after the global (NULL) disk set has been searched */
1646*0Sstevel@tonic-gate } while (disksets[i++] != NULL);
1647*0Sstevel@tonic-gate
1648*0Sstevel@tonic-gate return (ENOENT);
1649*0Sstevel@tonic-gate }
1650*0Sstevel@tonic-gate
1651*0Sstevel@tonic-gate /*
1652*0Sstevel@tonic-gate * Set the default number of data paths for generic volume
1653*0Sstevel@tonic-gate *
1654*0Sstevel@tonic-gate * @param defaults
1655*0Sstevel@tonic-gate * a defaults_t hierarchy representing default settings
1656*0Sstevel@tonic-gate * for all disk sets and specific disk sets
1657*0Sstevel@tonic-gate *
1658*0Sstevel@tonic-gate * @param diskset
1659*0Sstevel@tonic-gate * the name of the disk set to which to apply this
1660*0Sstevel@tonic-gate * default setting, or NULL to apply default
1661*0Sstevel@tonic-gate * setting to all disk sets
1662*0Sstevel@tonic-gate *
1663*0Sstevel@tonic-gate * @param val
1664*0Sstevel@tonic-gate * the value to set as the default number of data paths
1665*0Sstevel@tonic-gate * for generic volume
1666*0Sstevel@tonic-gate *
1667*0Sstevel@tonic-gate * @return 0
1668*0Sstevel@tonic-gate * if successful
1669*0Sstevel@tonic-gate *
1670*0Sstevel@tonic-gate * @return non-zero
1671*0Sstevel@tonic-gate * if an error occurred. Use get_error_string() to
1672*0Sstevel@tonic-gate * retrieve the associated error message.
1673*0Sstevel@tonic-gate */
1674*0Sstevel@tonic-gate int
defaults_set_volume_npaths(defaults_t * defaults,char * diskset,uint16_t val)1675*0Sstevel@tonic-gate defaults_set_volume_npaths(
1676*0Sstevel@tonic-gate defaults_t *defaults,
1677*0Sstevel@tonic-gate char *diskset,
1678*0Sstevel@tonic-gate uint16_t val)
1679*0Sstevel@tonic-gate {
1680*0Sstevel@tonic-gate devconfig_t *volume = NULL;
1681*0Sstevel@tonic-gate int error = 0;
1682*0Sstevel@tonic-gate
1683*0Sstevel@tonic-gate /* Get/create singleton volume element for this disk set */
1684*0Sstevel@tonic-gate if ((error = defaults_get_singleton_component(
1685*0Sstevel@tonic-gate defaults, diskset, TYPE_VOLUME, &volume, TRUE)) != 0) {
1686*0Sstevel@tonic-gate /* volume_set_error already called */
1687*0Sstevel@tonic-gate return (error);
1688*0Sstevel@tonic-gate }
1689*0Sstevel@tonic-gate
1690*0Sstevel@tonic-gate /* Set the npaths attribute */
1691*0Sstevel@tonic-gate return (devconfig_set_volume_npaths(volume, val));
1692*0Sstevel@tonic-gate }
1693*0Sstevel@tonic-gate
1694*0Sstevel@tonic-gate /*
1695*0Sstevel@tonic-gate * Get the default number of data paths for generic volume
1696*0Sstevel@tonic-gate *
1697*0Sstevel@tonic-gate * @param defaults
1698*0Sstevel@tonic-gate * a defaults_t hierarchy representing default settings
1699*0Sstevel@tonic-gate * for all disk sets and specific disk sets
1700*0Sstevel@tonic-gate *
1701*0Sstevel@tonic-gate * @param diskset
1702*0Sstevel@tonic-gate * the name of the disk set to which to apply this
1703*0Sstevel@tonic-gate * default setting, or NULL to apply default
1704*0Sstevel@tonic-gate * setting to all disk sets
1705*0Sstevel@tonic-gate *
1706*0Sstevel@tonic-gate * @param val
1707*0Sstevel@tonic-gate * RETURN: the default number of data paths for generic
1708*0Sstevel@tonic-gate * volume
1709*0Sstevel@tonic-gate *
1710*0Sstevel@tonic-gate * @return 0
1711*0Sstevel@tonic-gate * if successful
1712*0Sstevel@tonic-gate *
1713*0Sstevel@tonic-gate * @return non-zero
1714*0Sstevel@tonic-gate * if an error occurred. Use get_error_string() to
1715*0Sstevel@tonic-gate * retrieve the associated error message.
1716*0Sstevel@tonic-gate */
1717*0Sstevel@tonic-gate int
defaults_get_volume_npaths(defaults_t * defaults,char * diskset,uint16_t * val)1718*0Sstevel@tonic-gate defaults_get_volume_npaths(
1719*0Sstevel@tonic-gate defaults_t *defaults,
1720*0Sstevel@tonic-gate char *diskset,
1721*0Sstevel@tonic-gate uint16_t *val)
1722*0Sstevel@tonic-gate {
1723*0Sstevel@tonic-gate char *disksets[2];
1724*0Sstevel@tonic-gate devconfig_t *volume;
1725*0Sstevel@tonic-gate int error;
1726*0Sstevel@tonic-gate int i = 0;
1727*0Sstevel@tonic-gate
1728*0Sstevel@tonic-gate /* Check both the given and global (NULL) disk sets for the value */
1729*0Sstevel@tonic-gate disksets[0] = diskset;
1730*0Sstevel@tonic-gate disksets[1] = NULL;
1731*0Sstevel@tonic-gate do {
1732*0Sstevel@tonic-gate /* Get/create singleton volume element for this disk set */
1733*0Sstevel@tonic-gate error = defaults_get_singleton_component(
1734*0Sstevel@tonic-gate defaults, disksets[i], TYPE_VOLUME, &volume, FALSE);
1735*0Sstevel@tonic-gate
1736*0Sstevel@tonic-gate switch (error) {
1737*0Sstevel@tonic-gate /* volume found for this disk set */
1738*0Sstevel@tonic-gate case 0:
1739*0Sstevel@tonic-gate /* Get the npaths attribute */
1740*0Sstevel@tonic-gate if ((error = devconfig_get_volume_npaths(
1741*0Sstevel@tonic-gate volume, val)) == 0) {
1742*0Sstevel@tonic-gate /* npaths attribute found */
1743*0Sstevel@tonic-gate return (0);
1744*0Sstevel@tonic-gate }
1745*0Sstevel@tonic-gate
1746*0Sstevel@tonic-gate /* FALLTHROUGH */
1747*0Sstevel@tonic-gate
1748*0Sstevel@tonic-gate /* volume not found for this disk set */
1749*0Sstevel@tonic-gate case ENOENT:
1750*0Sstevel@tonic-gate break;
1751*0Sstevel@tonic-gate
1752*0Sstevel@tonic-gate /* Invalid disk set, or volume couldn't be created */
1753*0Sstevel@tonic-gate default:
1754*0Sstevel@tonic-gate /* volume_set_error already called */
1755*0Sstevel@tonic-gate return (error);
1756*0Sstevel@tonic-gate }
1757*0Sstevel@tonic-gate
1758*0Sstevel@tonic-gate /* Stop after the global (NULL) disk set has been searched */
1759*0Sstevel@tonic-gate } while (disksets[i++] != NULL);
1760*0Sstevel@tonic-gate
1761*0Sstevel@tonic-gate return (ENOENT);
1762*0Sstevel@tonic-gate }
1763*0Sstevel@tonic-gate
1764*0Sstevel@tonic-gate /*
1765*0Sstevel@tonic-gate * Set the default HSP creation flag for generic volume
1766*0Sstevel@tonic-gate *
1767*0Sstevel@tonic-gate * @param defaults
1768*0Sstevel@tonic-gate * a defaults_t hierarchy representing default settings
1769*0Sstevel@tonic-gate * for all disk sets and specific disk sets
1770*0Sstevel@tonic-gate *
1771*0Sstevel@tonic-gate * @param diskset
1772*0Sstevel@tonic-gate * the name of the disk set to which to apply this
1773*0Sstevel@tonic-gate * default setting, or NULL to apply default
1774*0Sstevel@tonic-gate * setting to all disk sets
1775*0Sstevel@tonic-gate *
1776*0Sstevel@tonic-gate * @param val
1777*0Sstevel@tonic-gate * the value to set as the default HSP creation flag for
1778*0Sstevel@tonic-gate * generic volume
1779*0Sstevel@tonic-gate *
1780*0Sstevel@tonic-gate * @return 0
1781*0Sstevel@tonic-gate * if successful
1782*0Sstevel@tonic-gate *
1783*0Sstevel@tonic-gate * @return non-zero
1784*0Sstevel@tonic-gate * if an error occurred. Use get_error_string() to
1785*0Sstevel@tonic-gate * retrieve the associated error message.
1786*0Sstevel@tonic-gate */
1787*0Sstevel@tonic-gate int
defaults_set_volume_usehsp(defaults_t * defaults,char * diskset,boolean_t val)1788*0Sstevel@tonic-gate defaults_set_volume_usehsp(
1789*0Sstevel@tonic-gate defaults_t *defaults,
1790*0Sstevel@tonic-gate char *diskset,
1791*0Sstevel@tonic-gate boolean_t val)
1792*0Sstevel@tonic-gate {
1793*0Sstevel@tonic-gate devconfig_t *volume = NULL;
1794*0Sstevel@tonic-gate int error = 0;
1795*0Sstevel@tonic-gate
1796*0Sstevel@tonic-gate /* Get/create singleton volume element for this disk set */
1797*0Sstevel@tonic-gate if ((error = defaults_get_singleton_component(
1798*0Sstevel@tonic-gate defaults, diskset, TYPE_VOLUME, &volume, TRUE)) != 0) {
1799*0Sstevel@tonic-gate /* volume_set_error already called */
1800*0Sstevel@tonic-gate return (error);
1801*0Sstevel@tonic-gate }
1802*0Sstevel@tonic-gate
1803*0Sstevel@tonic-gate /* Set the usehsp attribute */
1804*0Sstevel@tonic-gate return (devconfig_set_volume_usehsp(volume, val));
1805*0Sstevel@tonic-gate }
1806*0Sstevel@tonic-gate
1807*0Sstevel@tonic-gate /*
1808*0Sstevel@tonic-gate * Get the default HSP creation flag for generic volume
1809*0Sstevel@tonic-gate *
1810*0Sstevel@tonic-gate * @param defaults
1811*0Sstevel@tonic-gate * a defaults_t hierarchy representing default settings
1812*0Sstevel@tonic-gate * for all disk sets and specific disk sets
1813*0Sstevel@tonic-gate *
1814*0Sstevel@tonic-gate * @param diskset
1815*0Sstevel@tonic-gate * the name of the disk set to which to apply this
1816*0Sstevel@tonic-gate * default setting, or NULL to apply default
1817*0Sstevel@tonic-gate * setting to all disk sets
1818*0Sstevel@tonic-gate *
1819*0Sstevel@tonic-gate * @param val
1820*0Sstevel@tonic-gate * RETURN: the default HSP creation flag for generic
1821*0Sstevel@tonic-gate * volume
1822*0Sstevel@tonic-gate *
1823*0Sstevel@tonic-gate * @return 0
1824*0Sstevel@tonic-gate * if successful
1825*0Sstevel@tonic-gate *
1826*0Sstevel@tonic-gate * @return non-zero
1827*0Sstevel@tonic-gate * if an error occurred. Use get_error_string() to
1828*0Sstevel@tonic-gate * retrieve the associated error message.
1829*0Sstevel@tonic-gate */
1830*0Sstevel@tonic-gate int
defaults_get_volume_usehsp(defaults_t * defaults,char * diskset,boolean_t * val)1831*0Sstevel@tonic-gate defaults_get_volume_usehsp(
1832*0Sstevel@tonic-gate defaults_t *defaults,
1833*0Sstevel@tonic-gate char *diskset,
1834*0Sstevel@tonic-gate boolean_t *val)
1835*0Sstevel@tonic-gate {
1836*0Sstevel@tonic-gate char *disksets[2];
1837*0Sstevel@tonic-gate devconfig_t *volume;
1838*0Sstevel@tonic-gate int error;
1839*0Sstevel@tonic-gate int i = 0;
1840*0Sstevel@tonic-gate
1841*0Sstevel@tonic-gate /* Check both the given and global (NULL) disk sets for the value */
1842*0Sstevel@tonic-gate disksets[0] = diskset;
1843*0Sstevel@tonic-gate disksets[1] = NULL;
1844*0Sstevel@tonic-gate do {
1845*0Sstevel@tonic-gate /* Get/create singleton volume element for this disk set */
1846*0Sstevel@tonic-gate error = defaults_get_singleton_component(
1847*0Sstevel@tonic-gate defaults, disksets[i], TYPE_VOLUME, &volume, FALSE);
1848*0Sstevel@tonic-gate
1849*0Sstevel@tonic-gate switch (error) {
1850*0Sstevel@tonic-gate /* volume found for this disk set */
1851*0Sstevel@tonic-gate case 0:
1852*0Sstevel@tonic-gate /* Get the usehsp attribute */
1853*0Sstevel@tonic-gate if ((error = devconfig_get_volume_usehsp(
1854*0Sstevel@tonic-gate volume, val)) == 0) {
1855*0Sstevel@tonic-gate /* usehsp attribute found */
1856*0Sstevel@tonic-gate return (0);
1857*0Sstevel@tonic-gate }
1858*0Sstevel@tonic-gate
1859*0Sstevel@tonic-gate /* FALLTHROUGH */
1860*0Sstevel@tonic-gate
1861*0Sstevel@tonic-gate /* volume not found for this disk set */
1862*0Sstevel@tonic-gate case ENOENT:
1863*0Sstevel@tonic-gate break;
1864*0Sstevel@tonic-gate
1865*0Sstevel@tonic-gate /* Invalid disk set, or volume couldn't be created */
1866*0Sstevel@tonic-gate default:
1867*0Sstevel@tonic-gate /* volume_set_error already called */
1868*0Sstevel@tonic-gate return (error);
1869*0Sstevel@tonic-gate }
1870*0Sstevel@tonic-gate
1871*0Sstevel@tonic-gate /* Stop after the global (NULL) disk set has been searched */
1872*0Sstevel@tonic-gate } while (disksets[i++] != NULL);
1873*0Sstevel@tonic-gate
1874*0Sstevel@tonic-gate return (ENOENT);
1875*0Sstevel@tonic-gate }
1876