From: Mark Fasheh <mfasheh@suse.de>
To: linux-btrfs@vger.kernel.org
Cc: Chris Mason <chris.mason@oracle.com>,
Mark Fasheh <mfasheh@suse.de>, Mark Fasheh <mfasheh@suse.com>
Subject: [PATCH 03/20] btrfs: Don't BUG_ON kzalloc error in btrfs_lookup_csums_range()
Date: Thu, 15 Sep 2011 10:34:42 -0700 [thread overview]
Message-ID: <1316108099-5099-4-git-send-email-mfasheh@suse.de> (raw)
In-Reply-To: <1316108099-5099-1-git-send-email-mfasheh@suse.de>
From: Mark Fasheh <mfasheh@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 b910694..679fbff 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.6
next prev parent reply other threads:[~2011-09-15 17:34 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-09-15 17:34 [PATCH 0/20] btrfs: More error handling fixes Mark Fasheh
2011-09-15 17:34 ` [PATCH 01/20] btrfs: Don't BUG_ON errors from btrfs_create_subvol_root() Mark Fasheh
2011-09-15 17:34 ` [PATCH 02/20] btrfs: Don't BUG_ON() errors in update_ref_for_cow() Mark Fasheh
2011-09-15 17:34 ` Mark Fasheh [this message]
2011-09-15 17:34 ` [PATCH 04/20] btrfs: make insert_ptr() void Mark Fasheh
2011-09-15 17:34 ` [PATCH 05/20] btrfs: Don't BUG_ON errors in __finish_chunk_alloc() Mark Fasheh
2011-09-15 17:34 ` [PATCH 06/20] btrfs: fix error check of btrfs_lookup_dentry() Mark Fasheh
2011-09-15 17:34 ` [PATCH 07/20] btrfs: make fixup_low_keys() void Mark Fasheh
2011-09-15 17:34 ` [PATCH 08/20] btrfs: make del_ptr() and btrfs_del_leaf() void Mark Fasheh
2011-09-15 17:34 ` [PATCH 09/20] btrfs: Don't BUG_ON failures in find_and_setup_root() Mark Fasheh
2011-09-15 17:34 ` [PATCH 10/20] btrfs: go readonly on insert error in btrfs_add_root_ref() Mark Fasheh
2011-09-15 17:34 ` [PATCH 11/20] btrfs: Go readonly on bad extent refs in update_ref_for_cow() Mark Fasheh
2011-09-15 17:34 ` [PATCH 12/20] btrfs: Don't BUG_ON errors from update_ref_for_cow() Mark Fasheh
2011-09-15 17:34 ` [PATCH 13/20] btrfs: Go readonly on tree errors in balance_level Mark Fasheh
2011-09-15 17:34 ` [PATCH 14/20] btrfs: Document BUG() in find_lock_delalloc_range() Mark Fasheh
2011-09-15 17:34 ` [PATCH 15/20] btrfs: Go readonly on missing ref in btrfs_get_parent() Mark Fasheh
2011-09-15 17:34 ` [PATCH 16/20] btrfs: make add_delayed_ref_head() void Mark Fasheh
2011-09-15 17:34 ` [PATCH 17/20] btrfs: make add_delayed_tree_ref() void Mark Fasheh
2011-09-15 17:34 ` [PATCH 18/20] btrfs: Don't BUG_ON insert errors in btrfs_alloc_dev_extent() Mark Fasheh
2011-09-15 17:34 ` [PATCH 19/20] btrfs: Remove BUG_ON from __btrfs_alloc_chunk() Mark Fasheh
2011-09-15 17:34 ` [PATCH 20/20] btrfs: Remove BUG_ON from __finish_chunk_alloc() Mark Fasheh
2011-09-15 18:03 ` [PATCH 0/20] btrfs: More error handling fixes 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=1316108099-5099-4-git-send-email-mfasheh@suse.de \
--to=mfasheh@suse.de \
--cc=chris.mason@oracle.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).