diff options
Diffstat (limited to 'drivers/md/bitmap.c')
-rw-r--r-- | drivers/md/bitmap.c | 21 |
1 files changed, 12 insertions, 9 deletions
diff --git a/drivers/md/bitmap.c b/drivers/md/bitmap.c index 7df6b4f1548a..3fe86b54d50b 100644 --- a/drivers/md/bitmap.c +++ b/drivers/md/bitmap.c | |||
@@ -322,7 +322,7 @@ __clear_page_buffers(struct page *page) | |||
322 | { | 322 | { |
323 | ClearPagePrivate(page); | 323 | ClearPagePrivate(page); |
324 | set_page_private(page, 0); | 324 | set_page_private(page, 0); |
325 | page_cache_release(page); | 325 | put_page(page); |
326 | } | 326 | } |
327 | static void free_buffers(struct page *page) | 327 | static void free_buffers(struct page *page) |
328 | { | 328 | { |
@@ -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 | } |