aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md/md.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/md/md.c')
-rw-r--r--drivers/md/md.c25
1 files changed, 19 insertions, 6 deletions
diff --git a/drivers/md/md.c b/drivers/md/md.c
index 71f655015385..630a9142a819 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -5076,10 +5076,16 @@ int md_run(struct mddev *mddev)
5076 } 5076 }
5077 if (err == 0 && pers->sync_request && 5077 if (err == 0 && pers->sync_request &&
5078 (mddev->bitmap_info.file || mddev->bitmap_info.offset)) { 5078 (mddev->bitmap_info.file || mddev->bitmap_info.offset)) {
5079 err = bitmap_create(mddev); 5079 struct bitmap *bitmap;
5080 if (err) 5080
5081 bitmap = bitmap_create(mddev, -1);
5082 if (IS_ERR(bitmap)) {
5083 err = PTR_ERR(bitmap);
5081 printk(KERN_ERR "%s: failed to create bitmap (%d)\n", 5084 printk(KERN_ERR "%s: failed to create bitmap (%d)\n",
5082 mdname(mddev), err); 5085 mdname(mddev), err);
5086 } else
5087 mddev->bitmap = bitmap;
5088
5083 } 5089 }
5084 if (err) { 5090 if (err) {
5085 mddev_detach(mddev); 5091 mddev_detach(mddev);
@@ -6039,9 +6045,13 @@ static int set_bitmap_file(struct mddev *mddev, int fd)
6039 if (mddev->pers) { 6045 if (mddev->pers) {
6040 mddev->pers->quiesce(mddev, 1); 6046 mddev->pers->quiesce(mddev, 1);
6041 if (fd >= 0) { 6047 if (fd >= 0) {
6042 err = bitmap_create(mddev); 6048 struct bitmap *bitmap;
6043 if (!err) 6049
6050 bitmap = bitmap_create(mddev, -1);
6051 if (!IS_ERR(bitmap)) {
6052 mddev->bitmap = bitmap;
6044 err = bitmap_load(mddev); 6053 err = bitmap_load(mddev);
6054 }
6045 } 6055 }
6046 if (fd < 0 || err) { 6056 if (fd < 0 || err) {
6047 bitmap_destroy(mddev); 6057 bitmap_destroy(mddev);
@@ -6306,6 +6316,7 @@ static int update_array_info(struct mddev *mddev, mdu_array_info_t *info)
6306 if (mddev->recovery || mddev->sync_thread) 6316 if (mddev->recovery || mddev->sync_thread)
6307 return -EBUSY; 6317 return -EBUSY;
6308 if (info->state & (1<<MD_SB_BITMAP_PRESENT)) { 6318 if (info->state & (1<<MD_SB_BITMAP_PRESENT)) {
6319 struct bitmap *bitmap;
6309 /* add the bitmap */ 6320 /* add the bitmap */
6310 if (mddev->bitmap) 6321 if (mddev->bitmap)
6311 return -EEXIST; 6322 return -EEXIST;
@@ -6316,9 +6327,11 @@ static int update_array_info(struct mddev *mddev, mdu_array_info_t *info)
6316 mddev->bitmap_info.space = 6327 mddev->bitmap_info.space =
6317 mddev->bitmap_info.default_space; 6328 mddev->bitmap_info.default_space;
6318 mddev->pers->quiesce(mddev, 1); 6329 mddev->pers->quiesce(mddev, 1);
6319 rv = bitmap_create(mddev); 6330 bitmap = bitmap_create(mddev, -1);
6320 if (!rv) 6331 if (!IS_ERR(bitmap)) {
6332 mddev->bitmap = bitmap;
6321 rv = bitmap_load(mddev); 6333 rv = bitmap_load(mddev);
6334 }
6322 if (rv) 6335 if (rv)
6323 bitmap_destroy(mddev); 6336 bitmap_destroy(mddev);
6324 mddev->pers->quiesce(mddev, 0); 6337 mddev->pers->quiesce(mddev, 0);