Deleted Added
full compact
zpool_vdev.c (168404) zpool_vdev.c (169303)
1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE

--- 145 unchanged lines hidden (view full) ---

154 }
155 geom_deletetree(&mesh);
156 return (rv);
157}
158
159static boolean_t
160is_provider(const char *name)
161{
1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE

--- 145 unchanged lines hidden (view full) ---

154 }
155 geom_deletetree(&mesh);
156 return (rv);
157}
158
159static boolean_t
160is_provider(const char *name)
161{
162 off_t mediasize;
163 int fd;
164
162 int fd;
163
165 fd = open(name, O_RDONLY);
166 if (fd == -1)
167 return (B_FALSE);
168 if (ioctl(fd, DIOCGMEDIASIZE, &mediasize) == -1) {
169 close(fd);
170 return (B_FALSE);
164 fd = g_open(name, 0);
165 if (fd >= 0) {
166 g_close(fd);
167 return (B_TRUE);
171 }
168 }
172 close(fd);
173 return (B_TRUE);
169 return (B_FALSE);
174
175}
176/*
177 * Create a leaf vdev. Determine if this is a GEOM provider.
178 * Valid forms for a leaf vdev are:
179 *
180 * /dev/xxx Complete path to a GEOM provider
181 * xxx Shorthand for /dev/xxx
182 */
183nvlist_t *
184make_leaf_vdev(const char *arg)
185{
170
171}
172/*
173 * Create a leaf vdev. Determine if this is a GEOM provider.
174 * Valid forms for a leaf vdev are:
175 *
176 * /dev/xxx Complete path to a GEOM provider
177 * xxx Shorthand for /dev/xxx
178 */
179nvlist_t *
180make_leaf_vdev(const char *arg)
181{
186 char path[MAXPATHLEN];
182 char ident[DISK_IDENT_SIZE], path[MAXPATHLEN];
183 struct stat64 statbuf;
187 nvlist_t *vdev = NULL;
188 char *type = NULL;
184 nvlist_t *vdev = NULL;
185 char *type = NULL;
186 boolean_t wholedisk = B_FALSE;
189
190 if (strncmp(arg, _PATH_DEV, sizeof(_PATH_DEV) - 1) == 0)
191 strlcpy(path, arg, sizeof (path));
192 else
193 snprintf(path, sizeof (path), "%s%s", _PATH_DEV, arg);
194
195 if (is_provider(path))
196 type = VDEV_TYPE_DISK;

--- 10 unchanged lines hidden (view full) ---

207 */
208 verify(nvlist_alloc(&vdev, NV_UNIQUE_NAME, 0) == 0);
209 verify(nvlist_add_string(vdev, ZPOOL_CONFIG_PATH, path) == 0);
210 verify(nvlist_add_string(vdev, ZPOOL_CONFIG_TYPE, type) == 0);
211 if (strcmp(type, VDEV_TYPE_DISK) == 0)
212 verify(nvlist_add_uint64(vdev, ZPOOL_CONFIG_WHOLE_DISK,
213 (uint64_t)B_FALSE) == 0);
214
187
188 if (strncmp(arg, _PATH_DEV, sizeof(_PATH_DEV) - 1) == 0)
189 strlcpy(path, arg, sizeof (path));
190 else
191 snprintf(path, sizeof (path), "%s%s", _PATH_DEV, arg);
192
193 if (is_provider(path))
194 type = VDEV_TYPE_DISK;

--- 10 unchanged lines hidden (view full) ---

205 */
206 verify(nvlist_alloc(&vdev, NV_UNIQUE_NAME, 0) == 0);
207 verify(nvlist_add_string(vdev, ZPOOL_CONFIG_PATH, path) == 0);
208 verify(nvlist_add_string(vdev, ZPOOL_CONFIG_TYPE, type) == 0);
209 if (strcmp(type, VDEV_TYPE_DISK) == 0)
210 verify(nvlist_add_uint64(vdev, ZPOOL_CONFIG_WHOLE_DISK,
211 (uint64_t)B_FALSE) == 0);
212
213 /*
214 * For a whole disk, defer getting its devid until after labeling it.
215 */
216 if (1 || (S_ISBLK(statbuf.st_mode) && !wholedisk)) {
217 /*
218 * Get the devid for the device.
219 */
220 int fd;
221 ddi_devid_t devid;
222 char *minor = NULL, *devid_str = NULL;
223
224 if ((fd = open(path, O_RDONLY)) < 0) {
225 (void) fprintf(stderr, gettext("cannot open '%s': "
226 "%s\n"), path, strerror(errno));
227 nvlist_free(vdev);
228 return (NULL);
229 }
230
231 if (devid_get(fd, &devid) == 0) {
232 if (devid_get_minor_name(fd, &minor) == 0 &&
233 (devid_str = devid_str_encode(devid, minor)) !=
234 NULL) {
235 verify(nvlist_add_string(vdev,
236 ZPOOL_CONFIG_DEVID, devid_str) == 0);
237 }
238 if (devid_str != NULL)
239 devid_str_free(devid_str);
240 if (minor != NULL)
241 devid_str_free(minor);
242 devid_free(devid);
243 }
244
245 (void) close(fd);
246 }
247
215 return (vdev);
216}
217
218/*
219 * Go through and verify the replication level of the pool is consistent.
220 * Performs the following checks:
221 *
222 * For the new spec, verifies that devices in mirrors and raidz are the

--- 628 unchanged lines hidden ---
248 return (vdev);
249}
250
251/*
252 * Go through and verify the replication level of the pool is consistent.
253 * Performs the following checks:
254 *
255 * For the new spec, verifies that devices in mirrors and raidz are the

--- 628 unchanged lines hidden ---