summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/io/lvm/raid/raid.c
diff options
context:
space:
mode:
authortw21770 <none@none>2006-03-14 14:53:36 -0800
committertw21770 <none@none>2006-03-14 14:53:36 -0800
commitd7cd82522afdd890a66c7600b499590ad44e84bd (patch)
tree0799996b63c368edd3153e9f46468c93ebed25ff /usr/src/uts/common/io/lvm/raid/raid.c
parenta62bb709433c06fe335121c07822de4984bdcb84 (diff)
downloadillumos-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.c102
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;
}
/*