diff options
| author | David Teigland <teigland@redhat.com> | 2006-06-26 03:27:33 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-06-26 12:58:36 -0400 |
| commit | c2ade42dd35466d90aa6fc7cc717f396e165492f (patch) | |
| tree | 245baeabfea43a3b2654adb962e776a877da0059 | |
| parent | 17b2f66f2a39a4e4d1ed456f35ee3bb598e41d35 (diff) | |
[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>
| -rw-r--r-- | drivers/md/dm-table.c | 38 | ||||
| -rw-r--r-- | include/linux/device-mapper.h | 6 |
2 files changed, 44 insertions, 0 deletions
diff --git a/drivers/md/dm-table.c b/drivers/md/dm-table.c index 10c9439635ca..827b648fac50 100644 --- a/drivers/md/dm-table.c +++ b/drivers/md/dm-table.c | |||
| @@ -237,6 +237,44 @@ int dm_table_create(struct dm_table **result, int mode, | |||
| 237 | return 0; | 237 | return 0; |
| 238 | } | 238 | } |
| 239 | 239 | ||
| 240 | int dm_create_error_table(struct dm_table **result, struct mapped_device *md) | ||
| 241 | { | ||
| 242 | struct dm_table *t; | ||
| 243 | sector_t dev_size = 1; | ||
| 244 | int r; | ||
| 245 | |||
| 246 | /* | ||
| 247 | * Find current size of device. | ||
| 248 | * Default to 1 sector if inactive. | ||
| 249 | */ | ||
| 250 | t = dm_get_table(md); | ||
| 251 | if (t) { | ||
| 252 | dev_size = dm_table_get_size(t); | ||
| 253 | dm_table_put(t); | ||
| 254 | } | ||
| 255 | |||
| 256 | r = dm_table_create(&t, FMODE_READ, 1, md); | ||
| 257 | if (r) | ||
| 258 | return r; | ||
| 259 | |||
| 260 | r = dm_table_add_target(t, "error", 0, dev_size, NULL); | ||
| 261 | if (r) | ||
| 262 | goto out; | ||
| 263 | |||
| 264 | r = dm_table_complete(t); | ||
| 265 | if (r) | ||
| 266 | goto out; | ||
| 267 | |||
| 268 | *result = t; | ||
| 269 | |||
| 270 | out: | ||
| 271 | if (r) | ||
| 272 | dm_table_put(t); | ||
| 273 | |||
| 274 | return r; | ||
| 275 | } | ||
| 276 | EXPORT_SYMBOL_GPL(dm_create_error_table); | ||
| 277 | |||
| 240 | static void free_devices(struct list_head *devices) | 278 | static void free_devices(struct list_head *devices) |
| 241 | { | 279 | { |
| 242 | struct list_head *tmp, *next; | 280 | struct list_head *tmp, *next; |
diff --git a/include/linux/device-mapper.h b/include/linux/device-mapper.h index 010c8c5eeb37..61103d2bc244 100644 --- a/include/linux/device-mapper.h +++ b/include/linux/device-mapper.h | |||
| @@ -227,5 +227,11 @@ void dm_table_event(struct dm_table *t); | |||
| 227 | */ | 227 | */ |
| 228 | int dm_swap_table(struct mapped_device *md, struct dm_table *t); | 228 | int dm_swap_table(struct mapped_device *md, struct dm_table *t); |
| 229 | 229 | ||
| 230 | /* | ||
| 231 | * Prepare a table for a device that will error all I/O. | ||
| 232 | * To make it active, call dm_suspend(), dm_swap_table() then dm_resume(). | ||
| 233 | */ | ||
| 234 | int dm_create_error_table(struct dm_table **result, struct mapped_device *md); | ||
| 235 | |||
| 230 | #endif /* __KERNEL__ */ | 236 | #endif /* __KERNEL__ */ |
| 231 | #endif /* _LINUX_DEVICE_MAPPER_H */ | 237 | #endif /* _LINUX_DEVICE_MAPPER_H */ |
