Skip to content

Commit

Permalink
md/bitmap: clear bitmap if bitmap_create failed
Browse files Browse the repository at this point in the history
If bitmap_create returns an error, we need to call
either bitmap_destroy or bitmap_free to do clean up,
and the selection is based on mddev->bitmap is set
or not.

And the sysfs_put(bitmap->sysfs_can_clear) is moved
from bitmap_destroy to bitmap_free, and the comment
of bitmap_create is changed as well.

Signed-off-by: Guoqing Jiang <gqjiang@suse.com>
Signed-off-by: Shaohua Li <shli@fb.com>
  • Loading branch information
Guoqing Jiang authored and Shaohua Li committed Apr 1, 2016
1 parent ed3b98c commit f9a67b1
Showing 1 changed file with 11 additions and 8 deletions.
19 changes: 11 additions & 8 deletions drivers/md/bitmap.c
Original file line number Diff line number Diff line change
Expand Up @@ -1673,6 +1673,9 @@ static void bitmap_free(struct bitmap *bitmap)
if (!bitmap) /* there was no bitmap */
return;

if (bitmap->sysfs_can_clear)
sysfs_put(bitmap->sysfs_can_clear);

if (mddev_is_clustered(bitmap->mddev) && bitmap->mddev->cluster_info &&
bitmap->cluster_slot == md_cluster_ops->slot_number(bitmap->mddev))
md_cluster_stop(bitmap->mddev);
Expand Down Expand Up @@ -1712,15 +1715,13 @@ void bitmap_destroy(struct mddev *mddev)
if (mddev->thread)
mddev->thread->timeout = MAX_SCHEDULE_TIMEOUT;

if (bitmap->sysfs_can_clear)
sysfs_put(bitmap->sysfs_can_clear);

bitmap_free(bitmap);
}

/*
* initialize the bitmap structure
* if this returns an error, bitmap_destroy must be called to do clean up
* once mddev->bitmap is set
*/
struct bitmap *bitmap_create(struct mddev *mddev, int slot)
{
Expand Down Expand Up @@ -1865,8 +1866,10 @@ int bitmap_copy_from_slot(struct mddev *mddev, int slot,
struct bitmap_counts *counts;
struct bitmap *bitmap = bitmap_create(mddev, slot);

if (IS_ERR(bitmap))
if (IS_ERR(bitmap)) {
bitmap_free(bitmap);
return PTR_ERR(bitmap);
}

rv = bitmap_init_from_disk(bitmap, 0);
if (rv)
Expand Down Expand Up @@ -2170,14 +2173,14 @@ location_store(struct mddev *mddev, const char *buf, size_t len)
else {
mddev->bitmap = bitmap;
rv = bitmap_load(mddev);
if (rv) {
bitmap_destroy(mddev);
if (rv)
mddev->bitmap_info.offset = 0;
}
}
mddev->pers->quiesce(mddev, 0);
if (rv)
if (rv) {
bitmap_destroy(mddev);
return rv;
}
}
}
}
Expand Down

0 comments on commit f9a67b1

Please sign in to comment.