diff options
author | Guoqing Jiang <gqjiang@suse.com> | 2016-04-01 05:08:49 -0400 |
---|---|---|
committer | Shaohua Li <shli@fb.com> | 2016-04-01 16:05:50 -0400 |
commit | f9a67b1182e5abfcfcec24762ea95a77332f035e (patch) | |
tree | 9c7b17f98a7838daa26c1573e7d393350aeab9a4 /drivers/md/bitmap.c | |
parent | ed3b98c71cd91fa05954df52a79dcd6be08dd730 (diff) |
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>
Diffstat (limited to 'drivers/md/bitmap.c')
-rw-r--r-- | drivers/md/bitmap.c | 19 |
1 files changed, 11 insertions, 8 deletions
diff --git a/drivers/md/bitmap.c b/drivers/md/bitmap.c index 7df6b4f1548a..2a0362fc2107 100644 --- a/drivers/md/bitmap.c +++ b/drivers/md/bitmap.c | |||
@@ -1673,6 +1673,9 @@ static void bitmap_free(struct bitmap *bitmap) | |||
1673 | if (!bitmap) /* there was no bitmap */ | 1673 | if (!bitmap) /* there was no bitmap */ |
1674 | return; | 1674 | return; |
1675 | 1675 | ||
1676 | if (bitmap->sysfs_can_clear) | ||
1677 | sysfs_put(bitmap->sysfs_can_clear); | ||
1678 | |||
1676 | if (mddev_is_clustered(bitmap->mddev) && bitmap->mddev->cluster_info && | 1679 | if (mddev_is_clustered(bitmap->mddev) && bitmap->mddev->cluster_info && |
1677 | bitmap->cluster_slot == md_cluster_ops->slot_number(bitmap->mddev)) | 1680 | bitmap->cluster_slot == md_cluster_ops->slot_number(bitmap->mddev)) |
1678 | md_cluster_stop(bitmap->mddev); | 1681 | md_cluster_stop(bitmap->mddev); |
@@ -1712,15 +1715,13 @@ void bitmap_destroy(struct mddev *mddev) | |||
1712 | if (mddev->thread) | 1715 | if (mddev->thread) |
1713 | mddev->thread->timeout = MAX_SCHEDULE_TIMEOUT; | 1716 | mddev->thread->timeout = MAX_SCHEDULE_TIMEOUT; |
1714 | 1717 | ||
1715 | if (bitmap->sysfs_can_clear) | ||
1716 | sysfs_put(bitmap->sysfs_can_clear); | ||
1717 | |||
1718 | bitmap_free(bitmap); | 1718 | bitmap_free(bitmap); |
1719 | } | 1719 | } |
1720 | 1720 | ||
1721 | /* | 1721 | /* |
1722 | * initialize the bitmap structure | 1722 | * initialize the bitmap structure |
1723 | * if this returns an error, bitmap_destroy must be called to do clean up | 1723 | * if this returns an error, bitmap_destroy must be called to do clean up |
1724 | * once mddev->bitmap is set | ||
1724 | */ | 1725 | */ |
1725 | struct bitmap *bitmap_create(struct mddev *mddev, int slot) | 1726 | struct bitmap *bitmap_create(struct mddev *mddev, int slot) |
1726 | { | 1727 | { |
@@ -1865,8 +1866,10 @@ int bitmap_copy_from_slot(struct mddev *mddev, int slot, | |||
1865 | struct bitmap_counts *counts; | 1866 | struct bitmap_counts *counts; |
1866 | struct bitmap *bitmap = bitmap_create(mddev, slot); | 1867 | struct bitmap *bitmap = bitmap_create(mddev, slot); |
1867 | 1868 | ||
1868 | if (IS_ERR(bitmap)) | 1869 | if (IS_ERR(bitmap)) { |
1870 | bitmap_free(bitmap); | ||
1869 | return PTR_ERR(bitmap); | 1871 | return PTR_ERR(bitmap); |
1872 | } | ||
1870 | 1873 | ||
1871 | rv = bitmap_init_from_disk(bitmap, 0); | 1874 | rv = bitmap_init_from_disk(bitmap, 0); |
1872 | if (rv) | 1875 | if (rv) |
@@ -2170,14 +2173,14 @@ location_store(struct mddev *mddev, const char *buf, size_t len) | |||
2170 | else { | 2173 | else { |
2171 | mddev->bitmap = bitmap; | 2174 | mddev->bitmap = bitmap; |
2172 | rv = bitmap_load(mddev); | 2175 | rv = bitmap_load(mddev); |
2173 | if (rv) { | 2176 | if (rv) |
2174 | bitmap_destroy(mddev); | ||
2175 | mddev->bitmap_info.offset = 0; | 2177 | mddev->bitmap_info.offset = 0; |
2176 | } | ||
2177 | } | 2178 | } |
2178 | mddev->pers->quiesce(mddev, 0); | 2179 | mddev->pers->quiesce(mddev, 0); |
2179 | if (rv) | 2180 | if (rv) { |
2181 | bitmap_destroy(mddev); | ||
2180 | return rv; | 2182 | return rv; |
2183 | } | ||
2181 | } | 2184 | } |
2182 | } | 2185 | } |
2183 | } | 2186 | } |