[PATCH] dm: create error table
Add a library function dm_create_error_table() to create a table that rejects any I/O sent to a device with EIO. Signed-off-by: Alasdair G Kergon <agk@redhat.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
Родитель
17b2f66f2a
Коммит
c2ade42dd3
|
@ -237,6 +237,44 @@ int dm_table_create(struct dm_table **result, int mode,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int dm_create_error_table(struct dm_table **result, struct mapped_device *md)
|
||||||
|
{
|
||||||
|
struct dm_table *t;
|
||||||
|
sector_t dev_size = 1;
|
||||||
|
int r;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Find current size of device.
|
||||||
|
* Default to 1 sector if inactive.
|
||||||
|
*/
|
||||||
|
t = dm_get_table(md);
|
||||||
|
if (t) {
|
||||||
|
dev_size = dm_table_get_size(t);
|
||||||
|
dm_table_put(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
r = dm_table_create(&t, FMODE_READ, 1, md);
|
||||||
|
if (r)
|
||||||
|
return r;
|
||||||
|
|
||||||
|
r = dm_table_add_target(t, "error", 0, dev_size, NULL);
|
||||||
|
if (r)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
r = dm_table_complete(t);
|
||||||
|
if (r)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
*result = t;
|
||||||
|
|
||||||
|
out:
|
||||||
|
if (r)
|
||||||
|
dm_table_put(t);
|
||||||
|
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(dm_create_error_table);
|
||||||
|
|
||||||
static void free_devices(struct list_head *devices)
|
static void free_devices(struct list_head *devices)
|
||||||
{
|
{
|
||||||
struct list_head *tmp, *next;
|
struct list_head *tmp, *next;
|
||||||
|
|
|
@ -227,5 +227,11 @@ void dm_table_event(struct dm_table *t);
|
||||||
*/
|
*/
|
||||||
int dm_swap_table(struct mapped_device *md, struct dm_table *t);
|
int dm_swap_table(struct mapped_device *md, struct dm_table *t);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Prepare a table for a device that will error all I/O.
|
||||||
|
* To make it active, call dm_suspend(), dm_swap_table() then dm_resume().
|
||||||
|
*/
|
||||||
|
int dm_create_error_table(struct dm_table **result, struct mapped_device *md);
|
||||||
|
|
||||||
#endif /* __KERNEL__ */
|
#endif /* __KERNEL__ */
|
||||||
#endif /* _LINUX_DEVICE_MAPPER_H */
|
#endif /* _LINUX_DEVICE_MAPPER_H */
|
||||||
|
|
Загрузка…
Ссылка в новой задаче