summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/metadata/metadata.h7
-rw-r--r--lib/metadata/pv_map.c11
-rw-r--r--tools/lvcreate.c68
-rw-r--r--tools/lvresize.c2
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;