diff options
| author | NeilBrown <neilb@suse.de> | 2006-02-02 17:28:05 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-02-02 18:07:12 -0500 |
| commit | 978f946bb628ef228e13aadf4d4255b8727c4fc3 (patch) | |
| tree | f50dbda1faae2962fdd8c6517d4bc65d3c168862 | |
| parent | f0ca340cd20b350eab8288974e9a6077900846e8 (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>
| -rw-r--r-- | drivers/md/md.c | 16 |
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]; |
