summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src')
-rw-r--r--usr/src/uts/common/io/devinfo.c23
-rw-r--r--usr/src/uts/common/io/lvm/md/md.c179
-rw-r--r--usr/src/uts/common/io/lvm/mirror/mirror.c7
-rw-r--r--usr/src/uts/common/io/lvm/mirror/mirror_ioctl.c5
-rw-r--r--usr/src/uts/common/io/lvm/raid/raid.c181
-rw-r--r--usr/src/uts/common/io/lvm/raid/raid_ioctl.c9
-rw-r--r--usr/src/uts/common/io/lvm/softpart/sp.c42
-rw-r--r--usr/src/uts/common/io/lvm/softpart/sp_ioctl.c6
-rw-r--r--usr/src/uts/common/io/lvm/stripe/stripe.c115
-rw-r--r--usr/src/uts/common/io/lvm/stripe/stripe_ioctl.c8
-rw-r--r--usr/src/uts/common/io/lvm/trans/mdtrans.c28
-rw-r--r--usr/src/uts/common/io/lvm/trans/trans_ioctl.c1
-rw-r--r--usr/src/uts/common/os/modctl.c9
-rw-r--r--usr/src/uts/common/os/sunddi.c15
-rw-r--r--usr/src/uts/common/sys/lvm/mdvar.h2
-rw-r--r--usr/src/uts/common/sys/sunddi.h3
16 files changed, 372 insertions, 261 deletions
diff --git a/usr/src/uts/common/io/devinfo.c b/usr/src/uts/common/io/devinfo.c
index a61d0b1bfa..1672e5311a 100644
--- a/usr/src/uts/common/io/devinfo.c
+++ b/usr/src/uts/common/io/devinfo.c
@@ -18,13 +18,12 @@
*
* CDDL HEADER END
*/
+
/*
* Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
-#pragma ident "%Z%%M% %I% %E% SMI"
-
/*
* driver for accessing kernel devinfo tree.
*/
@@ -364,7 +363,7 @@ static struct dev_ops di_ops = {
*/
static struct modldrv modldrv = {
&mod_driverops,
- "DEVINFO Driver %I%",
+ "DEVINFO Driver",
&di_ops
};
@@ -2951,8 +2950,22 @@ di_getprop_add(int list, int dyn, struct di_state *st, struct dev_info *dip,
pflags = aflags & ~DDI_PROP_TYPE_MASK;
pflags |= DDI_PROP_DONTPASS | DDI_PROP_NOTPROM |
DDI_PROP_CONSUMER_TYPED;
- rv = (*prop_op)(pdevt, (dev_info_t)dip, PROP_LEN_AND_VAL_ALLOC,
- pflags, name, &val, &len);
+
+ /*
+ * Hold and exit across prop_op(9E) to avoid lock order
+ * issues between
+ * [ndi_devi_enter() ..prop_op(9E).. driver-lock]
+ * .vs.
+ * [..ioctl(9E).. driver-lock ..ddi_remove_minor_node(9F)..
+ * ndi_devi_enter()]
+ * ordering.
+ */
+ ndi_hold_devi((dev_info_t *)dip);
+ ndi_devi_exit((dev_info_t *)dip, dip->devi_circular);
+ rv = (*prop_op)(pdevt, (dev_info_t *)dip,
+ PROP_LEN_AND_VAL_ALLOC, pflags, name, &val, &len);
+ ndi_devi_enter((dev_info_t *)dip, &dip->devi_circular);
+ ndi_rele_devi((dev_info_t *)dip);
if (rv == DDI_PROP_SUCCESS) {
need_free = 1; /* dynamic prop obtained */
diff --git a/usr/src/uts/common/io/lvm/md/md.c b/usr/src/uts/common/io/lvm/md/md.c
index e6661cc32d..e03eb67d85 100644
--- a/usr/src/uts/common/io/lvm/md/md.c
+++ b/usr/src/uts/common/io/lvm/md/md.c
@@ -18,13 +18,12 @@
*
* CDDL HEADER END
*/
+
/*
- * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
-#pragma ident "%Z%%M% %I% %E% SMI"
-
/*
* Md - is the meta-disk driver. It sits below the UFS file system
* but above the 'real' disk drivers, xy, id, sd etc.
@@ -75,6 +74,7 @@
#include <sys/kmem.h>
#include <sys/cladm.h>
#include <sys/priv_names.h>
+#include <sys/modhash.h>
#ifndef lint
char _depends_on[] = "strmod/rpcmod";
@@ -283,6 +283,76 @@ int md_maxphys = 0; /* maximum io size in bytes */
#define MD_MAXBCOUNT (1024 * 1024)
unsigned md_maxbcount = 0; /* maximum physio size in bytes */
+/*
+ * Some md ioctls trigger io framework device tree operations. An
+ * example is md ioctls that call md_resolve_bydevid(): which uses the
+ * io framework to resolve a devid. Such operations result in acquiring
+ * io framework locks (like ndi_devi_enter() of "/") while holding
+ * driver locks (like md_unit_writerlock()).
+ *
+ * The prop_op(9E) entry point is called from the devinfo driver with
+ * an active ndi_devi_enter of "/". To avoid deadlock, md's prop_op
+ * implementation must avoid taking a lock that is held per above md
+ * ioctl description: i.e. mdprop_op(9E) can't call md_unit_readerlock()
+ * without risking deadlock.
+ *
+ * To service "size" requests without risking deadlock, we maintain a
+ * "mnum->nblocks" sizemap (protected by a short-term global mutex).
+ */
+static kmutex_t md_nblocks_mutex;
+static mod_hash_t *md_nblocksmap; /* mnum -> nblocks */
+int md_nblocksmap_size = 512;
+
+/*
+ * Maintain "mnum->nblocks" sizemap for mdprop_op use:
+ *
+ * Create: any code that establishes a unit's un_total_blocks needs the
+ * following type of call to establish nblocks for mdprop_op():
+ * md_nblocks_set(mnum, un->c.un_total_blocks);"
+ * NOTE: locate via cscope md_create_minor_node/md_create_unit_incore
+ * ...or "MD_UNIT..*="
+ *
+ * Change: any code that changes a unit's un_total_blocks needs the
+ * following type of call to sync nblocks for mdprop_op():
+ * md_nblocks_set(mnum, un->c.un_total_blocks);"
+ * NOTE: locate via cscope for "un_total_blocks[ \t]*="
+ *
+ * Destroy: any code that deletes a unit needs the following type of call
+ * to sync nblocks for mdprop_op():
+ * md_nblocks_set(mnum, -1ULL);
+ * NOTE: locate via cscope md_remove_minor_node/md_destroy_unit_incore
+ * ...or "MD_UNIT..*="
+ */
+void
+md_nblocks_set(minor_t mnum, uint64_t nblocks)
+{
+ mutex_enter(&md_nblocks_mutex);
+ if (nblocks == -1ULL)
+ (void) mod_hash_destroy(md_nblocksmap,
+ (mod_hash_key_t)(intptr_t)mnum);
+ else
+ (void) mod_hash_replace(md_nblocksmap,
+ (mod_hash_key_t)(intptr_t)mnum,
+ (mod_hash_val_t)(intptr_t)nblocks);
+ mutex_exit(&md_nblocks_mutex);
+}
+
+/* get the size of a mnum from "mnum->nblocks" sizemap */
+uint64_t
+md_nblocks_get(minor_t mnum)
+{
+ mod_hash_val_t hv;
+
+ mutex_enter(&md_nblocks_mutex);
+ if (mod_hash_find(md_nblocksmap,
+ (mod_hash_key_t)(intptr_t)mnum, &hv) == 0) {
+ mutex_exit(&md_nblocks_mutex);
+ return ((uint64_t)(intptr_t)hv);
+ }
+ mutex_exit(&md_nblocks_mutex);
+ return (0);
+}
+
/* allocate/free dynamic space associated with driver globals */
void
md_global_alloc_free(int alloc)
@@ -298,7 +368,8 @@ md_global_alloc_free(int alloc)
rw_init(&ni_rwlp.lock, NULL, RW_DRIVER, NULL);
rw_init(&hsp_rwlp.lock, NULL, RW_DRIVER, NULL);
mutex_init(&md_cpr_resync.md_resync_mutex, NULL,
- MUTEX_DEFAULT, NULL);
+ MUTEX_DEFAULT, NULL);
+ mutex_init(&md_nblocks_mutex, NULL, MUTEX_DEFAULT, NULL);
/* initialize per set driver global locks */
for (s = 0; s < MD_MAXSETS; s++) {
@@ -319,6 +390,7 @@ md_global_alloc_free(int alloc)
}
/* destroy driver global locks */
+ mutex_destroy(&md_nblocks_mutex);
mutex_destroy(&md_cpr_resync.md_resync_mutex);
rw_destroy(&hsp_rwlp.lock);
rw_destroy(&ni_rwlp.lock);
@@ -500,8 +572,9 @@ mdattach(dev_info_t *dip, ddi_attach_cmd_t cmd)
&md_majortab_len) != DDI_PROP_SUCCESS) {
md_majortab_len = 0;
if (md_init_debug)
- cmn_err(CE_WARN, "md_targ_nm_table "
- "ddi_prop_lookup_string_array failed");
+ cmn_err(CE_WARN, "md_targ_nm_table "
+ "ddi_prop_lookup_string_array "
+ "failed");
goto attach_failure;
}
@@ -523,9 +596,9 @@ mdattach(dev_info_t *dip, ddi_attach_cmd_t cmd)
str2 = str + 1;
md_major_tuple_table[i].targ_maj = 0;
while ((*str2 >= '0') && (*str2 <= '9')) {
- md_major_tuple_table[i].targ_maj *= 10;
- md_major_tuple_table[i].targ_maj +=
- *str2++ - '0';
+ md_major_tuple_table[i].targ_maj *= 10;
+ md_major_tuple_table[i].targ_maj +=
+ *str2++ - '0';
}
*str = ' ';
}
@@ -543,10 +616,10 @@ mdattach(dev_info_t *dip, ddi_attach_cmd_t cmd)
* and set globals if these exist.
*/
md_keep_repl_state = ddi_getprop(DDI_DEV_T_ANY, dip,
- 0, "md_keep_repl_state", 0);
+ 0, "md_keep_repl_state", 0);
md_devid_destroy = ddi_getprop(DDI_DEV_T_ANY, dip,
- 0, "md_devid_destroy", 0);
+ 0, "md_devid_destroy", 0);
if (MD_UPGRADE)
md_major_targ = md_targ_name_to_major("md");
@@ -618,6 +691,10 @@ mdattach(dev_info_t *dip, ddi_attach_cmd_t cmd)
}
}
+ /* create the hash to store the meta device sizes */
+ md_nblocksmap = mod_hash_create_idhash("md_nblocksmap",
+ md_nblocksmap_size, mod_hash_null_valdtor);
+
MD_CLR_IN(IN_ATTACH);
return (DDI_SUCCESS);
@@ -700,7 +777,8 @@ mddetach(dev_info_t *dip, ddi_detach_cmd_t cmd)
int i;
for (i = 0; non_ff_drivers[i] != NULL; i++)
- kmem_free(non_ff_drivers[i], strlen(non_ff_drivers[i]) + 1);
+ kmem_free(non_ff_drivers[i],
+ strlen(non_ff_drivers[i]) + 1);
/* free i+1 entries because there is a null entry at list end */
kmem_free(non_ff_drivers, (i + 1) * sizeof (char *));
@@ -739,6 +817,9 @@ mddetach(dev_info_t *dip, ddi_detach_cmd_t cmd)
ddi_remove_minor_node(dip, NULL);
med_fini();
+
+ mod_hash_destroy_idhash(md_nblocksmap);
+
md_devinfo = NULL;
MD_CLR_IN(IN_DETACH);
@@ -786,43 +867,8 @@ mdprop_op(
caddr_t valuep, /* where to put property value */
int *lengthp) /* put length of property here */
{
- minor_t mnum;
- set_t setno;
- md_unit_t *un;
- mdi_unit_t *ui;
- uint64_t nblocks64;
-
- /*
- * Our dynamic properties are all device specific and size oriented.
- * Requests issued under conditions where size is valid are passed
- * to ddi_prop_op_nblocks with the size information, otherwise the
- * request is passed to ddi_prop_op. Make sure that the minor device
- * is a valid part of the Virtual Disk subsystem.
- */
- mnum = getminor(dev);
- setno = MD_MIN2SET(mnum);
- if ((dev == DDI_DEV_T_ANY) || (mnum == MD_ADM_MINOR) ||
- (setno >= md_nsets) || (MD_MIN2UNIT(mnum) >= md_nunits)) {
-pass: return (ddi_prop_op(dev, dip, prop_op, mod_flags,
- name, valuep, lengthp));
- } else {
- rw_enter(&md_unit_array_rw.lock, RW_READER);
- if (((md_get_setstatus(setno) & MD_SET_SNARFED) == 0) ||
- ((ui = MDI_UNIT(mnum)) == NULL)) {
- rw_exit(&md_unit_array_rw.lock);
- goto pass;
- }
-
- /* get nblocks value */
- un = (md_unit_t *)md_unit_readerlock(ui);
- nblocks64 = un->c.un_total_blocks;
- md_unit_readerexit(ui);
- rw_exit(&md_unit_array_rw.lock);
-
- return (ddi_prop_op_nblocks(dev, dip, prop_op, mod_flags,
- name, valuep, lengthp, nblocks64));
- }
-
+ return (ddi_prop_op_nblocks(dev, dip, prop_op, mod_flags,
+ name, valuep, lengthp, md_nblocks_get(getminor(dev))));
}
static void
@@ -871,15 +917,14 @@ md_print_block_usage(mddb_set_t *s, uint_t blks)
max_blk_needed = s->s_totalblkcnt - s->s_freeblkcnt + blks;
-
cmn_err(CE_WARN, "Blocks in Metadevice State Database: %d\n"
- " Additional Blocks Needed: %d\n\n"
- " Increase size of following replicas for\n"
- " device relocatability by deleting listed\n"
- " replica and re-adding replica with\n"
- " increased size (see metadb(1M)):\n"
- " Replica Increase By",
- s->s_totalblkcnt, (blks - s->s_freeblkcnt));
+ " Additional Blocks Needed: %d\n\n"
+ " Increase size of following replicas for\n"
+ " device relocatability by deleting listed\n"
+ " replica and re-adding replica with\n"
+ " increased size (see metadb(1M)):\n"
+ " Replica Increase By",
+ s->s_totalblkcnt, (blks - s->s_freeblkcnt));
lbp = s->s_lbp;
@@ -897,7 +942,7 @@ md_print_block_usage(mddb_set_t *s, uint_t blks)
slp = &lbp->lb_sidelocators[s->s_sideno][li];
drv_index = slp->l_drvnm_index;
mddb_locatorblock2splitname(s->s_lnp, li, s->s_sideno,
- &sn);
+ &sn);
prefixlen = SPN_PREFIX(&sn).pre_len;
suffixlen = SPN_SUFFIX(&sn).suf_len;
alloc_sz = (int)(prefixlen + suffixlen + 2);
@@ -910,10 +955,10 @@ md_print_block_usage(mddb_set_t *s, uint_t blks)
suffixlen);
name[prefixlen + suffixlen + 1] = '\0';
cmn_err(CE_WARN,
- " %s (%s:%d:%d) %d blocks",
- name, lbp->lb_drvnm[drv_index].dn_data,
- slp->l_mnum, lbp->lb_locators[li].l_blkno,
- (max_blk_needed - ib));
+ " %s (%s:%d:%d) %d blocks",
+ name, lbp->lb_drvnm[drv_index].dn_data,
+ slp->l_mnum, lbp->lb_locators[li].l_blkno,
+ (max_blk_needed - ib));
kmem_free(name, alloc_sz);
}
}
@@ -945,14 +990,14 @@ md_create_minor_node(set_t setno, minor_t mnum)
return (1);
(void) snprintf(name, 20, "%u,%u,blk",
- (unsigned)setno, (unsigned)MD_MIN2UNIT(mnum));
+ (unsigned)setno, (unsigned)MD_MIN2UNIT(mnum));
if (ddi_create_minor_node(md_devinfo, name, S_IFBLK,
MD_MKMIN(setno, mnum), DDI_PSEUDO, 0))
return (1);
(void) snprintf(name, 20, "%u,%u,raw",
- (unsigned)setno, (unsigned)MD_MIN2UNIT(mnum));
+ (unsigned)setno, (unsigned)MD_MIN2UNIT(mnum));
if (ddi_create_minor_node(md_devinfo, name, S_IFCHR,
MD_MKMIN(setno, mnum), DDI_PSEUDO, 0))
@@ -993,7 +1038,7 @@ md_verify_orphaned_record(set_t setno, mdkey_t key)
if ((odev == NODEV64) || (md_getmajor(odev) == md_major))
return (0);
if (lookup_entry(did_nh, setno, side, key, odev, NM_DEVID) ==
- NULL)
+ NULL)
return (1);
}
return (0);
@@ -1152,7 +1197,7 @@ md_snarf_db_set(set_t setno, md_error_t *ep)
if (md_loadsubmod(setno, md_getshared_name(setno, drvrid),
drvrid) < 0) {
cmn_err(CE_NOTE, "md: could not load misc/%s",
- md_getshared_name(setno, drvrid));
+ md_getshared_name(setno, drvrid));
}
}
@@ -1874,7 +1919,7 @@ mdioctl(dev_t dev, int cmd, intptr_t data, int mode, cred_t *cred_p,
*/
if (mnum == MD_ADM_MINOR) {
err = md_admin_ioctl(md_expldev(dev), cmd, (void *) data,
- mode, &lock);
+ mode, &lock);
}
/*
diff --git a/usr/src/uts/common/io/lvm/mirror/mirror.c b/usr/src/uts/common/io/lvm/mirror/mirror.c
index 64508020b9..f97b46d850 100644
--- a/usr/src/uts/common/io/lvm/mirror/mirror.c
+++ b/usr/src/uts/common/io/lvm/mirror/mirror.c
@@ -18,13 +18,12 @@
*
* CDDL HEADER END
*/
+
/*
* Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
-#pragma ident "%Z%%M% %I% %E% SMI"
-
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/conf.h>
@@ -1884,7 +1883,10 @@ mirror_build_incore(mm_unit_t *un, int snarfing)
mutex_init(&un->un_dmr_mx, NULL, MUTEX_DEFAULT, NULL);
cv_init(&un->un_dmr_cv, NULL, CV_DEFAULT, NULL);
+ /* place various information in the in-core data structures */
+ md_nblocks_set(MD_SID(un), un->c.un_total_blocks);
MD_UNIT(MD_SID(un)) = un;
+
return (0);
}
@@ -1916,6 +1918,7 @@ reset_mirror(struct mm_unit *un, minor_t mnum, int removing)
if (un->un_resync_bm)
kmem_free((caddr_t)un->un_resync_bm, bitcnt);
+ md_nblocks_set(mnum, -1ULL);
MD_UNIT(mnum) = NULL;
/*
diff --git a/usr/src/uts/common/io/lvm/mirror/mirror_ioctl.c b/usr/src/uts/common/io/lvm/mirror/mirror_ioctl.c
index a2b55f056d..8e8d8dc496 100644
--- a/usr/src/uts/common/io/lvm/mirror/mirror_ioctl.c
+++ b/usr/src/uts/common/io/lvm/mirror/mirror_ioctl.c
@@ -249,14 +249,18 @@ mirror_set(
continue;
/* mirror creation should fail here */
+ md_nblocks_set(mnum, -1ULL);
MD_UNIT(mnum) = NULL;
+
mddb_deleterec_wrapper(recid);
return (mdmderror(&msp->mde, MDE_IN_USE,
md_getminor(sm->sm_dev)));
}
if (err = mirror_build_incore(un, 0)) {
+ md_nblocks_set(mnum, -1ULL);
MD_UNIT(mnum) = NULL;
+
mddb_deleterec_wrapper(recid);
return (err);
}
@@ -1366,6 +1370,7 @@ mirror_grow_unit(
current_tb = (total_blocks/spc) * spc;
un->c.un_total_blocks = current_tb;
+ md_nblocks_set(mnum, un->c.un_total_blocks);
un->c.un_actual_tb = total_blocks;
/* Is the mirror growing from 32 bit device to 64 bit device? */
diff --git a/usr/src/uts/common/io/lvm/raid/raid.c b/usr/src/uts/common/io/lvm/raid/raid.c
index 8f9c9990e5..22ae2f547c 100644
--- a/usr/src/uts/common/io/lvm/raid/raid.c
+++ b/usr/src/uts/common/io/lvm/raid/raid.c
@@ -18,13 +18,12 @@
*
* CDDL HEADER END
*/
+
/*
- * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
-#pragma ident "%Z%%M% %I% %E% SMI"
-
/*
* NAME: raid.c
*
@@ -197,9 +196,7 @@ raid_set_state(mr_unit_t *un, int col, rcs_state_t newstate, int force)
rus_state_t unitstate, origstate;
rcs_state_t colstate;
rcs_state_t orig_colstate;
- int errcnt = 0,
- okaycnt = 0,
- resynccnt = 0;
+ int errcnt = 0, okaycnt = 0, resynccnt = 0;
int i;
char *devname;
@@ -293,7 +290,7 @@ raid_set_state(mr_unit_t *un, int col, rcs_state_t newstate, int force)
if ((! (origstate & (RUS_ERRED|RUS_LAST_ERRED|RUS_DOI))) &&
(unitstate & (RUS_ERRED|RUS_LAST_ERRED|RUS_DOI))) {
devname = md_devname(MD_UN2SET(un),
- un->un_column[col].un_dev, NULL, 0);
+ un->un_column[col].un_dev, NULL, 0);
cmn_err(CE_WARN, "md: %s: %s needs maintenance",
md_shortname(MD_SID(un)), devname);
@@ -856,8 +853,7 @@ raid_build_incore(void *p, int snarfing)
mr_column_t *column;
int iosize;
md_dev64_t hs, dev;
- int resync_cnt = 0,
- error_cnt = 0;
+ int resync_cnt = 0, error_cnt = 0;
hs = NODEV64;
dev = NODEV64;
@@ -881,7 +877,7 @@ raid_build_incore(void *p, int snarfing)
un->un_column_ic = (mr_column_ic_t *)
kmem_zalloc(sizeof (mr_column_ic_t) *
- un->un_totalcolumncnt, KM_SLEEP);
+ un->un_totalcolumncnt, KM_SLEEP);
for (i = 0; i < un->un_totalcolumncnt; i++) {
@@ -957,12 +953,13 @@ raid_build_incore(void *p, int snarfing)
if ((preserve_flags &
(MD_RAID_COPY_RESYNC |
MD_RAID_REGEN_RESYNC)) == 0) {
- if (column->un_alt_dev != NODEV64)
- preserve_flags |=
- MD_RAID_COPY_RESYNC;
- else
- preserve_flags |=
- MD_RAID_REGEN_RESYNC;
+ if (column->un_alt_dev !=
+ NODEV64)
+ preserve_flags |=
+ MD_RAID_COPY_RESYNC;
+ else
+ preserve_flags |=
+ MD_RAID_REGEN_RESYNC;
}
}
} else { /* no hot spares */
@@ -1026,8 +1023,10 @@ raid_build_incore(void *p, int snarfing)
mutex_init(&un->un_linlck_mx, NULL, MUTEX_DEFAULT, NULL);
cv_init(&un->un_linlck_cv, NULL, CV_DEFAULT, NULL);
un->un_linlck_chn = NULL;
- MD_UNIT(mnum) = un;
+ /* place various information in the in-core data structures */
+ md_nblocks_set(mnum, un->c.un_total_blocks);
+ MD_UNIT(mnum) = un;
return (0);
}
@@ -1055,6 +1054,7 @@ reset_raid(mr_unit_t *un, minor_t mnum, int removing)
md_destroy_unit_incore(mnum, &raid_md_ops);
+ md_nblocks_set(mnum, -1ULL);
MD_UNIT(mnum) = NULL;
if (un->un_pbuffer) {
@@ -1071,7 +1071,7 @@ reset_raid(mr_unit_t *un, minor_t mnum, int removing)
raid_free_pw_reservation(un, i);
kmem_free(un->un_column_ic, sizeof (mr_column_ic_t) *
- un->un_totalcolumncnt);
+ un->un_totalcolumncnt);
kmem_free(un->mr_ic, sizeof (*un->mr_ic));
@@ -1609,7 +1609,7 @@ raid_read_error(md_raidcs_t *cs)
/* now schedule processing for possible state change */
daemon_request(&md_mstr_daemon, raid_rderr,
- (daemon_queue_t *)cs, REQ_OLD);
+ (daemon_queue_t *)cs, REQ_OLD);
}
@@ -2004,11 +2004,11 @@ raid_dcolumn(diskaddr_t segment, mr_unit_t *un)
if (segment >= max_orig_segment) {
adj_seg = segment - max_orig_segment;
column = un->un_origcolumncnt +
- (uint_t)(adj_seg / un->un_segsincolumn);
+ (uint_t)(adj_seg / un->un_segsincolumn);
} else {
line = segment / (un->un_origcolumncnt - 1);
- column = (uint_t)((segment % (un->un_origcolumncnt - 1) + line)
- % un->un_origcolumncnt);
+ column = (uint_t)((segment %
+ (un->un_origcolumncnt - 1) + line) % un->un_origcolumncnt);
}
return (column);
}
@@ -2028,8 +2028,8 @@ raid_pcolumn(diskaddr_t segment, mr_unit_t *un)
} else {
line = segment / (un->un_origcolumncnt - 1);
}
- column = (uint_t)((line + (un->un_origcolumncnt - 1))
- % un->un_origcolumncnt);
+ column = (uint_t)((line + (un->un_origcolumncnt - 1)) %
+ un->un_origcolumncnt);
return (column);
}
@@ -2067,7 +2067,7 @@ raid_check_cols(mr_unit_t *un)
* use the hotspare key
*/
tmpdev = md_resolve_bydevid(mnum, tmpdev, HOTSPARED(un, i) ?
- colptr->un_hs_key : colptr->un_orig_key);
+ colptr->un_hs_key : colptr->un_orig_key);
if (tmpdev == NODEV64) {
err = 1;
@@ -2254,7 +2254,7 @@ raid_done(struct buf *bp)
if (flags & MD_RCS_ERROR) {
if (cs->cs_error_call) {
daemon_request(&md_done_daemon, cs->cs_error_call,
- (daemon_queue_t *)cs, REQ_OLD);
+ (daemon_queue_t *)cs, REQ_OLD);
}
return;
}
@@ -2265,7 +2265,7 @@ raid_done(struct buf *bp)
return;
}
daemon_request(&md_done_daemon, cs->cs_call,
- (daemon_queue_t *)cs, REQ_OLD);
+ (daemon_queue_t *)cs, REQ_OLD);
}
/*
* the flag RIO_EXTRA is used when dealing with a column in the process
@@ -2429,12 +2429,12 @@ genstandardparity(md_raidcs_t *cs)
}
RAID_FILLIN_RPW(cs->cs_dbuffer, cs->cs_un, dsum, cs->cs_pcolumn,
- cs->cs_blkno, cs->cs_blkcnt, cs->cs_pwid,
- 2, cs->cs_dcolumn, RAID_PWMAGIC);
+ cs->cs_blkno, cs->cs_blkcnt, cs->cs_pwid,
+ 2, cs->cs_dcolumn, RAID_PWMAGIC);
RAID_FILLIN_RPW(cs->cs_pbuffer, cs->cs_un, psum, cs->cs_dcolumn,
- cs->cs_blkno, cs->cs_blkcnt, cs->cs_pwid,
- 2, cs->cs_pcolumn, RAID_PWMAGIC);
+ cs->cs_blkno, cs->cs_blkcnt, cs->cs_pwid,
+ 2, cs->cs_pcolumn, RAID_PWMAGIC);
}
static void
@@ -2493,8 +2493,8 @@ genlineparity(md_raidcs_t *cs)
}
RAID_FILLIN_RPW(cs->cs_dbuffer, un, dsum, cs->cs_pcolumn,
- cs->cs_blkno, cs->cs_blkcnt, cs->cs_pwid,
- un->un_totalcolumncnt, cs->cs_dcolumn, RAID_PWMAGIC);
+ cs->cs_blkno, cs->cs_blkcnt, cs->cs_pwid,
+ un->un_totalcolumncnt, cs->cs_dcolumn, RAID_PWMAGIC);
raidio(cs, RIO_PREWRITE | RIO_DATA);
@@ -2574,8 +2574,8 @@ genlineparity(md_raidcs_t *cs)
}
}
RAID_FILLIN_RPW(cbuf->cbuf_buffer, un, dsum, cs->cs_pcolumn,
- cs->cs_blkno, cs->cs_blkcnt, cs->cs_pwid,
- un->un_totalcolumncnt, col, RAID_PWMAGIC);
+ cs->cs_blkno, cs->cs_blkcnt, cs->cs_pwid,
+ un->un_totalcolumncnt, col, RAID_PWMAGIC);
/*
* fill in buffer for write to prewrite area
@@ -2593,12 +2593,12 @@ genlineparity(md_raidcs_t *cs)
bp->b_edev = md_dev64_to_dev(un->un_column[col].un_dev);
bp->b_chain = (struct buf *)cs;
md_call_strategy(bp,
- cs->cs_strategy_flag, cs->cs_strategy_private);
+ cs->cs_strategy_flag, cs->cs_strategy_private);
}
RAID_FILLIN_RPW(cs->cs_pbuffer, un, psum, cs->cs_dcolumn,
- cs->cs_blkno, cs->cs_blkcnt, cs->cs_pwid,
- un->un_totalcolumncnt, cs->cs_pcolumn, RAID_PWMAGIC);
+ cs->cs_blkno, cs->cs_blkcnt, cs->cs_pwid,
+ un->un_totalcolumncnt, cs->cs_pcolumn, RAID_PWMAGIC);
raidio(cs, RIO_PREWRITE | RIO_PARITY);
}
@@ -2676,14 +2676,14 @@ raid_read_io(mr_unit_t *un, md_raidcs_t *cs)
if (COLUMN_ISOKAY(un, cs->cs_dcolumn) ||
(COLUMN_ISLASTERR(un, cs->cs_dcolumn) &&
- (cs->cs_flags & MD_RCS_RECOVERY) == 0)) {
+ (cs->cs_flags & MD_RCS_RECOVERY) == 0)) {
dev_t ddi_dev; /* needed for bioclone, so not md_dev64_t */
ddi_dev = md_dev64_to_dev(column->un_dev);
bp = &cs->cs_dbuf;
bp = md_bioclone(pb, cs->cs_offset, cs->cs_bcount, ddi_dev,
- column->un_devstart + cs->cs_blkno,
- (int (*)())raid_done, bp, KM_NOSLEEP);
+ column->un_devstart + cs->cs_blkno,
+ (int (*)())raid_done, bp, KM_NOSLEEP);
bp->b_chain = (buf_t *)cs;
@@ -2973,7 +2973,7 @@ raid_write_error(md_raidcs_t *cs)
cmn_err(CE_WARN, "md %s: write error on %s",
md_shortname(MD_SID(un)),
md_devname(setno, md_expldev(cbuf->cbuf_bp.b_edev),
- NULL, 0));
+ NULL, 0));
md_unit_readerexit(ui);
@@ -2981,7 +2981,7 @@ raid_write_error(md_raidcs_t *cs)
/* now schedule processing for possible state change */
daemon_request(&md_mstr_daemon, raid_wrerr,
- (daemon_queue_t *)cs, REQ_OLD);
+ (daemon_queue_t *)cs, REQ_OLD);
}
@@ -3057,8 +3057,8 @@ raid_write_ploop(md_raidcs_t *cs)
pbuf++;
}
RAID_FILLIN_RPW(cs->cs_pbuffer, un, psum, -1,
- cs->cs_blkno, cs->cs_blkcnt, cs->cs_pwid,
- 1, cs->cs_pcolumn, RAID_PWMAGIC);
+ cs->cs_blkno, cs->cs_blkcnt, cs->cs_pwid,
+ 1, cs->cs_pcolumn, RAID_PWMAGIC);
cs->cs_stage = RAID_NONE;
cs->cs_call = raid_write_ponly;
@@ -3217,8 +3217,8 @@ raid_write_io(mr_unit_t *un, md_raidcs_t *cs)
ubuf++;
}
RAID_FILLIN_RPW(cs->cs_dbuffer, un, dsum, -1,
- cs->cs_blkno, cs->cs_blkcnt, cs->cs_pwid,
- 1, cs->cs_dcolumn, RAID_PWMAGIC);
+ cs->cs_blkno, cs->cs_blkcnt, cs->cs_pwid,
+ 1, cs->cs_dcolumn, RAID_PWMAGIC);
cs->cs_frags = 1;
cs->cs_stage = RAID_NONE;
cs->cs_call = raid_write_donly;
@@ -3383,15 +3383,15 @@ raid_stage(md_raidcs_t *cs)
int flag;
switch (cs->cs_stage) {
- case RAID_READ_DONE:
+ case RAID_READ_DONE:
raid_free_child(cs, 1);
/* decrement readfrags */
raid_free_parent(ps, RFP_DECR_READFRAGS | RFP_RLS_LOCK);
return;
- case RAID_WRITE_DONE:
- case RAID_WRITE_PONLY_DONE:
- case RAID_WRITE_DONLY_DONE:
+ case RAID_WRITE_DONE:
+ case RAID_WRITE_PONLY_DONE:
+ case RAID_WRITE_DONLY_DONE:
/*
* Completed writing real parity and/or data.
*/
@@ -3401,7 +3401,7 @@ raid_stage(md_raidcs_t *cs)
raid_free_parent(ps, RFP_DECR_FRAGS | RFP_RLS_LOCK);
return;
- case RAID_PREWRITE_DONE:
+ case RAID_PREWRITE_DONE:
/*
* completed writing data and parity to prewrite entries
*/
@@ -3433,7 +3433,7 @@ raid_stage(md_raidcs_t *cs)
}
return;
- case RAID_LINE_PWDONE:
+ case RAID_LINE_PWDONE:
ASSERT(cs->cs_frags == 0);
raid_free_parent(ps, RFP_DECR_PWFRAGS);
cs->cs_flags |= MD_RCS_PWDONE;
@@ -3460,7 +3460,7 @@ raid_stage(md_raidcs_t *cs)
bp->b_flags |= B_WRITE | B_BUSY;
bp->b_iodone = (int (*)())raid_done;
bp->b_edev = md_dev64_to_dev(
- un->un_column[cbuf->cbuf_column].un_dev);
+ un->un_column[cbuf->cbuf_column].un_dev);
bp->b_chain = (struct buf *)cs;
private = cs->cs_strategy_private;
flag = cs->cs_strategy_flag;
@@ -3473,7 +3473,7 @@ raid_stage(md_raidcs_t *cs)
}
return;
- default:
+ default:
ASSERT(0);
break;
}
@@ -3676,11 +3676,11 @@ raid_snarf(md_snarfcmd_t cmd, set_t setno)
(mr_unit32_od_t *)mddb_getrecaddr(recid);
ncol = small_un->un_totalcolumncnt;
newreqsize = sizeof (mr_unit_t) +
- ((ncol - 1) * sizeof (mr_column_t));
+ ((ncol - 1) * sizeof (mr_column_t));
big_un = (mr_unit_t *)kmem_zalloc(newreqsize,
- KM_SLEEP);
+ KM_SLEEP);
raid_convert((caddr_t)small_un, (caddr_t)big_un,
- SMALL_2_BIG);
+ SMALL_2_BIG);
kmem_free(small_un, dep->de_reqsize);
dep->de_rb_userdata = big_un;
dep->de_reqsize = newreqsize;
@@ -3717,12 +3717,11 @@ raid_snarf(md_snarfcmd_t cmd, set_t setno)
all_raid_gotten = 0;
if (raid_build_incore((void *)un, 1) == 0) {
mddb_setrecprivate(recid, MD_PRV_GOTIT);
- md_create_unit_incore(MD_SID(un), &raid_md_ops,
- 1);
+ md_create_unit_incore(MD_SID(un), &raid_md_ops, 1);
gotsomething = 1;
} else if (un->mr_ic) {
kmem_free(un->un_column_ic, sizeof (mr_column_ic_t) *
- un->un_totalcolumncnt);
+ un->un_totalcolumncnt);
kmem_free(un->mr_ic, sizeof (*un->mr_ic));
}
}
@@ -3808,7 +3807,7 @@ raid_close_all_devs(mr_unit_t *un, int init_pw, int md_cflags)
(device->un_dev != NODEV64));
if ((device->un_devstate & RCS_OKAY) && init_pw)
(void) init_pw_area(un, device->un_dev,
- device->un_pwstart, i);
+ device->un_pwstart, i);
md_layered_close(device->un_dev, md_cflags);
device->un_devflags &= ~MD_RAID_DEV_ISOPEN;
}
@@ -3855,9 +3854,9 @@ raid_open_all_devs(mr_unit_t *un, int md_oflags)
* Open by device id
*/
key = HOTSPARED(un, i) ?
- device->un_hs_key : device->un_orig_key;
+ device->un_hs_key : device->un_orig_key;
if ((md_getmajor(tmpdev) != md_major) &&
- md_devid_found(setno, side, key) == 1) {
+ md_devid_found(setno, side, key) == 1) {
tmpdev = md_resolve_bydevid(mnum, tmpdev, key);
}
if (md_layered_open(mnum, &tmpdev, md_oflags)) {
@@ -3872,10 +3871,9 @@ raid_open_all_devs(mr_unit_t *un, int md_oflags)
/* if open errors and errored devices are 1 then device can run */
if (not_opened > 1) {
cmn_err(CE_WARN,
- "md: %s failed to open. open error on %s\n",
- md_shortname(MD_SID(un)),
- md_devname(MD_UN2SET(un), device->un_orig_dev,
- NULL, 0));
+ "md: %s failed to open. open error on %s\n",
+ md_shortname(MD_SID(un)),
+ md_devname(MD_UN2SET(un), device->un_orig_dev, NULL, 0));
ui->ui_tstate |= MD_INACCESSIBLE;
@@ -3952,7 +3950,7 @@ raid_internal_open(minor_t mnum, int flag, int otyp, int md_oflags)
* raid_init_columns sets md_unit_isopen to block reset, halt.
*/
if ((UNIT_STATE(un) & (RUS_INIT | RUS_DOI)) &&
- !(md_oflags & MD_OFLG_ISINIT)) {
+ !(md_oflags & MD_OFLG_ISINIT)) {
md_unit_openclose_exit(ui);
return (EAGAIN);
}
@@ -4101,7 +4099,7 @@ raid_probe_close_all_devs(mr_unit_t *un)
if (device->un_devflags & MD_RAID_DEV_PROBEOPEN) {
md_layered_close(device->un_dev,
- MD_OFLG_PROBEDEV);
+ MD_OFLG_PROBEDEV);
device->un_devflags &= ~MD_RAID_DEV_PROBEOPEN;
}
}
@@ -4155,9 +4153,9 @@ raid_probe_dev(mdi_unit_t *ui, minor_t mnum)
* Open by device id
*/
tmpdev = md_resolve_bydevid(mnum, tmpdev, HOTSPARED(un, i)?
- device->un_hs_key : device->un_orig_key);
+ device->un_hs_key : device->un_orig_key);
if (md_layered_open(mnum, &tmpdev,
- MD_OFLG_CONT_ERRS | MD_OFLG_PROBEDEV)) {
+ MD_OFLG_CONT_ERRS | MD_OFLG_PROBEDEV)) {
device->un_dev = tmpdev;
not_opened++;
continue;
@@ -4188,10 +4186,9 @@ raid_probe_dev(mdi_unit_t *ui, minor_t mnum)
if (not_opened > 1 && !md_devopen) {
cmn_err(CE_WARN,
- "md: %s failed to open. open error on %s\n",
- md_shortname(MD_SID(un)),
- md_devname(MD_UN2SET(un), device->un_orig_dev,
- NULL, 0));
+ "md: %s failed to open. open error on %s\n",
+ md_shortname(MD_SID(un)),
+ md_devname(MD_UN2SET(un), device->un_orig_dev, NULL, 0));
SE_NOTIFY(EC_SVM_STATE, ESC_SVM_OPEN_FAIL, SVM_TAG_METADEVICE,
MD_UN2SET(un), MD_SID(un));
raid_probe_close_all_devs(un);
@@ -4310,16 +4307,16 @@ raid_imp_set(
hsp_id = &(un32->un_hsp_id);
for (i = 0; i < un32->un_totalcolumncnt; i++) {
- mr_column32_od_t *device;
+ mr_column32_od_t *device;
- device = &un32->un_column[i];
- if (!md_update_minor(setno, mddb_getsidenum
- (setno), device->un_orig_key))
- goto out;
+ device = &un32->un_column[i];
+ if (!md_update_minor(setno, mddb_getsidenum
+ (setno), device->un_orig_key))
+ goto out;
- if (device->un_hs_id != 0)
- device->un_hs_id = MAKERECID(
- setno, device->un_hs_id);
+ if (device->un_hs_id != 0)
+ device->un_hs_id =
+ MAKERECID(setno, device->un_hs_id);
}
break;
case MDDB_REV_RB64:
@@ -4331,16 +4328,16 @@ raid_imp_set(
hsp_id = &(un64->un_hsp_id);
for (i = 0; i < un64->un_totalcolumncnt; i++) {
- mr_column_t *device;
+ mr_column_t *device;
- device = &un64->un_column[i];
- if (!md_update_minor(setno, mddb_getsidenum
- (setno), device->un_orig_key))
- goto out;
+ device = &un64->un_column[i];
+ if (!md_update_minor(setno, mddb_getsidenum
+ (setno), device->un_orig_key))
+ goto out;
- if (device->un_hs_id != 0)
- device->un_hs_id = MAKERECID(
- setno, device->un_hs_id);
+ if (device->un_hs_id != 0)
+ device->un_hs_id =
+ MAKERECID(setno, device->un_hs_id);
}
break;
}
diff --git a/usr/src/uts/common/io/lvm/raid/raid_ioctl.c b/usr/src/uts/common/io/lvm/raid/raid_ioctl.c
index 65a8a9d6ed..b1de6b7d1f 100644
--- a/usr/src/uts/common/io/lvm/raid/raid_ioctl.c
+++ b/usr/src/uts/common/io/lvm/raid/raid_ioctl.c
@@ -603,6 +603,7 @@ raid_init_columns(minor_t mnum)
un->un_state = RUS_OKAY;
else {
un->c.un_total_blocks = un->un_grow_tb;
+ md_nblocks_set(mnum, un->c.un_total_blocks);
un->un_grow_tb = 0;
if (raid_state_cnt(un, RCS_OKAY) ==
un->un_totalcolumncnt)
@@ -979,7 +980,10 @@ raid_set(void *d, int mode)
un->un_totalcolumncnt);
kmem_free(un->mr_ic, sizeof (*un->mr_ic));
}
+
+ md_nblocks_set(mnum, -1ULL);
MD_UNIT(mnum) = NULL;
+
mddb_deleterec_wrapper(mr_recid);
goto out;
}
@@ -995,7 +999,9 @@ raid_set(void *d, int mode)
err = md_hot_spare_ifc(HSP_INCREF, un->un_hsp_id, 0, 0,
&recids[rid], NULL, NULL, NULL);
if (err) {
+ md_nblocks_set(mnum, -1ULL);
MD_UNIT(mnum) = NULL;
+
mddb_deleterec_wrapper(mr_recid);
goto out;
}
@@ -1914,6 +1920,9 @@ raid_grow(void *mgp, int mode, IOLOCK *lock)
/* delete old unit struct */
mddb_deleterec_wrapper(un->c.un_record_id);
+
+ /* place new unit in in-core array */
+ md_nblocks_set(mnum, new_un->c.un_total_blocks);
MD_UNIT(mnum) = new_un;
/*
diff --git a/usr/src/uts/common/io/lvm/softpart/sp.c b/usr/src/uts/common/io/lvm/softpart/sp.c
index 888341b84f..5c204341b8 100644
--- a/usr/src/uts/common/io/lvm/softpart/sp.c
+++ b/usr/src/uts/common/io/lvm/softpart/sp.c
@@ -18,13 +18,12 @@
*
* CDDL HEADER END
*/
+
/*
- * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
-#pragma ident "%Z%%M% %I% %E% SMI"
-
/*
* Soft partitioning metadevice driver (md_sp).
*
@@ -237,8 +236,10 @@ sp_build_incore(void *p, int snarfing)
un->un_dev = tmpdev;
}
- /* place unit in in-core array */
+ /* place various information in the in-core data structures */
+ md_nblocks_set(mnum, un->c.un_total_blocks);
MD_UNIT(mnum) = un;
+
return (0);
}
@@ -263,6 +264,7 @@ reset_sp(mp_unit_t *un, minor_t mnum, int removing)
/* clean up in-core structures */
md_destroy_unit_incore(mnum, &sp_md_ops);
+ md_nblocks_set(mnum, -1ULL);
MD_UNIT(mnum) = NULL;
/*
@@ -458,7 +460,7 @@ sp_send_stat_ok(mp_unit_t *un)
ps->ps_ui = MDI_UNIT(mnum);
daemon_request(&md_sp_daemon, sp_xmit_ok, (daemon_queue_t *)ps,
- REQ_OLD);
+ REQ_OLD);
}
static void
@@ -473,7 +475,7 @@ sp_send_stat_err(mp_unit_t *un)
ps->ps_ui = MDI_UNIT(mnum);
daemon_request(&md_sp_daemon, sp_xmit_error, (daemon_queue_t *)ps,
- REQ_OLD);
+ REQ_OLD);
}
@@ -1036,9 +1038,9 @@ md_sp_strategy(buf_t *parent_buf, int flag, void *private)
}
child_buf = md_bioclone(parent_buf, current_offset,
- child_buf->b_bcount, child_buf->b_edev,
- child_buf->b_blkno, sp_done, child_buf,
- KM_NOSLEEP);
+ child_buf->b_bcount, child_buf->b_edev,
+ child_buf->b_blkno, sp_done, child_buf,
+ KM_NOSLEEP);
/* calculate new offset, counts, etc... */
current_offset += child_buf->b_bcount;
current_count -= child_buf->b_bcount;
@@ -1179,9 +1181,9 @@ sp_directed_read(minor_t mnum, vol_directed_rd_t *vdr, int mode)
useroff = useroff + (offset_t)current_offset;
cvdr.vdr_data = (void *)(uintptr_t)useroff;
child_buf = md_bioclone(parent_buf, current_offset,
- child_buf->b_bcount, child_buf->b_edev,
- child_buf->b_blkno, NULL,
- child_buf, KM_NOSLEEP);
+ child_buf->b_bcount, child_buf->b_edev,
+ child_buf->b_blkno, NULL,
+ child_buf, KM_NOSLEEP);
/* calculate new offset, counts, etc... */
current_offset += child_buf->b_bcount;
current_count -= child_buf->b_bcount;
@@ -1308,12 +1310,12 @@ sp_snarf(md_snarfcmd_t cmd, set_t setno)
small_un =
(mp_unit32_od_t *)mddb_getrecaddr(recid);
newreqsize = sizeof (mp_unit_t) +
- ((small_un->un_numexts - 1) *
- sizeof (struct mp_ext));
+ ((small_un->un_numexts - 1) *
+ sizeof (struct mp_ext));
big_un = (mp_unit_t *)kmem_zalloc(newreqsize,
- KM_SLEEP);
+ KM_SLEEP);
softpart_convert((caddr_t)small_un,
- (caddr_t)big_un, SMALL_2_BIG);
+ (caddr_t)big_un, SMALL_2_BIG);
kmem_free(small_un, dep->de_reqsize);
dep->de_rb_userdata = big_un;
dep->de_reqsize = newreqsize;
@@ -1443,7 +1445,7 @@ sp_open_dev(mp_unit_t *un, int oflags)
* Do the open by device id if underlying is regular
*/
if ((md_getmajor(tmpdev) != md_major) &&
- md_devid_found(setno, side, un->un_key) == 1) {
+ md_devid_found(setno, side, un->un_key) == 1) {
tmpdev = md_resolve_bydevid(mnum, tmpdev, un->un_key);
}
err = md_layered_open(mnum, &tmpdev, oflags);
@@ -1728,7 +1730,7 @@ sp_imp_set(
gotsomething = 0;
rec_type = (mddb_type_t)md_getshared_key(setno,
- sp_md_ops.md_driver.md_drivername);
+ sp_md_ops.md_driver.md_drivername);
recid = mddb_makerecid(setno, 0);
while ((recid = mddb_getnextrec(recid, rec_type, 0)) > 0) {
@@ -1750,7 +1752,7 @@ sp_imp_set(
record_id = &(un32->c.un_record_id);
if (!md_update_minor(setno, mddb_getsidenum
- (setno), un32->un_key))
+ (setno), un32->un_key))
goto out;
break;
@@ -1762,7 +1764,7 @@ sp_imp_set(
record_id = &(un64->c.un_record_id);
if (!md_update_minor(setno, mddb_getsidenum
- (setno), un64->un_key))
+ (setno), un64->un_key))
goto out;
break;
}
diff --git a/usr/src/uts/common/io/lvm/softpart/sp_ioctl.c b/usr/src/uts/common/io/lvm/softpart/sp_ioctl.c
index 87b6b9025e..36fbf38793 100644
--- a/usr/src/uts/common/io/lvm/softpart/sp_ioctl.c
+++ b/usr/src/uts/common/io/lvm/softpart/sp_ioctl.c
@@ -546,7 +546,9 @@ sp_set(void *d, int mode)
* build the incore structures.
*/
if (err = sp_build_incore(rec_addr, 0)) {
+ md_nblocks_set(mnum, -1ULL);
MD_UNIT(mnum) = NULL;
+
mddb_deleterec_wrapper(recids[0]);
return (err);
}
@@ -862,7 +864,11 @@ sp_grow(void *d, int mode, IOLOCK *lockp)
* delete old unit struct.
*/
mddb_deleterec_wrapper(MD_RECID(un));
+
+ /* place new unit in in-core array */
+ md_nblocks_set(mnum, new_un->c.un_total_blocks);
MD_UNIT(mnum) = new_un;
+
SE_NOTIFY(EC_SVM_CONFIG, ESC_SVM_GROW, TAG_METADEVICE,
MD_UN2SET(new_un), MD_SID(new_un));
diff --git a/usr/src/uts/common/io/lvm/stripe/stripe.c b/usr/src/uts/common/io/lvm/stripe/stripe.c
index 8359873be8..6309ce86b3 100644
--- a/usr/src/uts/common/io/lvm/stripe/stripe.c
+++ b/usr/src/uts/common/io/lvm/stripe/stripe.c
@@ -18,13 +18,12 @@
*
* CDDL HEADER END
*/
+
/*
- * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
-#pragma ident "%Z%%M% %I% %E% SMI"
-
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/conf.h>
@@ -160,8 +159,7 @@ stripe_close_all_devs(ms_unit_t *un, int md_cflags)
(mdc->un_mirror.ms_flags & MDM_S_PROBEOPEN)) {
md_layered_close(mdc->un_dev,
md_cflags);
- mdc->un_mirror.ms_flags &=
- ~MDM_S_PROBEOPEN;
+ mdc->un_mirror.ms_flags &= ~MDM_S_PROBEOPEN;
} else if (mdc->un_mirror.ms_flags & MDM_S_ISOPEN) {
md_layered_close(mdc->un_dev, md_cflags);
mdc->un_mirror.ms_flags &= ~MDM_S_ISOPEN;
@@ -268,7 +266,7 @@ stripe_open_all_devs(ms_unit_t *un, int md_oflags)
} else {
if (md_oflags & MD_OFLG_PROBEDEV) {
mdc->un_mirror.ms_flags |=
- MDM_S_PROBEOPEN;
+ MDM_S_PROBEOPEN;
} else
mdc->un_mirror.ms_flags |= MDM_S_ISOPEN;
}
@@ -347,7 +345,10 @@ stripe_build_incore(void *p, int snarfing)
}
}
+ /* place various information in the in-core data structures */
+ md_nblocks_set(mnum, un->c.un_total_blocks);
MD_UNIT(mnum) = un;
+
return (0);
}
@@ -367,6 +368,7 @@ reset_stripe(ms_unit_t *un, minor_t mnum, int removing)
md_destroy_unit_incore(mnum, &stripe_md_ops);
+ md_nblocks_set(mnum, -1ULL);
MD_UNIT(mnum) = NULL;
/*
@@ -657,8 +659,8 @@ md_mapbuf(
stripe_blk = blk_in_row / interlace;
dev_index = (size_t)(stripe_blk % mdr->un_ncomp);
wmdc = &mdcomp[mdr->un_icomp + dev_index];
- wb_blkno = (diskaddr_t)(((stripe_blk / mdr->un_ncomp)
- * interlace) + fragment);
+ wb_blkno = (diskaddr_t)(((stripe_blk / mdr->un_ncomp) *
+ interlace) + fragment);
}
wb_blkno += wmdc->un_start_block;
@@ -780,10 +782,10 @@ md_stripe_strategy(buf_t *pb, int flag, void *private)
cb = &cs->cs_buf;
cs->cs_ps = ps;
more = md_mapbuf(un, current_blkno, current_count, cb,
- &cs->cs_comp);
+ &cs->cs_comp);
cb = md_bioclone(pb, current_offset, cb->b_bcount, cb->b_edev,
- cb->b_lblkno, stripe_done, cb, KM_NOSLEEP);
+ cb->b_lblkno, stripe_done, cb, KM_NOSLEEP);
/*
* Do these calculations now,
* so that we pickup a valid b_bcount from the chld_bp.
@@ -862,11 +864,11 @@ stripe_snarf(md_snarfcmd_t cmd, set_t setno)
small_un =
(ms_unit32_od_t *)mddb_getrecaddr(recid);
newreqsize = get_big_stripe_req_size(small_un,
- COMPLETE_STRUCTURE);
+ COMPLETE_STRUCTURE);
big_un = (ms_unit_t *)kmem_zalloc(newreqsize,
- KM_SLEEP);
+ KM_SLEEP);
stripe_convert((caddr_t)small_un,
- (caddr_t)big_un, SMALL_2_BIG);
+ (caddr_t)big_un, SMALL_2_BIG);
kmem_free(small_un, dep->de_reqsize);
dep->de_rb_userdata = big_un;
dep->de_reqsize = newreqsize;
@@ -1080,7 +1082,7 @@ stripe_dump(dev_t dev, caddr_t addr, daddr_t blkno, int nblk)
* 32 bit wide blkno's.
*/
result = bdev_dump(bp->b_edev, addr, (daddr_t)mapblk,
- nblk);
+ nblk);
if (result)
saveresult = result;
}
@@ -1163,8 +1165,8 @@ stripe_block_count_skip_size(
} else { /* Stripes */
*block = (mdr->un_cum_blocks - mdr->un_blocks) +
((ci - cmpcount) * mdr->un_interlace);
- *count = (size_t)(mdr->un_blocks / (mdr->un_interlace
- * mdr->un_ncomp));
+ *count = (size_t)(mdr->un_blocks / (mdr->un_interlace *
+ mdr->un_ncomp));
*skip = (mdr->un_interlace * mdr->un_ncomp) - mdr->un_interlace;
*size = mdr->un_interlace;
}
@@ -1230,9 +1232,9 @@ stripe_get_dev(md_dev64_t dev, void *junk, int indx, ms_cd_info_t *cd)
*/
if (tmpdev == NODEV64) {
tmpdev = md_resolve_bydevid(md_getminor(dev), tmpdev,
- comp->un_mirror.ms_hs_id ?
- comp->un_mirror.ms_hs_key :
- comp->un_key);
+ comp->un_mirror.ms_hs_id ?
+ comp->un_mirror.ms_hs_key :
+ comp->un_key);
comp->un_dev = tmpdev;
}
@@ -1461,7 +1463,7 @@ stripe_replace_dev(md_dev64_t dev, void *junk, int ci, ms_new_dev_t *nd,
setno = MD_MIN2SET(mnum);
(void) md_devname(setno, comp->un_mirror.ms_orig_dev, devname,
- sizeof (devname));
+ sizeof (devname));
(void) md_devname(setno, nd->nd_dev, hs_devname,
sizeof (hs_devname));
@@ -1581,7 +1583,7 @@ again:
}
if (stripe_replace_dev(dev, junk, ci, &nd, recids, nrecids,
- replace_done, replace_data)) {
+ replace_done, replace_data)) {
(void) md_hot_spare_ifc(HS_BAD, un->un_hsp_id, 0, 0,
&nd.nd_hs_id, &nd.nd_key, NULL, NULL);
@@ -1646,23 +1648,26 @@ stripe_imp_set(
record_id = &(un32->c.un_record_id);
hsp_id = &(un32->un_hsp_id);
- comp32 = (ms_comp32_od_t *)((void *)&((char *)un32)
- [un32->un_ocomp]);
+ comp32 = (ms_comp32_od_t *)
+ ((void *)&((char *)un32)[un32->un_ocomp]);
for (row = 0; row < un32->un_nrows; row++) {
- struct ms_row32_od *mdr = &un32->un_row[row];
- for (i = 0, c = mdr->un_icomp;
- i < mdr->un_ncomp; i++) {
- ms_comp32_od_t *mdc;
- mdc = &comp32[c++];
-
- if (!md_update_minor(setno, mddb_getsidenum
- (setno), mdc->un_key))
- goto out;
-
- if (mdc->un_mirror.ms_hs_id != 0)
- mdc->un_mirror.ms_hs_id = MAKERECID(
- setno, mdc->un_mirror.ms_hs_id);
- }
+ struct ms_row32_od *mdr = &un32->un_row[row];
+ for (i = 0, c = mdr->un_icomp;
+ i < mdr->un_ncomp; i++) {
+ ms_comp32_od_t *mdc;
+
+ mdc = &comp32[c++];
+
+ if (!md_update_minor(setno,
+ mddb_getsidenum(setno),
+ mdc->un_key))
+ goto out;
+
+ if (mdc->un_mirror.ms_hs_id != 0)
+ mdc->un_mirror.ms_hs_id =
+ MAKERECID(setno,
+ mdc->un_mirror.ms_hs_id);
+ }
}
break;
case MDDB_REV_RB64:
@@ -1673,23 +1678,27 @@ stripe_imp_set(
record_id = &(un64->c.un_record_id);
hsp_id = &(un64->un_hsp_id);
- comp64 = (ms_comp_t *)((void *)&((char *)un64)
- [un64->un_ocomp]);
+ comp64 = (ms_comp_t *)
+ ((void *)&((char *)un64)[un64->un_ocomp]);
for (row = 0; row < un64->un_nrows; row++) {
- struct ms_row *mdr = &un64->un_row[row];
- for (i = 0, c = mdr->un_icomp;
- i < mdr->un_ncomp; i++) {
- ms_comp_t *mdc;
- mdc = &comp64[c++];
-
- if (!md_update_minor(setno, mddb_getsidenum
- (setno), mdc->un_key))
- goto out;
-
- if (mdc->un_mirror.ms_hs_id != 0)
- mdc->un_mirror.ms_hs_id = MAKERECID(
- setno, mdc->un_mirror.ms_hs_id);
- }
+ struct ms_row *mdr = &un64->un_row[row];
+
+ for (i = 0, c = mdr->un_icomp;
+ i < mdr->un_ncomp; i++) {
+ ms_comp_t *mdc;
+
+ mdc = &comp64[c++];
+
+ if (!md_update_minor(setno,
+ mddb_getsidenum(setno),
+ mdc->un_key))
+ goto out;
+
+ if (mdc->un_mirror.ms_hs_id != 0)
+ mdc->un_mirror.ms_hs_id =
+ MAKERECID(setno,
+ mdc->un_mirror.ms_hs_id);
+ }
}
break;
}
diff --git a/usr/src/uts/common/io/lvm/stripe/stripe_ioctl.c b/usr/src/uts/common/io/lvm/stripe/stripe_ioctl.c
index 2c52ff6692..73b7ec96d4 100644
--- a/usr/src/uts/common/io/lvm/stripe/stripe_ioctl.c
+++ b/usr/src/uts/common/io/lvm/stripe/stripe_ioctl.c
@@ -231,7 +231,9 @@ stripe_set(void *d, int mode)
un->c.un_revision |= MD_FN_META_DEV;
if (err = stripe_build_incore(p, 0)) {
+ md_nblocks_set(mnum, -1ULL);
MD_UNIT(mnum) = NULL;
+
mddb_deleterec_wrapper(recids[0]);
kmem_free(recids, num_recs * sizeof (mddb_recid_t));
return (err);
@@ -249,7 +251,9 @@ stripe_set(void *d, int mode)
if (err) {
+ md_nblocks_set(mnum, -1ULL);
MD_UNIT(mnum) = NULL;
+
mddb_deleterec_wrapper(recids[0]);
kmem_free(recids, num_recs * sizeof (mddb_recid_t));
return (mdhsperror(mdep, MDE_INVAL_HSP, un->un_hsp_id));
@@ -553,6 +557,7 @@ stripe_grow(void *d, int mode, IOLOCK *lockp)
* Restore the saved stuff.
*/
new_un->c.un_total_blocks = tb;
+ md_nblocks_set(mnum, new_un->c.un_total_blocks);
new_un->c.un_actual_tb = atb;
new_un->un_nrows = nr;
new_un->un_ocomp = oc;
@@ -638,6 +643,9 @@ stripe_grow(void *d, int mode, IOLOCK *lockp)
/* delete old unit struct */
mddb_deleterec_wrapper(un->c.un_record_id);
+
+ /* place new unit in in-core array */
+ md_nblocks_set(mnum, new_un->c.un_total_blocks);
MD_UNIT(mnum) = new_un;
/*
diff --git a/usr/src/uts/common/io/lvm/trans/mdtrans.c b/usr/src/uts/common/io/lvm/trans/mdtrans.c
index 222fa79ab9..75c8cb3643 100644
--- a/usr/src/uts/common/io/lvm/trans/mdtrans.c
+++ b/usr/src/uts/common/io/lvm/trans/mdtrans.c
@@ -18,13 +18,12 @@
*
* CDDL HEADER END
*/
+
/*
- * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
-#pragma ident "%Z%%M% %I% %E% SMI"
-
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/conf.h>
@@ -146,7 +145,7 @@ shadow_debug(mt_unit_t *un, /* trans unit info */
sb = kmem_cache_alloc(trans_child_cache, MD_ALLOCFLAGS);
trans_child_init(sb);
sb = bioclone(pb, 0, pb->b_bcount, md_dev64_to_dev(un->un_s_dev),
- pb->b_blkno, trans_done_shadow, sb, KM_NOSLEEP);
+ pb->b_blkno, trans_done_shadow, sb, KM_NOSLEEP);
sb->b_flags |= B_ASYNC;
sb->b_chain = (void *)ps;
@@ -259,7 +258,7 @@ trans_open_all_devs(mt_unit_t *un)
* Do the open by device id if it is regular device
*/
if ((md_getmajor(tmpdev) != md_major) &&
- md_devid_found(setno, side, un->un_m_key) == 1) {
+ md_devid_found(setno, side, un->un_m_key) == 1) {
tmpdev = md_resolve_bydevid(mnum, tmpdev, un->un_m_key);
}
err = md_layered_open(mnum, &tmpdev, MD_OFLG_NULL);
@@ -307,7 +306,7 @@ trans_build_incore(void *p, int snarfing)
*/
if (snarfing) {
un->un_m_dev = md_getdevnum(setno, mddb_getsidenum(setno),
- un->un_m_key, MD_NOTRUST_DEVT);
+ un->un_m_key, MD_NOTRUST_DEVT);
}
/*
@@ -326,7 +325,7 @@ trans_build_incore(void *p, int snarfing)
* and resolve the devt at the open time
*/
if ((md_getmajor(un->un_m_dev) == md_major) &&
- (md_dev_exists(un->un_m_dev) == 0)) {
+ (md_dev_exists(un->un_m_dev) == 0)) {
return (1);
}
@@ -378,6 +377,8 @@ trans_build_incore(void *p, int snarfing)
un->c.un_total_blocks = c->un_total_blocks;
}
+ /* place various information in the in-core data structures */
+ md_nblocks_set(mnum, un->c.un_total_blocks);
MD_UNIT(mnum) = un;
return (0);
@@ -511,6 +512,7 @@ trans_reset(mt_unit_t *un, minor_t mnum, int removing, int force)
md_destroy_unit_incore(mnum, &trans_md_ops);
+ md_nblocks_set(mnum, -1ULL);
MD_UNIT(mnum) = NULL;
if (!removing)
@@ -603,7 +605,7 @@ trans_done(struct buf *cb)
*/
if (!ldl_isherror(ps->ps_un->un_l_unit)) {
daemon_request(&md_done_daemon, trans_error,
- (daemon_queue_t *)ps, REQ_OLD);
+ (daemon_queue_t *)ps, REQ_OLD);
if (cb->b_flags & B_REMAPPED)
bp_mapout(cb);
@@ -680,7 +682,7 @@ md_trans_strategy(buf_t *pb, int flag, void *private)
trans_child_init(cb);
cb = bioclone(pb, 0, pb->b_bcount, md_dev64_to_dev(un->un_m_dev),
- pb->b_blkno, trans_done, cb, KM_NOSLEEP);
+ pb->b_blkno, trans_done, cb, KM_NOSLEEP);
cb->b_chain = (void *)ps;
@@ -849,7 +851,7 @@ trans_snarf(md_snarfcmd_t cmd, set_t setno)
newreqsize = sizeof (ml_unit_t);
big_ul = (ml_unit_t *)kmem_zalloc(newreqsize, KM_SLEEP);
trans_log_convert((caddr_t)small_ul, (caddr_t)big_ul,
- SMALL_2_BIG);
+ SMALL_2_BIG);
kmem_free(small_ul, dep->de_reqsize);
/*
* Update userdata and incore userdata
@@ -902,7 +904,7 @@ trans_snarf(md_snarfcmd_t cmd, set_t setno)
newreqsize = sizeof (mt_unit_t);
big_un = (mt_unit_t *)kmem_zalloc(newreqsize, KM_SLEEP);
trans_master_convert((caddr_t)small_un, (caddr_t)big_un,
- SMALL_2_BIG);
+ SMALL_2_BIG);
kmem_free(small_un, dep->de_reqsize);
/*
* Update userdata and incore userdata
@@ -1166,7 +1168,7 @@ trans_imp_set(
*/
*record_id = MAKERECID(setno, DBID(*record_id));
if (!md_update_minor(setno, mddb_getsidenum
- (setno), ul32->un_key))
+ (setno), ul32->un_key))
goto out;
mddb_setrecprivate(recid, MD_PRV_GOTIT);
}
@@ -1194,7 +1196,7 @@ trans_imp_set(
*record_id = MAKERECID(setno, DBID(*record_id));
*self_id = MD_MKMIN(setno, MD_MIN2UNIT(*self_id));
if (!md_update_minor(setno, mddb_getsidenum
- (setno), un32->un_m_key))
+ (setno), un32->un_m_key))
goto out;
mddb_setrecprivate(recid, MD_PRV_GOTIT);
diff --git a/usr/src/uts/common/io/lvm/trans/trans_ioctl.c b/usr/src/uts/common/io/lvm/trans/trans_ioctl.c
index cfdeacec1e..0eb2933cba 100644
--- a/usr/src/uts/common/io/lvm/trans/trans_ioctl.c
+++ b/usr/src/uts/common/io/lvm/trans/trans_ioctl.c
@@ -1282,6 +1282,7 @@ trans_grow(void *d, int mode, IOLOCK *lock)
} else {
un->c.un_total_blocks = c->un_total_blocks;
}
+ md_nblocks_set(MD_SID(un), un->c.un_total_blocks);
}
return (0);
diff --git a/usr/src/uts/common/os/modctl.c b/usr/src/uts/common/os/modctl.c
index 9303b3fdc1..4eda8d97ac 100644
--- a/usr/src/uts/common/os/modctl.c
+++ b/usr/src/uts/common/os/modctl.c
@@ -24,8 +24,6 @@
* Use is subject to license terms.
*/
-#pragma ident "%Z%%M% %I% %E% SMI"
-
/*
* modctl system call for loadable module support.
*/
@@ -1206,12 +1204,7 @@ modctl_devid2paths(ddi_devid_t udevid, char *uminor_name, uint_t flag,
continue;
}
- /* XXX need ddi_pathname_minor(dmdp, path); interface */
- if (ddi_dev_pathname(dmdp->ddm_dev, dmdp->ddm_spec_type,
- path) != DDI_SUCCESS) {
- ret = EAGAIN;
- goto out;
- }
+ (void) ddi_pathname_minor(dmdp, path);
len = strlen(path) + 1;
*(path + len) = '\0'; /* set double termination */
lens += len;
diff --git a/usr/src/uts/common/os/sunddi.c b/usr/src/uts/common/os/sunddi.c
index b6e28b9c33..8ca1a74a58 100644
--- a/usr/src/uts/common/os/sunddi.c
+++ b/usr/src/uts/common/os/sunddi.c
@@ -6678,6 +6678,21 @@ ddi_pathname(dev_info_t *dip, char *path)
return (pathname_work(dip, path));
}
+char *
+ddi_pathname_minor(struct ddi_minor_data *dmdp, char *path)
+{
+ if (dmdp->dip == NULL)
+ *path = '\0';
+ else {
+ (void) ddi_pathname(dmdp->dip, path);
+ if (dmdp->ddm_name) {
+ (void) strcat(path, ":");
+ (void) strcat(path, dmdp->ddm_name);
+ }
+ }
+ return (path);
+}
+
static char *
pathname_work_obp(dev_info_t *dip, char *path)
{
diff --git a/usr/src/uts/common/sys/lvm/mdvar.h b/usr/src/uts/common/sys/lvm/mdvar.h
index 6f2f1992dd..6cb2134f6d 100644
--- a/usr/src/uts/common/sys/lvm/mdvar.h
+++ b/usr/src/uts/common/sys/lvm/mdvar.h
@@ -622,7 +622,7 @@ extern void get_info(struct dk_cinfo *, minor_t);
extern void get_minfo(struct dk_minfo *, minor_t);
extern int mdstrategy(buf_t *);
extern int md_create_minor_node(set_t, minor_t);
-
+extern void md_nblocks_set(minor_t mnum, uint64_t nblocks);
/* External from md_subr.c */
extern int md_inc_iocount(set_t);
diff --git a/usr/src/uts/common/sys/sunddi.h b/usr/src/uts/common/sys/sunddi.h
index 3c8bc9145e..cfbf1656b9 100644
--- a/usr/src/uts/common/sys/sunddi.h
+++ b/usr/src/uts/common/sys/sunddi.h
@@ -1617,6 +1617,9 @@ char *
ddi_pathname(dev_info_t *dip, char *path);
char *
+ddi_pathname_minor(struct ddi_minor_data *dmdp, char *path);
+
+char *
ddi_pathname_obp(dev_info_t *dip, char *path);
int