diff options
Diffstat (limited to 'usr/src')
| -rw-r--r-- | usr/src/uts/common/io/devinfo.c | 23 | ||||
| -rw-r--r-- | usr/src/uts/common/io/lvm/md/md.c | 179 | ||||
| -rw-r--r-- | usr/src/uts/common/io/lvm/mirror/mirror.c | 7 | ||||
| -rw-r--r-- | usr/src/uts/common/io/lvm/mirror/mirror_ioctl.c | 5 | ||||
| -rw-r--r-- | usr/src/uts/common/io/lvm/raid/raid.c | 181 | ||||
| -rw-r--r-- | usr/src/uts/common/io/lvm/raid/raid_ioctl.c | 9 | ||||
| -rw-r--r-- | usr/src/uts/common/io/lvm/softpart/sp.c | 42 | ||||
| -rw-r--r-- | usr/src/uts/common/io/lvm/softpart/sp_ioctl.c | 6 | ||||
| -rw-r--r-- | usr/src/uts/common/io/lvm/stripe/stripe.c | 115 | ||||
| -rw-r--r-- | usr/src/uts/common/io/lvm/stripe/stripe_ioctl.c | 8 | ||||
| -rw-r--r-- | usr/src/uts/common/io/lvm/trans/mdtrans.c | 28 | ||||
| -rw-r--r-- | usr/src/uts/common/io/lvm/trans/trans_ioctl.c | 1 | ||||
| -rw-r--r-- | usr/src/uts/common/os/modctl.c | 9 | ||||
| -rw-r--r-- | usr/src/uts/common/os/sunddi.c | 15 | ||||
| -rw-r--r-- | usr/src/uts/common/sys/lvm/mdvar.h | 2 | ||||
| -rw-r--r-- | usr/src/uts/common/sys/sunddi.h | 3 |
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 |
