]>
Commit | Line | Data |
---|---|---|
2cb7cef9 BS |
1 | From d0a4bb492772ce5c4bdfba3744a99ed6f6fb238f Mon Sep 17 00:00:00 2001 |
2 | From: NeilBrown <neilb@suse.de> | |
3 | Date: Tue, 31 Mar 2009 14:27:02 +1100 | |
4 | Subject: [PATCH] md: never clear bit from the write-intent bitmap when the array is degraded. | |
5 | ||
6 | It is safe to clear a bit from the write-intent bitmap for a raid1 | |
7 | if we know the data has been written to all devices, which is | |
8 | what the current test does. | |
9 | ||
10 | But it is not always safe to update the 'events_cleared' counter in | |
11 | that case. This is because one request could complete successfully | |
12 | after some other request has partially failed. | |
13 | ||
14 | So simply disable the clearing and updating of events_cleared whenever | |
15 | the array is degraded. This might end up not clearing some bits that | |
16 | could safely be cleared, but it is safest approach. | |
17 | ||
18 | Note that the bug fixed here did not risk corrupting data by letting | |
19 | the array get out-of-sync. Rather it meant that when a device is | |
20 | removed and re-added to the array, it might incorrectly require a full | |
21 | recovery rather than just recovering based on the bitmap. | |
22 | ||
23 | Signed-off-by: NeilBrown <neilb@suse.de> | |
24 | --- | |
25 | drivers/md/bitmap.c | 3 +++ | |
26 | 1 file changed, 3 insertions(+) | |
27 | ||
28 | --- a/drivers/md/bitmap.c | |
29 | +++ b/drivers/md/bitmap.c | |
30 | @@ -1307,6 +1307,9 @@ void bitmap_endwrite(struct bitmap *bitm | |
31 | PRINTK(KERN_DEBUG "dec write-behind count %d/%d\n", | |
32 | atomic_read(&bitmap->behind_writes), bitmap->max_write_behind); | |
33 | } | |
34 | + if (bitmap->mddev->degraded) | |
35 | + /* Never clear bits or update events_cleared when degraded */ | |
36 | + success = 0; | |
37 | ||
38 | while (sectors) { | |
39 | int blocks; |