From b612438abcf12bf0d3cbaa5a2ac90035ea5278e7 Mon Sep 17 00:00:00 2001 From: Zach Brown Date: Tue, 8 Nov 2016 17:42:03 -0800 Subject: [PATCH] Buddy forgot to put blocks in a few places The buddy code missed putting the block in a few error cases. Signed-off-by: Zach Brown Reviewed-by: Mark Fasheh --- kmod/src/buddy.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/kmod/src/buddy.c b/kmod/src/buddy.c index 204dbb88..9f4a16fd 100644 --- a/kmod/src/buddy.c +++ b/kmod/src/buddy.c @@ -298,8 +298,10 @@ static void stack_cleanup(struct super_block *sb) while ((bl = stack_pop(sta, &sl))) { bud = scoutfs_block_data(bl); - if (parent && !set_slot_free_orders(bud, sl, free_orders)) + if (parent && !set_slot_free_orders(bud, sl, free_orders)) { + scoutfs_block_put(bl); break; + } free_orders = 0; for (i = 0; i < ARRAY_SIZE(bud->first_set); i++) { @@ -491,6 +493,7 @@ static int buddy_walk(struct super_block *sb, u64 blk, int order, u64 *base) sl = le16_to_cpu(bud->first_set[order]); /* XXX corruption */ if (sl == U16_MAX) { + scoutfs_block_put(bl); ret = -EIO; break; }