1
0
mirror of git://sourceware.org/git/lvm2.git synced 2024-10-27 18:55:19 +03:00

o Added -r, --read-only switch to dmsetup for use with create and reload.

This commit is contained in:
Joe Thornber 2002-01-03 10:39:21 +00:00
parent f1568304e0
commit f17673f1d0
5 changed files with 66 additions and 6 deletions

View File

@ -51,10 +51,17 @@ int dm_task_get_info(struct dm_task *dmt, struct dm_info *info)
info->open_count = dmt->dmi->open_count; info->open_count = dmt->dmi->open_count;
info->major = dmt->dmi->major; info->major = dmt->dmi->major;
info->minor = dmt->dmi->minor; info->minor = dmt->dmi->minor;
info->read_only = dmt->dmi->read_only;
info->target_count = dmt->dmi->target_count; info->target_count = dmt->dmi->target_count;
return 1; return 1;
} }
int dm_task_set_ro(struct dm_task *dmt)
{
dmt->read_only = 1;
return 1;
}
struct target *create_target(uint64_t start, struct target *create_target(uint64_t start,
uint64_t len, uint64_t len,
const char *type, const char *params) const char *type, const char *params)
@ -156,6 +163,7 @@ static struct dm_ioctl *_flatten(struct dm_task *dmt)
dmi->suspend = (dmt->type == DM_DEVICE_SUSPEND) ? 1 : 0; dmi->suspend = (dmt->type == DM_DEVICE_SUSPEND) ? 1 : 0;
dmi->open_count = 0; dmi->open_count = 0;
dmi->minor = -1; dmi->minor = -1;
dmi->read_only = dmt->read_only;
dmi->target_count = count; dmi->target_count = count;

View File

@ -19,6 +19,7 @@ struct dm_task {
struct target *head, *tail; struct target *head, *tail;
int read_only;
struct dm_ioctl *dmi; struct dm_ioctl *dmi;
}; };

View File

@ -57,11 +57,15 @@ struct dm_info {
unsigned int open_count; unsigned int open_count;
int major; int major;
int minor; /* minor device number */ int minor; /* minor device number */
int read_only;
unsigned int target_count; unsigned int target_count;
}; };
int dm_task_get_info(struct dm_task *dmt, struct dm_info *dmi); int dm_task_get_info(struct dm_task *dmt, struct dm_info *dmi);
int dm_task_set_ro(struct dm_task *dmt);
/* /*
* Use these to prepare for a create or reload. * Use these to prepare for a create or reload.
*/ */

View File

@ -26,7 +26,7 @@
static char _dm_dir[PATH_MAX] = DEV_DIR DM_DIR; static char _dm_dir[PATH_MAX] = DEV_DIR DM_DIR;
/* /*
* Library users can provide their own logging * Library users can provide their own logging
* function. * function.
*/ */
@ -35,7 +35,7 @@ void _default_log(int level, const char *file, int line,
{ {
va_list ap; va_list ap;
va_start(ap, f); va_start(ap, f);
vfprintf(stderr, f, ap); vfprintf(stderr, f, ap);
va_end(ap); va_end(ap);

View File

@ -16,11 +16,27 @@
#include <sys/types.h> #include <sys/types.h>
#include <ctype.h> #include <ctype.h>
#include <errno.h> #include <errno.h>
#include <unistd.h>
#include <getopt.h>
#define LINE_SIZE 1024 #define LINE_SIZE 1024
#define err(msg, x...) fprintf(stderr, msg "\n", ##x) #define err(msg, x...) fprintf(stderr, msg "\n", ##x)
/*
* We have only very simple switches ATM.
*/
enum {
READ_ONLY = 0,
NUM_SWITCHES
};
static int _switches[NUM_SWITCHES];
/*
* Commands
*/
static int _parse_file(struct dm_task *dmt, const char *file) static int _parse_file(struct dm_task *dmt, const char *file)
{ {
char buffer[LINE_SIZE], *ttype, *ptr, *comment; char buffer[LINE_SIZE], *ttype, *ptr, *comment;
@ -86,6 +102,9 @@ static int _load(int task, const char *name, const char *file)
if (!_parse_file(dmt, file)) if (!_parse_file(dmt, file))
goto out; goto out;
if (_switches[READ_ONLY] && !dm_task_set_ro(dmt))
goto out;
if (!dm_task_run(dmt)) if (!dm_task_run(dmt))
goto out; goto out;
@ -221,7 +240,7 @@ static void _usage(FILE *out)
return; return;
} }
struct command *_find_command(const char *name) static struct command *_find_command(const char *name)
{ {
int i; int i;
@ -232,29 +251,57 @@ struct command *_find_command(const char *name)
return NULL; return NULL;
} }
static int _process_switches(int *argc, char ***argv)
{
int index;
char c;
static struct option long_options[] = {
{"read-only", 0, NULL, READ_ONLY},
};
/*
* Zero all the index counts.
*/
memset(&_switches, 0, sizeof(_switches));
while ((c = getopt_long(*argc, *argv, "r",
long_options, &index)) != -1)
if (c == 'r' || index == READ_ONLY)
_switches[READ_ONLY]++;
*argv += optind;
*argc -= optind;
return 1;
}
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
struct command *c; struct command *c;
if (!_process_switches(&argc, &argv)) {
fprintf(stderr, "Couldn't process command line switches.\n");
exit(1);
}
if (argc < 2) { if (argc < 2) {
_usage(stderr); _usage(stderr);
exit(1); exit(1);
} }
if (!(c = _find_command(argv[1]))) { if (!(c = _find_command(argv[0]))) {
fprintf(stderr, "Unknown command\n"); fprintf(stderr, "Unknown command\n");
_usage(stderr); _usage(stderr);
exit(1); exit(1);
} }
if (argc != c->num_args + 2) { if (argc != c->num_args + 1) {
fprintf(stderr, "Incorrect number of arguments\n"); fprintf(stderr, "Incorrect number of arguments\n");
_usage(stderr); _usage(stderr);
exit(1); exit(1);
} }
if (!c->fn(argc - 1, argv + 1)) { if (!c->fn(argc, argv)) {
fprintf(stderr, "Command failed\n"); fprintf(stderr, "Command failed\n");
exit(1); exit(1);
} }