Commit 40bea431 authored by Mike Snitzer's avatar Mike Snitzer Committed by Alasdair G Kergon

dm stripe: expose correct io hints

Set sensible I/O hints for striped DM devices in the topology
infrastructure added for 2.6.31 for userspace tools to
obtain via sysfs.

Add .io_hints to 'struct target_type' to allow the I/O hints portion
(io_min and io_opt) of the 'struct queue_limits' to be set by each
target and implement this for dm-stripe.
Signed-off-by: default avatarMike Snitzer <snitzer@redhat.com>
Signed-off-by: default avatarAlasdair G Kergon <agk@redhat.com>
parent a963a956
...@@ -329,9 +329,19 @@ static int stripe_iterate_devices(struct dm_target *ti, ...@@ -329,9 +329,19 @@ static int stripe_iterate_devices(struct dm_target *ti,
return ret; return ret;
} }
static void stripe_io_hints(struct dm_target *ti,
struct queue_limits *limits)
{
struct stripe_c *sc = ti->private;
unsigned chunk_size = (sc->chunk_mask + 1) << 9;
blk_limits_io_min(limits, chunk_size);
limits->io_opt = chunk_size * sc->stripes;
}
static struct target_type stripe_target = { static struct target_type stripe_target = {
.name = "striped", .name = "striped",
.version = {1, 2, 0}, .version = {1, 3, 0},
.module = THIS_MODULE, .module = THIS_MODULE,
.ctr = stripe_ctr, .ctr = stripe_ctr,
.dtr = stripe_dtr, .dtr = stripe_dtr,
...@@ -339,6 +349,7 @@ static struct target_type stripe_target = { ...@@ -339,6 +349,7 @@ static struct target_type stripe_target = {
.end_io = stripe_end_io, .end_io = stripe_end_io,
.status = stripe_status, .status = stripe_status,
.iterate_devices = stripe_iterate_devices, .iterate_devices = stripe_iterate_devices,
.io_hints = stripe_io_hints,
}; };
int __init dm_stripe_init(void) int __init dm_stripe_init(void)
......
...@@ -1007,6 +1007,10 @@ int dm_calculate_queue_limits(struct dm_table *table, ...@@ -1007,6 +1007,10 @@ int dm_calculate_queue_limits(struct dm_table *table,
ti->type->iterate_devices(ti, dm_set_device_limits, ti->type->iterate_devices(ti, dm_set_device_limits,
&ti_limits); &ti_limits);
/* Set I/O hints portion of queue limits */
if (ti->type->io_hints)
ti->type->io_hints(ti, &ti_limits);
/* /*
* Check each device area is consistent with the target's * Check each device area is consistent with the target's
* overall queue limits. * overall queue limits.
......
...@@ -91,6 +91,9 @@ typedef int (*dm_iterate_devices_fn) (struct dm_target *ti, ...@@ -91,6 +91,9 @@ typedef int (*dm_iterate_devices_fn) (struct dm_target *ti,
iterate_devices_callout_fn fn, iterate_devices_callout_fn fn,
void *data); void *data);
typedef void (*dm_io_hints_fn) (struct dm_target *ti,
struct queue_limits *limits);
/* /*
* Returns: * Returns:
* 0: The target can handle the next I/O immediately. * 0: The target can handle the next I/O immediately.
...@@ -151,6 +154,7 @@ struct target_type { ...@@ -151,6 +154,7 @@ struct target_type {
dm_merge_fn merge; dm_merge_fn merge;
dm_busy_fn busy; dm_busy_fn busy;
dm_iterate_devices_fn iterate_devices; dm_iterate_devices_fn iterate_devices;
dm_io_hints_fn io_hints;
/* For internal device-mapper use. */ /* For internal device-mapper use. */
struct list_head list; struct list_head list;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment