Now that allocations that are allowed to sleep can't fail,
 set_extent_bit has no more error conditions and we can assume the
 return value will be 0 and return void to callers.

Signed-off-by: Jeff Mahoney <je...@suse.com>
---
 fs/btrfs/ctree.h     |    4 +-
 fs/btrfs/disk-io.c   |    5 +-
 fs/btrfs/disk-io.h   |    2 -
 fs/btrfs/extent_io.c |   90 ++++++++++++++++++++++++++++-----------------------
 fs/btrfs/extent_io.h |   34 +++++++++++--------
 fs/btrfs/file.c      |    6 ---
 fs/btrfs/inode.c     |   38 +++++----------------
 fs/btrfs/scrub.c     |   11 +-----
 8 files changed, 89 insertions(+), 101 deletions(-)

--- a/fs/btrfs/ctree.h
+++ b/fs/btrfs/ctree.h
@@ -2675,8 +2675,8 @@ int btrfs_truncate_inode_items(struct bt
                               u32 min_type);
 
 int btrfs_start_delalloc_inodes(struct btrfs_root *root, int delay_iput);
-int btrfs_set_extent_delalloc(struct inode *inode, u64 start, u64 end,
-                             struct extent_state **cached_state);
+void btrfs_set_extent_delalloc(struct inode *inode, u64 start, u64 end,
+                              struct extent_state **cached_state);
 int btrfs_writepages(struct address_space *mapping,
                     struct writeback_control *wbc);
 int btrfs_create_subvol_root(struct btrfs_trans_handle *trans,
--- a/fs/btrfs/disk-io.c
+++ b/fs/btrfs/disk-io.c
@@ -2971,11 +2971,10 @@ int btrfs_buffer_uptodate(struct extent_
        return !ret;
 }
 
-int btrfs_set_buffer_uptodate(struct extent_buffer *buf)
+void btrfs_set_buffer_uptodate(struct extent_buffer *buf)
 {
        struct inode *btree_inode = buf->first_page->mapping->host;
-       return set_extent_buffer_uptodate(&BTRFS_I(btree_inode)->io_tree,
-                                         buf);
+       set_extent_buffer_uptodate(&BTRFS_I(btree_inode)->io_tree, buf);
 }
 
 void btrfs_mark_buffer_dirty(struct extent_buffer *buf)
--- a/fs/btrfs/disk-io.h
+++ b/fs/btrfs/disk-io.h
@@ -67,7 +67,7 @@ void __btrfs_btree_balance_dirty(struct
 int btrfs_free_fs_root(struct btrfs_fs_info *fs_info, struct btrfs_root *root);
 void btrfs_mark_buffer_dirty(struct extent_buffer *buf);
 int btrfs_buffer_uptodate(struct extent_buffer *buf, u64 parent_transid);
-int btrfs_set_buffer_uptodate(struct extent_buffer *buf);
+void btrfs_set_buffer_uptodate(struct extent_buffer *buf);
 int btrfs_read_buffer(struct extent_buffer *buf, u64 parent_transid);
 u32 btrfs_csum_data(struct btrfs_root *root, char *data, u32 seed, size_t len);
 void btrfs_csum_final(u32 crc, char *result);
--- a/fs/btrfs/extent_io.c
+++ b/fs/btrfs/extent_io.c
@@ -953,12 +953,24 @@ search_again:
        goto again;
 }
 
-int set_extent_bit(struct extent_io_tree *tree, u64 start, u64 end, int bits,
-                  u64 *failed_start, struct extent_state **cached_state,
-                  gfp_t mask)
+int set_extent_bit_atomic(struct extent_io_tree *tree, u64 start, u64 end,
+                         int bits, u64 *failed_start,
+                         struct extent_state **cached_state, gfp_t mask)
+{
+       WARN_ON(mask & __GFP_WAIT);
+       return __set_extent_bit(tree, start, end, bits, 0, failed_start,
+                               cached_state, mask);
+}
+
+void set_extent_bit(struct extent_io_tree *tree, u64 start, u64 end, int bits,
+                   u64 *failed_start, struct extent_state **cached_state,
+                   gfp_t mask)
 {
-       return __set_extent_bit(tree, start, end, bits, 0,
-                               failed_start, cached_state, mask);
+       int ret;
+       WARN_ON(!(mask & __GFP_WAIT));
+       ret = __set_extent_bit(tree, start, end, bits, 0,
+                              failed_start, cached_state, mask);
+       BUG_ON(ret < 0);
 }
 
 int set_extent_bit_excl(struct extent_io_tree *tree, u64 start, u64 end,
@@ -1155,18 +1167,16 @@ search_again:
 }
 
 /* wrappers around set/clear extent bit */
-int set_extent_dirty(struct extent_io_tree *tree, u64 start, u64 end,
-                    gfp_t mask)
+void set_extent_dirty(struct extent_io_tree *tree, u64 start, u64 end,
+                     gfp_t mask)
 {
-       return set_extent_bit(tree, start, end, EXTENT_DIRTY, NULL,
-                             NULL, mask);
+       set_extent_bit(tree, start, end, EXTENT_DIRTY, NULL, NULL, mask);
 }
 
-int set_extent_bits(struct extent_io_tree *tree, u64 start, u64 end,
-                   int bits, gfp_t mask)
+void set_extent_bits(struct extent_io_tree *tree, u64 start, u64 end,
+                    int bits, gfp_t mask)
 {
-       return set_extent_bit(tree, start, end, bits, NULL,
-                             NULL, mask);
+       set_extent_bit(tree, start, end, bits, NULL, NULL, mask);
 }
 
 void clear_extent_bits(struct extent_io_tree *tree, u64 start, u64 end,
@@ -1182,12 +1192,11 @@ void clear_extent_bits(struct extent_io_
        clear_extent_bit(tree, start, end, bits, 0, 0, NULL);
 }
 
-int set_extent_delalloc(struct extent_io_tree *tree, u64 start, u64 end,
-                       struct extent_state **cached_state, gfp_t mask)
+void set_extent_delalloc(struct extent_io_tree *tree, u64 start, u64 end,
+                        struct extent_state **cached_state, gfp_t mask)
 {
-       return set_extent_bit(tree, start, end,
-                             EXTENT_DELALLOC | EXTENT_UPTODATE,
-                             NULL, cached_state, mask);
+       set_extent_bit(tree, start, end, EXTENT_DELALLOC | EXTENT_UPTODATE,
+                      NULL, cached_state, mask);
 }
 
 void clear_extent_dirty(struct extent_io_tree *tree, u64 start, u64 end)
@@ -1196,18 +1205,24 @@ void clear_extent_dirty(struct extent_io
                         EXTENT_DO_ACCOUNTING, 0, 0, NULL);
 }
 
-int set_extent_new(struct extent_io_tree *tree, u64 start, u64 end,
-                    gfp_t mask)
+void set_extent_new(struct extent_io_tree *tree, u64 start, u64 end,
+                   gfp_t mask)
 {
-       return set_extent_bit(tree, start, end, EXTENT_NEW, NULL,
-                             NULL, mask);
+       set_extent_bit(tree, start, end, EXTENT_NEW, NULL, NULL, mask);
 }
 
-int set_extent_uptodate(struct extent_io_tree *tree, u64 start, u64 end,
-                       struct extent_state **cached_state, gfp_t mask)
+int set_extent_uptodate_atomic(struct extent_io_tree *tree, u64 start, u64 end,
+                              struct extent_state **cached_state, gfp_t mask)
 {
-       return set_extent_bit(tree, start, end, EXTENT_UPTODATE,
-                             NULL, cached_state, mask);
+       return set_extent_bit_atomic(tree, start, end, EXTENT_UPTODATE, NULL,
+                                    cached_state, mask);
+}
+
+void set_extent_uptodate(struct extent_io_tree *tree, u64 start, u64 end,
+                        struct extent_state **cached_state, gfp_t mask)
+{
+       set_extent_bit(tree, start, end, EXTENT_UPTODATE, NULL, cached_state,
+                      mask);
 }
 
 static void clear_extent_uptodate(struct extent_io_tree *tree, u64 start,
@@ -2107,19 +2122,16 @@ static int bio_readpage_error(struct bio
                free_extent_map(em);
 
                /* set the bits in the private failure tree */
-               ret = set_extent_bits(failure_tree, start, end,
-                                       EXTENT_LOCKED | EXTENT_DIRTY, GFP_NOFS);
-               if (ret >= 0)
-                       ret = set_state_private(failure_tree, start,
-                                               (u64)(unsigned long)failrec);
-               /* set the bits in the inode's tree */
-               if (ret >= 0)
-                       ret = set_extent_bits(tree, start, end, EXTENT_DAMAGED,
-                                               GFP_NOFS);
+               set_extent_bits(failure_tree, start, end,
+                               EXTENT_LOCKED | EXTENT_DIRTY, GFP_NOFS);
+               ret = set_state_private(failure_tree, start,
+                                       (u64)(unsigned long)failrec);
                if (ret < 0) {
                        kfree(failrec);
                        return ret;
                }
+               /* set the bits in the inode's tree */
+               set_extent_bits(tree, start, end, EXTENT_DAMAGED, GFP_NOFS);
        } else {
                failrec = (struct io_failure_record *)(unsigned long)private;
                pr_debug("bio_readpage_error: (found) logical=%llu, "
@@ -2375,8 +2387,9 @@ static void end_bio_extent_readpage(stru
                }
 
                if (uptodate) {
-                       set_extent_uptodate(tree, start, end, &cached,
-                                           GFP_ATOMIC);
+                       ret = set_extent_uptodate_atomic(tree, start, end,
+                                                        &cached, GFP_ATOMIC);
+                       BUG_ON(ret < 0);
                }
                ret = unlock_extent_cached_atomic(tree, start, end, &cached);
                BUG_ON(ret < 0);
@@ -3919,10 +3932,9 @@ int set_extent_buffer_uptodate(struct ex
 
        num_pages = num_extent_pages(eb->start, eb->len);
 
-       if (eb_straddles_pages(eb)) {
+       if (eb_straddles_pages(eb))
                set_extent_uptodate(tree, eb->start, eb->start + eb->len - 1,
                                    NULL, GFP_NOFS);
-       }
        for (i = 0; i < num_pages; i++) {
                page = extent_buffer_page(eb, i);
                if ((i == 0 && (eb->start & (PAGE_CACHE_SIZE - 1))) ||
--- a/fs/btrfs/extent_io.h
+++ b/fs/btrfs/extent_io.h
@@ -215,27 +215,35 @@ int __must_check clear_extent_bit_atomic
 void clear_extent_bit(struct extent_io_tree *tree, u64 start, u64 end,
                      int bits, int wake, int delete,
                      struct extent_state **cached);
-int set_extent_bits(struct extent_io_tree *tree, u64 start, u64 end,
-                   int bits, gfp_t mask);
+void set_extent_bits(struct extent_io_tree *tree, u64 start, u64 end,
+                    int bits, gfp_t mask);
 int __must_check set_extent_bit_excl(struct extent_io_tree *tree, u64 start,
                                     u64 end, int bits, int exclusive_bits,
                                     u64 *failed_start,
                                     struct extent_state **cached_state,
                                     gfp_t mask);
-int set_extent_bit(struct extent_io_tree *tree, u64 start, u64 end,
-                  int bits, u64 *failed_start,
-                  struct extent_state **cached_state, gfp_t mask);
-int set_extent_uptodate(struct extent_io_tree *tree, u64 start, u64 end,
-                       struct extent_state **cached_state, gfp_t mask);
-int set_extent_new(struct extent_io_tree *tree, u64 start, u64 end,
-                  gfp_t mask);
-int set_extent_dirty(struct extent_io_tree *tree, u64 start, u64 end,
-                    gfp_t mask);
+int __must_check set_extent_bit_atomic(struct extent_io_tree *tree, u64 start,
+                                      u64 end, int bits, u64 *failed_start,
+                                      struct extent_state **cached_state,
+                                      gfp_t mask);
+void set_extent_bit(struct extent_io_tree *tree, u64 start, u64 end, int bits,
+                   u64 *failed_start, struct extent_state **cached_state,
+                   gfp_t mask);
+int __must_check set_extent_uptodate_atomic(struct extent_io_tree *tree,
+                                           u64 start, u64 end,
+                                           struct extent_state **cached_state,
+                                           gfp_t mask);
+void set_extent_uptodate(struct extent_io_tree *tree, u64 start, u64 end,
+                        struct extent_state **cached_state, gfp_t mask);
+void set_extent_new(struct extent_io_tree *tree, u64 start, u64 end,
+                   gfp_t mask);
+void set_extent_dirty(struct extent_io_tree *tree, u64 start, u64 end,
+                     gfp_t mask);
 void clear_extent_dirty(struct extent_io_tree *tree, u64 start, u64 end);
 int convert_extent_bit(struct extent_io_tree *tree, u64 start, u64 end,
                       int bits, int clear_bits, gfp_t mask);
-int set_extent_delalloc(struct extent_io_tree *tree, u64 start, u64 end,
-                       struct extent_state **cached_state, gfp_t mask);
+void set_extent_delalloc(struct extent_io_tree *tree, u64 start, u64 end,
+                        struct extent_state **cached_state, gfp_t mask);
 int find_first_extent_bit(struct extent_io_tree *tree, u64 start,
                          u64 *start_ret, u64 *end_ret, int bits);
 struct extent_state *find_first_extent_bit_state(struct extent_io_tree *tree,
--- a/fs/btrfs/file.c
+++ b/fs/btrfs/file.c
@@ -390,7 +390,6 @@ int btrfs_dirty_pages(struct btrfs_root
                      loff_t pos, size_t write_bytes,
                      struct extent_state **cached)
 {
-       int err = 0;
        int i;
        u64 num_bytes;
        u64 start_pos;
@@ -403,10 +402,7 @@ int btrfs_dirty_pages(struct btrfs_root
                    root->sectorsize - 1) & ~((u64)root->sectorsize - 1);
 
        end_of_last_block = start_pos + num_bytes - 1;
-       err = btrfs_set_extent_delalloc(inode, start_pos, end_of_last_block,
-                                       cached);
-       if (err)
-               return err;
+       btrfs_set_extent_delalloc(inode, start_pos, end_of_last_block, cached);
 
        for (i = 0; i < num_pages; i++) {
                struct page *p = pages[i];
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -1530,13 +1530,13 @@ static noinline int add_pending_csums(st
        return 0;
 }
 
-int btrfs_set_extent_delalloc(struct inode *inode, u64 start, u64 end,
-                             struct extent_state **cached_state)
+void btrfs_set_extent_delalloc(struct inode *inode, u64 start, u64 end,
+                              struct extent_state **cached_state)
 {
        if ((end & (PAGE_CACHE_SIZE - 1)) == 0)
                WARN_ON(1);
-       return set_extent_delalloc(&BTRFS_I(inode)->io_tree, start, end,
-                                  cached_state, GFP_NOFS);
+       set_extent_delalloc(&BTRFS_I(inode)->io_tree, start, end,
+                           cached_state, GFP_NOFS);
 }
 
 /* see btrfs_writepage_start_hook for details on why this is required */
@@ -3248,13 +3248,7 @@ again:
                          EXTENT_DIRTY | EXTENT_DELALLOC | EXTENT_DO_ACCOUNTING,
                          0, 0, &cached_state);
 
-       ret = btrfs_set_extent_delalloc(inode, page_start, page_end,
-                                       &cached_state);
-       if (ret) {
-               unlock_extent_cached(io_tree, page_start, page_end,
-                                    &cached_state);
-               goto out_unlock;
-       }
+       btrfs_set_extent_delalloc(inode, page_start, page_end, &cached_state);
 
        ret = 0;
        if (offset != PAGE_CACHE_SIZE) {
@@ -4210,7 +4204,7 @@ void btrfs_dirty_inode(struct inode *ino
                trans = btrfs_start_transaction(root, 1);
                if (IS_ERR(trans)) {
                        printk_ratelimited(KERN_ERR "btrfs: fail to "
-                                      "dirty  inode %llu error %ld\n",
+                                      "dirty  inode %llu error %ld (trans)\n",
                                       (unsigned long long)btrfs_ino(inode),
                                       PTR_ERR(trans));
                        return;
@@ -6090,15 +6084,8 @@ static ssize_t btrfs_direct_IO(int rw, s
         */
        if (writing) {
                write_bits = EXTENT_DELALLOC | EXTENT_DO_ACCOUNTING;
-               ret = set_extent_bit(&BTRFS_I(inode)->io_tree, lockstart, 
lockend,
-                                    EXTENT_DELALLOC, NULL, &cached_state,
-                                    GFP_NOFS);
-               if (ret) {
-                       clear_extent_bit(&BTRFS_I(inode)->io_tree, lockstart,
-                                        lockend, EXTENT_LOCKED | write_bits,
-                                        1, 0, &cached_state);
-                       goto out;
-               }
+               set_extent_bit(&BTRFS_I(inode)->io_tree, lockstart, lockend,
+                              EXTENT_DELALLOC, NULL, &cached_state, GFP_NOFS);
        }
 
        free_extent_state(cached_state);
@@ -6340,14 +6327,7 @@ again:
                          EXTENT_DIRTY | EXTENT_DELALLOC | EXTENT_DO_ACCOUNTING,
                          0, 0, &cached_state);
 
-       ret = btrfs_set_extent_delalloc(inode, page_start, page_end,
-                                       &cached_state);
-       if (ret) {
-               unlock_extent_cached(io_tree, page_start, page_end,
-                                    &cached_state);
-               ret = VM_FAULT_SIGBUS;
-               goto out_unlock;
-       }
+       btrfs_set_extent_delalloc(inode, page_start, page_end, &cached_state);
        ret = 0;
 
        /* page is wholly or partially inside EOF */
--- a/fs/btrfs/scrub.c
+++ b/fs/btrfs/scrub.c
@@ -424,15 +424,8 @@ static int scrub_fixup_readpage(u64 inum
                 * will call repair_io_failure for us, we just have to make
                 * sure we read the bad mirror.
                 */
-               ret = set_extent_bits(&BTRFS_I(inode)->io_tree, offset, end,
-                                       EXTENT_DAMAGED, GFP_NOFS);
-               if (ret) {
-                       /* set_extent_bits should give proper error */
-                       WARN_ON(ret > 0);
-                       if (ret > 0)
-                               ret = -EFAULT;
-                       goto out;
-               }
+               set_extent_bits(&BTRFS_I(inode)->io_tree, offset, end,
+                               EXTENT_DAMAGED, GFP_NOFS);
 
                ret = extent_read_full_page(&BTRFS_I(inode)->io_tree, page,
                                                btrfs_get_extent,


--
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