From 672880a8f2b00f800d92b6c7474993a932c7388d Mon Sep 17 00:00:00 2001 From: Alasdair Kergon Date: Fri, 1 Oct 2004 19:11:37 +0000 Subject: [PATCH] Support device referencing by uuid or major/minor. --- WHATS_NEW | 2 + dmsetup/dmsetup.c | 243 ++++++++++++++++++++++++++++------------ lib/ioctl/libdm-iface.c | 19 +++- 3 files changed, 185 insertions(+), 79 deletions(-) diff --git a/WHATS_NEW b/WHATS_NEW index 8bbfd8a..43858f1 100644 --- a/WHATS_NEW +++ b/WHATS_NEW @@ -1,5 +1,7 @@ Version 1.00.20 - ============================= + Support device referencing by uuid or major/minor. + Warn if kernel data didn't fit in buffer. Fix a printf. Version 1.00.19 - 3 July 2004 diff --git a/dmsetup/dmsetup.c b/dmsetup/dmsetup.c index e564267..25d400c 100644 --- a/dmsetup/dmsetup.c +++ b/dmsetup/dmsetup.c @@ -207,30 +207,64 @@ static void _display_info(struct dm_task *dmt) _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; 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 (!dm_task_set_name(dmt, name)) - goto out; + 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 (uuid && !dm_task_set_uuid(dmt, uuid)) - goto out; + if (argc == 2) + file = argv[1]; - if (!_switches[NOTABLE_ARG] && !_parse_file(dmt, file)) - goto out; + if (!(dmt = dm_task_create(DM_DEVICE_RELOAD))) + return 0; - if (_switches[READ_ONLY] && !dm_task_set_ro(dmt)) + if (!_set_task_device(dmt, name, 0)) goto out; - if (_switches[MAJOR_ARG] && !dm_task_set_major(dmt, _values[MAJOR_ARG])) + if (!_switches[NOTABLE_ARG] && !_parse_file(dmt, file)) goto out; - if (_switches[MINOR_ARG] && !dm_task_set_minor(dmt, _values[MINOR_ARG])) + if (_switches[READ_ONLY] && !dm_task_set_ro(dmt)) goto out; if (!dm_task_run(dmt)) @@ -249,19 +283,46 @@ static int _load(int task, const char *name, const char *file, const char *uuid) 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); -} + int r = 0; + struct dm_task *dmt; + const char *file = NULL; -static int _reload(int argc, char **argv, void *data) -{ - if (_switches[NOTABLE_ARG]) { - err("--notable only available when creating new device\n"); + if (argc == 3) + file = argv[2]; + + if (!(dmt = dm_task_create(DM_DEVICE_CREATE))) return 0; - } - return _load(DM_DEVICE_RELOAD, argv[1], - (argc == 3) ? argv[2] : NULL, NULL); + if (!dm_task_set_name(dmt, argv[1])) + goto out; + + if (_switches[UUID_ARG] && !dm_task_set_uuid(dmt, _uuid)) + goto out; + + if (!_switches[NOTABLE_ARG] && !_parse_file(dmt, file)) + goto out; + + if (_switches[READ_ONLY] && !dm_task_set_ro(dmt)) + goto out; + + if (_switches[MAJOR_ARG] && !dm_task_set_major(dmt, _values[MAJOR_ARG])) + goto out; + + if (_switches[MINOR_ARG] && !dm_task_set_minor(dmt, _values[MINOR_ARG])) + 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 _rename(int argc, char **argv, void *data) @@ -272,10 +333,11 @@ static int _rename(int argc, char **argv, void *data) if (!(dmt = dm_task_create(DM_DEVICE_RENAME))) 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; - if (!dm_task_set_newname(dmt, argv[2])) + if (!dm_task_set_newname(dmt, argv[argc - 1])) goto out; 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))) return 0; - if (!dm_task_set_name(dmt, argv[1])) - goto out; + 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[2]))) + if (!dm_task_set_sector(dmt, atoll(argv[1]))) goto out; - argc -= 3; - argv += 3; + argc -= 2; + argv += 2; + + if (argc <= 0) + err("No message supplied.\n"); for (i = 0; i < argc; i++) 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; - /* remove */ struct dm_task *dmt; if (!(dmt = dm_task_create(task))) return 0; - if (!dm_task_set_name(dmt, name)) + if (!_set_task_device(dmt, name, 0)) goto out; 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) { - 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) { - 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) { - 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) { - 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) { - return _simple(DM_DEVICE_WAITEVENT, argv[1], - (argc == 3) ? atoi(argv[2]) : 0, 1); + const char *name = NULL; + + 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, @@ -471,15 +553,16 @@ static int _status(int argc, char **argv, void *data) char *params; int cmd; struct dm_names *names = (struct dm_names *) data; - char *name; - - if (argc == 1 && !data) - return _process_all(argc, argv, _status); + char *name = NULL; if (data) name = names->name; - else - name = argv[1]; + else { + 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")) cmd = DM_DEVICE_TABLE; @@ -489,7 +572,7 @@ static int _status(int argc, char **argv, void *data) if (!(dmt = dm_task_create(cmd))) return 0; - if (!dm_task_set_name(dmt, name)) + if (!_set_task_device(dmt, name, 0)) goto out; 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))) 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; 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; char *name = NULL; - if (argc == 1 && !data) - return _process_all(argc, argv, _info); - if (data) name = names->name; - else - name = argv[1]; + else { + 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))) return 0; - if (name && !dm_task_set_name(dmt, name)) + if (!_set_task_device(dmt, name, 0)) goto out; if (!dm_task_run(dmt)) @@ -619,20 +703,21 @@ static int _deps(int argc, char **argv, void *data) struct dm_task *dmt; struct dm_info info; struct dm_names *names = (struct dm_names *) data; - char *name; - - if (argc == 1 && !data) - return _process_all(argc, argv, _deps); + char *name = NULL; if (data) name = names->name; - else - name = argv[1]; + else { + 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))) return 0; - if (!dm_task_set_name(dmt, name)) + if (!_set_task_device(dmt, name, 0)) goto out; if (!dm_task_run(dmt)) @@ -702,24 +787,25 @@ struct command { }; static struct command _commands[] = { - {"create", " [-u ] [--notable] []", + {"create", " [-j|--major -m|--minor ]\n" + "\t [-u|uuid ] [--notable] []", 1, 2, _create}, - {"remove", "", 1, 1, _remove}, + {"remove", "", 0, 1, _remove}, {"remove_all", "", 0, 0, _remove_all}, - {"suspend", "", 1, 1, _suspend}, - {"resume", "", 1, 1, _resume}, - {"load", " []", 1, 2, _reload}, - {"clear", "", 1, 1, _clear}, - {"reload", " []", 1, 2, _reload}, - {"rename", " ", 2, 2, _rename}, - {"message", " ", 3, -1, _message}, + {"suspend", "", 0, 1, _suspend}, + {"resume", "", 0, 1, _resume}, + {"load", " []", 0, 2, _load}, + {"clear", "", 0, 1, _clear}, + {"reload", " []", 0, 2, _load}, + {"rename", " ", 1, 2, _rename}, + {"message", " ", 2, -1, _message}, {"ls", "", 0, 0, _ls}, - {"info", "[]", 0, 1, _info}, - {"deps", "[]", 0, 1, _deps}, - {"status", "[]", 0, 1, _status}, - {"table", "[]", 0, 1, _status}, - {"wait", " []", 1, 2, _wait}, - {"mknodes", "[]", 0, 1, _mknodes}, + {"info", "[]", 0, 1, _info}, + {"deps", "[]", 0, 1, _deps}, + {"status", "[]", 0, 1, _status}, + {"table", "[]", 0, 1, _status}, + {"wait", " []", 0, 2, _wait}, + {"mknodes", "[]", 0, 1, _mknodes}, {"targets", "", 0, 0, _targets}, {"version", "", 0, 0, _version}, {NULL, NULL, 0, 0, NULL} @@ -731,10 +817,12 @@ static void _usage(FILE *out) fprintf(out, "Usage:\n\n"); fprintf(out, "dmsetup [--version] [-v|--verbose [-v|--verbose ...]]\n" - " [-r|--readonly] [-j|--major ] " - "[-m|--minor ]\n\n"); + " [-r|--readonly]\n\n"); for (i = 0; _commands[i].name; i++) fprintf(out, "\t%s %s\n", _commands[i].name, _commands[i].help); + fprintf(out, "\n may be device name or -u or " + "-j -m \n"); + fprintf(out, "Table_file contents may be supplied on stdin.\n\n"); return; } @@ -807,6 +895,13 @@ static int _process_switches(int *argc, char ***argv) if (_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; *argc -= optind; return 1; diff --git a/lib/ioctl/libdm-iface.c b/lib/ioctl/libdm-iface.c index f84c262..2d48b0d 100644 --- a/lib/ioctl/libdm-iface.c +++ b/lib/ioctl/libdm-iface.c @@ -495,6 +495,10 @@ static int _dm_task_run_v1(struct dm_task *dmt) 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) { case DM_DEVICE_CREATE: 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) 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); if (!_open_control()) @@ -1193,18 +1198,22 @@ int dm_task_run(struct dm_task *dmt) break; 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; 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; case DM_DEVICE_MKNODES: 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)); - else + else if (dmt->dev_name) rm_dev_node(dmt->dev_name); break; -- 2.43.5