aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Mason <chris.mason@oracle.com>2011-01-31 16:48:24 -0500
committerChris Mason <chris.mason@oracle.com>2011-01-31 16:48:24 -0500
commitb31eabd86eb68d3c217e6821078249bc045e698a (patch)
treea6453484e1404ab2f92affad0225b3929dff5df6
parentb1953bcec95c189b1eea690a08e89646d7750bda (diff)
Btrfs: catch errors from btrfs_sync_log
btrfs_sync_log returns -EAGAIN when we need full transaction commits instead of small log commits, but sometimes we were dropping the return value. In practice, we check for this a few different ways, but this is still a bug that can leave off full log commits when we really need them. Signed-off-by: Chris Mason <chris.mason@oracle.com>
-rw-r--r--fs/btrfs/tree-log.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c
index c25a41d86118..42dfc3077040 100644
--- a/fs/btrfs/tree-log.c
+++ b/fs/btrfs/tree-log.c
@@ -2051,6 +2051,7 @@ int btrfs_sync_log(struct btrfs_trans_handle *trans,
2051 wait_log_commit(trans, log_root_tree, 2051 wait_log_commit(trans, log_root_tree,
2052 log_root_tree->log_transid); 2052 log_root_tree->log_transid);
2053 mutex_unlock(&log_root_tree->log_mutex); 2053 mutex_unlock(&log_root_tree->log_mutex);
2054 ret = 0;
2054 goto out; 2055 goto out;
2055 } 2056 }
2056 atomic_set(&log_root_tree->log_commit[index2], 1); 2057 atomic_set(&log_root_tree->log_commit[index2], 1);
@@ -2115,7 +2116,7 @@ out:
2115 smp_mb(); 2116 smp_mb();
2116 if (waitqueue_active(&root->log_commit_wait[index1])) 2117 if (waitqueue_active(&root->log_commit_wait[index1]))
2117 wake_up(&root->log_commit_wait[index1]); 2118 wake_up(&root->log_commit_wait[index1]);
2118 return 0; 2119 return ret;
2119} 2120}
2120 2121
2121static void free_log_tree(struct btrfs_trans_handle *trans, 2122static void free_log_tree(struct btrfs_trans_handle *trans,