There are 28 callers of unlock_extent_cached that call it with GFP_NOFS and only 1 that calls it with GFP_ATOMIC (the bio_endio callback).
Since unlock_extent_cached is a simple wrapper around clear_extent_bit, we can create a new unlock_extent_cached_atomic to handle the atomic case and let unlock_extent_cached return void. Signed-off-by: Jeff Mahoney <je...@suse.com> --- fs/btrfs/extent_io.c | 19 ++++++++++++++----- fs/btrfs/extent_io.h | 8 ++++++-- 2 files changed, 20 insertions(+), 7 deletions(-) --- a/fs/btrfs/extent_io.c +++ b/fs/btrfs/extent_io.c @@ -1259,11 +1259,18 @@ int try_lock_extent(struct extent_io_tre return 1; } -int unlock_extent_cached(struct extent_io_tree *tree, u64 start, u64 end, - struct extent_state **cached, gfp_t mask) +void unlock_extent_cached(struct extent_io_tree *tree, u64 start, u64 end, + struct extent_state **cached, gfp_t mask) { - return __clear_extent_bit(tree, start, end, EXTENT_LOCKED, 1, 0, - cached, mask); + clear_extent_bit(tree, start, end, EXTENT_LOCKED, 1, 0, cached, mask); +} + +int unlock_extent_cached_atomic(struct extent_io_tree *tree, u64 start, + u64 end, struct extent_state **cached, + gfp_t mask) +{ + return clear_extent_bit_atomic(tree, start, end, EXTENT_LOCKED, 1, 0, + cached, mask); } void unlock_extent(struct extent_io_tree *tree, u64 start, u64 end, gfp_t mask) @@ -2368,7 +2375,9 @@ static void end_bio_extent_readpage(stru set_extent_uptodate(tree, start, end, &cached, GFP_ATOMIC); } - unlock_extent_cached(tree, start, end, &cached, GFP_ATOMIC); + ret = unlock_extent_cached_atomic(tree, start, end, + &cached, GFP_ATOMIC); + BUG_ON(ret < 0); if (whole_page) { if (uptodate) { --- a/fs/btrfs/extent_io.h +++ b/fs/btrfs/extent_io.h @@ -184,8 +184,12 @@ int lock_extent(struct extent_io_tree *t int lock_extent_bits(struct extent_io_tree *tree, u64 start, u64 end, int bits, struct extent_state **cached, gfp_t mask); void unlock_extent(struct extent_io_tree *tree, u64 start, u64 end, gfp_t mask); -int unlock_extent_cached(struct extent_io_tree *tree, u64 start, u64 end, - struct extent_state **cached, gfp_t mask); +int __must_check unlock_extent_cached_atomic(struct extent_io_tree *tree, + u64 start, u64 end, + struct extent_state **cached, + gfp_t mask); +void unlock_extent_cached(struct extent_io_tree *tree, u64 start, u64 end, + struct extent_state **cached, gfp_t mask); int try_lock_extent(struct extent_io_tree *tree, u64 start, u64 end, gfp_t mask); int extent_read_full_page(struct extent_io_tree *tree, struct page *page, -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html