add_root_to_dirty_list(root);
        } else {
                WARN_ON(trans->transid != btrfs_header_generation(parent));
-               btrfs_tree_mod_log_insert_key(parent, parent_slot,
-                                             BTRFS_MOD_LOG_KEY_REPLACE);
+               ret = btrfs_tree_mod_log_insert_key(parent, parent_slot,
+                                                   BTRFS_MOD_LOG_KEY_REPLACE);
+               if (ret) {
+                       btrfs_tree_unlock(cow);
+                       free_extent_buffer(cow);
+                       btrfs_abort_transaction(trans, ret);
+                       return ret;
+               }
                btrfs_set_node_blockptr(parent, parent_slot,
                                        cow->start);
                btrfs_set_node_ptr_generation(parent, parent_slot,