1
0
mirror of git://sourceware.org/git/lvm2.git synced 2024-12-21 13:34:40 +03:00

o make dm.c compile

This commit is contained in:
Joe Thornber 2001-08-21 14:28:00 +00:00
parent fb037af2b3
commit 12a8b590e0
2 changed files with 99 additions and 58 deletions

View File

@ -122,6 +122,8 @@
* for the LV. Could also use poll() for this kind of thing.
*/
#include "dm.h"
#define MAX_DEVICES 64
#define DEFAULT_READ_AHEAD 64
@ -130,8 +132,12 @@
const char *_name = "device-mapper";
int _version[3] = {1, 0, 0};
#define rl down_read(&_dev_lock)
#define ru up_read(&_dev_lock)
#define wl down_write(&_dev_lock)
#define wu up_read(&_dev_lock)
struct rw_semaphore _dev_lock;
static int _dev_count = 0;
static struct mapped_device *_devs[MAX_DEVICES];
/* block device arrays */
@ -150,7 +156,6 @@ static struct block_device_operations _blk_dops = {
ioctl: _blk_ioctl
};
static struct mapped_device *_build_map(struct device_table *t);
static int _request_fn(request_queue_t *q, int rw, struct buffer_head *bh);
/*
@ -169,16 +174,8 @@ static int _init(void)
blksize_size[MAJOR_NR] = _blksize_size;
hardsect_size[MAJOR_NR] = _hardsect_size;
if (register_chrdev(DM_CTL_MAJOR, _name, &_ctl_fops) < 0) {
printk(KERN_ERR "%s - register_chrdev failed\n", _name);
return -EIO;
}
if (register_blkdev(MAJOR_NR, _name, &_blk_dops) < 0) {
printk(KERN_ERR "%s -- register_blkdev failed\n", _name);
if (unregister_chrdev(DM_CTL_MAJOR, _name) < 0)
printk(KERN_ERR "%s - unregister_chrdev failed\n",
_name);
return -EIO;
}
@ -191,9 +188,6 @@ static int _init(void)
static void _fin(void)
{
if (unregister_chrdev(DM_CTL_MAJOR, _name) < 0)
printk(KERN_ERR "%s - unregister_chrdev failed\n", _name);
if (unregister_blkdev(MAJOR_NR, _name) < 0)
printk(KERN_ERR "%s -- unregister_blkdev failed\n", _name);
@ -212,43 +206,44 @@ static void _fin(void)
static int _blk_open(struct inode *inode, struct file *file)
{
int minor = MINOR(inode->i_rdev);
struct mapped_device *md = _devices + minor;
struct mapped_device *md;
if (minor >= MAX_DEVICES)
return -ENXIO;
spin_lock(&md->lock);
wl;
md = _devs[minor];
if (!md->in_use) {
spin_unlock(&md->lock);
if (!md || !is_active(md)) {
wu;
return -ENXIO;
}
md->in_use++;
spin_unlock(&md->lock);
md->use_count++;
wu;
MOD_INC_USE_COUNT; /* isn't this done by blk layer ? it should be */
MOD_INC_USE_COUNT;
return 0;
}
static int _blk_close(struct inode *inode, struct file *file)
{
int minor = MINOR(inode->i_rdev);
struct mapped_device *md = _devices + minor;
struct mapped_device *md;
if (minor >= MAX_DEVICES)
return -ENXIO;
spin_lock(&md->lock);
if (md->in_use <= 1) {
wl;
md = _devs[minor];
if (!md || md->use_count <= 1) {
WARN("reference count in mapped_device incorrect");
spin_unlock(&md->lock);
wu;
return -ENXIO;
}
md->in_use--;
spin_unlock(&md->lock);
md->use_count--;
wu;
MOD_DEC_USE_COUNT;
return 0;
@ -313,7 +308,7 @@ static int _request_fn(request_queue_t *q, int rw, struct buffer_head *bh)
if (minor >= MAX_DEVICES)
return -ENXIO;
down_read(&_dev_lock);
rl;
md = _devs[minor];
if (!md) {
@ -341,7 +336,7 @@ static int _request_fn(request_queue_t *q, int rw, struct buffer_head *bh)
buffer_IO_error(bh);
out:
up_read(&md->lock);
ru;
return ret;
}
@ -371,36 +366,35 @@ static inline int __any_old_dev(void)
static struct mapped_device *_alloc_dev(int minor)
{
int i;
struct mapped_device *md = kmalloc(sizeof(*md), GFP_KERNEL);
down_write(&_dev_lock);
wl;
minor = (minor < 0) ? __any_old_dev() : __specific_dev(minor);
if (minor < 0) {
WARN("no free devices available");
up_write(&_dev_lock);
wu;
kfree(md);
return 0;
}
md->dev = MKDEV(DM_BLK_MAJOR, minor);
md->name[0] = '\0';
clear_bit(md->status, DM_CREATED);
md->state = 0;
_devs[minor] = md;
up_write(&_dev_lock);
wu;
return *d;
return md;
}
static void _free_dev(struct mapped_device *md)
{
int i, minor = MINOR(md->dev);
int minor = MINOR(md->dev);
down_write(&_dev_lock);
_devs[i] = 0;
up_write(&_dev_lock);
wl;
_devs[minor] = 0;
wu;
kfree(md);
}
@ -415,13 +409,35 @@ static inline struct mapped_device *__find_name(const char *name)
return 0;
}
static int _open_dev(struct dev_list *d)
{
int err;
if (!(d->bd = bdget(kdev_t_to_nr(d->dev))))
return -ENOMEM;
if ((err = blkdev_get(d->bd, FMODE_READ|FMODE_WRITE, 0, BDEV_FILE))) {
bdput(d->bd);
return err;
}
return 0;
}
static void _close_dev(struct dev_list *d)
{
blkdev_put(d->bd, BDEV_FILE);
bdput(d->bd);
d->bd = 0;
}
struct mapped_device *dm_find_name(const char *name)
{
struct mapped_device *md;
down_read(&_dev_lock);
rl;
md = __find_name(name);
up_read(&_dev_lock);
ru;
return md;
}
@ -430,9 +446,9 @@ struct mapped_device *dm_find_minor(int minor)
{
struct mapped_device *md;
down_read(&_dev_lock);
rl;
md = _devs[minor];
up_read(&_dev_lock);
ru;
return md;
}
@ -447,28 +463,29 @@ int dm_create(int minor, const char *name)
if (!(md = _alloc_dev(minor)))
return -ENOMEM;
down_write(&_dev_lock);
if (__find_dev(name)) {
wl;
if (__find_name(name)) {
WARN("device with that name already exists");
up_write(&_dev_lock);
wu;
_free_dev(md);
return -EINVAL;
}
strcpy(md->name, name);
_devs[minor] = md;
up_write(&_dev_lock);
wu;
return 0;
}
int dm_remove(const char *name, int minor)
{
struct mapped_device *md;
int minor;
struct dev_list *d, *n;
down_write(&_dev_lock);
if (!(md = __find_dev(name))) {
up_write(&_dev_lock);
wl;
if (!(md = __find_name(name))) {
wu;
return -ENXIO;
}
@ -481,13 +498,14 @@ int dm_remove(const char *name, int minor)
minor = MINOR(md->dev);
_free_dev(md);
_devs[minor] = 0;
up_write(&_dev_lock);
wu;
return 0;
}
int dm_add_device(struct mapped_device *md, kdev_t dev)
{
struct dev_list *d = kmalloc(sizeof(*d));
struct dev_list *d = kmalloc(sizeof(*d), GFP_KERNEL);
if (!d)
return 0;
@ -495,6 +513,7 @@ int dm_add_device(struct mapped_device *md, kdev_t dev)
d->dev = dev;
d->next = md->devices;
md->devices = d;
return 1;
}
@ -506,10 +525,12 @@ int dm_activate(struct mapped_device *md)
if (is_active(md))
return 1;
rl;
/* open all the devices */
for (d = md->devices; d; d = d->next)
if ((ret = _open_dev(d->dev)))
if ((ret = _open_dev(d)))
goto bad;
ru;
return 0;
@ -517,7 +538,8 @@ int dm_activate(struct mapped_device *md)
od = d;
for (d = md->devices; d != od; d = d->next)
_close_dev(d->dev);
_close_dev(d);
ru;
return ret;
}
@ -530,7 +552,7 @@ void dm_suspend(struct mapped_device *md)
/* close all the devices */
for (d = md->devices; d; d = d->next)
_close_dev(d->dev));
_close_dev(d);
set_active(md, 0);
}

