diff options
-rw-r--r-- | lib/metadata/metadata.h | 7 | ||||
-rw-r--r-- | lib/metadata/pv_map.c | 11 | ||||
-rw-r--r-- | tools/lvcreate.c | 68 | ||||
-rw-r--r-- | tools/lvresize.c | 2 |
4 files changed, 43 insertions, 45 deletions
diff --git a/lib/metadata/metadata.h b/lib/metadata/metadata.h index bf968234..5817324c 100644 --- a/lib/metadata/metadata.h +++ b/lib/metadata/metadata.h @@ -11,11 +11,18 @@ #define _LVM_METADATA_H #include <sys/types.h> +#include <asm/page.h> #include "dev-cache.h" #include "list.h" #include "uuid.h" #define NAME_LEN 128 +#define MAX_STRIPES 128 +#define SECTOR_SIZE 512 +#define STRIPE_SIZE_DEFAULT 16 /* 16KB */ +#define STRIPE_SIZE_MIN ( PAGE_SIZE/SECTOR_SIZE) /* PAGESIZE in sectors */ +#define STRIPE_SIZE_MAX ( 512L * 1024 / SECTOR_SIZE) /* 512 KB in sectors */ + /* Various flags */ /* Note that the bits no longer necessarily correspond to LVM1 disk format */ diff --git a/lib/metadata/pv_map.c b/lib/metadata/pv_map.c index 2075fdfe..efb8b31c 100644 --- a/lib/metadata/pv_map.c +++ b/lib/metadata/pv_map.c @@ -111,6 +111,11 @@ static void _insert_area(struct list *head, struct pv_area *a) struct list *pvah; struct pv_area *pva; + if (list_empty(head)) { + list_add(head, &a->list); + return; + } + list_iterate (pvah, head) { pva = list_item(pvah, struct pv_area); @@ -118,10 +123,8 @@ static void _insert_area(struct list *head, struct pv_area *a) break; } - a->list.n = &pva->list; - a->list.p = pva->list.p; - pva->list.p->n = &a->list; - pva->list.p = &a->list; + list_add_h(&pva->list, &a->list); + return; } static int _create_single_area(struct pool *mem, struct pv_map *pvm, diff --git a/tools/lvcreate.c b/tools/lvcreate.c index 50abbe86..fc5e48ca 100644 --- a/tools/lvcreate.c +++ b/tools/lvcreate.c @@ -18,6 +18,7 @@ int lvcreate(int argc, char **argv) int opt = 0; uint32_t status = 0; uint32_t size = 0; + uint32_t size_rest; uint32_t extents = 0; struct volume_group *vg; struct logical_volume *lv; @@ -51,20 +52,24 @@ int lvcreate(int argc, char **argv) zero = strcmp(arg_str_value(zero_ARG, "y"), "n"); if (arg_count(stripes_ARG)) { - log_print("Stripes not yet implemented in LVM2. Ignoring."); stripes = arg_int_value(stripes_ARG, 1); if (stripes == 1) log_print("Redundant stripes argument: default is 1"); } if (arg_count(stripesize_ARG)) - stripesize = arg_int_value(stripesize_ARG, 0); + stripesize = 2 * arg_int_value(stripesize_ARG, 0); if (stripes == 1 && stripesize) { log_print("Ignoring stripesize argument with single stripe"); stripesize = 0; } + if (stripes > 1 && !stripesize) { + stripesize = 2 * STRIPE_SIZE_DEFAULT; + log_print("Using default stripesize %dKB", stripesize / 2); + } + if (arg_count(permission_ARG)) status |= arg_int_value(permission_ARG, 0); else @@ -157,44 +162,31 @@ int lvcreate(int argc, char **argv) pvh = &vg->pvs; } -/********* FIXME Move default choice (0) into format1 - log_print("Using default stripe size of %lu KB", - LVM_DEFAULT_STRIPE_SIZE); -***********/ - - if (argc && argc != stripes) { - log_error("Incorrect number of physical volumes on " + if (argc && argc < stripes ) { + log_error("Too few physical volumes on " "command line for %d-way striping", stripes); return EINVALID_CMD_LINE; } -/******** FIXME Inside lv_create stripes - log_verbose("checking stripe count"); - if (stripes < 1 || stripes > LVM_MAX_STRIPES) { - log_error("Invalid number of stripes: %d", stripes); - log_error("must be between %d and %d", 1, LVM_MAX_STRIPES); + if (stripes < 1 || stripes > MAX_STRIPES) { + log_error("Number of stripes (%d) must be between %d and %d", + stripes, 1, MAX_STRIPES); return EINVALID_CMD_LINE; } - log_verbose("checking stripe size"); - if (stripesize > 0 && lv_check_stripesize(stripesize) < 0) { - log_error("invalid stripe size %d", stripesize); + if (stripes > 1 && (stripesize < STRIPE_SIZE_MIN || + stripesize > STRIPE_SIZE_MAX || + stripesize & (stripesize - 1))) { + log_error("Invalid stripe size %d", stripesize); return EINVALID_CMD_LINE; } -*********/ - - stripesize *= 2; - -/******** FIXME Stripes - log_verbose - ("checking stripe size against volume group physical extent size"); - if (stripesize > vg_core->pe_size) { - log_error - ("setting stripe size %d KB to physical extent size %u KB", - stripesize / 2, vg_core->pe_size / 2); - stripesize = vg_core->pe_size; + + if (stripesize > vg->extent_size) { + log_error("Setting stripe size %d KB to physical extent " + "size %u KB", + stripesize / 2, vg->extent_size / 2); + stripesize = vg->extent_size; } -**********/ if (size) { /* No of 512-byte sectors */ @@ -212,16 +204,12 @@ int lvcreate(int argc, char **argv) extents /= vg->extent_size; } -/******* FIXME Stripes - size_rest = size % (stripes * vg_core->pe_size); - if (size_rest != 0) { - log_print("rounding %d KB to stripe boundary size ", - size / 2); - size = size - size_rest + stripes * vg_core->pe_size; - printf("%d KB / %u PE\n", size / 2, - size / vg_core->pe_size); - } -*************/ + if ((size_rest = extents % stripes)) { + log_print("Rounding size (%d extents) up to stripe boundary " + "size (%d extents)", extents, + extents - size_rest + stripes); + extents = extents - size_rest + stripes; + } if (!(lv = lv_create(lv_name, status, stripes, stripesize, extents, vg, pvh))) return ECMD_FAILED; diff --git a/tools/lvresize.c b/tools/lvresize.c index b377f8e9..f14694e8 100644 --- a/tools/lvresize.c +++ b/tools/lvresize.c @@ -178,7 +178,7 @@ int lvresize(int argc, char **argv) /* If extending, find stripes, stripesize & size of last segment */ if (extents > lv->le_count && - !(stripes == 1 || stripes > 1 && stripesize)) { + !(stripes == 1 || (stripes > 1 && stripesize))) { list_iterate(segh, &lv->segments) { struct stripe_segment *seg; uint32_t sz, str; |