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);
                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,