aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md/bitmap.c
diff options
context:
space:
mode:
authorGuoqing Jiang <gqjiang@suse.com>2016-04-01 05:08:49 -0400
committerShaohua Li <shli@fb.com>2016-04-01 16:05:50 -0400
commitf9a67b1182e5abfcfcec24762ea95a77332f035e (patch)
tree9c7b17f98a7838daa26c1573e7d393350aeab9a4 /drivers/md/bitmap.c
parented3b98c71cd91fa05954df52a79dcd6be08dd730 (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.c19
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 */
1725struct bitmap *bitmap_create(struct mddev *mddev, int slot) 1726struct 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 }