diff options
author | Yan, Zheng <zheng.yan@oracle.com> | 2009-10-14 09:24:59 -0400 |
---|---|---|
committer | Chris Mason <chris.mason@oracle.com> | 2009-10-14 10:32:48 -0400 |
commit | 86df7eb921a009515285e7171363fa57dd2d7d31 (patch) | |
tree | 884e8cda2535dc43cf57ce9fa273381b827d2f4f /fs/btrfs/tree-log.c | |
parent | 5d5e103a70f74ae98e3965a4add1ab951d0651d1 (diff) |
Btrfs: properly wait log writers during log sync
A recently fsync optimization make btrfs_sync_log skip calling
wait_for_writer in the single log writer case. This is incorrect
since the writer count can also be increased by btrfs_pin_log.
Signed-off-by: Yan Zheng <zheng.yan@oracle.com>
Signed-off-by: Chris Mason <chris.mason@oracle.com>
Diffstat (limited to 'fs/btrfs/tree-log.c')
-rw-r--r-- | fs/btrfs/tree-log.c | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c index 4aff766d171a..f51bf13125c0 100644 --- a/fs/btrfs/tree-log.c +++ b/fs/btrfs/tree-log.c | |||
@@ -1995,12 +1995,13 @@ int btrfs_sync_log(struct btrfs_trans_handle *trans, | |||
1995 | if (atomic_read(&root->log_commit[(index1 + 1) % 2])) | 1995 | if (atomic_read(&root->log_commit[(index1 + 1) % 2])) |
1996 | wait_log_commit(trans, root, root->log_transid - 1); | 1996 | wait_log_commit(trans, root, root->log_transid - 1); |
1997 | 1997 | ||
1998 | while (root->log_multiple_pids) { | 1998 | while (1) { |
1999 | unsigned long batch = root->log_batch; | 1999 | unsigned long batch = root->log_batch; |
2000 | mutex_unlock(&root->log_mutex); | 2000 | if (root->log_multiple_pids) { |
2001 | schedule_timeout_uninterruptible(1); | 2001 | mutex_unlock(&root->log_mutex); |
2002 | mutex_lock(&root->log_mutex); | 2002 | schedule_timeout_uninterruptible(1); |
2003 | 2003 | mutex_lock(&root->log_mutex); | |
2004 | } | ||
2004 | wait_for_writer(trans, root); | 2005 | wait_for_writer(trans, root); |
2005 | if (batch == root->log_batch) | 2006 | if (batch == root->log_batch) |
2006 | break; | 2007 | break; |