All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jeff Mahoney <jeffm@suse.com>
To: Linux Btrfs List <linux-btrfs@vger.kernel.org>
Cc: David Sterba <dsterba@suse.com>, Mark Fasheh <mfasheh@suse.com>
Subject: [patch 21/35] btrfs: Dont BUG_ON kzalloc error in btrfs_lookup_csums_range()
Date: Wed, 21 Mar 2012 21:11:25 -0400	[thread overview]
Message-ID: <20120322011135.937953541@suse.com> (raw)
In-Reply-To: 20120322011104.212214639@suse.com

Unfortunately it isn't enough to just exit here - the kzalloc() happens in a
loop and the allocated items are added to a linked list whose head is passed
in from the caller.

To fix the BUG_ON() and also provide the semantic that the list passed in is
only modified on success, I create function-local temporary list that we add
items too. If no error is met, that list is spliced to the callers at the
end of the function. Otherwise the list will be walked and all items freed
before the error value is returned.

I did a simple test on this patch by forcing an error at the kzalloc() point
and verifying that when this hits (git clone seemed to exercise this), the
function throws the proper error. Unfortunately but predictably, we later
hit a BUG_ON(ret) type line that still hasn't been fixed up ;)

Signed-off-by: Mark Fasheh <mfasheh@suse.com>
---
 fs/btrfs/file-item.c |   15 +++++++++++++--
 1 files changed, 13 insertions(+), 2 deletions(-)

diff --git a/fs/btrfs/file-item.c b/fs/btrfs/file-item.c
index edb69b4..89af104 100644
--- a/fs/btrfs/file-item.c
+++ b/fs/btrfs/file-item.c
@@ -284,6 +284,7 @@ int btrfs_lookup_csums_range(struct btrfs_root *root, u64 start, u64 end,
 	struct btrfs_ordered_sum *sums;
 	struct btrfs_sector_sum *sector_sum;
 	struct btrfs_csum_item *item;
+	LIST_HEAD(tmplist);
 	unsigned long offset;
 	int ret;
 	size_t size;
@@ -358,7 +359,10 @@ int btrfs_lookup_csums_range(struct btrfs_root *root, u64 start, u64 end,
 					MAX_ORDERED_SUM_BYTES(root));
 			sums = kzalloc(btrfs_ordered_sum_size(root, size),
 					GFP_NOFS);
-			BUG_ON(!sums);
+			if (!sums) {
+				ret = -ENOMEM;
+				goto fail;
+			}
 
 			sector_sum = sums->sums;
 			sums->bytenr = start;
@@ -380,12 +384,19 @@ int btrfs_lookup_csums_range(struct btrfs_root *root, u64 start, u64 end,
 				offset += csum_size;
 				sector_sum++;
 			}
-			list_add_tail(&sums->list, list);
+			list_add_tail(&sums->list, &tmplist);
 		}
 		path->slots[0]++;
 	}
 	ret = 0;
 fail:
+	while (ret < 0 && !list_empty(&tmplist)) {
+		sums = list_entry(&tmplist, struct btrfs_ordered_sum, list);
+		list_del(&sums->list);
+		kfree(sums);
+	}
+	list_splice_tail(&tmplist, list);
+
 	btrfs_free_path(path);
 	return ret;
 }
-- 
1.7.9




  parent reply	other threads:[~2012-03-22  1:11 UTC|newest]

