annotate usr/src/lib/libdiskmgt/common/entry.c @ 4082:2e3825fd8bb5

6372011 libdiskmgt needs to build appropriate .po file 6533990 zpool create in-use check fails on svm swap device
author mmusante
date Fri, 20 Apr 2007 17:46:13 -0700
parents 806e933bf124
children b25030891c44
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2 * CDDL HEADER START
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
4 * The contents of this file are subject to the terms of the
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1352
diff changeset
5 * Common Development and Distribution License (the "License").
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1352
diff changeset
6 * You may not use this file except in compliance with the License.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
7 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
9 * or http://www.opensolaris.org/os/licensing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
10 * See the License for the specific language governing permissions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
11 * and limitations under the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
12 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
13 * When distributing Covered Code, include this CDDL HEADER in each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
15 * If applicable, add the following below this CDDL HEADER, with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
16 * fields enclosed by brackets "[]" replaced with your own identifying
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
17 * information: Portions Copyright [yyyy] [name of copyright owner]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
18 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
19 * CDDL HEADER END
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
20 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
21 /*
3741
806e933bf124 6441384 zpool import action message is not correctly localized
mmusante
parents: 2082
diff changeset
22 * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
23 * Use is subject to license terms.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
24 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
25
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
26 #pragma ident "%Z%%M% %I% %E% SMI"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
27
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
28 #include <fcntl.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
29 #include <libdevinfo.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
30 #include <stdio.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
31 #include <sys/sunddi.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
32 #include <sys/types.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
33 #include <unistd.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
34 #include <stdlib.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
35 #include <string.h>
767
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
36 #include <libintl.h>
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
37 #include <locale.h>
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
38 #include <sys/debug.h>
4082
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
39 #include <strings.h>
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
40 #include <sys/stat.h>
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
41 #include <sys/swap.h>
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
42
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
43 #include "libdiskmgt.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
44 #include "disks_private.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
45 #include "partition.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
46
4082
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
47 #define ANY_ZPOOL_USE(who) \
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
48 (((who) == DM_WHO_ZPOOL_FORCE) || \
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
49 ((who) == DM_WHO_ZPOOL) || \
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
50 ((who) == DM_WHO_ZPOOL_SPARE))
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
51
767
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
52 extern char *getfullblkname();
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
53
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
54 extern dm_desc_type_t drive_assoc_types[];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
55 extern dm_desc_type_t bus_assoc_types[];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
56 extern dm_desc_type_t controller_assoc_types[];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
57 extern dm_desc_type_t media_assoc_types[];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
58 extern dm_desc_type_t slice_assoc_types[];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
59 extern dm_desc_type_t partition_assoc_types[];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
60 extern dm_desc_type_t path_assoc_types[];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
61 extern dm_desc_type_t alias_assoc_types[];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
62
767
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
63
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
64 static dm_descriptor_t *ptr_array_to_desc_array(descriptor_t **ptrs, int *errp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
65 static descriptor_t **desc_array_to_ptr_array(dm_descriptor_t *da, int *errp);
767
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
66 static int build_usage_string(char *dname, char *by, char *data, char **use,
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
67 int *found, int *errp);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
68
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
69 void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
70 dm_free_descriptor(dm_descriptor_t desc)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
71 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
72 descriptor_t *dp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
73
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
74 if (desc == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
75 return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
76 }
556
5afbbcbc4e13 6268963 cmd/wbem and gcc don't get along
mike_s
parents: 0
diff changeset
77 dp = (descriptor_t *)(uintptr_t)desc;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
78
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
79 cache_wlock();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
80 cache_free_descriptor(dp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
81 cache_unlock();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
82 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
83
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
84 void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
85 dm_free_descriptors(dm_descriptor_t *desc_list)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
86 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
87 descriptor_t **dp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
88 int error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
89
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
90 if (desc_list == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
91 return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
92 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
93 dp = desc_array_to_ptr_array(desc_list, &error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
94 if (error != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
95 free(desc_list);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
96 return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
97 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
98
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
99 cache_wlock();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
100 cache_free_descriptors(dp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
101 cache_unlock();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
102 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
103
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
104 /*ARGSUSED*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
105 void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
106 dm_free_name(char *name)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
107 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
108 free(name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
109 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
110
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
111 dm_descriptor_t *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
112 dm_get_associated_descriptors(dm_descriptor_t desc, dm_desc_type_t type,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
113 int *errp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
114 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
115 descriptor_t **descs = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
116 descriptor_t *dp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
117
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
118
556
5afbbcbc4e13 6268963 cmd/wbem and gcc don't get along
mike_s
parents: 0
diff changeset
119 dp = (descriptor_t *)(uintptr_t)desc;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
120
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
121 cache_wlock();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
122
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
123 if (!cache_is_valid_desc(dp)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
124 cache_unlock();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
125 *errp = EBADF;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
126 return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
127 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
128
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
129 /* verify that the descriptor is still valid */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
130 if (dp->p.generic == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
131 cache_unlock();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
132 *errp = ENODEV;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
133 return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
134 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
135
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
136 switch (dp->type) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
137 case DM_DRIVE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
138 descs = drive_get_assoc_descriptors(dp, type, errp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
139 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
140 case DM_BUS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
141 descs = bus_get_assoc_descriptors(dp, type, errp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
142 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
143 case DM_CONTROLLER:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
144 descs = controller_get_assoc_descriptors(dp, type, errp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
145 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
146 case DM_MEDIA:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
147 descs = media_get_assoc_descriptors(dp, type, errp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
148 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
149 case DM_SLICE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
150 descs = slice_get_assoc_descriptors(dp, type, errp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
151 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
152 case DM_PARTITION:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
153 descs = partition_get_assoc_descriptors(dp, type, errp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
154 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
155 case DM_PATH:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
156 descs = path_get_assoc_descriptors(dp, type, errp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
157 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
158 case DM_ALIAS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
159 descs = alias_get_assoc_descriptors(dp, type, errp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
160 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
161 default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
162 *errp = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
163 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
164 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
165
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
166 cache_unlock();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
167
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
168 return (ptr_array_to_desc_array(descs, errp));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
169 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
170
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
171 dm_desc_type_t *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
172 dm_get_associated_types(dm_desc_type_t type)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
173 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
174 switch (type) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
175 case DM_DRIVE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
176 return (drive_assoc_types);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
177 case DM_BUS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
178 return (bus_assoc_types);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
179 case DM_CONTROLLER:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
180 return (controller_assoc_types);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
181 case DM_MEDIA:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
182 return (media_assoc_types);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
183 case DM_SLICE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
184 return (slice_assoc_types);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
185 case DM_PARTITION:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
186 return (partition_assoc_types);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
187 case DM_PATH:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
188 return (path_assoc_types);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
189 case DM_ALIAS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
190 return (alias_assoc_types);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
191 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
192
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
193 return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
194 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
195
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
196 nvlist_t *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
197 dm_get_attributes(dm_descriptor_t desc, int *errp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
198 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
199 descriptor_t *dp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
200 nvlist_t *attrs = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
201
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
202
556
5afbbcbc4e13 6268963 cmd/wbem and gcc don't get along
mike_s
parents: 0
diff changeset
203 dp = (descriptor_t *)(uintptr_t)desc;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
204
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
205 cache_rlock();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
206
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
207 if (!cache_is_valid_desc(dp)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
208 cache_unlock();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
209 *errp = EBADF;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
210 return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
211 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
212
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
213 /* verify that the descriptor is still valid */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
214 if (dp->p.generic == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
215 cache_unlock();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
216 *errp = ENODEV;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
217 return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
218 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
219
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
220 switch (dp->type) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
221 case DM_DRIVE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
222 attrs = drive_get_attributes(dp, errp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
223 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
224 case DM_BUS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
225 attrs = bus_get_attributes(dp, errp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
226 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
227 case DM_CONTROLLER:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
228 attrs = controller_get_attributes(dp, errp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
229 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
230 case DM_MEDIA:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
231 attrs = media_get_attributes(dp, errp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
232 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
233 case DM_SLICE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
234 attrs = slice_get_attributes(dp, errp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
235 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
236 case DM_PARTITION:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
237 attrs = partition_get_attributes(dp, errp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
238 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
239 case DM_PATH:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
240 attrs = path_get_attributes(dp, errp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
241 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
242 case DM_ALIAS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
243 attrs = alias_get_attributes(dp, errp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
244 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
245 default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
246 *errp = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
247 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
248 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
249
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
250 cache_unlock();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
251
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
252 return (attrs);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
253 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
254
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
255 dm_descriptor_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
256 dm_get_descriptor_by_name(dm_desc_type_t desc_type, char *name, int *errp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
257 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
258 dm_descriptor_t desc = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
259
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
260
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
261 cache_wlock();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
262
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
263 switch (desc_type) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
264 case DM_DRIVE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
265 desc = (uintptr_t)drive_get_descriptor_by_name(name, errp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
266 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
267 case DM_BUS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
268 desc = (uintptr_t)bus_get_descriptor_by_name(name, errp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
269 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
270 case DM_CONTROLLER:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
271 desc = (uintptr_t)controller_get_descriptor_by_name(name,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
272 errp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
273 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
274 case DM_MEDIA:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
275 desc = (uintptr_t)media_get_descriptor_by_name(name, errp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
276 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
277 case DM_SLICE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
278 desc = (uintptr_t)slice_get_descriptor_by_name(name, errp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
279 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
280 case DM_PARTITION:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
281 desc = (uintptr_t)partition_get_descriptor_by_name(name,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
282 errp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
283 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
284 case DM_PATH:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
285 desc = (uintptr_t)path_get_descriptor_by_name(name, errp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
286 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
287 case DM_ALIAS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
288 desc = (uintptr_t)alias_get_descriptor_by_name(name, errp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
289 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
290 default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
291 *errp = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
292 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
293 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
294
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
295 cache_unlock();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
296
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
297 return (desc);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
298 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
299
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
300 dm_descriptor_t *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
301 dm_get_descriptors(dm_desc_type_t type, int filter[], int *errp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
302 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
303 descriptor_t **descs = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
304
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
305
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
306 cache_wlock();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
307
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
308 switch (type) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
309 case DM_DRIVE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
310 descs = drive_get_descriptors(filter, errp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
311 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
312 case DM_BUS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
313 descs = bus_get_descriptors(filter, errp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
314 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
315 case DM_CONTROLLER:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
316 descs = controller_get_descriptors(filter, errp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
317 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
318 case DM_MEDIA:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
319 descs = media_get_descriptors(filter, errp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
320 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
321 case DM_SLICE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
322 descs = slice_get_descriptors(filter, errp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
323 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
324 case DM_PARTITION:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
325 descs = partition_get_descriptors(filter, errp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
326 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
327 case DM_PATH:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
328 descs = path_get_descriptors(filter, errp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
329 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
330 case DM_ALIAS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
331 descs = alias_get_descriptors(filter, errp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
332 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
333 default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
334 *errp = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
335 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
336 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
337
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
338 cache_unlock();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
339
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
340 return (ptr_array_to_desc_array(descs, errp));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
341 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
342
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
343 char *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
344 dm_get_name(dm_descriptor_t desc, int *errp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
345 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
346 descriptor_t *dp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
347 char *nm = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
348 char *name = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
349
556
5afbbcbc4e13 6268963 cmd/wbem and gcc don't get along
mike_s
parents: 0
diff changeset
350 dp = (descriptor_t *)(uintptr_t)desc;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
351
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
352 cache_rlock();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
353
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
354 if (!cache_is_valid_desc(dp)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
355 cache_unlock();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
356 *errp = EBADF;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
357 return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
358 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
359
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
360 /* verify that the descriptor is still valid */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
361 if (dp->p.generic == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
362 cache_unlock();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
363 *errp = ENODEV;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
364 return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
365 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
366
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
367 switch (dp->type) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
368 case DM_DRIVE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
369 nm = (drive_get_name(dp));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
370 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
371 case DM_BUS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
372 nm = (bus_get_name(dp));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
373 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
374 case DM_CONTROLLER:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
375 nm = (controller_get_name(dp));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
376 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
377 case DM_MEDIA:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
378 nm = (media_get_name(dp));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
379 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
380 case DM_SLICE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
381 nm = (slice_get_name(dp));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
382 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
383 case DM_PARTITION:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
384 nm = (partition_get_name(dp));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
385 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
386 case DM_PATH:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
387 nm = (path_get_name(dp));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
388 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
389 case DM_ALIAS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
390 nm = (alias_get_name(dp));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
391 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
392 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
393
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
394 cache_unlock();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
395
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
396 *errp = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
397 if (nm != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
398 name = strdup(nm);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
399 if (name == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
400 *errp = ENOMEM;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
401 return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
402 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
403 return (name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
404 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
405 return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
406 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
407
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
408 nvlist_t *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
409 dm_get_stats(dm_descriptor_t desc, int stat_type, int *errp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
410 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
411 descriptor_t *dp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
412 nvlist_t *stats = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
413
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
414
556
5afbbcbc4e13 6268963 cmd/wbem and gcc don't get along
mike_s
parents: 0
diff changeset
415 dp = (descriptor_t *)(uintptr_t)desc;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
416
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
417 cache_rlock();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
418
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
419 if (!cache_is_valid_desc(dp)) {
767
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
420 cache_unlock();
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
421 *errp = EBADF;
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
422 return (NULL);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
423 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
424
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
425 /* verify that the descriptor is still valid */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
426 if (dp->p.generic == NULL) {
767
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
427 cache_unlock();
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
428 *errp = ENODEV;
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
429 return (NULL);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
430 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
431
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
432 switch (dp->type) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
433 case DM_DRIVE:
767
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
434 stats = drive_get_stats(dp, stat_type, errp);
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
435 break;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
436 case DM_BUS:
767
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
437 stats = bus_get_stats(dp, stat_type, errp);
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
438 break;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
439 case DM_CONTROLLER:
767
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
440 stats = controller_get_stats(dp, stat_type, errp);
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
441 break;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
442 case DM_MEDIA:
767
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
443 stats = media_get_stats(dp, stat_type, errp);
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
444 break;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
445 case DM_SLICE:
767
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
446 if (stat_type == DM_SLICE_STAT_USE) {
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
447 /*
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
448 * If NOINUSE_CHECK is set, we do not perform
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
449 * the in use checking if the user has set stat_type
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
450 * DM_SLICE_STAT_USE
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
451 */
1107
1f78db36dee1 6349487 libdiskmgt should bypass all calls in dm_inuse when NOINUSE_CHECK is set
sjelinek
parents: 767
diff changeset
452 if (NOINUSE_SET) {
767
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
453 stats = NULL;
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
454 break;
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
455 }
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
456 }
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
457 stats = slice_get_stats(dp, stat_type, errp);
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
458 break;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
459 case DM_PARTITION:
767
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
460 stats = partition_get_stats(dp, stat_type, errp);
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
461 break;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
462 case DM_PATH:
767
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
463 stats = path_get_stats(dp, stat_type, errp);
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
464 break;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
465 case DM_ALIAS:
767
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
466 stats = alias_get_stats(dp, stat_type, errp);
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
467 break;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
468 default:
767
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
469 *errp = EINVAL;
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
470 break;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
471 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
472
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
473 cache_unlock();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
474
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
475 return (stats);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
476 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
477
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
478 dm_desc_type_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
479 dm_get_type(dm_descriptor_t desc)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
480 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
481 descriptor_t *dp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
482
556
5afbbcbc4e13 6268963 cmd/wbem and gcc don't get along
mike_s
parents: 0
diff changeset
483 dp = (descriptor_t *)(uintptr_t)desc;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
484
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
485 cache_rlock();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
486
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
487 if (!cache_is_valid_desc(dp)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
488 cache_unlock();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
489 return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
490 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
491
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
492 cache_unlock();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
493
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
494 return (dp->type);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
495 }
767
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
496 /*
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
497 * Returns, via slices paramater, a dm_descriptor_t list of
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
498 * slices for the named disk drive.
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
499 */
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
500 void
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
501 dm_get_slices(char *drive, dm_descriptor_t **slices, int *errp)
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
502 {
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
503 dm_descriptor_t alias;
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
504 dm_descriptor_t *media;
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
505 dm_descriptor_t *disk;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
506
767
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
507 *slices = NULL;
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
508 *errp = 0;
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
509
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
510 if (drive == NULL) {
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
511 return;
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
512 }
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
513
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
514 alias = dm_get_descriptor_by_name(DM_ALIAS, drive, errp);
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
515
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
516 /*
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
517 * Errors must be handled by the caller. The dm_descriptor_t *
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
518 * values will be NULL if an error occured in these calls.
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
519 */
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
520
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
521 if (alias != NULL) {
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
522 disk = dm_get_associated_descriptors(alias, DM_DRIVE, errp);
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
523 dm_free_descriptor(alias);
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
524 if (disk != NULL) {
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
525 media = dm_get_associated_descriptors(*disk,
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
526 DM_MEDIA, errp);
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
527 dm_free_descriptors(disk);
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
528 if (media != NULL) {
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
529 *slices = dm_get_associated_descriptors(*media,
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
530 DM_SLICE, errp);
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
531 dm_free_descriptors(media);
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
532 }
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
533 }
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
534 }
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
535 }
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
536 /*
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
537 * Convenience function to get slice stats
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
538 */
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
539 void
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
540 dm_get_slice_stats(char *slice, nvlist_t **dev_stats, int *errp)
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
541 {
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
542 dm_descriptor_t devp;
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
543
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
544 *dev_stats = NULL;
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
545 *errp = 0;
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
546
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
547 if (slice == NULL) {
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
548 return;
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
549 }
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
550
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
551 /*
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
552 * Errors must be handled by the caller. The dm_descriptor_t *
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
553 * values will be NULL if an error occured in these calls.
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
554 */
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
555 devp = dm_get_descriptor_by_name(DM_SLICE, slice, errp);
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
556 if (devp != NULL) {
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
557 *dev_stats = dm_get_stats(devp, DM_SLICE_STAT_USE,
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
558 errp);
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
559 dm_free_descriptor(devp);
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
560 }
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
561 }
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
562
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
563 /*
1352
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
564 * Checks for overlapping slices. If the given device is a slice, and it
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
565 * overlaps with any non-backup slice on the disk, return true with a detailed
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
566 * description similar to dm_inuse().
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
567 */
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
568 int
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
569 dm_isoverlapping(char *slicename, char **overlaps_with, int *errp)
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
570 {
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
571 dm_descriptor_t slice = NULL;
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
572 dm_descriptor_t *media = NULL;
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
573 dm_descriptor_t *slices = NULL;
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
574 int i = 0;
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
575 uint32_t in_snum;
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
576 uint64_t start_block = 0;
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
577 uint64_t end_block = 0;
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
578 uint64_t media_size = 0;
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
579 uint64_t size = 0;
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
580 nvlist_t *media_attrs = NULL;
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
581 nvlist_t *slice_attrs = NULL;
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
582 int ret = 0;
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
583
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
584 slice = dm_get_descriptor_by_name(DM_SLICE, slicename, errp);
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
585 if (slice == NULL)
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
586 goto out;
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
587
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
588 /*
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
589 * Get the list of slices be fetching the associated media, and then all
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
590 * associated slices.
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
591 */
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
592 media = dm_get_associated_descriptors(slice, DM_MEDIA, errp);
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
593 if (media == NULL || *media == NULL || *errp != 0)
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
594 goto out;
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
595
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
596 slices = dm_get_associated_descriptors(*media, DM_SLICE, errp);
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
597 if (slices == NULL || *slices == NULL || *errp != 0)
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
598 goto out;
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
599
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
600 media_attrs = dm_get_attributes(*media, errp);
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
601 if (media_attrs == NULL || *errp)
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
602 goto out;
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
603
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
604 *errp = nvlist_lookup_uint64(media_attrs, DM_NACCESSIBLE, &media_size);
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
605 if (*errp != 0)
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
606 goto out;
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
607
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
608 slice_attrs = dm_get_attributes(slice, errp);
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
609 if (slice_attrs == NULL || *errp != 0)
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
610 goto out;
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
611
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
612 *errp = nvlist_lookup_uint64(slice_attrs, DM_START, &start_block);
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
613 if (*errp != 0)
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
614 goto out;
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
615
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
616 *errp = nvlist_lookup_uint64(slice_attrs, DM_SIZE, &size);
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
617 if (*errp != 0)
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
618 goto out;
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
619
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
620 *errp = nvlist_lookup_uint32(slice_attrs, DM_INDEX, &in_snum);
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
621 if (*errp != 0)
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
622 goto out;
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
623
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
624 end_block = (start_block + size) - 1;
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
625
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
626 for (i = 0; slices[i]; i ++) {
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
627 uint64_t other_start;
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
628 uint64_t other_end;
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
629 uint64_t other_size;
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
630 uint32_t snum;
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
631
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
632 nvlist_t *other_attrs = dm_get_attributes(slices[i], errp);
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
633
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
634 if (other_attrs == NULL)
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
635 continue;
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
636
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
637 if (*errp != 0)
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
638 goto out;
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
639
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
640 *errp = nvlist_lookup_uint64(other_attrs, DM_START,
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
641 &other_start);
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
642 if (*errp) {
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
643 nvlist_free(other_attrs);
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
644 goto out;
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
645 }
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
646
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
647 *errp = nvlist_lookup_uint64(other_attrs, DM_SIZE,
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
648 &other_size);
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
649
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
650 if (*errp) {
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
651 nvlist_free(other_attrs);
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
652 ret = -1;
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
653 goto out;
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
654 }
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
655
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
656 other_end = (other_size + other_start) - 1;
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
657
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
658 *errp = nvlist_lookup_uint32(other_attrs, DM_INDEX,
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
659 &snum);
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
660
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
661 if (*errp) {
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
662 nvlist_free(other_attrs);
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
663 ret = -1;
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
664 goto out;
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
665 }
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
666
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
667 /*
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
668 * Check to see if there are > 2 overlapping regions
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
669 * on this media in the same region as this slice.
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
670 * This is done by assuming the following:
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
671 * Slice 2 is the backup slice if it is the size
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
672 * of the whole disk
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
673 * If slice 2 is the overlap and slice 2 is the size of
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
674 * the whole disk, continue. If another slice is found
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
675 * that overlaps with our slice, return it.
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
676 * There is the potential that there is more than one slice
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
677 * that our slice overlaps with, however, we only return
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
678 * the first overlapping slice we find.
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
679 *
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
680 */
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
681 if (start_block >= other_start && start_block <= other_end) {
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
682 if ((snum == 2 && (other_size == media_size)) ||
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
683 snum == in_snum) {
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
684 continue;
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
685 } else {
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
686 char *str = dm_get_name(slices[i], errp);
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
687 if (*errp != 0) {
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
688 nvlist_free(other_attrs);
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
689 ret = -1;
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
690 goto out;
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
691 }
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
692 *overlaps_with = strdup(str);
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
693 dm_free_name(str);
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
694 nvlist_free(other_attrs);
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
695 ret = 1;
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
696 goto out;
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
697 }
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
698 } else if (other_start >= start_block &&
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
699 other_start <= end_block) {
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
700 if ((snum == 2 && (other_size == media_size)) ||
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
701 snum == in_snum) {
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
702 continue;
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
703 } else {
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
704 char *str = dm_get_name(slices[i], errp);
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
705 if (*errp != 0) {
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
706 nvlist_free(other_attrs);
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
707 ret = -1;
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
708 goto out;
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
709 }
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
710 *overlaps_with = strdup(str);
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
711 dm_free_name(str);
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
712 nvlist_free(other_attrs);
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
713 ret = 1;
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
714 goto out;
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
715 }
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
716 }
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
717 nvlist_free(other_attrs);
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
718 }
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
719
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
720 out:
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
721 if (media_attrs)
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
722 nvlist_free(media_attrs);
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
723 if (slice_attrs)
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
724 nvlist_free(slice_attrs);
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
725
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
726 if (slices)
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
727 dm_free_descriptors(slices);
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
728 if (media)
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
729 dm_free_descriptors(media);
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
730 if (slice)
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
731 dm_free_descriptor(slice);
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
732
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
733 return (ret);
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
734 }
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
735
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
736 /*
4082
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
737 * Get the full list of swap entries. Returns -1 on error, or >= 0 to
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
738 * indicate the number of entries in the list. Callers are responsible
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
739 * for calling dm_free_swapentries() to deallocate memory. If this
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
740 * returns 0, the swaptbl_t still needs to be freed.
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
741 */
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
742 int
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
743 dm_get_swapentries(swaptbl_t **stp, int *errp)
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
744 {
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
745 int count, i;
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
746 swaptbl_t *tbl;
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
747 char *ptr;
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
748
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
749 *stp = NULL;
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
750
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
751 /* get number of swap entries */
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
752 if ((count = swapctl(SC_GETNSWP, NULL)) < 0) {
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
753 *errp = errno;
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
754 return (-1);
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
755 }
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
756
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
757 if (count == 0) {
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
758 return (0);
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
759 }
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
760
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
761 /* allocate space */
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
762 tbl = calloc(1, sizeof (int) + count * sizeof (swapent_t));
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
763 if (tbl == NULL) {
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
764 *errp = ENOMEM;
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
765 return (-1);
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
766 }
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
767
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
768 ptr = calloc(1, count * MAXPATHLEN);
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
769 if (ptr == NULL) {
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
770 *errp = ENOMEM;
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
771 free(tbl);
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
772 return (-1);
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
773 }
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
774
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
775 /* set up pointers to the pathnames */
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
776 tbl->swt_n = count;
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
777 for (i = 0; i < count; i++) {
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
778 tbl->swt_ent[i].ste_path = ptr;
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
779 ptr += MAXPATHLEN;
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
780 }
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
781
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
782 /* get list of swap paths */
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
783 count = swapctl(SC_LIST, tbl);
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
784 if (count < 0) {
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
785 *errp = errno;
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
786 free(ptr);
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
787 free(tbl);
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
788 return (-1);
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
789 }
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
790
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
791 *stp = tbl;
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
792 return (count);
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
793 }
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
794
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
795 /* ARGSUSED */
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
796 void
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
797 dm_free_swapentries(swaptbl_t *stp)
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
798 {
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
799 ASSERT(stp != NULL);
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
800
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
801 free(stp->swt_ent[0].ste_path);
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
802 free(stp);
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
803 }
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
804
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
805 /*
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
806 * Check a slice to see if it's being used by swap.
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
807 */
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
808 int
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
809 dm_inuse_swap(const char *dev_name, int *errp)
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
810 {
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
811 int count;
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
812 int found;
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
813 swaptbl_t *tbl = NULL;
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
814
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
815 *errp = 0;
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
816
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
817 count = dm_get_swapentries(&tbl, errp);
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
818 if (count < 0 || *errp) {
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
819 if (tbl)
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
820 dm_free_swapentries(tbl);
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
821 return (-1);
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
822 }
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
823
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
824 /* if there are no swap entries, we're done */
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
825 if (!count) {
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
826 return (0);
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
827 }
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
828
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
829 ASSERT(tbl != NULL);
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
830
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
831 found = 0;
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
832 while (count--) {
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
833 if (strcmp(dev_name, tbl->swt_ent[count].ste_path) == 0) {
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
834 found = 1;
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
835 break;
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
836 }
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
837 }
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
838
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
839 dm_free_swapentries(tbl);
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
840 return (found);
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
841 }
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
842
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
843 /*
767
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
844 * Returns 'in use' details, if found, about a specific dev_name,
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
845 * based on the caller(who). It is important to note that it is possible
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
846 * for there to be more than one 'in use' statistic regarding a dev_name.
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
847 * The **msg parameter returns a list of 'in use' details. This message
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
848 * is formatted via gettext().
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
849 */
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
850 int
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
851 dm_inuse(char *dev_name, char **msg, dm_who_type_t who, int *errp)
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
852 {
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
853 nvlist_t *dev_stats = NULL;
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
854 char *by, *data;
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
855 nvpair_t *nvwhat = NULL;
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
856 nvpair_t *nvdesc = NULL;
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
857 int found = 0;
4082
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
858 int err;
767
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
859 char *dname = NULL;
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
860
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
861 *errp = 0;
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
862 *msg = NULL;
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
863
1107
1f78db36dee1 6349487 libdiskmgt should bypass all calls in dm_inuse when NOINUSE_CHECK is set
sjelinek
parents: 767
diff changeset
864 /*
1f78db36dee1 6349487 libdiskmgt should bypass all calls in dm_inuse when NOINUSE_CHECK is set
sjelinek
parents: 767
diff changeset
865 * If the user doesn't want to do in use checking, return.
1f78db36dee1 6349487 libdiskmgt should bypass all calls in dm_inuse when NOINUSE_CHECK is set
sjelinek
parents: 767
diff changeset
866 */
1f78db36dee1 6349487 libdiskmgt should bypass all calls in dm_inuse when NOINUSE_CHECK is set
sjelinek
parents: 767
diff changeset
867
1f78db36dee1 6349487 libdiskmgt should bypass all calls in dm_inuse when NOINUSE_CHECK is set
sjelinek
parents: 767
diff changeset
868 if (NOINUSE_SET)
1f78db36dee1 6349487 libdiskmgt should bypass all calls in dm_inuse when NOINUSE_CHECK is set
sjelinek
parents: 767
diff changeset
869 return (0);
1f78db36dee1 6349487 libdiskmgt should bypass all calls in dm_inuse when NOINUSE_CHECK is set
sjelinek
parents: 767
diff changeset
870
767
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
871 dname = getfullblkname(dev_name);
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
872 /*
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
873 * If we cannot find the block name, we cannot check the device
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
874 * for in use statistics. So, return found, which is == 0.
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
875 */
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
876 if (dname == NULL || *dname == '\0') {
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
877 return (found);
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
878 }
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
879
4082
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
880 /*
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
881 * Slice stats for swap devices are only returned if mounted
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
882 * (e.g. /tmp). Other devices or files being used for swap
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
883 * are ignored, so we add a special check here to use swapctl(2)
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
884 * to perform in-use checking.
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
885 */
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
886 if (ANY_ZPOOL_USE(who) && (err = dm_inuse_swap(dname, errp))) {
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
887
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
888 /* on error, dm_inuse_swap sets errp */
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
889 if (err < 0) {
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
890 free(dname);
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
891 return (err);
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
892 }
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
893
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
894 /* simulate a mounted swap device */
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
895 (void) build_usage_string(dname, DM_USE_MOUNT, "swap", msg,
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
896 &found, errp);
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
897
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
898 /* if this fails, dm_get_usage_string changed */
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
899 ASSERT(found == 1);
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
900
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
901 free(dname);
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
902 return (found);
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
903 }
2e3825fd8bb5 6372011 libdiskmgt needs to build appropriate .po file
mmusante
parents: 3741
diff changeset
904
767
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
905 dm_get_slice_stats(dname, &dev_stats, errp);
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
906 if (dev_stats == NULL) {
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
907 /*
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
908 * If there is an error, but it isn't a no device found error
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
909 * return the error as recorded. Otherwise, with a full
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
910 * block name, we might not be able to get the slice
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
911 * associated, and will get an ENODEV error. For example,
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
912 * an SVM metadevice will return a value from getfullblkname()
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
913 * but libdiskmgt won't be able to find this device for
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
914 * statistics gathering. This is expected and we should not
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
915 * report errnoneous errors.
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
916 */
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
917 if (*errp) {
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
918 if (*errp == ENODEV) {
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
919 *errp = 0;
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
920 }
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
921 }
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
922 free(dname);
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
923 return (found);
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
924 }
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
925
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
926 for (;;) {
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
927
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
928 nvwhat = nvlist_next_nvpair(dev_stats, nvdesc);
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
929 nvdesc = nvlist_next_nvpair(dev_stats, nvwhat);
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
930
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
931 /*
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
932 * End of the list found.
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
933 */
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
934 if (nvwhat == NULL || nvdesc == NULL) {
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
935 break;
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
936 }
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
937 /*
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
938 * Otherwise, we check to see if this client(who) cares
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
939 * about this in use scenario
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
940 */
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
941
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
942 ASSERT(strcmp(nvpair_name(nvwhat), DM_USED_BY) == 0);
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
943 ASSERT(strcmp(nvpair_name(nvdesc), DM_USED_NAME) == 0);
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
944 /*
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
945 * If we error getting the string value continue on
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
946 * to the next pair(if there is one)
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
947 */
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
948 if (nvpair_value_string(nvwhat, &by)) {
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
949 continue;
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
950 }
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
951 if (nvpair_value_string(nvdesc, &data)) {
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
952 continue;
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
953 }
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
954
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
955 switch (who) {
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
956 case DM_WHO_MKFS:
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
957 /*
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
958 * mkfs is not in use for these cases.
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
959 * All others are in use.
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
960 */
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
961 if (strcmp(by, DM_USE_LU) == 0 ||
1352
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
962 strcmp(by, DM_USE_FS) == 0 ||
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
963 strcmp(by, DM_USE_EXPORTED_ZPOOL) == 0) {
767
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
964 break;
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
965 }
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
966 if (build_usage_string(dname,
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
967 by, data, msg, &found, errp) != 0) {
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
968 if (*errp) {
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
969 goto out;
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
970 }
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
971 }
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
972 break;
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
973 case DM_WHO_SWAP:
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
974 /*
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
975 * Not in use for this.
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
976 */
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
977 if (strcmp(by, DM_USE_DUMP) == 0 ||
1352
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
978 strcmp(by, DM_USE_FS) == 0 ||
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
979 strcmp(by, DM_USE_EXPORTED_ZPOOL) == 0) {
767
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
980 break;
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
981 }
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
982
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
983 if (build_usage_string(dname,
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
984 by, data, msg, &found, errp) != 0) {
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
985 if (*errp) {
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
986 goto out;
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
987 }
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
988 }
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
989 break;
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
990 case DM_WHO_DUMP:
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
991 /*
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
992 * Not in use for this.
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
993 */
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
994 if ((strcmp(by, DM_USE_MOUNT) == 0 &&
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
995 strcmp(data, "swap") == 0) ||
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
996 strcmp(by, DM_USE_DUMP) == 0 ||
1352
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
997 strcmp(by, DM_USE_FS) == 0 ||
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
998 strcmp(by, DM_USE_EXPORTED_ZPOOL) == 0) {
767
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
999 break;
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1000 }
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1001 if (build_usage_string(dname,
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1002 by, data, msg, &found, errp)) {
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1003 if (*errp) {
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1004 goto out;
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1005 }
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1006 }
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1007 break;
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1008
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1009 case DM_WHO_FORMAT:
1352
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
1010 if (strcmp(by, DM_USE_FS) == 0 ||
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
1011 strcmp(by, DM_USE_EXPORTED_ZPOOL) == 0)
767
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1012 break;
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1013 if (build_usage_string(dname,
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1014 by, data, msg, &found, errp) != 0) {
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1015 if (*errp) {
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1016 goto out;
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1017 }
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1018 }
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1019 break;
1352
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
1020
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
1021 case DM_WHO_ZPOOL_FORCE:
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
1022 if (strcmp(by, DM_USE_FS) == 0 ||
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
1023 strcmp(by, DM_USE_EXPORTED_ZPOOL) == 0)
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
1024 break;
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
1025 /* FALLTHROUGH */
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
1026 case DM_WHO_ZPOOL:
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
1027 if (build_usage_string(dname,
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
1028 by, data, msg, &found, errp) != 0) {
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
1029 if (*errp)
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
1030 goto out;
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
1031 }
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
1032 break;
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
1033
3741
806e933bf124 6441384 zpool import action message is not correctly localized
mmusante
parents: 2082
diff changeset
1034 case DM_WHO_ZPOOL_SPARE:
806e933bf124 6441384 zpool import action message is not correctly localized
mmusante
parents: 2082
diff changeset
1035 if (strcmp(by, DM_USE_SPARE_ZPOOL) != 0) {
806e933bf124 6441384 zpool import action message is not correctly localized
mmusante
parents: 2082
diff changeset
1036 if (build_usage_string(dname, by,
806e933bf124 6441384 zpool import action message is not correctly localized
mmusante
parents: 2082
diff changeset
1037 data, msg, &found, errp) != 0) {
806e933bf124 6441384 zpool import action message is not correctly localized
mmusante
parents: 2082
diff changeset
1038 if (*errp)
806e933bf124 6441384 zpool import action message is not correctly localized
mmusante
parents: 2082
diff changeset
1039 goto out;
806e933bf124 6441384 zpool import action message is not correctly localized
mmusante
parents: 2082
diff changeset
1040 }
806e933bf124 6441384 zpool import action message is not correctly localized
mmusante
parents: 2082
diff changeset
1041 }
806e933bf124 6441384 zpool import action message is not correctly localized
mmusante
parents: 2082
diff changeset
1042 break;
806e933bf124 6441384 zpool import action message is not correctly localized
mmusante
parents: 2082
diff changeset
1043
767
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1044 default:
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1045 /*
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1046 * nothing found in use for this client
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1047 * of libdiskmgt. Default is 'not in use'.
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1048 */
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1049 break;
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1050 }
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1051 }
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1052 out:
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1053 if (dname != NULL)
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1054 free(dname);
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1055 if (dev_stats != NULL)
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1056 nvlist_free(dev_stats);
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1057
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1058 return (found);
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1059 }
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1060
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1061 void
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1062 dm_get_usage_string(char *what, char *how, char **usage_string)
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1063 {
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1064
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1065
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1066 if (usage_string == NULL || what == NULL) {
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1067 return;
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1068 }
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1069 *usage_string = NULL;
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1070
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1071 if (strcmp(what, DM_USE_MOUNT) == 0) {
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1072 if (strcmp(how, "swap") == 0) {
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1073 *usage_string = dgettext(TEXT_DOMAIN,
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1074 "%s is currently used by swap. Please see swap(1M)."
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1075 "\n");
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1076 } else {
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1077 *usage_string = dgettext(TEXT_DOMAIN,
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1078 "%s is currently mounted on %s."
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1079 " Please see umount(1M).\n");
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1080 }
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1081 } else if (strcmp(what, DM_USE_VFSTAB) == 0) {
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1082 *usage_string = dgettext(TEXT_DOMAIN,
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1083 "%s is normally mounted on %s according to /etc/vfstab. "
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1084 "Please remove this entry to use this device.\n");
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1085 } else if (strcmp(what, DM_USE_FS) == 0) {
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1086 *usage_string = dgettext(TEXT_DOMAIN,
1352
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
1087 "%s contains a %s filesystem.\n");
767
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1088 } else if (strcmp(what, DM_USE_SVM) == 0) {
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1089 if (strcmp(how, "mdb") == 0) {
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1090 *usage_string = dgettext(TEXT_DOMAIN,
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1091 "%s contains an SVM %s. Please see "
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1092 "metadb(1M).\n");
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1093 } else {
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1094 *usage_string = dgettext(TEXT_DOMAIN,
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1095 "%s is part of SVM volume %s. "
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1096 "Please see metaclear(1M).\n");
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1097 }
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1098 } else if (strcmp(what, DM_USE_VXVM) == 0) {
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1099 *usage_string = dgettext(TEXT_DOMAIN,
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1100 "%s is part of VxVM volume %s.\n");
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1101 } else if (strcmp(what, DM_USE_LU) == 0) {
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1102 *usage_string = dgettext(TEXT_DOMAIN,
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1103 "%s is in use for live upgrade %s. Please see ludelete(1M)."
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1104 "\n");
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1105 } else if (strcmp(what, DM_USE_DUMP) == 0) {
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1106 *usage_string = dgettext(TEXT_DOMAIN,
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1107 "%s is in use by %s. Please see dumpadm(1M)."
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1108 "\n");
1352
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
1109 } else if (strcmp(what, DM_USE_EXPORTED_ZPOOL) == 0) {
767
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1110 *usage_string = dgettext(TEXT_DOMAIN,
1352
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
1111 "%s is part of exported or potentially active ZFS pool %s. "
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
1112 "Please see zpool(1M).\n");
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
1113 } else if (strcmp(what, DM_USE_ACTIVE_ZPOOL) == 0) {
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
1114 *usage_string = dgettext(TEXT_DOMAIN,
b7039548de2f 6343802 zpool(1M) should make better use of libdiskmgt
eschrock
parents: 1107
diff changeset
1115 "%s is part of active ZFS pool %s. Please see zpool(1M)."
767
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1116 "\n");
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1352
diff changeset
1117 } else if (strcmp(what, DM_USE_SPARE_ZPOOL) == 0) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1352
diff changeset
1118 *usage_string = dgettext(TEXT_DOMAIN,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1352
diff changeset
1119 "%s is reserved as a hot spare for ZFS pool %s. Please "
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1352
diff changeset
1120 "see zpool(1M).\n");
767
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1121 }
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1122 }
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1123 void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1124 libdiskmgt_add_str(nvlist_t *attrs, char *name, char *val, int *errp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1125 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1126 if (*errp == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1127 *errp = nvlist_add_string(attrs, name, val);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1128 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1129 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1130
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1131 descriptor_t **
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1132 libdiskmgt_empty_desc_array(int *errp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1133 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1134 descriptor_t **empty;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1135
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1136 empty = (descriptor_t **)calloc(1, sizeof (descriptor_t *));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1137 if (empty == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1138 *errp = ENOMEM;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1139 return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1140 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1141 empty[0] = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1142
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1143 *errp = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1144 return (empty);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1145 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1146
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1147 void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1148 libdiskmgt_init_debug()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1149 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1150 char *valp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1151
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1152 if ((valp = getenv(DM_DEBUG)) != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1153 dm_debug = atoi(valp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1154 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1155 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1156
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1157 int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1158 libdiskmgt_str_eq(char *nm1, char *nm2)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1159 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1160 if (nm1 == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1161 if (dm_debug) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1162 (void) fprintf(stderr, "WARNING: str_eq nm1 NULL\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1163 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1164
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1165 if (nm2 == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1166 return (1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1167 } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1168 return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1169 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1170 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1171
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1172 /* nm1 != NULL */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1173
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1174 if (nm2 == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1175 if (dm_debug) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1176 (void) fprintf(stderr, "WARNING: str_eq nm2 NULL\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1177 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1178 return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1179 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1180
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1181 if (strcmp(nm1, nm2) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1182 return (1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1183 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1184
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1185 return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1186 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1187
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1188 /*ARGSUSED*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1189 static descriptor_t **
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1190 desc_array_to_ptr_array(dm_descriptor_t *descs, int *errp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1191 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1192 #ifdef _LP64
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1193 return ((descriptor_t **)descs);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1194 #else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1195 /* convert the 64 bit descriptors to 32 bit ptrs */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1196 int cnt;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1197 int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1198 descriptor_t **da;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1199
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1200 for (cnt = 0; descs[cnt]; cnt++);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1201
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1202 da = (descriptor_t **)calloc(cnt + 1, sizeof (descriptor_t *));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1203 if (da == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1204 *errp = ENOMEM;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1205 return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1206 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1207
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1208 for (i = 0; descs[i]; i++) {
556
5afbbcbc4e13 6268963 cmd/wbem and gcc don't get along
mike_s
parents: 0
diff changeset
1209 da[i] = (descriptor_t *)(uintptr_t)descs[i];
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1210 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1211 *errp = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1212 free(descs);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1213
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1214 return (da);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1215 #endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1216 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1217
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1218 /*ARGSUSED*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1219 static dm_descriptor_t *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1220 ptr_array_to_desc_array(descriptor_t **ptrs, int *errp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1221 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1222 #ifdef _LP64
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1223 return ((dm_descriptor_t *)ptrs);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1224 #else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1225 /* convert the 32 bit ptrs to the 64 bit descriptors */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1226 int cnt;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1227 int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1228 dm_descriptor_t *da;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1229
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1230 if (*errp != 0 || ptrs == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1231 return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1232 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1233
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1234 for (cnt = 0; ptrs[cnt]; cnt++);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1235
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1236 da = (dm_descriptor_t *)calloc(cnt + 1, sizeof (dm_descriptor_t));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1237 if (da == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1238 *errp = ENOMEM;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1239 return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1240 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1241
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1242 for (i = 0; ptrs[i]; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1243 da[i] = (uintptr_t)ptrs[i];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1244 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1245 *errp = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1246 free(ptrs);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1247
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1248 return (da);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1249 #endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1250 }
767
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1251 /*
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1252 * Build the usage string for the in use data. Return the build string in
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1253 * the msg parameter. This function takes care of reallocing all the memory
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1254 * for this usage string. Usage string is returned already formatted for
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1255 * localization.
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1256 */
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1257 static int
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1258 build_usage_string(char *dname, char *by, char *data, char **msg,
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1259 int *found, int *errp)
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1260 {
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1261 int len0;
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1262 int len1;
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1263 char *use;
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1264 char *p;
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1265
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1266 *errp = 0;
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1267
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1268 dm_get_usage_string(by, data, &use);
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1269 if (!use) {
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1270 return (-1);
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1271 }
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1272
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1273 if (*msg)
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1274 len0 = strlen(*msg);
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1275 else
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1276 len0 = 0;
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1277 /* LINTED */
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1278 len1 = snprintf(NULL, 0, use, dname, data);
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1279
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1280 /*
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1281 * If multiple in use details they
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1282 * are listed 1 per line for ease of
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1283 * reading. dm_find_usage_string
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1284 * formats these appropriately.
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1285 */
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1286 if ((p = realloc(*msg, len0 + len1 + 1)) == NULL) {
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1287 *errp = errno;
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1288 free(*msg);
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1289 return (-1);
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1290 }
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1291 *msg = p;
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1292
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1293 /* LINTED */
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1294 (void) snprintf(*msg + len0, len1 + 1, use, dname, data);
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1295 (*found)++;
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1296 return (0);
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 556
diff changeset
1297 }