View File

@ -33,14 +33,17 @@
#define MAX_DEPTH 16
#define NODE_SIZE L1_CACHE_BYTES
#define KEYS_PER_NODE (NODE_SIZE / sizeof(offset_t))
#define DM_NAME_LEN 64
enum {
DM_LOADED = 0,
DM_LOADING,
DM_ACTIVE,
};
struct dev_list {
kdev_t dev;
struct block_device *bd;
struct dev_list *next;
};
@ -48,6 +51,7 @@ struct mapped_device {
kdev_t dev;
char name[DM_NAME_LEN];
int use_count;
int state;
atomic_t pending;
@ -69,7 +73,6 @@ struct mapped_device {
struct dev_list *devices;
};
/* dm-target.c */
struct target {
char *name;
dm_ctr_fn ctr;
@ -79,6 +82,8 @@ struct target {
struct target *next;
};
/* dm-target.c */
struct target *dm_get_target(const char *name);
int dm_std_targets(void);
@ -86,7 +91,7 @@ int dm_std_targets(void);
struct mapped_device *dm_find_name(const char *name);
struct mapped_device *dm_find_minor(int minor);
void dm_activate(struct mapped_device *md);
int dm_activate(struct mapped_device *md);
void dm_suspend(struct mapped_device *md);
/* dm-table.c */
@ -94,10 +99,24 @@ int dm_start_table(struct mapped_device *md);
int dm_add_entry(struct mapped_device *md, offset_t high,
dm_map_fn target, void *context);
int dm_complete_table(struct mapped_device *md);
int dm_clear_table(struct mapped_device *md);
/* dm-fs.c */
int dm_init_fs(void);
int dm_fin_fs(void);
static int is_active(struct mapped_device *md)
{
return test_bit(DM_ACTIVE, &md->state);
}
static void set_active(struct mapped_device *md, int set)
{
if (set)
set_bit(DM_ACTIVE, &md->state);
else
clear_bit(DM_ACTIVE,& md->state);
}
#endif