Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f9a67b11 authored by Guoqing Jiang's avatar Guoqing Jiang Committed by Shaohua Li
Browse files

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: default avatarGuoqing Jiang <gqjiang@suse.com>
Signed-off-by: default avatarShaohua Li <shli@fb.com>
parent ed3b98c7
Loading
Loading
Loading
Loading
+11 −8
Original line number Diff line number Diff line
@@ -1673,6 +1673,9 @@ static void bitmap_free(struct bitmap *bitmap)
	if (!bitmap) /* there was no bitmap */
		return;

	if (bitmap->sysfs_can_clear)
		sysfs_put(bitmap->sysfs_can_clear);

	if (mddev_is_clustered(bitmap->mddev) && bitmap->mddev->cluster_info &&
		bitmap->cluster_slot == md_cluster_ops->slot_number(bitmap->mddev))
		md_cluster_stop(bitmap->mddev);
@@ -1712,15 +1715,13 @@ void bitmap_destroy(struct mddev *mddev)
	if (mddev->thread)
		mddev->thread->timeout = MAX_SCHEDULE_TIMEOUT;

	if (bitmap->sysfs_can_clear)
		sysfs_put(bitmap->sysfs_can_clear);

	bitmap_free(bitmap);
}

/*
 * initialize the bitmap structure
 * 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)
{
@@ -1865,8 +1866,10 @@ int bitmap_copy_from_slot(struct mddev *mddev, int slot,
	struct bitmap_counts *counts;
	struct bitmap *bitmap = bitmap_create(mddev, slot);

	if (IS_ERR(bitmap))
	if (IS_ERR(bitmap)) {
		bitmap_free(bitmap);
		return PTR_ERR(bitmap);
	}

	rv = bitmap_init_from_disk(bitmap, 0);
	if (rv)
@@ -2170,17 +2173,17 @@ location_store(struct mddev *mddev, const char *buf, size_t len)
				else {
					mddev->bitmap = bitmap;
					rv = bitmap_load(mddev);
					if (rv) {
						bitmap_destroy(mddev);
					if (rv)
						mddev->bitmap_info.offset = 0;
				}
				}
				mddev->pers->quiesce(mddev, 0);
				if (rv)
				if (rv) {
					bitmap_destroy(mddev);
					return rv;
				}
			}
		}
	}
	if (!mddev->external) {
		/* Ensure new bitmap info is stored in
		 * metadata promptly.