aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/disk-io.c
diff options
context:
space:
mode:
authorTsutomu Itoh <t-itoh@jp.fujitsu.com>2011-01-24 21:51:38 -0500
committerChris Mason <chris.mason@oracle.com>2011-01-28 16:40:37 -0500
commit3612b49598c303cfb22a4b609427f829828e2427 (patch)
treed0e9eabb176777ab80af5d78eab0555044172370 /fs/btrfs/disk-io.c
parent34d19bada00f4825588b338a8ee193820f9ceeb0 (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.c5
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);