]> git.ipfire.org Git - people/pmueller/ipfire-2.x.git/blame - src/patches/suse-2.6.27.39/patches.fixes/dm-release-map_lock-before-set_disk_ro
Fix oinkmaster patch.
[people/pmueller/ipfire-2.x.git] / src / patches / suse-2.6.27.39 / patches.fixes / dm-release-map_lock-before-set_disk_ro
CommitLineData
2cb7cef9
BS
1From: Nikanth Karthikesan <knikanth@suse.de>
2Subject: Release md->map_lock before set_disk_ro
3Patch-mainline: No
4References: bnc#479784
5
6Signed-off-by: Nikanth Karthikesan <knikanth@suse.de>
7
8Calling set_disk_ro() with irqs disabled triggers a warning.
9
10set_disk_ro() can be called outside the
11write_lock_irqsave(&md->map_lock)? And to get the
12dm_table_get_mode(md->map), we just need to hold a reference
13with dm_get_table() and dm_table_put()
14
15
16Index: linux-2.6.27-SLE11_BRANCH/drivers/md/dm.c
17===================================================================
18--- linux-2.6.27-SLE11_BRANCH.orig/drivers/md/dm.c
19+++ linux-2.6.27-SLE11_BRANCH/drivers/md/dm.c
20@@ -1948,12 +1948,15 @@ static int __bind(struct mapped_device *
21 md->map = t;
22 dm_table_set_restrictions(t, q);
23 dm_table_set_integrity(t, md);
24- if (!(dm_table_get_mode(t) & FMODE_WRITE)) {
25- set_disk_ro(md->disk, 1);
26- } else {
27+ write_unlock_irqrestore(&md->map_lock, flags);
28+
29+ dm_get_table(md);
30+ if (dm_table_get_mode(md->map) & FMODE_WRITE) {
31 set_disk_ro(md->disk, 0);
32+ } else {
33+ set_disk_ro(md->disk, 1);
34 }
35- write_unlock_irqrestore(&md->map_lock, flags);
36+ dm_table_put(md->map);
37
38 return 0;
39 }