aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2006-01-06 03:20:15 -0500
committerLinus Torvalds <torvalds@g5.osdl.org>2006-01-06 11:34:02 -0500
commit6ff8d8ec06690f4011a6c3ad9e0759b9094f0601 (patch)
tree3606791ca1fb73e0263c4bb90d9c909d354bf9d4 /drivers/md
parent14f8d26b8ea3413b28f2cac208c9a93600fe3a80 (diff)
[PATCH] md: allow dirty raid[456] arrays to be started at boot
See patch to md.txt for more details Signed-off-by: Neil Brown <neilb@suse.de> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'drivers/md')
-rw-r--r--drivers/md/md.c4
-rw-r--r--drivers/md/raid5.c15
-rw-r--r--drivers/md/raid6main.c13
3 files changed, 24 insertions, 8 deletions
diff --git a/drivers/md/md.c b/drivers/md/md.c
index 8175a2a222da..b4fb7247b3ed 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -1937,6 +1937,7 @@ static void md_safemode_timeout(unsigned long data)
1937 md_wakeup_thread(mddev->thread); 1937 md_wakeup_thread(mddev->thread);
1938} 1938}
1939 1939
1940static int start_dirty_degraded;
1940 1941
1941static int do_md_run(mddev_t * mddev) 1942static int do_md_run(mddev_t * mddev)
1942{ 1943{
@@ -2048,6 +2049,7 @@ static int do_md_run(mddev_t * mddev)
2048 mddev->recovery = 0; 2049 mddev->recovery = 0;
2049 mddev->resync_max_sectors = mddev->size << 1; /* may be over-ridden by personality */ 2050 mddev->resync_max_sectors = mddev->size << 1; /* may be over-ridden by personality */
2050 mddev->barriers_work = 1; 2051 mddev->barriers_work = 1;
2052 mddev->ok_start_degraded = start_dirty_degraded;
2051 2053
2052 if (start_readonly) 2054 if (start_readonly)
2053 mddev->ro = 2; /* read-only, but switch on first write */ 2055 mddev->ro = 2; /* read-only, but switch on first write */
@@ -4509,6 +4511,8 @@ static int set_ro(const char *val, struct kernel_param *kp)
4509} 4511}
4510 4512
4511module_param_call(start_ro, set_ro, get_ro, NULL, 0600); 4513module_param_call(start_ro, set_ro, get_ro, NULL, 0600);
4514module_param(start_dirty_degraded, int, 0644);
4515
4512 4516
4513EXPORT_SYMBOL(register_md_personality); 4517EXPORT_SYMBOL(register_md_personality);
4514EXPORT_SYMBOL(unregister_md_personality); 4518EXPORT_SYMBOL(unregister_md_personality);
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c
index 334ff7a07283..53a0f2ce76c8 100644
--- a/drivers/md/raid5.c
+++ b/drivers/md/raid5.c
@@ -1904,10 +1904,17 @@ static int run(mddev_t *mddev)
1904 1904
1905 if (mddev->degraded == 1 && 1905 if (mddev->degraded == 1 &&
1906 mddev->recovery_cp != MaxSector) { 1906 mddev->recovery_cp != MaxSector) {
1907 printk(KERN_ERR 1907 if (mddev->ok_start_degraded)
1908 "raid5: cannot start dirty degraded array for %s\n", 1908 printk(KERN_WARNING
1909 mdname(mddev)); 1909 "raid5: starting dirty degraded array: %s"
1910 goto abort; 1910 "- data corruption possible.\n",
1911 mdname(mddev));
1912 else {
1913 printk(KERN_ERR
1914 "raid5: cannot start dirty degraded array for %s\n",
1915 mdname(mddev));
1916 goto abort;
1917 }
1911 } 1918 }
1912 1919
1913 { 1920 {
diff --git a/drivers/md/raid6main.c b/drivers/md/raid6main.c
index 0000d162d198..9ac6dcd55127 100644
--- a/drivers/md/raid6main.c
+++ b/drivers/md/raid6main.c
@@ -1929,13 +1929,18 @@ static int run(mddev_t *mddev)
1929 goto abort; 1929 goto abort;
1930 } 1930 }
1931 1931
1932#if 0 /* FIX: For now */
1933 if (mddev->degraded > 0 && 1932 if (mddev->degraded > 0 &&
1934 mddev->recovery_cp != MaxSector) { 1933 mddev->recovery_cp != MaxSector) {
1935 printk(KERN_ERR "raid6: cannot start dirty degraded array for %s\n", mdname(mddev)); 1934 if (mddev->ok_start_degraded)
1936 goto abort; 1935 printk(KERN_WARNING "raid6: starting dirty degraded array:%s"
1936 "- data corruption possible.\n",
1937 mdname(mddev));
1938 else {
1939 printk(KERN_ERR "raid6: cannot start dirty degraded array"
1940 " for %s\n", mdname(mddev));
1941 goto abort;
1942 }
1937 } 1943 }
1938#endif
1939 1944
1940 { 1945 {
1941 mddev->thread = md_register_thread(raid6d, mddev, "%s_raid6"); 1946 mddev->thread = md_register_thread(raid6d, mddev, "%s_raid6");