From: Alasdair Kergon Date: Fri, 11 Jan 2002 12:12:44 +0000 (+0000) Subject: o Add rename support to dmsetup. X-Git-Tag: beta1-pre1~17 X-Git-Url: https://sourceware.org/git/?a=commitdiff_plain;h=9a50d9b6a369b62508ea5c28fd2c610a89989826;p=dm.git o Add rename support to dmsetup. o Add support to use specified minor number to library and dmsetup. --- diff --git a/VERSION b/VERSION index 6f835a0..7d1c60f 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.92.00-cvs (2002-01-10) +0.92.01-cvs (2002-01-11) diff --git a/dmsetup/dmsetup.c b/dmsetup/dmsetup.c index 380bf01..a7328fb 100644 --- a/dmsetup/dmsetup.c +++ b/dmsetup/dmsetup.c @@ -28,10 +28,12 @@ */ enum { READ_ONLY = 0, + MINOR_ARG, NUM_SWITCHES }; static int _switches[NUM_SWITCHES]; +static int _values[NUM_SWITCHES]; /* @@ -105,6 +107,9 @@ static int _load(int task, const char *name, const char *file) if (_switches[READ_ONLY] && !dm_task_set_ro(dmt)) goto out; + if (_switches[MINOR_ARG] && !dm_task_set_minor(dmt, _values[MINOR_ARG])) + goto out; + if (!dm_task_run(dmt)) goto out; @@ -126,6 +131,30 @@ static int _reload(int argc, char **argv) return _load(DM_DEVICE_RELOAD, argv[1], argv[2]); } +static int _rename(int argc, char **argv) +{ + int r = 0; + struct dm_task *dmt; + + if (!(dmt = dm_task_create(DM_DEVICE_RENAME))) + return 0; + + if (!dm_task_set_name(dmt, argv[1])) + goto out; + + if (!dm_task_set_newname(dmt, argv[2])) + goto out; + + if (!dm_task_run(dmt)) + goto out; + + r = 1; + +out: + dm_task_destroy(dmt); + + return r; +} static int _simple(int task, const char *name) { @@ -226,6 +255,7 @@ static struct command _commands[] = { {"resume", "", 1, _resume}, {"reload", " ", 2, _reload}, {"info", "", 1, _info}, + {"rename", " ", 2, _rename}, {NULL, NULL, 0, NULL} }; @@ -258,17 +288,25 @@ static int _process_switches(int *argc, char ***argv) static struct option long_options[] = { {"read-only", 0, NULL, READ_ONLY}, + {"minor", 1, NULL, MINOR_ARG}, + {"", 0, NULL, 0} }; /* * Zero all the index counts. */ memset(&_switches, 0, sizeof(_switches)); + memset(&_values, 0, sizeof(_values)); - while ((c = getopt_long(*argc, *argv, "r", - long_options, &index)) != -1) + while ((c = getopt_long(*argc, *argv, "m:r", + long_options, &index)) != -1) { if (c == 'r' || index == READ_ONLY) _switches[READ_ONLY]++; + if (c == 'm' || index == MINOR_ARG) { + _switches[MINOR_ARG]++; + _values[MINOR_ARG] = atoi(optarg); + } + } *argv += optind; *argc -= optind; diff --git a/lib/fs/libdevmapper.c b/lib/fs/libdevmapper.c index 823d42a..159663e 100644 --- a/lib/fs/libdevmapper.c +++ b/lib/fs/libdevmapper.c @@ -82,6 +82,12 @@ int dm_task_set_ro(struct dm_task *dmt) return 1; } +int dm_task_set_newname(struct dm_task *dmt, const char *newname) +{ + log("Renaming is not yet supported by the filesystem interface"); + return 0; +} + struct target *create_target(uint64_t start, uint64_t len, const char *type, const char *params) { diff --git a/lib/fs/libdm-targets.h b/lib/fs/libdm-targets.h index a4b102e..02a2db4 100644 --- a/lib/fs/libdm-targets.h +++ b/lib/fs/libdm-targets.h @@ -12,6 +12,7 @@ struct target { struct dm_task { int type; char *dev_name; + int minor; struct target *head, *tail; diff --git a/lib/ioctl/libdevmapper.c b/lib/ioctl/libdevmapper.c index 0d39c93..bed81a1 100644 --- a/lib/ioctl/libdevmapper.c +++ b/lib/ioctl/libdevmapper.c @@ -185,7 +185,7 @@ static struct dm_ioctl *_flatten(struct dm_task *dmt) strncpy(dmi->name, dmt->dev_name, sizeof(dmi->name)); dmi->suspend = (dmt->type == DM_DEVICE_SUSPEND) ? 1 : 0; dmi->open_count = 0; - dmi->minor = -1; + dmi->minor = dmt->minor; dmi->read_only = dmt->read_only; dmi->target_count = count; diff --git a/lib/ioctl/libdm-targets.h b/lib/ioctl/libdm-targets.h index 9243366..5a0e30f 100644 --- a/lib/ioctl/libdm-targets.h +++ b/lib/ioctl/libdm-targets.h @@ -20,6 +20,7 @@ struct dm_task { struct target *head, *tail; int read_only; + int minor; struct dm_ioctl *dmi; char *newname; }; diff --git a/lib/libdevmapper.h b/lib/libdevmapper.h index 67ddba8..7e3cf61 100644 --- a/lib/libdevmapper.h +++ b/lib/libdevmapper.h @@ -66,8 +66,8 @@ struct dm_info { int dm_task_get_info(struct dm_task *dmt, struct dm_info *dmi); int dm_task_set_ro(struct dm_task *dmt); - int dm_task_set_newname(struct dm_task *dmt, const char *newname); +int dm_task_set_minor(struct dm_task *dmt, int minor); /* * Use these to prepare for a create or reload. diff --git a/lib/libdm-common.c b/lib/libdm-common.c index 679fd71..ade0515 100644 --- a/lib/libdm-common.c +++ b/lib/libdm-common.c @@ -70,6 +70,7 @@ struct dm_task *dm_task_create(int type) memset(dmt, 0, sizeof(*dmt)); dmt->type = type; + dmt->minor = -1; return dmt; } @@ -105,6 +106,13 @@ int dm_task_set_name(struct dm_task *dmt, const char *name) return 1; } +int dm_task_set_minor(struct dm_task *dmt, int minor) +{ + dmt->minor = minor; + return 1; +} + + int dm_task_add_target(struct dm_task *dmt, uint64_t start, uint64_t size,