Пример #1
0
 // 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);
   }
 }
Пример #2
0
/*
 * 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));
}
Пример #3
0
/* 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);
}