diff options
Diffstat (limited to 'usr/src/lib')
-rw-r--r-- | usr/src/lib/lvm/libmeta/common/meta_devadm.c | 6 | ||||
-rw-r--r-- | usr/src/lib/lvm/libmeta/common/meta_nameinfo.c | 50 |
2 files changed, 44 insertions, 12 deletions
diff --git a/usr/src/lib/lvm/libmeta/common/meta_devadm.c b/usr/src/lib/lvm/libmeta/common/meta_devadm.c index 411da72b60..0d90d2f802 100644 --- a/usr/src/lib/lvm/libmeta/common/meta_devadm.c +++ b/usr/src/lib/lvm/libmeta/common/meta_devadm.c @@ -19,12 +19,9 @@ * CDDL HEADER END */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. + * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. */ -#pragma ident "%Z%%M% %I% %E% SMI" - #include <stdio.h> #include <stdarg.h> #include <ctype.h> @@ -292,6 +289,7 @@ meta_update_namespace( nm.devname = (uintptr_t)devname; nm.devname_len = strlen(devname); nm.mnum = meta_getminor(dev); + nm.major = meta_getmajor(dev); nm.key = key; nm.pathname = (uintptr_t)pname; nm.pathname_len = strlen(pname); diff --git a/usr/src/lib/lvm/libmeta/common/meta_nameinfo.c b/usr/src/lib/lvm/libmeta/common/meta_nameinfo.c index f2e6104300..f353af9a0d 100644 --- a/usr/src/lib/lvm/libmeta/common/meta_nameinfo.c +++ b/usr/src/lib/lvm/libmeta/common/meta_nameinfo.c @@ -20,8 +20,7 @@ */ /* - * Copyright 2009 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. + * Copyright (c) 1993, 2010, Oracle and/or its affiliates. All rights reserved. */ #include <dlfcn.h> @@ -96,13 +95,28 @@ meta_geom_to_md( * convert efi to md types */ static void -meta_efi_to_mdgeom(struct dk_gpt *gpt, mdgeom_t *mdgp) +meta_efi_to_mdgeom(md_unit_t *mdev, 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); - mdgp->nhead = MD_EFI_FG_HEADS; - mdgp->nsect = MD_EFI_FG_SECTORS; + + /* + * Should always get geom from metadevice unit if metadevice. + * If metadevice is built on top of efi disks then it will + * have MD_EFI_FG_ values, otherwise it will have geom from + * the first component. + */ + if (mdev) { + mdgp->ncyl = (mdev->c.un_total_blocks) / + (mdev->c.un_nhead * mdev->c.un_nsect); + mdgp->nhead = mdev->c.un_nhead; + mdgp->nsect = mdev->c.un_nsect; + } else { + mdgp->ncyl = (gpt->efi_last_u_lba - gpt->efi_first_u_lba) + / (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; mdgp->write_reinstruct = MD_EFI_FG_WRI; mdgp->read_reinstruct = MD_EFI_FG_RRI; @@ -589,6 +603,8 @@ metagetvtoc( /* DKIOCGGEOM yielded ENOTSUP => try efi_alloc_and_read */ struct dk_gpt *gpt; int save_errno; + md_unit_t *mdev = NULL; + mdsetname_t *sp = NULL; /* this also sets errno */ partno = efi_alloc_and_read(fd, &gpt); @@ -610,6 +626,7 @@ metagetvtoc( metafreevtoc(&dnp->vtoc); meta_efi_to_mdvtoc(gpt, &dnp->vtoc); if (dnp->vtoc.nparts > MD_MAX_PARTS) { + efi_free(gpt); (void) mddeverror(ep, MDE_TOO_MANY_PARTS, NODEV64, rname); return (NULL); @@ -623,7 +640,24 @@ metagetvtoc( if (dnp->vtoc.nparts < V_NUMPAR) { dnp->vtoc.nparts = V_NUMPAR; } - meta_efi_to_mdgeom(gpt, &dnp->geom); + + /* + * Is np a metadevice? + */ + if (metaismeta(np)) { + sp = metasetnosetname(MD_MIN2SET(meta_getminor + (np->dev)), ep); + if (!sp || (mdev = meta_get_mdunit(sp, np, ep)) == + NULL) { + efi_free(gpt); + (void) mddeverror(ep, MDE_NOT_META, + NODEV64, rname); + return (NULL); + } + } + + meta_efi_to_mdgeom(mdev, gpt, &dnp->geom); + Free(mdev); efi_free(gpt); } else { /* no error on DKIOCGGEOM, try meta_getvtoc */ |