1
0
mirror of git://sourceware.org/git/lvm2.git synced 2025-01-03 05:18:29 +03:00

o New ioctl(): LV_BMAP which is compatible with LVM so that hopefully LILO

will work. I haven't actually tested that, but this support at least will
   be required.
This commit is contained in:
Steven Whitehouse 2001-09-14 13:45:40 +00:00
parent df18917b3c
commit 9b90e8ee2c
3 changed files with 56 additions and 5 deletions

View File

@ -59,8 +59,11 @@ struct target_type {
dm_ctr_fn ctr; dm_ctr_fn ctr;
dm_dtr_fn dtr; dm_dtr_fn dtr;
dm_map_fn map; dm_map_fn map;
unsigned long flags;
}; };
#define TF_BMAP 0x0001 /* Target supports bmap operation */
int dm_register_target(struct target_type *t); int dm_register_target(struct target_type *t);
int dm_unregister_target(struct target_type *t); int dm_unregister_target(struct target_type *t);

View File

@ -118,6 +118,7 @@ static struct target_type linear_target = {
ctr: linear_ctr, ctr: linear_ctr,
dtr: linear_dtr, dtr: linear_dtr,
map: linear_map, map: linear_map,
flags: TF_BMAP,
}; };
static int __init linear_init(void) static int __init linear_init(void)

View File

@ -37,6 +37,7 @@
#include <linux/blk.h> #include <linux/blk.h>
#include <linux/blkpg.h> #include <linux/blkpg.h>
#include <linux/hdreg.h> #include <linux/hdreg.h>
#include <linux/lvm.h>
#define MAX_DEVICES 64 #define MAX_DEVICES 64
#define DEFAULT_READ_AHEAD 64 #define DEFAULT_READ_AHEAD 64
@ -63,7 +64,8 @@ static int _hardsect_size[MAX_DEVICES];
const char *_fs_dir = "device-mapper"; const char *_fs_dir = "device-mapper";
static devfs_handle_t _dev_dir; static devfs_handle_t _dev_dir;
static int request(request_queue_t * q, int rw, struct buffer_head *bh); static int request(request_queue_t *q, int rw, struct buffer_head *bh);
static int dm_user_bmap(struct inode *inode, struct lv_bmap *lvb);
/* /*
* setup and teardown the driver * setup and teardown the driver
@ -247,9 +249,9 @@ static int dm_blk_ioctl(struct inode *inode, struct file *file,
case BLKRRPART: case BLKRRPART:
return -EINVAL; return -EINVAL;
#if 0
case LVM_BMAP: /* we need some method for LILO to use */ case LV_BMAP:
#endif return dm_user_bmap(inode, (struct lv_bmap *)a);
default: default:
printk(KERN_WARNING "%s - unknown block ioctl %d", printk(KERN_WARNING "%s - unknown block ioctl %d",
@ -397,7 +399,52 @@ static inline int __find_node(struct dm_table *t, struct buffer_head *bh)
return (KEYS_PER_NODE * n) + k; return (KEYS_PER_NODE * n) + k;
} }
static int request(request_queue_t * q, int rw, struct buffer_head *bh) static int dm_user_bmap(struct inode *inode, struct lv_bmap *lvb)
{
struct buffer_head bh;
struct mapped_device *md;
unsigned long block;
int minor = MINOR(inode->i_rdev);
int err;
if (minor >= MAX_DEVICES)
return -ENXIO;
md = _devs[minor];
if (md == NULL)
return -ENXIO;
if (get_user(block, &lvb->lv_block))
return -EFAULT;
memset(&bh, 0, sizeof(bh));
bh.b_blocknr = block;
bh.b_dev = bh.b_rdev = inode->i_rdev;
bh.b_size = _blksize_size[minor];
bh.b_rsector = block * (bh.b_size >> 9);
err = -EINVAL;
down_read(&_dev_lock);
if (test_bit(DM_ACTIVE, &md->state) && md->map) {
struct target *t = md->map->targets + __find_node(md->map, &bh);
struct target_type *target = t->type;
if (target->flags & TF_BMAP) {
err = target->map(&bh, t->private);
}
}
up_read(&_dev_lock);
if (err >= 0) {
if (put_user(kdev_t_to_nr(bh.b_rdev), &lvb->lv_dev))
return -EFAULT;
if (put_user(bh.b_rsector / (bh.b_size >> 9), &lvb->lv_dev))
return -EFAULT;
}
return err;
}
static int request(request_queue_t *q, int rw, struct buffer_head *bh)
{ {
struct mapped_device *md; struct mapped_device *md;
int r, minor = MINOR(bh->b_rdev); int r, minor = MINOR(bh->b_rdev);