btrfs: Remove extent_io_ops::set_bit_hook extent_io callback
authorNikolay Borisov <nborisov@suse.com>
Thu, 1 Nov 2018 12:09:50 +0000 (14:09 +0200)
committerDavid Sterba <dsterba@suse.com>
Mon, 17 Dec 2018 13:51:28 +0000 (14:51 +0100)
This callback is used to properly account delalloc extents for data
inodes (ordinary file inodes and freespace v1 inodes). Those can be
easily identified since they have their extent_io trees ->private_data
member point to the inode. Let's exploit this fact to remove the
needless indirection through extent_io_hooks and directly call the
function. Also give the function a name which reflects its purpose -
btrfs_set_delalloc_extent.

This patch also modified test_find_delalloc so that the extent_io_tree
used for testing doesn't have its ->private_data set which would have
caused a crash in btrfs_set_delalloc_extent due to the btrfs_inode->root
member not being initialised. The old version of the code also didn't
call set_bit_hook since the extent_io ops weren't set for the inode.  No
functional changes.

Reviewed-by: Josef Bacik <josef@toxicpanda.com>
Signed-off-by: Nikolay Borisov <nborisov@suse.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/ctree.h
fs/btrfs/extent_io.c
fs/btrfs/extent_io.h
fs/btrfs/inode.c
fs/btrfs/tests/extent-io-tests.c

index edcbca9cd813c137e967d170aa0546d18858200d..9a0e4e1c59eab8b93e4f2523e69aadb016e21da8 100644 (file)
@@ -3150,6 +3150,8 @@ int btrfs_create_subvol_root(struct btrfs_trans_handle *trans,
                             struct btrfs_root *new_root,
                             struct btrfs_root *parent_root,
                             u64 new_dirid);
+void btrfs_set_delalloc_extent(struct inode *inode, struct extent_state *state,
+                              unsigned *bits);
 int btrfs_merge_bio_hook(struct page *page, unsigned long offset,
                         size_t size, struct bio *bio,
                         unsigned long bio_flags);
index c63334c6b0082d356371e4f7505ee61ee68a1732..1678adae79638845837e99e593e077c8b72a68cf 100644 (file)
@@ -404,13 +404,6 @@ static void merge_state(struct extent_io_tree *tree,
        }
 }
 
-static void set_state_cb(struct extent_io_tree *tree,
-                        struct extent_state *state, unsigned *bits)
-{
-       if (tree->ops && tree->ops->set_bit_hook)
-               tree->ops->set_bit_hook(tree->private_data, state, bits);
-}
-
 static void clear_state_cb(struct extent_io_tree *tree,
                           struct extent_state *state, unsigned *bits)
 {
@@ -809,7 +802,9 @@ static void set_state_bits(struct extent_io_tree *tree,
        unsigned bits_to_set = *bits & ~EXTENT_CTLBITS;
        int ret;
 
-       set_state_cb(tree, state, bits);
+       if (tree->private_data && is_data_inode(tree->private_data))
+               btrfs_set_delalloc_extent(tree->private_data, state, bits);
+
        if ((bits_to_set & EXTENT_DIRTY) && !(state->state & EXTENT_DIRTY)) {
                u64 range = state->end - state->start + 1;
                tree->dirty_bytes += range;
index 3cb84a0fbaabbc37f296973ad8e6988e4dfdc87b..b3235d46b5c3ffc2ae1b4ba9a4875c385a12f2ad 100644 (file)
@@ -106,8 +106,6 @@ struct extent_io_ops {
        /*
         * Optional hooks, called if the pointer is not NULL
         */
-       void (*set_bit_hook)(void *private_data, struct extent_state *state,
-                            unsigned *bits);
        void (*clear_bit_hook)(void *private_data,
                        struct extent_state *state,
                        unsigned *bits);
index 175ef341b8aec6c91724381af7cd08da6d517015..f95733fc970420304ae21498539dc8cd0baa8980 100644 (file)
@@ -1755,15 +1755,12 @@ static void btrfs_del_delalloc_inode(struct btrfs_root *root,
 }
 
 /*
- * extent_io.c set_bit_hook, used to track delayed allocation
- * bytes in this file, and to maintain the list of inodes that
- * have pending delalloc work to be done.
+ * Properly track delayed allocation bytes in the inode and to maintain the
+ * list of inodes that have pending delalloc work to be done.
  */
-static void btrfs_set_bit_hook(void *private_data,
-                              struct extent_state *state, unsigned *bits)
+void btrfs_set_delalloc_extent(struct inode *inode, struct extent_state *state,
+                              unsigned *bits)
 {
-       struct inode *inode = private_data;
-
        struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb);
 
        if ((*bits & EXTENT_DEFRAG) && !(*bits & EXTENT_DELALLOC))
@@ -10512,7 +10509,6 @@ static const struct extent_io_ops btrfs_extent_io_ops = {
        .readpage_io_failed_hook = btrfs_readpage_io_failed_hook,
 
        /* optional callbacks */
-       .set_bit_hook = btrfs_set_bit_hook,
        .clear_bit_hook = btrfs_clear_bit_hook,
        .merge_extent_hook = btrfs_merge_extent_hook,
        .split_extent_hook = btrfs_split_extent_hook,
index 9e0f4a01be14a93311987e25e29fe39ee484c518..ac8b5e35797d29b3c1dfa8f734e3169158383390 100644 (file)
@@ -76,7 +76,7 @@ static int test_find_delalloc(u32 sectorsize)
                return -ENOMEM;
        }
 
-       extent_io_tree_init(&tmp, inode);
+       extent_io_tree_init(&tmp, NULL);
 
        /*
         * First go through and create and mark all of our pages dirty, we pin