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); }
/* * 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); }