struct tree_entry {
        u64 root_objectid;
        u64 objectid;
+       struct inode *inode;
        struct rb_node rb_node;
 };
 
        write_lock(&tree->lock);
        entry->objectid = inode->i_ino;
        entry->root_objectid = root_objectid;
+       entry->inode = inode;
 
        node = tree_insert(&tree->tree, root_objectid,
                           inode->i_ino, &entry->rb_node);
 }
 
 int btrfs_find_first_ordered_inode(struct btrfs_ordered_inode_tree *tree,
-                                      u64 *root_objectid, u64 *objectid)
+                                  u64 *root_objectid, u64 *objectid,
+                                  struct inode **inode)
 {
        struct tree_entry *entry;
        struct rb_node *node;
        }
 
        *root_objectid = entry->root_objectid;
+       *inode = entry->inode;
+       atomic_inc(&entry->inode->i_count);
        *objectid = entry->objectid;
        write_unlock(&tree->lock);
        return 1;
 }
 
 int btrfs_find_del_first_ordered_inode(struct btrfs_ordered_inode_tree *tree,
-                                      u64 *root_objectid, u64 *objectid)
+                                      u64 *root_objectid, u64 *objectid,
+                                      struct inode **inode)
 {
        struct tree_entry *entry;
        struct rb_node *node;
 
        *root_objectid = entry->root_objectid;
        *objectid = entry->objectid;
+       *inode = entry->inode;
+       atomic_inc(&entry->inode->i_count);
        rb_erase(node, &tree->tree);
        write_unlock(&tree->lock);
        kfree(entry);
 
 
 int btrfs_add_ordered_inode(struct inode *inode);
 int btrfs_find_del_first_ordered_inode(struct btrfs_ordered_inode_tree *tree,
-                                      u64 *root_objectid, u64 *objectid);
+                                      u64 *root_objectid, u64 *objectid,
+                                      struct inode **inode);
 int btrfs_find_first_ordered_inode(struct btrfs_ordered_inode_tree *tree,
-                                      u64 *root_objectid, u64 *objectid);
+                                      u64 *root_objectid, u64 *objectid,
+                                      struct inode **inode);
 int btrfs_del_ordered_inode(struct inode *inode);
 #endif
 
        while(1) {
                ret = btrfs_find_first_ordered_inode(
                                &cur_trans->ordered_inode_tree,
-                               &root_objectid, &objectid);
+                               &root_objectid, &objectid, &inode);
                if (!ret)
                        break;
 
                mutex_unlock(&root->fs_info->trans_mutex);
                mutex_unlock(&root->fs_info->fs_mutex);
-               inode = btrfs_ilookup(root->fs_info->sb, objectid,
-                                     root_objectid);
-               if (inode) {
-                       if (S_ISREG(inode->i_mode))
-                               filemap_fdatawrite(inode->i_mapping);
-                       iput(inode);
-               }
+
+               if (S_ISREG(inode->i_mode))
+                       filemap_fdatawrite(inode->i_mapping);
+               iput(inode);
+
                mutex_lock(&root->fs_info->fs_mutex);
                mutex_lock(&root->fs_info->trans_mutex);
        }
                objectid = 0;
                ret = btrfs_find_del_first_ordered_inode(
                                &cur_trans->ordered_inode_tree,
-                               &root_objectid, &objectid);
+                               &root_objectid, &objectid, &inode);
                if (!ret)
                        break;
                mutex_unlock(&root->fs_info->trans_mutex);
                mutex_unlock(&root->fs_info->fs_mutex);
-               inode = btrfs_ilookup(root->fs_info->sb, objectid,
-                                     root_objectid);
-               if (inode) {
-                       if (S_ISREG(inode->i_mode))
-                               filemap_write_and_wait(inode->i_mapping);
-                       atomic_dec(&inode->i_count);
-                       iput(inode);
-               }
+
+               if (S_ISREG(inode->i_mode))
+                       filemap_write_and_wait(inode->i_mapping);
+               atomic_dec(&inode->i_count);
+               iput(inode);
+
                mutex_lock(&root->fs_info->fs_mutex);
                mutex_lock(&root->fs_info->trans_mutex);
        }