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

Reply via email to