]> git.dujemihanovic.xyz Git - linux.git/commitdiff
btrfs: use find_first_extent_bit in btrfs_clean_io_failure
authorJosef Bacik <josef@toxicpanda.com>
Fri, 9 Sep 2022 21:53:17 +0000 (17:53 -0400)
committerDavid Sterba <dsterba@suse.com>
Mon, 26 Sep 2022 10:28:02 +0000 (12:28 +0200)
Currently we're using find_first_extent_bit_state to check if our state
contains the given failrec range, however this is more of an internal
extent_io_tree helper, and is technically unsafe to use because we're
accessing the state outside of the extent_io_tree lock.

Instead use the normal helper find_first_extent_bit which returns the
range of the extent state we find in find_first_extent_bit_state and use
that to do our sanity checking.

Signed-off-by: Josef Bacik <josef@toxicpanda.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/extent_io.c

index 1ab14fa7f837507792a65e331a9907197779eae8..f4481c2212ddb9b3edfbac6d2b530a0edb526e75 100644 (file)
@@ -2394,9 +2394,10 @@ int btrfs_clean_io_failure(struct btrfs_inode *inode, u64 start,
        struct btrfs_fs_info *fs_info = inode->root->fs_info;
        struct extent_io_tree *io_tree = &inode->io_tree;
        u64 ino = btrfs_ino(inode);
+       u64 locked_start, locked_end;
        struct io_failure_record *failrec;
-       struct extent_state *state;
        int mirror;
+       int ret;
 
        failrec = get_failrec(inode, start);
        if (IS_ERR(failrec))
@@ -2407,14 +2408,10 @@ int btrfs_clean_io_failure(struct btrfs_inode *inode, u64 start,
        if (sb_rdonly(fs_info->sb))
                goto out;
 
-       spin_lock(&io_tree->lock);
-       state = find_first_extent_bit_state(io_tree,
-                                           failrec->bytenr,
-                                           EXTENT_LOCKED);
-       spin_unlock(&io_tree->lock);
-
-       if (!state || state->start > failrec->bytenr ||
-           state->end < failrec->bytenr + failrec->len - 1)
+       ret = find_first_extent_bit(io_tree, failrec->bytenr, &locked_start,
+                                   &locked_end, EXTENT_LOCKED, NULL);
+       if (ret || locked_start > failrec->bytenr ||
+           locked_end < failrec->bytenr + failrec->len - 1)
                goto out;
 
        mirror = failrec->this_mirror;