diff options
author | Tsutomu Itoh <t-itoh@jp.fujitsu.com> | 2011-01-24 21:51:38 -0500 |
---|---|---|
committer | Chris Mason <chris.mason@oracle.com> | 2011-01-28 16:40:37 -0500 |
commit | 3612b49598c303cfb22a4b609427f829828e2427 (patch) | |
tree | d0e9eabb176777ab80af5d78eab0555044172370 /fs/btrfs/disk-io.c | |
parent | 34d19bada00f4825588b338a8ee193820f9ceeb0 (diff) |
btrfs: fix return value check of btrfs_join_transaction()
The error check of btrfs_join_transaction()/btrfs_join_transaction_nolock()
is added, and the mistake of the error check in several places is
corrected.
For more stable Btrfs, I think that we should reduce BUG_ON().
But, I think that long time is necessary for this.
So, I propose this patch as a short-term solution.
With this patch:
- To more stable Btrfs, the part that should be corrected is clarified.
- The panic isn't done by the NULL pointer reference etc. (even if
BUG_ON() is increased temporarily)
- The error code is returned in the place where the error can be easily
returned.
As a long-term plan:
- BUG_ON() is reduced by using the forced-readonly framework, etc.
Signed-off-by: Tsutomu Itoh <t-itoh@jp.fujitsu.com>
Signed-off-by: Chris Mason <chris.mason@oracle.com>
Diffstat (limited to 'fs/btrfs/disk-io.c')
-rw-r--r-- | fs/btrfs/disk-io.c | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 2887b8be6fdd..b36eeef19194 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c | |||
@@ -1550,6 +1550,7 @@ static int transaction_kthread(void *arg) | |||
1550 | spin_unlock(&root->fs_info->new_trans_lock); | 1550 | spin_unlock(&root->fs_info->new_trans_lock); |
1551 | 1551 | ||
1552 | trans = btrfs_join_transaction(root, 1); | 1552 | trans = btrfs_join_transaction(root, 1); |
1553 | BUG_ON(IS_ERR(trans)); | ||
1553 | if (transid == trans->transid) { | 1554 | if (transid == trans->transid) { |
1554 | ret = btrfs_commit_transaction(trans, root); | 1555 | ret = btrfs_commit_transaction(trans, root); |
1555 | BUG_ON(ret); | 1556 | BUG_ON(ret); |
@@ -2464,10 +2465,14 @@ int btrfs_commit_super(struct btrfs_root *root) | |||
2464 | up_write(&root->fs_info->cleanup_work_sem); | 2465 | up_write(&root->fs_info->cleanup_work_sem); |
2465 | 2466 | ||
2466 | trans = btrfs_join_transaction(root, 1); | 2467 | trans = btrfs_join_transaction(root, 1); |
2468 | if (IS_ERR(trans)) | ||
2469 | return PTR_ERR(trans); | ||
2467 | ret = btrfs_commit_transaction(trans, root); | 2470 | ret = btrfs_commit_transaction(trans, root); |
2468 | BUG_ON(ret); | 2471 | BUG_ON(ret); |
2469 | /* run commit again to drop the original snapshot */ | 2472 | /* run commit again to drop the original snapshot */ |
2470 | trans = btrfs_join_transaction(root, 1); | 2473 | trans = btrfs_join_transaction(root, 1); |
2474 | if (IS_ERR(trans)) | ||
2475 | return PTR_ERR(trans); | ||
2471 | btrfs_commit_transaction(trans, root); | 2476 | btrfs_commit_transaction(trans, root); |
2472 | ret = btrfs_write_and_wait_transaction(NULL, root); | 2477 | ret = btrfs_write_and_wait_transaction(NULL, root); |
2473 | BUG_ON(ret); | 2478 | BUG_ON(ret); |