md/bitmap: clear bitmap if bitmap_create failed
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>
This commit is contained in:
Родитель
ed3b98c71c
Коммит
f9a67b1182
|
@ -1673,6 +1673,9 @@ static void bitmap_free(struct bitmap *bitmap)
|
||||||
if (!bitmap) /* there was no bitmap */
|
if (!bitmap) /* there was no bitmap */
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (bitmap->sysfs_can_clear)
|
||||||
|
sysfs_put(bitmap->sysfs_can_clear);
|
||||||
|
|
||||||
if (mddev_is_clustered(bitmap->mddev) && bitmap->mddev->cluster_info &&
|
if (mddev_is_clustered(bitmap->mddev) && bitmap->mddev->cluster_info &&
|
||||||
bitmap->cluster_slot == md_cluster_ops->slot_number(bitmap->mddev))
|
bitmap->cluster_slot == md_cluster_ops->slot_number(bitmap->mddev))
|
||||||
md_cluster_stop(bitmap->mddev);
|
md_cluster_stop(bitmap->mddev);
|
||||||
|
@ -1712,15 +1715,13 @@ void bitmap_destroy(struct mddev *mddev)
|
||||||
if (mddev->thread)
|
if (mddev->thread)
|
||||||
mddev->thread->timeout = MAX_SCHEDULE_TIMEOUT;
|
mddev->thread->timeout = MAX_SCHEDULE_TIMEOUT;
|
||||||
|
|
||||||
if (bitmap->sysfs_can_clear)
|
|
||||||
sysfs_put(bitmap->sysfs_can_clear);
|
|
||||||
|
|
||||||
bitmap_free(bitmap);
|
bitmap_free(bitmap);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* initialize the bitmap structure
|
* initialize the bitmap structure
|
||||||
* if this returns an error, bitmap_destroy must be called to do clean up
|
* 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)
|
struct bitmap *bitmap_create(struct mddev *mddev, int slot)
|
||||||
{
|
{
|
||||||
|
@ -1865,8 +1866,10 @@ int bitmap_copy_from_slot(struct mddev *mddev, int slot,
|
||||||
struct bitmap_counts *counts;
|
struct bitmap_counts *counts;
|
||||||
struct bitmap *bitmap = bitmap_create(mddev, slot);
|
struct bitmap *bitmap = bitmap_create(mddev, slot);
|
||||||
|
|
||||||
if (IS_ERR(bitmap))
|
if (IS_ERR(bitmap)) {
|
||||||
|
bitmap_free(bitmap);
|
||||||
return PTR_ERR(bitmap);
|
return PTR_ERR(bitmap);
|
||||||
|
}
|
||||||
|
|
||||||
rv = bitmap_init_from_disk(bitmap, 0);
|
rv = bitmap_init_from_disk(bitmap, 0);
|
||||||
if (rv)
|
if (rv)
|
||||||
|
@ -2170,14 +2173,14 @@ location_store(struct mddev *mddev, const char *buf, size_t len)
|
||||||
else {
|
else {
|
||||||
mddev->bitmap = bitmap;
|
mddev->bitmap = bitmap;
|
||||||
rv = bitmap_load(mddev);
|
rv = bitmap_load(mddev);
|
||||||
if (rv) {
|
if (rv)
|
||||||
bitmap_destroy(mddev);
|
|
||||||
mddev->bitmap_info.offset = 0;
|
mddev->bitmap_info.offset = 0;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
mddev->pers->quiesce(mddev, 0);
|
mddev->pers->quiesce(mddev, 0);
|
||||||
if (rv)
|
if (rv) {
|
||||||
|
bitmap_destroy(mddev);
|
||||||
return rv;
|
return rv;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Загрузка…
Ссылка в новой задаче