1
0
mirror of git://sourceware.org/git/lvm2.git synced 2024-12-22 17:35:59 +03:00

Support device referencing by uuid or major/minor.

This commit is contained in:
Alasdair Kergon 2004-10-01 19:11:37 +00:00
parent 339ba55111
commit 1ca102d639
3 changed files with 185 additions and 79 deletions

View File

@ -1,5 +1,7 @@
Version 1.00.20 - Version 1.00.20 -
============================= =============================
Support device referencing by uuid or major/minor.
Warn if kernel data didn't fit in buffer.
Fix a printf. Fix a printf.
Version 1.00.19 - 3 July 2004 Version 1.00.19 - 3 July 2004

View File

@ -495,6 +495,10 @@ static int _dm_task_run_v1(struct dm_task *dmt)
goto bad; goto bad;
} }
if (dmi->flags & DM_BUFFER_FULL_FLAG)
/* FIXME Increase buffer size and retry operation (if query) */
log_error("Warning: libdevmapper buffer too small for data");
switch (dmt->type) { switch (dmt->type) {
case DM_DEVICE_CREATE: case DM_DEVICE_CREATE:
add_dev_node(dmt->dev_name, MAJOR(dmi->dev), MINOR(dmi->dev)); add_dev_node(dmt->dev_name, MAJOR(dmi->dev), MINOR(dmi->dev));
@ -1152,7 +1156,8 @@ int dm_task_run(struct dm_task *dmt)
if (dmt->type == DM_DEVICE_CREATE && dmt->head) if (dmt->type == DM_DEVICE_CREATE && dmt->head)
return _create_and_load_v4(dmt); return _create_and_load_v4(dmt);
if (dmt->type == DM_DEVICE_MKNODES && !dmt->dev_name) if (dmt->type == DM_DEVICE_MKNODES && !dmt->dev_name &&
!dmt->uuid && dmt->major <= 0)
return _mknodes_v4(dmt); return _mknodes_v4(dmt);
if (!_open_control()) if (!_open_control())
@ -1193,18 +1198,22 @@ int dm_task_run(struct dm_task *dmt)
break; break;
case DM_DEVICE_REMOVE: case DM_DEVICE_REMOVE:
rm_dev_node(dmt->dev_name); /* FIXME Kernel needs to fill in dmi->name */
if (dmt->dev_name)
rm_dev_node(dmt->dev_name);
break; break;
case DM_DEVICE_RENAME: case DM_DEVICE_RENAME:
rename_dev_node(dmt->dev_name, dmt->newname); /* FIXME Kernel needs to fill in dmi->name */
if (dmt->dev_name)
rename_dev_node(dmt->dev_name, dmt->newname);
break; break;
case DM_DEVICE_MKNODES: case DM_DEVICE_MKNODES:
if (dmi->flags & DM_EXISTS_FLAG) if (dmi->flags & DM_EXISTS_FLAG)
add_dev_node(dmt->dev_name, MAJOR(dmi->dev), add_dev_node(dmi->name, MAJOR(dmi->dev),
MINOR(dmi->dev)); MINOR(dmi->dev));
else else if (dmt->dev_name)
rm_dev_node(dmt->dev_name); rm_dev_node(dmt->dev_name);
break; break;

View File

@ -207,18 +207,96 @@ static void _display_info(struct dm_task *dmt)
_display_info_long(dmt, &info); _display_info_long(dmt, &info);
} }
static int _load(int task, const char *name, const char *file, const char *uuid) static int _set_task_device(struct dm_task *dmt, const char *name, int optional)
{
if (name) {
if (!dm_task_set_name(dmt, name))
return 0;
} else if (_switches[UUID_ARG]) {
if (!dm_task_set_uuid(dmt, _uuid))
return 0;
} else if (_switches[MAJOR_ARG] && _switches[MINOR_ARG]) {
if (!dm_task_set_major(dmt, _values[MAJOR_ARG]) ||
!dm_task_set_minor(dmt, _values[MINOR_ARG]))
return 0;
} else if (!optional) {
fprintf(stderr, "No device specified.\n");
return 0;
}
return 1;
}
static int _load(int argc, char **argv, void *data)
{ {
int r = 0; int r = 0;
struct dm_task *dmt; struct dm_task *dmt;
const char *file = NULL;
const char *name = NULL;
if (!(dmt = dm_task_create(task))) if (_switches[NOTABLE_ARG]) {
err("--notable only available when creating new device\n");
return 0;
}
if (!_switches[UUID_ARG] && !_switches[MAJOR_ARG]) {
if (argc == 1) {
err("Please specify device.\n");
return 0;
}
name = argv[1];
argc--;
argv++;
} else if (argc > 2) {
err("Too many command line arguments.\n");
return 0;
}
if (argc == 2)
file = argv[1];
if (!(dmt = dm_task_create(DM_DEVICE_RELOAD)))
return 0; return 0;
if (!dm_task_set_name(dmt, name)) if (!_set_task_device(dmt, name, 0))
goto out; goto out;
if (uuid && !dm_task_set_uuid(dmt, uuid)) if (!_switches[NOTABLE_ARG] && !_parse_file(dmt, file))
goto out;
if (_switches[READ_ONLY] && !dm_task_set_ro(dmt))
goto out;
if (!dm_task_run(dmt))
goto out;
r = 1;
if (_switches[VERBOSE_ARG])
_display_info(dmt);
out:
dm_task_destroy(dmt);
return r;
}
static int _create(int argc, char **argv, void *data)
{
int r = 0;
struct dm_task *dmt;
const char *file = NULL;
if (argc == 3)
file = argv[2];
if (!(dmt = dm_task_create(DM_DEVICE_CREATE)))
return 0;
if (!dm_task_set_name(dmt, argv[1]))
goto out;
if (_switches[UUID_ARG] && !dm_task_set_uuid(dmt, _uuid))
goto out; goto out;
if (!_switches[NOTABLE_ARG] && !_parse_file(dmt, file)) if (!_switches[NOTABLE_ARG] && !_parse_file(dmt, file))
@ -247,23 +325,6 @@ static int _load(int task, const char *name, const char *file, const char *uuid)
return r; return r;
} }
static int _create(int argc, char **argv, void *data)
{
return _load(DM_DEVICE_CREATE, argv[1], (argc == 3) ? argv[2] : NULL,
_switches[UUID_ARG] ? _uuid : NULL);
}
static int _reload(int argc, char **argv, void *data)
{
if (_switches[NOTABLE_ARG]) {
err("--notable only available when creating new device\n");
return 0;
}
return _load(DM_DEVICE_RELOAD, argv[1],
(argc == 3) ? argv[2] : NULL, NULL);
}
static int _rename(int argc, char **argv, void *data) static int _rename(int argc, char **argv, void *data)
{ {
int r = 0; int r = 0;
@ -272,10 +333,11 @@ static int _rename(int argc, char **argv, void *data)
if (!(dmt = dm_task_create(DM_DEVICE_RENAME))) if (!(dmt = dm_task_create(DM_DEVICE_RENAME)))
return 0; return 0;
if (!dm_task_set_name(dmt, argv[1])) /* FIXME Kernel doesn't support uuid or device number here yet */
if (!_set_task_device(dmt, (argc == 3) ? argv[1] : NULL, 0))
goto out; goto out;
if (!dm_task_set_newname(dmt, argv[2])) if (!dm_task_set_newname(dmt, argv[argc - 1]))
goto out; goto out;
if (!dm_task_run(dmt)) if (!dm_task_run(dmt))
@ -298,14 +360,24 @@ static int _message(int argc, char **argv, void *data)
if (!(dmt = dm_task_create(DM_DEVICE_TARGET_MSG))) if (!(dmt = dm_task_create(DM_DEVICE_TARGET_MSG)))
return 0; return 0;
if (!dm_task_set_name(dmt, argv[1])) if (_switches[UUID_ARG] || _switches[MAJOR_ARG]) {
if (!_set_task_device(dmt, NULL, 0))
goto out;
} else {
if (!_set_task_device(dmt, argv[1], 0))
goto out;
argc--;
argv++;
}
if (!dm_task_set_sector(dmt, atoll(argv[1])))
goto out; goto out;
if (!dm_task_set_sector(dmt, atoll(argv[2]))) argc -= 2;
goto out; argv += 2;
argc -= 3; if (argc <= 0)
argv += 3; err("No message supplied.\n");
for (i = 0; i < argc; i++) for (i = 0; i < argc; i++)
sz += strlen(argv[i]) + 1; sz += strlen(argv[i]) + 1;
@ -369,13 +441,12 @@ static int _simple(int task, const char *name, uint32_t event_nr, int display)
{ {
int r = 0; int r = 0;
/* remove <dev_name> */
struct dm_task *dmt; struct dm_task *dmt;
if (!(dmt = dm_task_create(task))) if (!(dmt = dm_task_create(task)))
return 0; return 0;
if (!dm_task_set_name(dmt, name)) if (!_set_task_device(dmt, name, 0))
goto out; goto out;
if (event_nr && !dm_task_set_event_nr(dmt, event_nr)) if (event_nr && !dm_task_set_event_nr(dmt, event_nr))
@ -398,28 +469,39 @@ static int _remove_all(int argc, char **argv, void *data)
static int _remove(int argc, char **argv, void *data) static int _remove(int argc, char **argv, void *data)
{ {
return _simple(DM_DEVICE_REMOVE, argv[1], 0, 0); return _simple(DM_DEVICE_REMOVE, argc > 1 ? argv[1] : NULL, 0, 0);
} }
static int _suspend(int argc, char **argv, void *data) static int _suspend(int argc, char **argv, void *data)
{ {
return _simple(DM_DEVICE_SUSPEND, argv[1], 0, 1); return _simple(DM_DEVICE_SUSPEND, argc > 1 ? argv[1] : NULL, 0, 1);
} }
static int _resume(int argc, char **argv, void *data) static int _resume(int argc, char **argv, void *data)
{ {
return _simple(DM_DEVICE_RESUME, argv[1], 0, 1); return _simple(DM_DEVICE_RESUME, argc > 1 ? argv[1] : NULL, 0, 1);
} }
static int _clear(int argc, char **argv, void *data) static int _clear(int argc, char **argv, void *data)
{ {
return _simple(DM_DEVICE_CLEAR, argv[1], 0, 1); return _simple(DM_DEVICE_CLEAR, argc > 1 ? argv[1] : NULL, 0, 1);
} }
static int _wait(int argc, char **argv, void *data) static int _wait(int argc, char **argv, void *data)
{ {
return _simple(DM_DEVICE_WAITEVENT, argv[1], const char *name = NULL;
(argc == 3) ? atoi(argv[2]) : 0, 1);
if (!_switches[UUID_ARG] && !_switches[MAJOR_ARG]) {
if (argc == 1) {
err("No device specified.");
return 0;
}
name = argv[1];
argc--, argv++;
}
return _simple(DM_DEVICE_WAITEVENT, name,
(argc > 1) ? atoi(argv[argc - 1]) : 0, 1);
} }
static int _process_all(int argc, char **argv, static int _process_all(int argc, char **argv,
@ -471,15 +553,16 @@ static int _status(int argc, char **argv, void *data)
char *params; char *params;
int cmd; int cmd;
struct dm_names *names = (struct dm_names *) data; struct dm_names *names = (struct dm_names *) data;
char *name; char *name = NULL;
if (argc == 1 && !data)
return _process_all(argc, argv, _status);
if (data) if (data)
name = names->name; name = names->name;
else else {
name = argv[1]; if (argc == 1 && !_switches[UUID_ARG] && !_switches[MAJOR_ARG])
return _process_all(argc, argv, _status);
if (argc == 2)
name = argv[1];
}
if (!strcmp(argv[0], "table")) if (!strcmp(argv[0], "table"))
cmd = DM_DEVICE_TABLE; cmd = DM_DEVICE_TABLE;
@ -489,7 +572,7 @@ static int _status(int argc, char **argv, void *data)
if (!(dmt = dm_task_create(cmd))) if (!(dmt = dm_task_create(cmd)))
return 0; return 0;
if (!dm_task_set_name(dmt, name)) if (!_set_task_device(dmt, name, 0))
goto out; goto out;
if (!dm_task_run(dmt)) if (!dm_task_run(dmt))
@ -564,7 +647,7 @@ static int _mknodes(int argc, char **argv, void *data)
if (!(dmt = dm_task_create(DM_DEVICE_MKNODES))) if (!(dmt = dm_task_create(DM_DEVICE_MKNODES)))
return 0; return 0;
if (argc == 2 && !dm_task_set_name(dmt, argv[1])) if (!_set_task_device(dmt, argc > 1 ? argv[1] : NULL, 1))
goto out; goto out;
if (!dm_task_run(dmt)) if (!dm_task_run(dmt))
@ -585,18 +668,19 @@ static int _info(int argc, char **argv, void *data)
struct dm_names *names = (struct dm_names *) data; struct dm_names *names = (struct dm_names *) data;
char *name = NULL; char *name = NULL;
if (argc == 1 && !data)
return _process_all(argc, argv, _info);
if (data) if (data)
name = names->name; name = names->name;
else else {
name = argv[1]; if (argc == 1 && !_switches[UUID_ARG] && !_switches[MAJOR_ARG])
return _process_all(argc, argv, _info);
if (argc == 2)
name = argv[1];
}
if (!(dmt = dm_task_create(DM_DEVICE_INFO))) if (!(dmt = dm_task_create(DM_DEVICE_INFO)))
return 0; return 0;
if (name && !dm_task_set_name(dmt, name)) if (!_set_task_device(dmt, name, 0))
goto out; goto out;
if (!dm_task_run(dmt)) if (!dm_task_run(dmt))
@ -619,20 +703,21 @@ static int _deps(int argc, char **argv, void *data)
struct dm_task *dmt; struct dm_task *dmt;
struct dm_info info; struct dm_info info;
struct dm_names *names = (struct dm_names *) data; struct dm_names *names = (struct dm_names *) data;
char *name; char *name = NULL;
if (argc == 1 && !data)
return _process_all(argc, argv, _deps);
if (data) if (data)
name = names->name; name = names->name;
else else {
name = argv[1]; if (argc == 1 && !_switches[UUID_ARG] && !_switches[MAJOR_ARG])
return _process_all(argc, argv, _deps);
if (argc == 2)
name = argv[1];
}
if (!(dmt = dm_task_create(DM_DEVICE_DEPS))) if (!(dmt = dm_task_create(DM_DEVICE_DEPS)))
return 0; return 0;
if (!dm_task_set_name(dmt, name)) if (!_set_task_device(dmt, name, 0))
goto out; goto out;
if (!dm_task_run(dmt)) if (!dm_task_run(dmt))
@ -702,24 +787,25 @@ struct command {
}; };
static struct command _commands[] = { static struct command _commands[] = {
{"create", "<dev_name> [-u <uuid>] [--notable] [<table_file>]", {"create", "<dev_name> [-j|--major <major> -m|--minor <minor>]\n"
"\t [-u|uuid <uuid>] [--notable] [<table_file>]",
1, 2, _create}, 1, 2, _create},
{"remove", "<dev_name>", 1, 1, _remove}, {"remove", "<device>", 0, 1, _remove},
{"remove_all", "", 0, 0, _remove_all}, {"remove_all", "", 0, 0, _remove_all},
{"suspend", "<dev_name>", 1, 1, _suspend}, {"suspend", "<device>", 0, 1, _suspend},
{"resume", "<dev_name>", 1, 1, _resume}, {"resume", "<device>", 0, 1, _resume},
{"load", "<dev_name> [<table_file>]", 1, 2, _reload}, {"load", "<device> [<table_file>]", 0, 2, _load},
{"clear", "<dev_name>", 1, 1, _clear}, {"clear", "<device>", 0, 1, _clear},
{"reload", "<dev_name> [<table_file>]", 1, 2, _reload}, {"reload", "<device> [<table_file>]", 0, 2, _load},
{"rename", "<dev_name> <new_name>", 2, 2, _rename}, {"rename", "<device> <new_name>", 1, 2, _rename},
{"message", "<dev_name> <sector> <message>", 3, -1, _message}, {"message", "<device> <sector> <message>", 2, -1, _message},
{"ls", "", 0, 0, _ls}, {"ls", "", 0, 0, _ls},
{"info", "[<dev_name>]", 0, 1, _info}, {"info", "[<device>]", 0, 1, _info},
{"deps", "[<dev_name>]", 0, 1, _deps}, {"deps", "[<device>]", 0, 1, _deps},
{"status", "[<dev_name>]", 0, 1, _status}, {"status", "[<device>]", 0, 1, _status},
{"table", "[<dev_name>]", 0, 1, _status}, {"table", "[<device>]", 0, 1, _status},
{"wait", "<dev_name> [<event_nr>]", 1, 2, _wait}, {"wait", "<device> [<event_nr>]", 0, 2, _wait},
{"mknodes", "[<dev_name>]", 0, 1, _mknodes}, {"mknodes", "[<device>]", 0, 1, _mknodes},
{"targets", "", 0, 0, _targets}, {"targets", "", 0, 0, _targets},
{"version", "", 0, 0, _version}, {"version", "", 0, 0, _version},
{NULL, NULL, 0, 0, NULL} {NULL, NULL, 0, 0, NULL}
@ -731,10 +817,12 @@ static void _usage(FILE *out)
fprintf(out, "Usage:\n\n"); fprintf(out, "Usage:\n\n");
fprintf(out, "dmsetup [--version] [-v|--verbose [-v|--verbose ...]]\n" fprintf(out, "dmsetup [--version] [-v|--verbose [-v|--verbose ...]]\n"
" [-r|--readonly] [-j|--major <major>] " " [-r|--readonly]\n\n");
"[-m|--minor <minor>]\n\n");
for (i = 0; _commands[i].name; i++) for (i = 0; _commands[i].name; i++)
fprintf(out, "\t%s %s\n", _commands[i].name, _commands[i].help); fprintf(out, "\t%s %s\n", _commands[i].name, _commands[i].help);
fprintf(out, "\n<device> may be device name or -u <uuid> or "
"-j <major> -m <minor>\n");
fprintf(out, "Table_file contents may be supplied on stdin.\n\n");
return; return;
} }
@ -807,6 +895,13 @@ static int _process_switches(int *argc, char ***argv)
if (_switches[VERBOSE_ARG] > 1) if (_switches[VERBOSE_ARG] > 1)
dm_log_init_verbose(_switches[VERBOSE_ARG] - 1); dm_log_init_verbose(_switches[VERBOSE_ARG] - 1);
if ((_switches[MAJOR_ARG] && !_switches[MINOR_ARG]) ||
(!_switches[MAJOR_ARG] && _switches[MINOR_ARG])) {
fprintf(stderr, "Please specify both major number and "
"minor number.\n");
return 0;
}
*argv += optind; *argv += optind;
*argc -= optind; *argc -= optind;
return 1; return 1;