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>
int retries = 0;
int ret = 0;
bool reserved = false;
+ bool committed = false;
again:
ret = -ENOSPC;
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) {