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 | |
| 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>
| -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 | } |
