1
0
mirror of git://sourceware.org/git/lvm2.git synced 2025-01-04 09:18:36 +03:00

o dm-fs compiles, I've forgotten to register the device in /proc though

This commit is contained in:
Joe Thornber 2001-08-21 15:24:02 +00:00
parent bb6ddc2de7
commit e16c478a25
3 changed files with 49 additions and 42 deletions

View File

@ -29,6 +29,9 @@
#include "dm.h" #include "dm.h"
#include <linux/proc_fs.h>
#include <linux/ctype.h>
/* /*
* /dev/device-mapper/control is the control char device used to * /dev/device-mapper/control is the control char device used to
* create/destroy mapping devices. * create/destroy mapping devices.
@ -47,12 +50,20 @@ static struct proc_dir_entry *_control;
static devfs_handle_t _dev_dir; static devfs_handle_t _dev_dir;
static int _line_splitter(struct file *file, const char *buffer, static int _line_splitter(struct file *file, const char *buffer,
unsigned long *count, void *data) unsigned long count, void *data);
int _process_control(const char *b, const char *e, int minor);
static int _process_table(const char *b, const char *e, int minor);
static const char *_eat_space(const char *b, const char *e);
static int _get_word(const char *b, const char *e,
const char **wb, const char **we);
static int _tok_cmp(const char *str, const char *b, const char *e);
static void _tok_cpy(char *dest, size_t max,
const char *b, const char *e);
typedef int (process_fn)(const char *b, const char *e); typedef int (*process_fn)(const char *b, const char *e, int minor);
struct pf_data { struct pf_data {
process_fn data; process_fn fn;
int minor; int minor;
}; };
@ -103,8 +114,7 @@ void dm_fin_fs(void)
int _process_control(const char *b, const char *e, int minor) int _process_control(const char *b, const char *e, int minor)
{ {
const char *wb, *we; const char *wb, *we;
char *name[64]; char name[64];
long minor = -1;
int create = 0; int create = 0;
/* /*
@ -125,23 +135,24 @@ int _process_control(const char *b, const char *e, int minor)
return -EINVAL; return -EINVAL;
b = we; b = we;
_tok_cpy(name, sizeof(buffer), wb, we); _tok_cpy(name, sizeof(name), wb, we);
if (create) { if (create) {
if (_get_word(b, e, &wb, &we)) { if (_get_word(b, e, &wb, &we)) {
minor = simple_strtol(wb, &we, 10); minor = simple_strtol(wb, (char **) &we, 10);
if (we == wb) if (we == wb)
return -EINVAL; return -EINVAL;
} }
_create_dm(name, minor);
return dm_create(name, minor);
} else { } else {
if (!_get_word(b, e, &wb, &we)) if (!_get_word(b, e, &wb, &we))
return -EINVAL; return -EINVAL;
_tok_cpy(name, sizeof(buffer), wb, we); _tok_cpy(name, sizeof(name), wb, we);
_remove_dm(name, minor); return dm_remove(name);
} }
return -EINVAL; return -EINVAL;
@ -149,32 +160,10 @@ int _process_control(const char *b, const char *e, int minor)
static int _process_table(const char *b, const char *e, int minor) static int _process_table(const char *b, const char *e, int minor)
{ {
struct target *t;
const char *wb, *we; const char *wb, *we;
char buffer[64]; struct mapped_device *md = dm_find_minor(minor);
int len; void *context;
int ret;
/*
* format of a line is:
* <highest valid sector> <target name> <target args>
*/
if (!_get_word(b, e, &wb, &we) || (we - wb) > sizeof(buffer))
return -EPARAM;
len = we - wb;
strncpy(buffer, wb, we - wb);
buffer[len] = '\0';
if (!(t = get_target(buffer))) {
/* FIXME: add module loading here */
return -EPARAM;
}
}
static int _process_table(const char *b, const char *e, int minor)
{
const char *wb, *we;
struct mapped_device *md = dm_get_dev(minor);
if (!md) if (!md)
return -ENXIO; return -ENXIO;
@ -208,7 +197,7 @@ static int _process_table(const char *b, const char *e, int minor)
strncpy(high_s, wb, we - wb); strncpy(high_s, wb, we - wb);
high_s[len] = '\0'; high_s[len] = '\0';
high = strtol(high_s, &ptr, 10); high = simple_strtol(high_s, &ptr, 10);
if (ptr == high_s) if (ptr == high_s)
return 0; return 0;
@ -226,7 +215,11 @@ static int _process_table(const char *b, const char *e, int minor)
if (!(t = dm_get_target(target))) if (!(t = dm_get_target(target)))
return 0; return 0;
dm_add_entry(md, high, t, context); if ((ret = t->ctr(md->highs[md->num_targets - 1],
high, md, we, &context)))
return ret;
dm_add_entry(md, high, t->map, context);
} }
return 1; return 1;
@ -241,7 +234,7 @@ static const char *_eat_space(const char *b, const char *e)
} }
static int _get_word(const char *b, const char *e, static int _get_word(const char *b, const char *e,
const char **wb, const char *we) const char **wb, const char **we)
{ {
b = _eat_space(b, e); b = _eat_space(b, e);
@ -256,7 +249,7 @@ static int _get_word(const char *b, const char *e,
} }
static int _line_splitter(struct file *file, const char *buffer, static int _line_splitter(struct file *file, const char *buffer,
unsigned long *count, void *data) unsigned long count, void *data)
{ {
const char *b = buffer, *e = buffer + count, *lb; const char *b = buffer, *e = buffer + count, *lb;
struct pf_data *pfd = (struct pf_data *) data; struct pf_data *pfd = (struct pf_data *) data;
@ -297,3 +290,13 @@ static int _tok_cmp(const char *str, const char *b, const char *e)
return -1; return -1;
} }
static void _tok_cpy(char *dest, size_t max,
const char *b, const char *e)
{
size_t len = e - b;
if (len > --max)
len = max;
strncpy(dest, b, len);
dest[len] = '0';
}

View File

@ -440,7 +440,7 @@ struct mapped_device *dm_find_minor(int minor)
return md; return md;
} }
int dm_create(int minor, const char *name) int dm_create(const char *name, int minor)
{ {
struct mapped_device *md; struct mapped_device *md;
@ -465,10 +465,11 @@ int dm_create(int minor, const char *name)
return 0; return 0;
} }
int dm_remove(const char *name, int minor) int dm_remove(const char *name)
{ {
struct mapped_device *md; struct mapped_device *md;
struct dev_list *d, *n; struct dev_list *d, *n;
int minor;
wl; wl;
if (!(md = __find_name(name))) { if (!(md = __find_name(name))) {

View File

@ -103,6 +103,9 @@ int dm_std_targets(void);
struct mapped_device *dm_find_name(const char *name); struct mapped_device *dm_find_name(const char *name);
struct mapped_device *dm_find_minor(int minor); struct mapped_device *dm_find_minor(int minor);
int dm_create(const char *name, int minor);
int dm_remove(const char *name);
int dm_activate(struct mapped_device *md); int dm_activate(struct mapped_device *md);
void dm_suspend(struct mapped_device *md); void dm_suspend(struct mapped_device *md);
@ -116,7 +119,7 @@ void dm_free_table(struct mapped_device *md);
/* dm-fs.c */ /* dm-fs.c */
int dm_init_fs(void); int dm_init_fs(void);
int dm_fin_fs(void); void dm_fin_fs(void);
#define WARN(f, x...) printk(KERN_WARNING "device-mapper: " f "\n" , ## x) #define WARN(f, x...) printk(KERN_WARNING "device-mapper: " f "\n" , ## x)