aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/transaction.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/btrfs/transaction.c')
-rw-r--r--fs/btrfs/transaction.c65
1 files changed, 9 insertions, 56 deletions
diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c
index eb55863bb4a..7dc36fab4af 100644
--- a/fs/btrfs/transaction.c
+++ b/fs/btrfs/transaction.c
@@ -216,17 +216,11 @@ static void wait_current_trans(struct btrfs_root *root)
216 spin_lock(&root->fs_info->trans_lock); 216 spin_lock(&root->fs_info->trans_lock);
217 cur_trans = root->fs_info->running_transaction; 217 cur_trans = root->fs_info->running_transaction;
218 if (cur_trans && cur_trans->blocked) { 218 if (cur_trans && cur_trans->blocked) {
219 DEFINE_WAIT(wait);
220 atomic_inc(&cur_trans->use_count); 219 atomic_inc(&cur_trans->use_count);
221 spin_unlock(&root->fs_info->trans_lock); 220 spin_unlock(&root->fs_info->trans_lock);
222 while (1) { 221
223 prepare_to_wait(&root->fs_info->transaction_wait, &wait, 222 wait_event(root->fs_info->transaction_wait,
224 TASK_UNINTERRUPTIBLE); 223 !cur_trans->blocked);
225 if (!cur_trans->blocked)
226 break;
227 schedule();
228 }
229 finish_wait(&root->fs_info->transaction_wait, &wait);
230 put_transaction(cur_trans); 224 put_transaction(cur_trans);
231 } else { 225 } else {
232 spin_unlock(&root->fs_info->trans_lock); 226 spin_unlock(&root->fs_info->trans_lock);
@@ -357,19 +351,10 @@ struct btrfs_trans_handle *btrfs_start_ioctl_transaction(struct btrfs_root *root
357} 351}
358 352
359/* wait for a transaction commit to be fully complete */ 353/* wait for a transaction commit to be fully complete */
360static noinline int wait_for_commit(struct btrfs_root *root, 354static noinline void wait_for_commit(struct btrfs_root *root,
361 struct btrfs_transaction *commit) 355 struct btrfs_transaction *commit)
362{ 356{
363 DEFINE_WAIT(wait); 357 wait_event(commit->commit_wait, commit->commit_done);
364 while (!commit->commit_done) {
365 prepare_to_wait(&commit->commit_wait, &wait,
366 TASK_UNINTERRUPTIBLE);
367 if (commit->commit_done)
368 break;
369 schedule();
370 }
371 finish_wait(&commit->commit_wait, &wait);
372 return 0;
373} 358}
374 359
375int btrfs_wait_for_commit(struct btrfs_root *root, u64 transid) 360int btrfs_wait_for_commit(struct btrfs_root *root, u64 transid)
@@ -1085,22 +1070,7 @@ int btrfs_transaction_blocked(struct btrfs_fs_info *info)
1085static void wait_current_trans_commit_start(struct btrfs_root *root, 1070static void wait_current_trans_commit_start(struct btrfs_root *root,
1086 struct btrfs_transaction *trans) 1071 struct btrfs_transaction *trans)
1087{ 1072{
1088 DEFINE_WAIT(wait); 1073 wait_event(root->fs_info->transaction_blocked_wait, trans->in_commit);
1089
1090 if (trans->in_commit)
1091 return;
1092
1093 while (1) {
1094 prepare_to_wait(&root->fs_info->transaction_blocked_wait, &wait,
1095 TASK_UNINTERRUPTIBLE);
1096 if (trans->in_commit) {
1097 finish_wait(&root->fs_info->transaction_blocked_wait,
1098 &wait);
1099 break;
1100 }
1101 schedule();
1102 finish_wait(&root->fs_info->transaction_blocked_wait, &wait);
1103 }
1104} 1074}
1105 1075
1106/* 1076/*
@@ -1110,24 +1080,8 @@ static void wait_current_trans_commit_start(struct btrfs_root *root,
1110static void wait_current_trans_commit_start_and_unblock(struct btrfs_root *root, 1080static void wait_current_trans_commit_start_and_unblock(struct btrfs_root *root,
1111 struct btrfs_transaction *trans) 1081 struct btrfs_transaction *trans)
1112{ 1082{
1113 DEFINE_WAIT(wait); 1083 wait_event(root->fs_info->transaction_wait,
1114 1084 trans->commit_done || (trans->in_commit && !trans->blocked));
1115 if (trans->commit_done || (trans->in_commit && !trans->blocked))
1116 return;
1117
1118 while (1) {
1119 prepare_to_wait(&root->fs_info->transaction_wait, &wait,
1120 TASK_UNINTERRUPTIBLE);
1121 if (trans->commit_done ||
1122 (trans->in_commit && !trans->blocked)) {
1123 finish_wait(&root->fs_info->transaction_wait,
1124 &wait);
1125 break;
1126 }
1127 schedule();
1128 finish_wait(&root->fs_info->transaction_wait,
1129 &wait);
1130 }
1131} 1085}
1132 1086
1133/* 1087/*
@@ -1234,8 +1188,7 @@ int btrfs_commit_transaction(struct btrfs_trans_handle *trans,
1234 atomic_inc(&cur_trans->use_count); 1188 atomic_inc(&cur_trans->use_count);
1235 btrfs_end_transaction(trans, root); 1189 btrfs_end_transaction(trans, root);
1236 1190
1237 ret = wait_for_commit(root, cur_trans); 1191 wait_for_commit(root, cur_trans);
1238 BUG_ON(ret);
1239 1192
1240 put_transaction(cur_trans); 1193 put_transaction(cur_trans);
1241 1194