Skip to content

Commit

Permalink
Btrfs: fix wrong return value of btrfs_wait_for_commit()
Browse files Browse the repository at this point in the history
If the id of the existed transaction is more than the one we specified, it
means the specified transaction was commited, so we should return 0, not
EINVAL.

Signed-off-by: Miao Xie <[email protected]>
Signed-off-by: Chris Mason <[email protected]>
  • Loading branch information
Miao Xie authored and Chris Mason committed Dec 17, 2012
1 parent ff7c1d3 commit 8cd2807
Showing 1 changed file with 8 additions and 7 deletions.
15 changes: 8 additions & 7 deletions fs/btrfs/transaction.c
Original file line number Diff line number Diff line change
Expand Up @@ -456,28 +456,31 @@ static noinline void wait_for_commit(struct btrfs_root *root,
int btrfs_wait_for_commit(struct btrfs_root *root, u64 transid)
{
struct btrfs_transaction *cur_trans = NULL, *t;
int ret;
int ret = 0;

ret = 0;
if (transid) {
if (transid <= root->fs_info->last_trans_committed)
goto out;

ret = -EINVAL;
/* find specified transaction */
spin_lock(&root->fs_info->trans_lock);
list_for_each_entry(t, &root->fs_info->trans_list, list) {
if (t->transid == transid) {
cur_trans = t;
atomic_inc(&cur_trans->use_count);
ret = 0;
break;
}
if (t->transid > transid)
if (t->transid > transid) {
ret = 0;
break;
}
}
spin_unlock(&root->fs_info->trans_lock);
ret = -EINVAL;
/* The specified transaction doesn't exist */
if (!cur_trans)
goto out; /* bad transid */
goto out;
} else {
/* find newest transaction that is committing | committed */
spin_lock(&root->fs_info->trans_lock);
Expand All @@ -497,9 +500,7 @@ int btrfs_wait_for_commit(struct btrfs_root *root, u64 transid)
}

wait_for_commit(root, cur_trans);

put_transaction(cur_trans);
ret = 0;
out:
return ret;
}
Expand Down

0 comments on commit 8cd2807

Please sign in to comment.