Ejemplo n.º 1
0
static int
slice_in_use(dmgt_slice_t *slice, int *error)
{
    char *msg = NULL;
    int in_use;

    /* Determine whether this slice could be passed to "zpool -f" */
    in_use = dm_inuse(slice->name, &msg, DM_WHO_ZPOOL_FORCE, error);
    if (*error) {
        handle_error("%s: could not determine usage", slice->name);
    }

#ifdef DEBUG
    if (in_use) {
        (void) fprintf(stderr,
                       "can't use %s: used name: %s: used by: %s\n  message: %s\n",
                       slice->name, slice->used_name, slice->used_by, msg);
    }
#endif

    if (msg != NULL) {
        free(msg);
    }

    return (in_use);
}
Ejemplo n.º 2
0
/*
 * Validate a device, passing the bulk of the work off to libdiskmgt.
 */
int
check_slice(const char *path, int force, boolean_t wholedisk, boolean_t isspare)
{
	char *msg;
	int error = 0;
	int ret = 0;

	if (dm_inuse((char *)path, &msg, isspare ? DM_WHO_ZPOOL_SPARE :
	    (force ? DM_WHO_ZPOOL_FORCE : DM_WHO_ZPOOL), &error) || error) {
		if (error != 0) {
			libdiskmgt_error(error);
			return (0);
		} else {
			vdev_error("%s", msg);
			free(msg);
			ret = -1;
		}

	}

	/*
	 * If we're given a whole disk, ignore overlapping slices since we're
	 * about to label it anyway.
	 */
	error = 0;
	if (!wholedisk && !force &&
	    (dm_isoverlapping((char *)path, &msg, &error) || error)) {
		if (error != 0) {
			libdiskmgt_error(error);
			return (0);
		} else {
			vdev_error("%s overlaps with %s\n", path, msg);
			free(msg);
		}

		ret = -1;
	}

	return (ret);
}