Esempio n. 1
0
static void
load_hotspare(set_t setno, mddb_recid_t recid)
{
	hot_spare_t	*hs;
	mddb_de_ic_t	*dep;
	mddb_rb32_t	*rbp;
	size_t		newreqsize;
	hot_spare_t	*b_hs;
	hot_spare32_od_t *s_hs;

	mddb_setrecprivate(recid, MD_PRV_GOTIT);

	dep = mddb_getrecdep(recid);
	dep->de_flags = MDDB_F_HOTSPARE;
	rbp = dep->de_rb;
	switch (rbp->rb_revision) {
	case MDDB_REV_RB:
	case MDDB_REV_RBFN:
		/*
		 * Needs to convert to internal 64 bit
		 */
		s_hs = (hot_spare32_od_t *)mddb_getrecaddr(recid);
		newreqsize = sizeof (hot_spare_t);
		b_hs = (hot_spare_t *)kmem_zalloc(newreqsize, KM_SLEEP);
		hs_convert((caddr_t)s_hs, (caddr_t)b_hs, SMALL_2_BIG);
		kmem_free(s_hs, dep->de_reqsize);
		dep->de_rb_userdata = b_hs;
		dep->de_reqsize = newreqsize;
		hs = b_hs;
		break;
	case MDDB_REV_RB64:
	case MDDB_REV_RB64FN:
		hs = (hot_spare_t *)mddb_getrecaddr_resize
			(recid, sizeof (*hs), 0);
		break;
	}
	MDDB_NOTE_FN(rbp->rb_revision, hs->hs_revision);

#if defined(_ILP32)
	if (hs->hs_revision & MD_64BIT_META_DEV) {
		char	devname[MD_MAX_CTDLEN];

		set_hot_spare_state(hs, HSS_BROKEN);
		(void) md_devname(setno, hs->hs_devnum, devname,
		    sizeof (devname));
		cmn_err(CE_NOTE, "%s is unavailable because 64 bit hotspares "
		    "are not accessible on a 32 bit kernel\n", devname);
	}
#endif

	ASSERT(hs != NULL);

	if (hs->hs_refcount == 0) {
		mddb_setrecprivate(recid, MD_PRV_PENDDEL);
		return;
	}

	hs->hs_next = (hot_spare_t *)md_set[setno].s_hs;
	md_set[setno].s_hs = (void *)hs;

	hs->hs_isopen = 0;

	hs->hs_devnum = md_getdevnum(setno, mddb_getsidenum(setno),
		hs->hs_key, MD_NOTRUST_DEVT);
}
Esempio n. 2
0
int
stripe_build_incore(void *p, int snarfing)
{
	ms_unit_t *un = (ms_unit_t *)p;
	struct ms_comp	*mdcomp;
	minor_t		mnum;
	int		row;
	int		i;
	int		c;
	int		ncomps;

	mnum = MD_SID(un);

	if (MD_UNIT(mnum) != NULL)
		return (0);

	MD_STATUS(un) = 0;

	/*
	 * Reset all the is_open flags, these are probably set
	 * cause they just came out of the database.
	 */
	mdcomp = (struct ms_comp *)((void *)&((char *)un)[un->un_ocomp]);

	ncomps = 0;
	for (row = 0; row < un->un_nrows; row++) {
		struct ms_row *mdr = &un->un_row[row];
		ncomps += mdr->un_ncomp;
	}

	for (row = 0; row < un->un_nrows; row++) {
		struct ms_row *mdr = &un->un_row[row];
		for (i = 0, c = mdr->un_icomp; i < mdr->un_ncomp; i++) {
			struct ms_comp		*mdc;
			set_t			setno;
			md_dev64_t		tmpdev;

			mdc = &mdcomp[c++];
			mdc->un_mirror.ms_flags &=
			    ~(MDM_S_ISOPEN | MDM_S_IOERR | MDM_S_RS_TRIED);

			if (!snarfing)
				continue;

			setno = MD_MIN2SET(mnum);

			tmpdev = md_getdevnum(setno, mddb_getsidenum(setno),
			    mdc->un_key, MD_NOTRUST_DEVT);
			mdc->un_dev = tmpdev;
			/*
			 * Check for hotspares. If the hotspares haven't been
			 * snarfed yet, stripe_open_all_devs() will do the
			 * remapping of the dev's later.
			 */
			if (mdc->un_mirror.ms_hs_id != 0) {
				mdc->un_mirror.ms_orig_dev = mdc->un_dev;
				(void) md_hot_spare_ifc(HS_MKDEV, 0, 0,
				    0, &mdc->un_mirror.ms_hs_id, NULL,
				    &tmpdev, NULL);
				mdc->un_dev = tmpdev;
			}
		}
	}

	/* place various information in the in-core data structures */
	md_nblocks_set(mnum, un->c.un_total_blocks);
	MD_UNIT(mnum) = un;

	return (0);
}