summaryrefslogtreecommitdiff
path: root/init
diff options
context:
space:
mode:
Diffstat (limited to 'init')
-rw-r--r--init/do_mounts_dm.c17
1 files changed, 16 insertions, 1 deletions
diff --git a/init/do_mounts_dm.c b/init/do_mounts_dm.c
index 0fd3411533f3..f521bc5ae248 100644
--- a/init/do_mounts_dm.c
+++ b/init/do_mounts_dm.c
@@ -10,6 +10,7 @@
#include <linux/string.h>
#include "do_mounts.h"
+#include "../drivers/md/dm.h"
#define DM_MAX_NAME 32
#define DM_MAX_UUID 129
@@ -333,6 +334,7 @@ static void __init dm_setup_drive(void)
goto dm_table_create_fail;
}
+ dm_lock_md_type(md);
target = dm_setup_args.target;
while (target) {
DMINFO("adding target '%llu %llu %s %s'",
@@ -352,6 +354,17 @@ static void __init dm_setup_drive(void)
goto table_complete_fail;
}
+ if (dm_get_md_type(md) == DM_TYPE_NONE) {
+ dm_set_md_type(md, dm_table_get_type(table));
+ if (dm_setup_md_queue(md)) {
+ DMWARN("unable to set up device queue for new table.");
+ goto setup_md_queue_fail;
+ }
+ } else if (dm_get_md_type(md) != dm_table_get_type(table)) {
+ DMWARN("can't change device type after initial table load.");
+ goto setup_md_queue_fail;
+ }
+
/* Suspend the device so that we can bind it to the table. */
if (dm_suspend(md, 0)) {
DMDEBUG("failed to suspend the device pre-bind");
@@ -380,6 +393,7 @@ static void __init dm_setup_drive(void)
}
printk(KERN_INFO "dm: dm-%d is ready\n", dm_setup_args.minor);
+ dm_unlock_md_type(md);
dm_setup_cleanup();
return;
@@ -387,9 +401,10 @@ export_fail:
resume_fail:
table_bind_fail:
suspend_fail:
+setup_md_queue_fail:
table_complete_fail:
add_target_fail:
- dm_table_put(table);
+ dm_unlock_md_type(md);
dm_table_create_fail:
dm_put(md);
dm_create_fail: