aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2006-02-02 17:28:05 -0500
committerLinus Torvalds <torvalds@g5.osdl.org>2006-02-02 18:07:12 -0500
commit978f946bb628ef228e13aadf4d4255b8727c4fc3 (patch)
treef50dbda1faae2962fdd8c6517d4bc65d3c168862 /drivers
parentf0ca340cd20b350eab8288974e9a6077900846e8 (diff)
[PATCH] md: Don't remove bitmap from md array when switching to read-only
While a read-only array doesn't not really need a bitmap, we should not remove the bitmap when switching an array to read-only because a/ There is no code to re-add the bitmap which switching to read-write, b/ There is insufficient locking - the bitmap could be accessed while it is being removed. Cc: Reuben Farrelly <reuben-lkml@reub.net> 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')
-rw-r--r--drivers/md/md.c16
1 files changed, 8 insertions, 8 deletions
diff --git a/drivers/md/md.c b/drivers/md/md.c
index 06dee51456e8..653d4dcbee23 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -2689,14 +2689,6 @@ static int do_md_stop(mddev_t * mddev, int ro)
2689 set_disk_ro(disk, 1); 2689 set_disk_ro(disk, 1);
2690 } 2690 }
2691 2691
2692 bitmap_destroy(mddev);
2693 if (mddev->bitmap_file) {
2694 atomic_set(&mddev->bitmap_file->f_dentry->d_inode->i_writecount, 1);
2695 fput(mddev->bitmap_file);
2696 mddev->bitmap_file = NULL;
2697 }
2698 mddev->bitmap_offset = 0;
2699
2700 /* 2692 /*
2701 * Free resources if final stop 2693 * Free resources if final stop
2702 */ 2694 */
@@ -2706,6 +2698,14 @@ static int do_md_stop(mddev_t * mddev, int ro)
2706 struct gendisk *disk; 2698 struct gendisk *disk;
2707 printk(KERN_INFO "md: %s stopped.\n", mdname(mddev)); 2699 printk(KERN_INFO "md: %s stopped.\n", mdname(mddev));
2708 2700
2701 bitmap_destroy(mddev);
2702 if (mddev->bitmap_file) {
2703 atomic_set(&mddev->bitmap_file->f_dentry->d_inode->i_writecount, 1);
2704 fput(mddev->bitmap_file);
2705 mddev->bitmap_file = NULL;
2706 }
2707 mddev->bitmap_offset = 0;
2708
2709 ITERATE_RDEV(mddev,rdev,tmp) 2709 ITERATE_RDEV(mddev,rdev,tmp)
2710 if (rdev->raid_disk >= 0) { 2710 if (rdev->raid_disk >= 0) {
2711 char nm[20]; 2711 char nm[20];