Commit 8757b776 authored by Milan Broz's avatar Milan Broz Committed by Linus Torvalds

[PATCH] dm table: add target preresume

This patch adds a target preresume hook.

It is called before the targets are resumed and if it returns an error the
resume gets cancelled.

The crypt target will use this to indicate that it is unable to process I/O
because no encryption key has been supplied.
Signed-off-by: default avatarMilan Broz <mbroz@redhat.com>
Signed-off-by: default avatarAlasdair G Kergon <agk@redhat.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent cc109201
...@@ -939,9 +939,20 @@ void dm_table_postsuspend_targets(struct dm_table *t) ...@@ -939,9 +939,20 @@ void dm_table_postsuspend_targets(struct dm_table *t)
return suspend_targets(t, 1); return suspend_targets(t, 1);
} }
void dm_table_resume_targets(struct dm_table *t) int dm_table_resume_targets(struct dm_table *t)
{ {
int i; int i, r = 0;
for (i = 0; i < t->num_targets; i++) {
struct dm_target *ti = t->targets + i;
if (!ti->type->preresume)
continue;
r = ti->type->preresume(ti);
if (r)
return r;
}
for (i = 0; i < t->num_targets; i++) { for (i = 0; i < t->num_targets; i++) {
struct dm_target *ti = t->targets + i; struct dm_target *ti = t->targets + i;
...@@ -949,6 +960,8 @@ void dm_table_resume_targets(struct dm_table *t) ...@@ -949,6 +960,8 @@ void dm_table_resume_targets(struct dm_table *t)
if (ti->type->resume) if (ti->type->resume)
ti->type->resume(ti); ti->type->resume(ti);
} }
return 0;
} }
int dm_table_any_congested(struct dm_table *t, int bdi_bits) int dm_table_any_congested(struct dm_table *t, int bdi_bits)
......
...@@ -1360,7 +1360,9 @@ int dm_resume(struct mapped_device *md) ...@@ -1360,7 +1360,9 @@ int dm_resume(struct mapped_device *md)
if (!map || !dm_table_get_size(map)) if (!map || !dm_table_get_size(map))
goto out; goto out;
dm_table_resume_targets(map); r = dm_table_resume_targets(map);
if (r)
goto out;
down_write(&md->io_lock); down_write(&md->io_lock);
clear_bit(DMF_BLOCK_IO, &md->flags); clear_bit(DMF_BLOCK_IO, &md->flags);
......
...@@ -57,7 +57,7 @@ void dm_table_set_restrictions(struct dm_table *t, struct request_queue *q); ...@@ -57,7 +57,7 @@ void dm_table_set_restrictions(struct dm_table *t, struct request_queue *q);
struct list_head *dm_table_get_devices(struct dm_table *t); struct list_head *dm_table_get_devices(struct dm_table *t);
void dm_table_presuspend_targets(struct dm_table *t); void dm_table_presuspend_targets(struct dm_table *t);
void dm_table_postsuspend_targets(struct dm_table *t); void dm_table_postsuspend_targets(struct dm_table *t);
void dm_table_resume_targets(struct dm_table *t); int dm_table_resume_targets(struct dm_table *t);
int dm_table_any_congested(struct dm_table *t, int bdi_bits); int dm_table_any_congested(struct dm_table *t, int bdi_bits);
void dm_table_unplug_all(struct dm_table *t); void dm_table_unplug_all(struct dm_table *t);
int dm_table_flush_all(struct dm_table *t); int dm_table_flush_all(struct dm_table *t);
......
...@@ -57,6 +57,7 @@ typedef int (*dm_endio_fn) (struct dm_target *ti, ...@@ -57,6 +57,7 @@ typedef int (*dm_endio_fn) (struct dm_target *ti,
typedef void (*dm_presuspend_fn) (struct dm_target *ti); typedef void (*dm_presuspend_fn) (struct dm_target *ti);
typedef void (*dm_postsuspend_fn) (struct dm_target *ti); typedef void (*dm_postsuspend_fn) (struct dm_target *ti);
typedef int (*dm_preresume_fn) (struct dm_target *ti);
typedef void (*dm_resume_fn) (struct dm_target *ti); typedef void (*dm_resume_fn) (struct dm_target *ti);
typedef int (*dm_status_fn) (struct dm_target *ti, status_type_t status_type, typedef int (*dm_status_fn) (struct dm_target *ti, status_type_t status_type,
...@@ -92,6 +93,7 @@ struct target_type { ...@@ -92,6 +93,7 @@ struct target_type {
dm_endio_fn end_io; dm_endio_fn end_io;
dm_presuspend_fn presuspend; dm_presuspend_fn presuspend;
dm_postsuspend_fn postsuspend; dm_postsuspend_fn postsuspend;
dm_preresume_fn preresume;
dm_resume_fn resume; dm_resume_fn resume;
dm_status_fn status; dm_status_fn status;
dm_message_fn message; dm_message_fn message;
......
...@@ -285,9 +285,9 @@ typedef char ioctl_struct[308]; ...@@ -285,9 +285,9 @@ typedef char ioctl_struct[308];
#define DM_DEV_SET_GEOMETRY _IOWR(DM_IOCTL, DM_DEV_SET_GEOMETRY_CMD, struct dm_ioctl) #define DM_DEV_SET_GEOMETRY _IOWR(DM_IOCTL, DM_DEV_SET_GEOMETRY_CMD, struct dm_ioctl)
#define DM_VERSION_MAJOR 4 #define DM_VERSION_MAJOR 4
#define DM_VERSION_MINOR 8 #define DM_VERSION_MINOR 9
#define DM_VERSION_PATCHLEVEL 0 #define DM_VERSION_PATCHLEVEL 0
#define DM_VERSION_EXTRA "-ioctl (2006-06-24)" #define DM_VERSION_EXTRA "-ioctl (2006-09-14)"
/* Status bits */ /* Status bits */
#define DM_READONLY_FLAG (1 << 0) /* In/Out */ #define DM_READONLY_FLAG (1 << 0) /* In/Out */
......
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