diff options
author | tw21770 <none@none> | 2006-03-14 14:53:36 -0800 |
---|---|---|
committer | tw21770 <none@none> | 2006-03-14 14:53:36 -0800 |
commit | d7cd82522afdd890a66c7600b499590ad44e84bd (patch) | |
tree | 0799996b63c368edd3153e9f46468c93ebed25ff /usr/src/uts/common/io/lvm/raid/raid.c | |
parent | a62bb709433c06fe335121c07822de4984bdcb84 (diff) | |
download | illumos-joyent-d7cd82522afdd890a66c7600b499590ad44e84bd.tar.gz |
PSARC/2005/153 Bunnahabhain: Descriptive Name Support in SVM
4521995 Allow descriptive names for metadevices and hot spare pools
6396962 metareplace -c is obsolete and no longer needed.
Diffstat (limited to 'usr/src/uts/common/io/lvm/raid/raid.c')
-rw-r--r-- | usr/src/uts/common/io/lvm/raid/raid.c | 102 |
1 files changed, 72 insertions, 30 deletions
diff --git a/usr/src/uts/common/io/lvm/raid/raid.c b/usr/src/uts/common/io/lvm/raid/raid.c index e90c3d0e0c..d83ec8f2a2 100644 --- a/usr/src/uts/common/io/lvm/raid/raid.c +++ b/usr/src/uts/common/io/lvm/raid/raid.c @@ -1075,6 +1075,11 @@ reset_raid(mr_unit_t *un, minor_t mnum, int removing) kmem_free(un->mr_ic, sizeof (*un->mr_ic)); + /* + * Attempt release of its minor node + */ + (void) md_remove_minor_node(mnum); + if (!removing) return; @@ -1120,6 +1125,12 @@ reset_raid(mr_unit_t *un, minor_t mnum, int removing) raid_commit(un, recids); + /* + * Remove self from the namespace + */ + if (un->c.un_revision & MD_FN_META_DEV) { + (void) md_rem_selfname(un->c.un_self_id); + } /* Remove the unit structure */ mddb_deleterec_wrapper(un->c.un_record_id); @@ -3649,38 +3660,49 @@ raid_snarf(md_snarfcmd_t cmd, set_t setno) dep = mddb_getrecdep(recid); dep->de_flags = MDDB_F_RAID; rbp = dep->de_rb; - if ((rbp->rb_revision == MDDB_REV_RB) && - ((rbp->rb_private & MD_PRV_CONVD) == 0)) { - /* - * This means, we have an old and small record - * and this record hasn't already been converted. - * Before we create an incore metadevice from this - * we have to convert it to a big record. - */ - small_un = (mr_unit32_od_t *)mddb_getrecaddr(recid); - ncol = small_un->un_totalcolumncnt; - newreqsize = sizeof (mr_unit_t) + - ((ncol - 1) * sizeof (mr_column_t)); - big_un = (mr_unit_t *)kmem_zalloc(newreqsize, KM_SLEEP); - raid_convert((caddr_t)small_un, (caddr_t)big_un, - SMALL_2_BIG); - kmem_free(small_un, dep->de_reqsize); - dep->de_rb_userdata = big_un; - dep->de_reqsize = newreqsize; - un = big_un; - rbp->rb_private |= MD_PRV_CONVD; - } else { + switch (rbp->rb_revision) { + case MDDB_REV_RB: + case MDDB_REV_RBFN: + if ((rbp->rb_private & MD_PRV_CONVD) == 0) { + /* + * This means, we have an old and small record + * and this record hasn't already been + * converted. Before we create an incore + * metadevice from this we have to convert it to + * a big record. + */ + small_un = + (mr_unit32_od_t *)mddb_getrecaddr(recid); + ncol = small_un->un_totalcolumncnt; + newreqsize = sizeof (mr_unit_t) + + ((ncol - 1) * sizeof (mr_column_t)); + big_un = (mr_unit_t *)kmem_zalloc(newreqsize, + KM_SLEEP); + raid_convert((caddr_t)small_un, (caddr_t)big_un, + SMALL_2_BIG); + kmem_free(small_un, dep->de_reqsize); + dep->de_rb_userdata = big_un; + dep->de_reqsize = newreqsize; + un = big_un; + rbp->rb_private |= MD_PRV_CONVD; + } else { + /* + * Record has already been converted. Just + * get its address. + */ + un = (mr_unit_t *)mddb_getrecaddr(recid); + } + un->c.un_revision &= ~MD_64BIT_META_DEV; + break; + case MDDB_REV_RB64: + case MDDB_REV_RB64FN: /* Big device */ un = (mr_unit_t *)mddb_getrecaddr(recid); - } - - /* Set revision and flag accordingly */ - if (rbp->rb_revision == MDDB_REV_RB) { - un->c.un_revision = MD_32BIT_META_DEV; - } else { - un->c.un_revision = MD_64BIT_META_DEV; + un->c.un_revision |= MD_64BIT_META_DEV; un->c.un_flag |= MD_EFILABEL; + break; } + NOTE_FN(rbp->rb_revision, un->c.un_revision); /* * Create minor device node for snarfed entry. @@ -4255,6 +4277,7 @@ raid_imp_set( mddb_rb32_t *rbp; mr_unit_t *un64; mr_unit32_od_t *un32; + md_dev64_t self_devt; minor_t *self_id; /* minor needs to be updated */ md_parent_t *parent_id; /* parent needs to be updated */ mddb_recid_t *record_id; /* record id needs to be updated */ @@ -4273,7 +4296,9 @@ raid_imp_set( dep = mddb_getrecdep(recid); rbp = dep->de_rb; - if (rbp->rb_revision == MDDB_REV_RB) { + switch (rbp->rb_revision) { + case MDDB_REV_RB: + case MDDB_REV_RBFN: /* * Small device */ @@ -4295,7 +4320,9 @@ raid_imp_set( device->un_hs_id = MAKERECID( setno, device->un_hs_id); } - } else { + break; + case MDDB_REV_RB64: + case MDDB_REV_RB64FN: un64 = (mr_unit_t *)mddb_getrecaddr(recid); self_id = &(un64->c.un_self_id); parent_id = &(un64->c.un_parent); @@ -4314,6 +4341,21 @@ raid_imp_set( device->un_hs_id = MAKERECID( setno, device->un_hs_id); } + break; + } + + /* + * If this is a top level and a friendly name metadevice, + * update its minor in the namespace. + */ + if ((*parent_id == MD_NO_PARENT) && + ((rbp->rb_revision == MDDB_REV_RBFN) || + (rbp->rb_revision == MDDB_REV_RB64FN))) { + + self_devt = md_makedevice(md_major, *self_id); + if (!md_update_top_device_minor(setno, + mddb_getsidenum(setno), self_devt)) + goto out; } /* |