|
@@ -18,6 +18,7 @@
|
|
|
|
|
|
#include <linux/sched.h>
|
|
#include <linux/sched.h>
|
|
#include <linux/slab.h>
|
|
#include <linux/slab.h>
|
|
|
|
+#include <linux/blkdev.h>
|
|
#include <linux/list_sort.h>
|
|
#include <linux/list_sort.h>
|
|
#include "ctree.h"
|
|
#include "ctree.h"
|
|
#include "transaction.h"
|
|
#include "transaction.h"
|
|
@@ -2353,6 +2354,7 @@ int btrfs_sync_log(struct btrfs_trans_handle *trans,
|
|
struct btrfs_root *log = root->log_root;
|
|
struct btrfs_root *log = root->log_root;
|
|
struct btrfs_root *log_root_tree = root->fs_info->log_root_tree;
|
|
struct btrfs_root *log_root_tree = root->fs_info->log_root_tree;
|
|
unsigned long log_transid = 0;
|
|
unsigned long log_transid = 0;
|
|
|
|
+ struct blk_plug plug;
|
|
|
|
|
|
mutex_lock(&root->log_mutex);
|
|
mutex_lock(&root->log_mutex);
|
|
log_transid = root->log_transid;
|
|
log_transid = root->log_transid;
|
|
@@ -2396,8 +2398,10 @@ int btrfs_sync_log(struct btrfs_trans_handle *trans,
|
|
/* we start IO on all the marked extents here, but we don't actually
|
|
/* we start IO on all the marked extents here, but we don't actually
|
|
* wait for them until later.
|
|
* wait for them until later.
|
|
*/
|
|
*/
|
|
|
|
+ blk_start_plug(&plug);
|
|
ret = btrfs_write_marked_extents(log, &log->dirty_log_pages, mark);
|
|
ret = btrfs_write_marked_extents(log, &log->dirty_log_pages, mark);
|
|
if (ret) {
|
|
if (ret) {
|
|
|
|
+ blk_finish_plug(&plug);
|
|
btrfs_abort_transaction(trans, root, ret);
|
|
btrfs_abort_transaction(trans, root, ret);
|
|
btrfs_free_logged_extents(log, log_transid);
|
|
btrfs_free_logged_extents(log, log_transid);
|
|
mutex_unlock(&root->log_mutex);
|
|
mutex_unlock(&root->log_mutex);
|
|
@@ -2432,6 +2436,7 @@ int btrfs_sync_log(struct btrfs_trans_handle *trans,
|
|
}
|
|
}
|
|
|
|
|
|
if (ret) {
|
|
if (ret) {
|
|
|
|
+ blk_finish_plug(&plug);
|
|
if (ret != -ENOSPC) {
|
|
if (ret != -ENOSPC) {
|
|
btrfs_abort_transaction(trans, root, ret);
|
|
btrfs_abort_transaction(trans, root, ret);
|
|
mutex_unlock(&log_root_tree->log_mutex);
|
|
mutex_unlock(&log_root_tree->log_mutex);
|
|
@@ -2447,6 +2452,7 @@ int btrfs_sync_log(struct btrfs_trans_handle *trans,
|
|
|
|
|
|
index2 = log_root_tree->log_transid % 2;
|
|
index2 = log_root_tree->log_transid % 2;
|
|
if (atomic_read(&log_root_tree->log_commit[index2])) {
|
|
if (atomic_read(&log_root_tree->log_commit[index2])) {
|
|
|
|
+ blk_finish_plug(&plug);
|
|
btrfs_wait_marked_extents(log, &log->dirty_log_pages, mark);
|
|
btrfs_wait_marked_extents(log, &log->dirty_log_pages, mark);
|
|
wait_log_commit(trans, log_root_tree,
|
|
wait_log_commit(trans, log_root_tree,
|
|
log_root_tree->log_transid);
|
|
log_root_tree->log_transid);
|
|
@@ -2469,6 +2475,7 @@ int btrfs_sync_log(struct btrfs_trans_handle *trans,
|
|
* check the full commit flag again
|
|
* check the full commit flag again
|
|
*/
|
|
*/
|
|
if (root->fs_info->last_trans_log_full_commit == trans->transid) {
|
|
if (root->fs_info->last_trans_log_full_commit == trans->transid) {
|
|
|
|
+ blk_finish_plug(&plug);
|
|
btrfs_wait_marked_extents(log, &log->dirty_log_pages, mark);
|
|
btrfs_wait_marked_extents(log, &log->dirty_log_pages, mark);
|
|
btrfs_free_logged_extents(log, log_transid);
|
|
btrfs_free_logged_extents(log, log_transid);
|
|
mutex_unlock(&log_root_tree->log_mutex);
|
|
mutex_unlock(&log_root_tree->log_mutex);
|
|
@@ -2476,9 +2483,10 @@ int btrfs_sync_log(struct btrfs_trans_handle *trans,
|
|
goto out_wake_log_root;
|
|
goto out_wake_log_root;
|
|
}
|
|
}
|
|
|
|
|
|
- ret = btrfs_write_and_wait_marked_extents(log_root_tree,
|
|
|
|
- &log_root_tree->dirty_log_pages,
|
|
|
|
- EXTENT_DIRTY | EXTENT_NEW);
|
|
|
|
|
|
+ ret = btrfs_write_marked_extents(log_root_tree,
|
|
|
|
+ &log_root_tree->dirty_log_pages,
|
|
|
|
+ EXTENT_DIRTY | EXTENT_NEW);
|
|
|
|
+ blk_finish_plug(&plug);
|
|
if (ret) {
|
|
if (ret) {
|
|
btrfs_abort_transaction(trans, root, ret);
|
|
btrfs_abort_transaction(trans, root, ret);
|
|
btrfs_free_logged_extents(log, log_transid);
|
|
btrfs_free_logged_extents(log, log_transid);
|
|
@@ -2486,6 +2494,9 @@ int btrfs_sync_log(struct btrfs_trans_handle *trans,
|
|
goto out_wake_log_root;
|
|
goto out_wake_log_root;
|
|
}
|
|
}
|
|
btrfs_wait_marked_extents(log, &log->dirty_log_pages, mark);
|
|
btrfs_wait_marked_extents(log, &log->dirty_log_pages, mark);
|
|
|
|
+ btrfs_wait_marked_extents(log_root_tree,
|
|
|
|
+ &log_root_tree->dirty_log_pages,
|
|
|
|
+ EXTENT_NEW | EXTENT_DIRTY);
|
|
btrfs_wait_logged_extents(log, log_transid);
|
|
btrfs_wait_logged_extents(log, log_transid);
|
|
|
|
|
|
btrfs_set_super_log_root(root->fs_info->super_for_commit,
|
|
btrfs_set_super_log_root(root->fs_info->super_for_commit,
|