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