Josef Bacik
2010-Oct-26 16:54 UTC
[PATCH] Btrfs: set trans to null in reserve_metadata_bytes if we commit the transaction
btrfs_commit_transaction will free our trans, but because we pass trans to
shrink_delalloc we could possibly have a use after free situation. So instead
if we commit the transaction, set trans to null and set committed to true so we
don''t keep trying to commit a transaction. This fixes a panic I could
reproduce
at will. Thanks,
Signed-off-by: Josef Bacik <josef@redhat.com>
---
fs/btrfs/extent-tree.c | 9 ++++++---
1 files changed, 6 insertions(+), 3 deletions(-)
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
index 180a501..e2dfd4a 100644
--- a/fs/btrfs/extent-tree.c
+++ b/fs/btrfs/extent-tree.c
@@ -3157,6 +3157,7 @@ static int reserve_metadata_bytes(struct
btrfs_trans_handle *trans,
int retries = 0;
int ret = 0;
bool reserved = false;
+ bool committed = false;
again:
ret = -ENOSPC;
@@ -3249,17 +3250,19 @@ again:
goto out;
ret = -EAGAIN;
- if (trans)
+ if (trans || committed)
goto out;
-
ret = -ENOSPC;
trans = btrfs_join_transaction(root, 1);
if (IS_ERR(trans))
goto out;
ret = btrfs_commit_transaction(trans, root);
- if (!ret)
+ if (!ret) {
+ trans = NULL;
+ committed = true;
goto again;
+ }
out:
if (reserved) {
--
1.6.6.1
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs"
in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Apparently Analagous Threads
- [PATCH] Btrfs: proper metadata -ENOSPC handling
- [RFC PATCH 4/4 v2] Btrfs: deal with filesystem state at mount, umount
- [PATCH 08/12] Btrfs: Introduce global metadata reservation
- [PATCH] Btrfs: pass lockdep rwsem metadata to async commit transaction
- [PATCH 2/2] Btrfs: fix unclosed transaction handler when the async transaction commitment fails
