mutex_lock(&root->log_mutex);
        if (root->log_root) {
+               if (ACCESS_ONCE(root->fs_info->last_trans_log_full_commit) ==
+                   trans->transid) {
+                       ret = -EAGAIN;
+                       goto out;
+               }
+
                if (!root->log_start_pid) {
                        root->log_start_pid = current->pid;
                        root->log_multiple_pids = false;
                blk_finish_plug(&plug);
                btrfs_abort_transaction(trans, root, ret);
                btrfs_free_logged_extents(log, log_transid);
+               ACCESS_ONCE(root->fs_info->last_trans_log_full_commit) =
+                                                               trans->transid;
                mutex_unlock(&root->log_mutex);
                goto out;
        }
                        list_del_init(&root_log_ctx.list);
 
                blk_finish_plug(&plug);
+               ACCESS_ONCE(root->fs_info->last_trans_log_full_commit) =
+                                                               trans->transid;
                if (ret != -ENOSPC) {
                        btrfs_abort_transaction(trans, root, ret);
                        mutex_unlock(&log_root_tree->log_mutex);
                        goto out;
                }
-               ACCESS_ONCE(root->fs_info->last_trans_log_full_commit) =
-                                                               trans->transid;
                btrfs_wait_marked_extents(log, &log->dirty_log_pages, mark);
                btrfs_free_logged_extents(log, log_transid);
                mutex_unlock(&log_root_tree->log_mutex);
                                         EXTENT_DIRTY | EXTENT_NEW);
        blk_finish_plug(&plug);
        if (ret) {
+               ACCESS_ONCE(root->fs_info->last_trans_log_full_commit) =
+                                                               trans->transid;
                btrfs_abort_transaction(trans, root, ret);
                btrfs_free_logged_extents(log, log_transid);
                mutex_unlock(&log_root_tree->log_mutex);
         */
        ret = write_ctree_super(trans, root->fs_info->tree_root, 1);
        if (ret) {
+               ACCESS_ONCE(root->fs_info->last_trans_log_full_commit) =
+                                                               trans->transid;
                btrfs_abort_transaction(trans, root, ret);
                goto out_wake_log_root;
        }