[dm-devel] [Patch 2/2] proposal: map context
Joe Thornber
joe at fib011235813.fsnet.co.uk
Fri Jan 10 07:59:01 UTC 2003
Allow the map method to pass some context to the endio method.
--- diff/drivers/md/dm-linear.c 2002-11-29 09:44:59.000000000 +0000
+++ source/drivers/md/dm-linear.c 2003-01-10 11:49:27.000000000 +0000
@@ -64,7 +64,8 @@
kfree(lc);
}
-static int linear_map(struct dm_target *ti, struct buffer_head *bh, int rw)
+static int linear_map(struct dm_target *ti, struct buffer_head *bh, int rw,
+ void **map_context)
{
struct linear_c *lc = (struct linear_c *) ti->private;
--- diff/drivers/md/dm-snapshot.c 2003-01-10 10:47:54.000000000 +0000
+++ source/drivers/md/dm-snapshot.c 2003-01-10 11:49:27.000000000 +0000
@@ -785,7 +785,8 @@
(bh->b_rsector & s->chunk_mask);
}
-static int snapshot_map(struct dm_target *ti, struct buffer_head *bh, int rw)
+static int snapshot_map(struct dm_target *ti, struct buffer_head *bh, int rw,
+ void **map_context)
{
struct exception *e;
struct dm_snapshot *s = (struct dm_snapshot *) ti->private;
@@ -1028,7 +1029,8 @@
dm_put_device(ti, dev);
}
-static int origin_map(struct dm_target *ti, struct buffer_head *bh, int rw)
+static int origin_map(struct dm_target *ti, struct buffer_head *bh, int rw,
+ void **map_context)
{
struct dm_dev *dev = (struct dm_dev *) ti->private;
bh->b_rdev = dev->dev;
--- diff/drivers/md/dm-stripe.c 2002-11-29 09:46:30.000000000 +0000
+++ source/drivers/md/dm-stripe.c 2003-01-10 11:49:27.000000000 +0000
@@ -186,7 +186,8 @@
kfree(sc);
}
-static int stripe_map(struct dm_target *ti, struct buffer_head *bh, int rw)
+static int stripe_map(struct dm_target *ti, struct buffer_head *bh, int rw,
+ void **context)
{
struct stripe_c *sc = (struct stripe_c *) ti->private;
--- diff/drivers/md/dm-target.c 2003-01-10 10:20:03.000000000 +0000
+++ source/drivers/md/dm-target.c 2003-01-10 11:49:27.000000000 +0000
@@ -159,7 +159,8 @@
/* empty */
}
-static int io_err_map(struct dm_target *ti, struct buffer_head *bh, int rw)
+static int io_err_map(struct dm_target *ti, struct buffer_head *bh, int rw,
+ void **map_context)
{
return -EIO;
}
--- diff/drivers/md/dm.c 2003-01-10 11:43:50.000000000 +0000
+++ source/drivers/md/dm.c 2003-01-10 11:49:27.000000000 +0000
@@ -30,6 +30,7 @@
struct dm_target *ti;
int rw;
+ void *map_context;
void (*end_io) (struct buffer_head * bh, int uptodate);
void *context;
};
@@ -320,7 +321,8 @@
dm_endio_fn endio = io->ti->type->end_io;
if (endio) {
- r = endio(io->ti, bh, io->rw, uptodate ? 0 : -EIO);
+ r = endio(io->ti, bh, io->rw, uptodate ? 0 : -EIO,
+ io->map_context);
if (r < 0)
uptodate = 0;
@@ -354,7 +356,7 @@
if (!ti)
return -EINVAL;
- r = ti->type->map(ti, bh, rw);
+ r = ti->type->map(ti, bh, rw, &io->map_context);
if (r >= 0) {
/* hook the end io request fn */
@@ -469,6 +471,7 @@
{
struct buffer_head bh;
struct dm_target *ti;
+ void *map_context;
int r;
if (test_bit(DMF_BLOCK_IO, &md->flags)) {
@@ -490,7 +493,8 @@
ti = dm_table_find_target(md->map, bh.b_rsector);
/* do the mapping */
- r = ti->type->map(ti, &bh, READ);
+ r = ti->type->map(ti, &bh, READ, &map_context);
+ ti->type->end_io(ti, &bh, READ, 0, map_context);
if (!r) {
*r_dev = bh.b_rdev;
--- diff/include/linux/device-mapper.h 2003-01-10 11:36:08.000000000 +0000
+++ source/include/linux/device-mapper.h 2003-01-10 11:49:27.000000000 +0000
@@ -33,7 +33,8 @@
* = 0: The target will handle the io by resubmitting it later
* > 0: simple remap complete
*/
-typedef int (*dm_map_fn) (struct dm_target *ti, struct buffer_head *bh, int rw);
+typedef int (*dm_map_fn) (struct dm_target *ti, struct buffer_head *bh, int rw,
+ void **map_context);
/*
* Returns:
@@ -43,7 +44,8 @@
* multipath target might want to requeue a failed io).
*/
typedef int (*dm_endio_fn) (struct dm_target *ti,
- struct buffer_head *bh, int rw, int error);
+ struct buffer_head *bh, int rw, int error,
+ void *map_context);
typedef int (*dm_status_fn) (struct dm_target *ti, status_type_t status_type,
char *result, int maxlen);
More information about the dm-devel
mailing list