|
@@ -2599,12 +2599,14 @@ int btrfs_sync_log(struct btrfs_trans_handle *trans,
|
|
|
index2 = root_log_ctx.log_transid % 2;
|
|
|
if (atomic_read(&log_root_tree->log_commit[index2])) {
|
|
|
blk_finish_plug(&plug);
|
|
|
- btrfs_wait_marked_extents(log, &log->dirty_log_pages, mark);
|
|
|
+ ret = btrfs_wait_marked_extents(log, &log->dirty_log_pages,
|
|
|
+ mark);
|
|
|
btrfs_wait_logged_extents(trans, log, log_transid);
|
|
|
wait_log_commit(trans, log_root_tree,
|
|
|
root_log_ctx.log_transid);
|
|
|
mutex_unlock(&log_root_tree->log_mutex);
|
|
|
- ret = root_log_ctx.log_ret;
|
|
|
+ if (!ret)
|
|
|
+ ret = root_log_ctx.log_ret;
|
|
|
goto out;
|
|
|
}
|
|
|
ASSERT(root_log_ctx.log_transid == log_root_tree->log_transid);
|
|
@@ -2641,10 +2643,17 @@ int btrfs_sync_log(struct btrfs_trans_handle *trans,
|
|
|
mutex_unlock(&log_root_tree->log_mutex);
|
|
|
goto out_wake_log_root;
|
|
|
}
|
|
|
- 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);
|
|
|
+ ret = btrfs_wait_marked_extents(log, &log->dirty_log_pages, mark);
|
|
|
+ if (!ret)
|
|
|
+ ret = btrfs_wait_marked_extents(log_root_tree,
|
|
|
+ &log_root_tree->dirty_log_pages,
|
|
|
+ EXTENT_NEW | EXTENT_DIRTY);
|
|
|
+ if (ret) {
|
|
|
+ btrfs_set_log_full_commit(root->fs_info, trans);
|
|
|
+ btrfs_free_logged_extents(log, log_transid);
|
|
|
+ mutex_unlock(&log_root_tree->log_mutex);
|
|
|
+ goto out_wake_log_root;
|
|
|
+ }
|
|
|
btrfs_wait_logged_extents(trans, log, log_transid);
|
|
|
|
|
|
btrfs_set_super_log_root(root->fs_info->super_for_commit,
|