1
0
mirror of git://sourceware.org/git/lvm2.git synced 2024-12-30 17:18:21 +03:00

Remember increased buffer size and use for subsequent calls.

This commit is contained in:
Alasdair Kergon 2005-09-20 18:04:28 +00:00
parent d54d93ab2e
commit 59a2bf62f0
2 changed files with 16 additions and 9 deletions

View File

@ -1,5 +1,6 @@
Version 1.01.05 -
=============================
Remember increased buffer size and use for subsequent calls.
On 'buffer full' condition, double buffer size and repeat ioctl.
Fix termination of getopt_long() option array.
Report 'buffer full' condition with v4 ioctl as well as with v1.

View File

@ -63,6 +63,7 @@ static int _log_suppress = 0;
static int _control_fd = -1;
static int _version_checked = 0;
static int _version_ok = 1;
static unsigned _ioctl_buffer_double_factor = 0;
/*
* Support both old and new major numbers to ease the transition.
@ -610,8 +611,10 @@ static int _dm_task_run_v1(struct dm_task *dmt)
if (dmt->type == DM_DEVICE_TABLE)
dmi->flags |= DM_STATUS_TABLE_FLAG;
log_debug("dm %s %s %s %s", _cmd_data_v1[dmt->type].name, dmi->name,
dmi->uuid, dmt->newname ? dmt->newname : "");
log_debug("dm %s %s %s%s%s [%u]", _cmd_data_v1[dmt->type].name,
dmi->name, dmi->uuid, dmt->newname ? " " : "",
dmt->newname ? dmt->newname : "",
dmi->data_size);
if (dmt->type == DM_DEVICE_LIST) {
if (!_dm_names_v1(dmi))
goto bad;
@ -1280,7 +1283,8 @@ static int _create_and_load_v4(struct dm_task *dmt)
return r;
}
static struct dm_ioctl *_do_dm_ioctl(struct dm_task *dmt, unsigned repeat_count)
static struct dm_ioctl *_do_dm_ioctl(struct dm_task *dmt, unsigned command,
unsigned repeat_count)
{
struct dm_ioctl *dmi;
@ -1298,10 +1302,13 @@ static struct dm_ioctl *_do_dm_ioctl(struct dm_task *dmt, unsigned repeat_count)
if (dmt->no_open_count)
dmi->flags |= DM_SKIP_BDGET_FLAG;
log_debug("dm %s %s %s %s%c %.0llu %s", _cmd_data_v4[dmt->type].name,
dmi->name, dmi->uuid, dmt->newname ? dmt->newname : "",
log_debug("dm %s %s %s%s%s %c %.0llu %s [%u]",
_cmd_data_v4[dmt->type].name,
dmi->name, dmi->uuid, dmt->newname ? " " : "",
dmt->newname ? dmt->newname : "",
dmt->no_open_count ? 'N' : 'O',
dmt->sector, dmt->message ? dmt->message : "");
dmt->sector, dmt->message ? dmt->message : "",
dmi->data_size);
#ifdef DM_IOCTLS
if (ioctl(_control_fd, command, dmi) < 0) {
if (errno == ENXIO && ((dmt->type == DM_DEVICE_INFO) ||
@ -1329,7 +1336,6 @@ int dm_task_run(struct dm_task *dmt)
{
struct dm_ioctl *dmi;
unsigned command;
unsigned repeat_count = 0;
#ifdef DM_COMPAT
if (_dm_version == 1)
@ -1357,7 +1363,7 @@ int dm_task_run(struct dm_task *dmt)
return 0;
repeat_ioctl:
if (!(dmi = _do_dm_ioctl(dmt, repeat_count)))
if (!(dmi = _do_dm_ioctl(dmt, command, _ioctl_buffer_double_factor)))
return 0;
if (dmi->flags & DM_BUFFER_FULL_FLAG) {
@ -1368,7 +1374,7 @@ repeat_ioctl:
case DM_DEVICE_STATUS:
case DM_DEVICE_TABLE:
case DM_DEVICE_WAITEVENT:
repeat_count++;
_ioctl_buffer_double_factor++;
free(dmi);
goto repeat_ioctl;
default: