diff options
author | Andrew Balfour <Andrew.Balfour@Sun.COM> | 2008-09-02 13:45:22 -0700 |
---|---|---|
committer | Andrew Balfour <Andrew.Balfour@Sun.COM> | 2008-09-02 13:45:22 -0700 |
commit | 4deca0aa2cec144a6025c5a10c197bf98ca741f1 (patch) | |
tree | eb1e0339d8c0e6886bf06d17095704ae082f8258 | |
parent | 0e233487902b546a8949e2147ff8af45b1afc77c (diff) | |
download | illumos-joyent-4deca0aa2cec144a6025c5a10c197bf98ca741f1.tar.gz |
6659374 metainit - when submirrors are over 1TB (approx), mirror size != submirror size
-rw-r--r-- | usr/src/head/meta.h | 9 | ||||
-rw-r--r-- | usr/src/lib/lvm/libmeta/common/meta_nameinfo.c | 49 | ||||
-rw-r--r-- | usr/src/lib/lvm/libmeta/common/meta_stripe.c | 13 |
3 files changed, 38 insertions, 33 deletions
diff --git a/usr/src/head/meta.h b/usr/src/head/meta.h index fcc1cd2f0b..6480e2b89a 100644 --- a/usr/src/head/meta.h +++ b/usr/src/head/meta.h @@ -26,8 +26,6 @@ #ifndef _META_H #define _META_H -#pragma ident "%Z%%M% %I% %E% SMI" - #include <limits.h> #include <stdio.h> #include <stdlib.h> @@ -112,6 +110,13 @@ die right now /* disk label size */ #define VTOC_SIZE (16) +/* EFI geometry data */ +#define MD_EFI_FG_HEADS 128 +#define MD_EFI_FG_SECTORS 256 +#define MD_EFI_FG_RPM 7200 +#define MD_EFI_FG_WRI 1 +#define MD_EFI_FG_RRI 1 + /* maximum ctd name size (in # of digits) for printing out */ #define CTD_FORMAT_LEN 6 diff --git a/usr/src/lib/lvm/libmeta/common/meta_nameinfo.c b/usr/src/lib/lvm/libmeta/common/meta_nameinfo.c index fe7664dc13..b1ff708b7c 100644 --- a/usr/src/lib/lvm/libmeta/common/meta_nameinfo.c +++ b/usr/src/lib/lvm/libmeta/common/meta_nameinfo.c @@ -19,12 +19,10 @@ * CDDL HEADER END */ /* - * Copyright 2006 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 <dlfcn.h> #include <meta.h> #include <metadyn.h> @@ -37,13 +35,6 @@ #include <sys/scsi/generic/inquiry.h> #include <sys/efi_partition.h> -#define MD_EFI_FG_HEADS 128 -#define MD_EFI_FG_SECTORS 256 -#define MD_EFI_FG_RPM 7200 -#define MD_EFI_FG_WRI 1 -#define MD_EFI_FG_RRI 1 - - typedef struct ctlr_cache { char *ctlr_nm; int ctlr_ty; @@ -68,7 +59,7 @@ metagetset( /* metadevice */ if (metaismeta(np)) return (metasetnosetname(MD_MIN2SET(meta_getminor(np->dev)), - ep)); + ep)); /* regular device */ if (meta_is_drive_in_anyset(np->drivenamep, &sp, bypass_daemon, @@ -108,7 +99,7 @@ meta_efi_to_mdgeom(struct dk_gpt *gpt, mdgeom_t *mdgp) { (void) memset(mdgp, '\0', sizeof (*mdgp)); mdgp->ncyl = (gpt->efi_last_u_lba - gpt->efi_first_u_lba) / - (MD_EFI_FG_HEADS * MD_EFI_FG_SECTORS); + (MD_EFI_FG_HEADS * MD_EFI_FG_SECTORS); mdgp->nhead = MD_EFI_FG_HEADS; mdgp->nsect = MD_EFI_FG_SECTORS; mdgp->rpm = MD_EFI_FG_RPM; @@ -157,7 +148,7 @@ meta_efi_to_mdvtoc(struct dk_gpt *gpt, mdvtoc_t *mdvp) if ((gpt->efi_parts[i].p_tag == V_RESERVED) && (gpt->efi_parts[i].p_name != NULL)) { (void) strlcpy(typename, gpt->efi_parts[i].p_name, - EFI_PART_NAME_LEN); + EFI_PART_NAME_LEN); /* Stop at first (if any) space or tab */ (void) strtok(typename, " \t"); mdvp->typename = Strdup(typename); @@ -200,9 +191,9 @@ meta_mdvtoc_to_efi(mdvtoc_t *mdvp, struct dk_gpt **gpt) * we use p_name of the reserved partition */ if (((*gpt)->efi_parts[i].p_tag == V_RESERVED) && - (mdvp->typename != NULL)) { + (mdvp->typename != NULL)) { (void) strlcpy((*gpt)->efi_parts[i].p_name, typename, - EFI_PART_NAME_LEN); + EFI_PART_NAME_LEN); } } } @@ -256,8 +247,8 @@ char * getdrvnode(mdname_t *np, md_error_t *ep) { char *devicespath, - *drvnode, - *cp; + *drvnode, + *cp; if ((devicespath = metagetdevicesname(np, ep)) == NULL) return (NULL); @@ -298,8 +289,8 @@ static void * meta_load_dl(mdname_t *np, md_error_t *ep) { char *drvnode, - newpath[MAXPATHLEN], - *p; + newpath[MAXPATHLEN], + *p; void *cookie; if ((drvnode = getdrvnode(np, ep)) != NULL) { @@ -347,7 +338,7 @@ meta_match_names(mdname_t *np, struct dk_cinfo *cp, mdcinfo_t *mdcp, { void *cookie; meta_convert_e ((*fptr)(mdname_t *, struct dk_cinfo *, mdcinfo_t *, - md_error_t *)); + md_error_t *)); if ((cookie = meta_load_dl(np, ep)) != NULL) { fptr = (meta_convert_e (*)(mdname_t *, struct dk_cinfo *, @@ -365,8 +356,8 @@ int meta_match_enclosure(mdname_t *np, mdcinfo_t *mdcp, md_error_t *ep) { meta_enclosure_e e, - ((*fptr)(mdname_t *, mdcinfo_t *, - md_error_t *)); + ((*fptr)(mdname_t *, mdcinfo_t *, + md_error_t *)); void *cookie; if ((cookie = meta_load_dl(np, ep)) != NULL) { @@ -611,7 +602,7 @@ metagetvtoc( if (partno >= gpt->efi_nparts) { efi_free(gpt); (void) mddeverror(ep, MDE_INVALID_PART, NODEV64, - rname); + rname); return (NULL); } @@ -1253,12 +1244,12 @@ meta_isopen( * Hence NO_LOG and NO_MCT */ err = mdmn_send_message( - sp->setno, - MD_MN_MSG_CLU_CHECK, - MD_MSGF_NO_MCT | MD_MSGF_STOP_ON_ERROR | - MD_MSGF_NO_LOG | MD_MSGF_OVERRIDE_SUSPEND, - (char *)&d, sizeof (md_isopen_t), - &resp, ep); + sp->setno, + MD_MN_MSG_CLU_CHECK, + MD_MSGF_NO_MCT | MD_MSGF_STOP_ON_ERROR | + MD_MSGF_NO_LOG | MD_MSGF_OVERRIDE_SUSPEND, + (char *)&d, sizeof (md_isopen_t), + &resp, ep); if (err == 0) { d.isopen = resp->mmr_exitval; } else { diff --git a/usr/src/lib/lvm/libmeta/common/meta_stripe.c b/usr/src/lib/lvm/libmeta/common/meta_stripe.c index 856dfe747f..b8a9dd68c4 100644 --- a/usr/src/lib/lvm/libmeta/common/meta_stripe.c +++ b/usr/src/lib/lvm/libmeta/common/meta_stripe.c @@ -23,8 +23,6 @@ * Use is subject to license terms. */ -#pragma ident "%Z%%M% %I% %E% SMI" - /* * Just in case we're not in a build environment, make sure that * TEXT_DOMAIN gets set to something. @@ -1837,6 +1835,17 @@ stripe_geom( is_sp = 1; } + /* + * If the stripe is to be multi-terabyte we should + * use EFI geometries, else we can get rounding errors + * in meta_setup_geom(). + */ + + if (ms->c.un_actual_tb > MD_MAX_BLKS_FOR_SMALL_DEVS) { + geomp->nhead = MD_EFI_FG_HEADS; + geomp->nsect = MD_EFI_FG_SECTORS; + geomp->rpm = MD_EFI_FG_RPM; + } /* setup geometry from first device */ if (meta_setup_geom((md_unit_t *)ms, stripep->common.namep, geomp, |