Thread overview: 42+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-03-22  1:11 [patch 00/35] btrfs: Error Handling Patchset Jeff Mahoney
2012-03-22  1:11 ` [patch 01/35] btrfs: Add btrfs_panic() Jeff Mahoney
2012-03-22  1:11 ` [patch 02/35] btrfs: Catch locking failures in {set,clear,convert}_extent_bit Jeff Mahoney
2012-03-22  1:11 ` [patch 03/35] btrfs: Panic on bad rbtree operations Jeff Mahoney
2012-03-22  1:11 ` [patch 04/35] btrfs: Fix kfree of member instead of structure Jeff Mahoney
2012-03-22  1:11 ` [patch 05/35] btrfs: Simplify btrfs_insert_root Jeff Mahoney
2012-03-22  1:11 ` [patch 06/35] btrfs: clean_tree_block should panic on observed memory corruption and return void Jeff Mahoney
2012-03-22  1:11 ` [patch 07/35] btrfs: avoid NULL deref in btrfs_reserve_extent with DEBUG_ENOSPC Jeff Mahoney
2012-03-22  1:11 ` [patch 08/35] btrfs: Remove set bits return from clear_extent_bit Jeff Mahoney
2012-03-22  2:03   ` Liu Bo
2012-03-22  2:34     ` Jeff Mahoney
2012-03-22  1:11 ` [patch 09/35] btrfs: find_and_setup_root error push-up Jeff Mahoney
2012-03-22  1:11 ` [patch 10/35] btrfs: btrfs_update_root " Jeff Mahoney
2012-03-22  1:11 ` [patch 11/35] btrfs: Simplify btrfs_submit_bio_hook Jeff Mahoney
2012-03-22  1:11 ` [patch 12/35] btrfs: Factor out tree->ops->merge_bio_hook call Jeff Mahoney
2012-03-22  1:11 ` [patch 13/35] btrfs: ->submit_bio_hook error push-up Jeff Mahoney
2012-03-22  1:11 ` [patch 14/35] btrfs: __add_reloc_root " Jeff Mahoney
2012-03-22  1:11 ` [patch 15/35] btrfs: return void in functions without error conditions Jeff Mahoney
2012-03-22  1:11 ` [patch 16/35] btrfs: drop gfp_t from lock_extent Jeff Mahoney
2012-03-22  1:11 ` [patch 17/35] btrfs: split extent_state ops Jeff Mahoney
2012-03-22  1:56   ` Liu Bo
2012-03-22  2:35     ` Jeff Mahoney
2012-03-22  1:11 ` [patch 18/35] btrfs: btrfs_drop_snapshot should return int Jeff Mahoney
2012-03-22  1:11 ` [patch 19/35] btrfs: Dont BUG_ON errors from btrfs_create_subvol_root() Jeff Mahoney
2012-03-22  1:11 ` [patch 20/35] btrfs: Dont BUG_ON() errors in update_ref_for_cow() Jeff Mahoney
2012-03-22  1:11 ` Jeff Mahoney [this message]
2012-03-22  1:11 ` [patch 22/35] btrfs: Dont BUG_ON errors in __finish_chunk_alloc() Jeff Mahoney
2012-03-22  1:11 ` [patch 23/35] btrfs: Go readonly on bad extent refs in update_ref_for_cow() Jeff Mahoney
2012-03-22  1:11 ` [patch 24/35] btrfs: Dont BUG_ON errors from update_ref_for_cow() Jeff Mahoney
2012-03-22  1:11 ` [patch 25/35] btrfs: Go readonly on tree errors in balance_level Jeff Mahoney
2012-03-22  1:11 ` [patch 26/35] btrfs: Dont BUG_ON insert errors in btrfs_alloc_dev_extent() Jeff Mahoney
2012-03-22  1:11 ` [patch 27/35] btrfs: Remove BUG_ON from __btrfs_alloc_chunk() Jeff Mahoney
2012-03-22  1:11 ` [patch 28/35] btrfs: Remove BUG_ON from __finish_chunk_alloc() Jeff Mahoney
2012-03-22  1:11 ` [patch 29/35] btrfs: add varargs to btrfs_error Jeff Mahoney
2012-03-22  1:11 ` [patch 30/35] btrfs: enhance transaction abort infrastructure Jeff Mahoney
2012-03-22  1:11 ` [patch 32/35] btrfs: Fix busyloop in transaction_kthread() Jeff Mahoney
2012-03-22  1:11 ` [patch 33/35] btrfs: handle errors when excluding super extents Jeff Mahoney
2012-03-23 17:21   ` David Sterba
2012-03-22  1:11 ` [patch 34/35] btrfs: enhance superblock sanity checks Jeff Mahoney
2012-03-22  1:11 ` [patch 35/35] btrfs: disallow unequal data/metadata blocksize for mixed block groups Jeff Mahoney
2012-03-22 16:02   ` Stefan Behrens
2012-03-23 17:13     ` David Sterba

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20120322011135.937953541@suse.com \
    --to=jeffm@suse.com \
    --cc=dsterba@suse.com \
    --cc=linux-btrfs@vger.kernel.org \
    --cc=mfasheh@suse.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.