// Driver function to find the limits of a slice containing 'x'. // Logic varies according to whether the distribution is bounded // above, below, both, or neither. void SSS::find_limits(double x){ logp_slice_ = logf_(x) - rexp_mt(rng(), 1.0); check_finite(x,logp_slice_); bool limits_successfully_found = true; if(doubly_bounded()){ lo_ = lower_bound_; logplo_ = logf_(lo_); hi_ = upper_bound_; logphi_ = logf_(hi_); }else if (lower_bounded()){ lo_ = lower_bound_; logplo_ = logf_(lo_); limits_successfully_found = find_upper_limit(x); }else if(upper_bounded()){ limits_successfully_found = find_lower_limit(x); hi_ = upper_bound_; logphi_ = logf_(hi_); }else{ // unbounded limits_successfully_found = find_limits_unbounded(x); } check_slice(x); if (limits_successfully_found) { check_probs(x); } }
/* * Validate a device. */ int check_device(const char *path, boolean_t force, boolean_t isspare) { dm_descriptor_t desc; int err; char *dev; /* * For whole disks, libdiskmgt does not include the leading dev path. */ dev = strrchr(path, '/'); assert(dev != NULL); dev++; if ((desc = dm_get_descriptor_by_name(DM_ALIAS, dev, &err)) != NULL) { err = check_disk(path, desc, force, isspare); dm_free_descriptor(desc); return (err); } return (check_slice(path, force, B_FALSE, isspare)); }
/* ARGSUSED */ int check_disk(const char *name, dm_descriptor_t disk, int force, int isspare) { dm_descriptor_t *drive, *media, *slice; int err = 0; int i; int ret; /* * Get the drive associated with this disk. This should never fail, * because we already have an alias handle open for the device. */ if ((drive = dm_get_associated_descriptors(disk, DM_DRIVE, &err)) == NULL || *drive == NULL) { if (err) libdiskmgt_error(err); return (0); } if ((media = dm_get_associated_descriptors(*drive, DM_MEDIA, &err)) == NULL) { dm_free_descriptors(drive); if (err) libdiskmgt_error(err); return (0); } dm_free_descriptors(drive); /* * It is possible that the user has specified a removable media drive, * and the media is not present. */ if (*media == NULL) { dm_free_descriptors(media); vdev_error(gettext("'%s' has no media in drive\n"), name); return (-1); } if ((slice = dm_get_associated_descriptors(*media, DM_SLICE, &err)) == NULL) { dm_free_descriptors(media); if (err) libdiskmgt_error(err); return (0); } dm_free_descriptors(media); ret = 0; /* * Iterate over all slices and report any errors. We don't care about * overlapping slices because we are using the whole disk. */ for (i = 0; slice[i] != NULL; i++) { char *name = dm_get_name(slice[i], &err); if (check_slice(name, force, B_TRUE, isspare) != 0) ret = -1; dm_free_name(name); } dm_free_descriptors(slice); return (ret); }