|
@@ -3242,6 +3242,16 @@ static int btrfs_readpage_end_io_hook(struct btrfs_io_bio *io_bio,
|
|
|
start, (size_t)(end - start + 1));
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * btrfs_add_delayed_iput - perform a delayed iput on @inode
|
|
|
+ *
|
|
|
+ * @inode: The inode we want to perform iput on
|
|
|
+ *
|
|
|
+ * This function uses the generic vfs_inode::i_count to track whether we should
|
|
|
+ * just decrement it (in case it's > 1) or if this is the last iput then link
|
|
|
+ * the inode to the delayed iput machinery. Delayed iputs are processed at
|
|
|
+ * transaction commit time/superblock commit/cleaner kthread.
|
|
|
+ */
|
|
|
void btrfs_add_delayed_iput(struct inode *inode)
|
|
|
{
|
|
|
struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb);
|
|
@@ -3251,12 +3261,8 @@ void btrfs_add_delayed_iput(struct inode *inode)
|
|
|
return;
|
|
|
|
|
|
spin_lock(&fs_info->delayed_iput_lock);
|
|
|
- if (binode->delayed_iput_count == 0) {
|
|
|
- ASSERT(list_empty(&binode->delayed_iput));
|
|
|
- list_add_tail(&binode->delayed_iput, &fs_info->delayed_iputs);
|
|
|
- } else {
|
|
|
- binode->delayed_iput_count++;
|
|
|
- }
|
|
|
+ ASSERT(list_empty(&binode->delayed_iput));
|
|
|
+ list_add_tail(&binode->delayed_iput, &fs_info->delayed_iputs);
|
|
|
spin_unlock(&fs_info->delayed_iput_lock);
|
|
|
}
|
|
|
|
|
@@ -3269,13 +3275,7 @@ void btrfs_run_delayed_iputs(struct btrfs_fs_info *fs_info)
|
|
|
|
|
|
inode = list_first_entry(&fs_info->delayed_iputs,
|
|
|
struct btrfs_inode, delayed_iput);
|
|
|
- if (inode->delayed_iput_count) {
|
|
|
- inode->delayed_iput_count--;
|
|
|
- list_move_tail(&inode->delayed_iput,
|
|
|
- &fs_info->delayed_iputs);
|
|
|
- } else {
|
|
|
- list_del_init(&inode->delayed_iput);
|
|
|
- }
|
|
|
+ list_del_init(&inode->delayed_iput);
|
|
|
spin_unlock(&fs_info->delayed_iput_lock);
|
|
|
iput(&inode->vfs_inode);
|
|
|
spin_lock(&fs_info->delayed_iput_lock);
|
|
@@ -9333,7 +9333,6 @@ struct inode *btrfs_alloc_inode(struct super_block *sb)
|
|
|
ei->dir_index = 0;
|
|
|
ei->last_unlink_trans = 0;
|
|
|
ei->last_log_commit = 0;
|
|
|
- ei->delayed_iput_count = 0;
|
|
|
|
|
|
spin_lock_init(&ei->lock);
|
|
|
ei->outstanding_extents = 0;
|