diff options
-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 */ |