1
0
mirror of git://sourceware.org/git/lvm2.git synced 2025-01-02 01:18:26 +03:00

Remove small hard-coded activation target line parameter limit.

This commit is contained in:
Alasdair Kergon 2003-08-20 12:53:57 +00:00
parent 36cf79384f
commit 9a90f1aba6

View File

@ -41,6 +41,8 @@
* *
*/ */
#define MAX_TARGET_PARAMSIZE 50000
enum { enum {
ACTIVE = 0, ACTIVE = 0,
RELOAD = 1, RELOAD = 1,
@ -765,10 +767,10 @@ static int _resume(struct dev_layer *dl)
* Emit a target for a given segment. * Emit a target for a given segment.
* FIXME: tidy this function. * FIXME: tidy this function.
*/ */
static int _emit_target(struct dev_manager *dm, struct dm_task *dmt, static int _emit_target_line(struct dev_manager *dm, struct dm_task *dmt,
struct lv_segment *seg) struct lv_segment *seg, char *params,
size_t paramsize)
{ {
char params[1024];
uint64_t esize = seg->lv->vg->extent_size; uint64_t esize = seg->lv->vg->extent_size;
uint32_t s, start_area = 0u, areas = seg->area_count; uint32_t s, start_area = 0u, areas = seg->area_count;
int w = 0, tw = 0; int w = 0, tw = 0;
@ -794,7 +796,7 @@ static int _emit_target(struct dev_manager *dm, struct dm_task *dmt,
target = "linear"; target = "linear";
else if (areas > 1) { else if (areas > 1) {
target = "striped"; target = "striped";
if ((tw = lvm_snprintf(params, sizeof(params), "%u %u ", if ((tw = lvm_snprintf(params, paramsize, "%u %u ",
areas, seg->stripe_size)) < 0) areas, seg->stripe_size)) < 0)
goto error; goto error;
w = tw; w = tw;
@ -820,8 +822,7 @@ static int _emit_target(struct dev_manager *dm, struct dm_task *dmt,
break; break;
} }
target = "mirror"; target = "mirror";
if ((tw = lvm_snprintf(params, sizeof(params), if ((tw = lvm_snprintf(params, paramsize, "core 1 %u %u ",
"core 1 %u %u ",
dm->mirror_region_size, areas)) < 0) dm->mirror_region_size, areas)) < 0)
goto error; goto error;
w = tw; w = tw;
@ -833,11 +834,11 @@ static int _emit_target(struct dev_manager *dm, struct dm_task *dmt,
if ((seg->area[s].type == AREA_PV && if ((seg->area[s].type == AREA_PV &&
(!seg->area[s].u.pv.pv || !seg->area[s].u.pv.pv->dev)) || (!seg->area[s].u.pv.pv || !seg->area[s].u.pv.pv->dev)) ||
(seg->area[s].type == AREA_LV && !seg->area[s].u.lv.lv)) (seg->area[s].type == AREA_LV && !seg->area[s].u.lv.lv))
tw = lvm_snprintf(params + w, sizeof(params) - w, tw = lvm_snprintf(params + w, paramsize - w,
"%s 0%s", dm->stripe_filler, "%s 0%s", dm->stripe_filler,
trailing_space); trailing_space);
else if (seg->area[s].type == AREA_PV) else if (seg->area[s].type == AREA_PV)
tw = lvm_snprintf(params + w, sizeof(params) - w, tw = lvm_snprintf(params + w, paramsize - w,
"%s %" PRIu64 "%s", "%s %" PRIu64 "%s",
dev_name(seg->area[s].u.pv.pv->dev), dev_name(seg->area[s].u.pv.pv->dev),
(seg->area[s].u.pv.pv->pe_start + (seg->area[s].u.pv.pv->pe_start +
@ -855,7 +856,7 @@ static int _emit_target(struct dev_manager *dm, struct dm_task *dmt,
dl->info.major, dl->info.minor); dl->info.major, dl->info.minor);
return 0; return 0;
} }
tw = lvm_snprintf(params + w, sizeof(params) - w, tw = lvm_snprintf(params + w, paramsize - w,
"%s %" PRIu64 "%s", devbuf, "%s %" PRIu64 "%s", devbuf,
esize * seg->area[s].u.lv.le, esize * seg->area[s].u.lv.le,
trailing_space); trailing_space);
@ -877,7 +878,37 @@ static int _emit_target(struct dev_manager *dm, struct dm_task *dmt,
return 1; return 1;
error: error:
log_error("Insufficient space in params[] to write target parameters."); log_debug("Insufficient space in params[%" PRIsize_t "] for target "
"parameters.", paramsize);
return -1;
}
static int _emit_target(struct dev_manager *dm, struct dm_task *dmt,
struct lv_segment *seg)
{
char *params;
size_t paramsize = 4096;
int ret;
do {
if (!(params = dbg_malloc(paramsize))) {
log_error("Insufficient space for target parameters.");
return 0;
}
ret = _emit_target_line(dm, dmt, seg, params, paramsize);
dbg_free(params);
if (!ret)
stack;
if (ret >= 0)
return ret;
paramsize *= 2;
} while (paramsize < MAX_TARGET_PARAMSIZE);
log_error("Target parameter size too big. Aborting.");
return 0; return 0;
} }
@ -985,8 +1016,8 @@ static int _populate_snapshot(struct dev_manager *dm,
return 0; return 0;
} }
if (snprintf(params, sizeof(params), "%s %s P %d", if (lvm_snprintf(params, sizeof(params), "%s %s P %d",
devbufo, devbufc, s->chunk_size) == -1) { devbufo, devbufc, s->chunk_size) == -1) {
stack; stack;
return 0; return 0;
} }
@ -1589,8 +1620,7 @@ static int _resume_with_deps(struct dev_manager *dm, struct dev_layer *dl)
} }
} }
if (dl->info.exists & !_get_flag(dl, SUSPENDED) && if (dl->info.exists & !_get_flag(dl, SUSPENDED) && !_resume(dl)) {
!_resume(dl)) {
stack; stack;
return 0; return 0;
} }