From: Zdenek Kabelac Date: Fri, 21 Oct 2011 09:55:07 +0000 (+0000) Subject: Thin pool now support chunk size as well X-Git-Tag: old-v2_02_89~309 X-Git-Url: https://sourceware.org/git/?a=commitdiff_plain;h=5a6a8f4897f139e389a44f71b7637cd32bcab86b;p=lvm2.git Thin pool now support chunk size as well Use chunksize option to specify data_block_size for thin pool target. Drop low_water_mark to zero. --- diff --git a/lib/metadata/lv_manip.c b/lib/metadata/lv_manip.c index 0799d1ce2..927eed9aa 100644 --- a/lib/metadata/lv_manip.c +++ b/lib/metadata/lv_manip.c @@ -4160,9 +4160,12 @@ static struct logical_volume *_lv_create_an_lv(struct volume_group *vg, struct l seg_is_thin_volume(lp) ? lp->pool : NULL, lp->pvh, lp->alloc)) return_NULL; - if (seg_is_thin_pool(lp) && lp->zero) - first_seg(lv)->zero_new_blocks = 1; - else if (seg_is_thin_volume(lp)) { + if (seg_is_thin_pool(lp)) { + first_seg(lv)->zero_new_blocks = lp->zero ? 1 : 0; + first_seg(lv)->data_block_size = lp->chunk_size; + /* FIXME: use lowwatermark via lvm.conf global for all thinpools ? */ + first_seg(lv)->low_water_mark = 0; + } else if (seg_is_thin_volume(lp)) { pool_lv = first_seg(lv)->pool_lv; if (!(first_seg(lv)->device_id = @@ -4184,13 +4187,6 @@ static struct logical_volume *_lv_create_an_lv(struct volume_group *vg, struct l */ } - if (seg_is_thin_pool(lp)) { - /* FIXME: add lvcreate params - maybe -c/--chunksize?, - * use lowwatermark via lvm.conf global for all thinpools ?*/ - first_seg(lv)->data_block_size = 128; - first_seg(lv)->low_water_mark = 4096; - } - if (lp->log_count && !seg_is_raid(first_seg(lv)) && seg_is_mirrored(first_seg(lv))) { if (!add_mirror_log(cmd, lv, lp->log_count, @@ -4217,7 +4213,9 @@ static struct logical_volume *_lv_create_an_lv(struct volume_group *vg, struct l if (seg_is_thin_pool(lp)) { /* FIXME: skipping in test mode is not going work */ if (!activate_lv_excl(cmd, first_seg(lv)->pool_metadata_lv) || - /* First 4KB of metadata device must be cleared. */ + /* Clear 4KB of metadata device for new thin-pool. */ + // FIXME: maybe -zero n should allow to recreate same thin pool + // and different option should be used for zero_new_blocks !set_lv(cmd, first_seg(lv)->pool_metadata_lv, UINT64_C(0), 0)) { log_error("Aborting. Failed to wipe pool metadata %s.", lv->name); diff --git a/lib/thin/thin.c b/lib/thin/thin.c index c3f8438b5..3daaf756a 100644 --- a/lib/thin/thin.c +++ b/lib/thin/thin.c @@ -155,7 +155,7 @@ static int _thin_pool_text_export(const struct lv_segment *seg, struct formatter outf(f, "pool = \"%s\"", seg_lv(seg, 0)->name); outf(f, "metadata = \"%s\"", seg->pool_metadata_lv->name); outf(f, "transaction_id = %" PRIu64, seg->transaction_id); - outf(f, "data_block_size = %d", seg->data_block_size); + outf(f, "data_block_size = %u", seg->data_block_size); if (seg->low_water_mark) outf(f, "low_water_mark = %" PRIu64, seg->low_water_mark); diff --git a/man/lvcreate.8.in b/man/lvcreate.8.in index 21f138c8b..8052bb757 100644 --- a/man/lvcreate.8.in +++ b/man/lvcreate.8.in @@ -132,6 +132,8 @@ on one node and \fB-a\fIly\fR will activate only on the local node. Power of 2 chunk size in sector units (512b). For snapshot logical volume the value must be between 8 (4KB) and 1024 (512KB) and the default value is 8. +For thin pool logical volume the value must be between 128 (64KB) and +2097152 (1MB) and the default value is 128. .TP .BR \-C ", " \-\-contiguous " {" \fIy | \fIn } Sets or resets the contiguous allocation policy for diff --git a/tools/lvcreate.c b/tools/lvcreate.c index 89e0191c7..9b55fd063 100644 --- a/tools/lvcreate.c +++ b/tools/lvcreate.c @@ -690,14 +690,26 @@ static int _lvcreate_params(struct lvcreate_params *lp, log_error("Negative chunk size is invalid"); return 0; } - lp->chunk_size = arg_uint_value(cmd, chunksize_ARG, 8); - if (lp->chunk_size < 8 || lp->chunk_size > 1024 || - (lp->chunk_size & (lp->chunk_size - 1))) { - log_error("Chunk size must be a power of 2 in the " - "range 4K to 512K"); - return 0; + if (lp->snapshot) { + lp->chunk_size = arg_uint_value(cmd, chunksize_ARG, 8); + if (lp->chunk_size < 8 || lp->chunk_size > 1024 || + (lp->chunk_size & (lp->chunk_size - 1))) { + log_error("Chunk size must be a power of 2 in the " + "range 4K to 512K"); + return 0; + } + } else { + lp->chunk_size = arg_uint_value(cmd, chunksize_ARG, DM_THIN_MIN_DATA_BLOCK_SIZE); + if ((lp->chunk_size < DM_THIN_MIN_DATA_BLOCK_SIZE) || + (lp->chunk_size > DM_THIN_MAX_DATA_BLOCK_SIZE) || + (lp->chunk_size & (lp->chunk_size - 1))) { + log_error("Chunk size must be a power of 2 in the " + "range %uK to %uK", (DM_THIN_MIN_DATA_BLOCK_SIZE / 2), + (DM_THIN_MIN_DATA_BLOCK_SIZE / 2)); + return 0; + } } - log_verbose("Setting chunksize to %d sectors.", lp->chunk_size); + log_verbose("Setting chunksize to %u sectors.", lp->chunk_size); if (!lp->thin && lp->snapshot && !(lp->segtype = get_segtype_from_string(cmd, "snapshot"))) return_0;