OSDN Git Service

Btrfs: print error messages when failing to read trees
[uclinux-h8/linux.git] / fs / btrfs / extent_io.c
index dfeb74a..f27bad0 100644 (file)
@@ -76,8 +76,8 @@ void btrfs_leak_debug_check(void)
 
        while (!list_empty(&buffers)) {
                eb = list_entry(buffers.next, struct extent_buffer, leak_list);
-               pr_err("BTRFS: buffer leak start %llu len %lu refs %d\n",
-                      eb->start, eb->len, atomic_read(&eb->refs));
+               pr_err("BTRFS: buffer leak start %llu len %lu refs %d bflags %lu\n",
+                      eb->start, eb->len, atomic_read(&eb->refs), eb->bflags);
                list_del(&eb->leak_list);
                kmem_cache_free(extent_buffer_cache, eb);
        }
@@ -187,7 +187,7 @@ free_state_cache:
        return -ENOMEM;
 }
 
-void extent_io_exit(void)
+void __cold extent_io_exit(void)
 {
        btrfs_leak_debug_check();
 
@@ -2744,20 +2744,21 @@ static int __must_check submit_one_bio(struct bio *bio, int mirror_num,
        return blk_status_to_errno(ret);
 }
 
-static int merge_bio(struct extent_io_tree *tree, struct page *page,
-                    unsigned long offset, size_t size, struct bio *bio,
-                    unsigned long bio_flags)
-{
-       int ret = 0;
-       if (tree->ops)
-               ret = tree->ops->merge_bio_hook(page, offset, size, bio,
-                                               bio_flags);
-       return ret;
-
-}
-
 /*
  * @opf:       bio REQ_OP_* and REQ_* flags as one value
+ * @tree:      tree so we can call our merge_bio hook
+ * @wbc:       optional writeback control for io accounting
+ * @page:      page to add to the bio
+ * @pg_offset: offset of the new bio or to check whether we are adding
+ *              a contiguous page to the previous one
+ * @size:      portion of page that we want to write
+ * @offset:    starting offset in the page
+ * @bdev:      attach newly created bios to this bdev
+ * @bio_ret:   must be valid pointer, newly allocated bio will be stored there
+ * @end_io_func:     end_io callback for new bio
+ * @mirror_num:             desired mirror to read/write
+ * @prev_bio_flags:  flags of previous bio to see if we can merge the current one
+ * @bio_flags: flags of the current bio to see if we can merge them
  */
 static int submit_extent_page(unsigned int opf, struct extent_io_tree *tree,
                              struct writeback_control *wbc,
@@ -2773,21 +2774,27 @@ static int submit_extent_page(unsigned int opf, struct extent_io_tree *tree,
 {
        int ret = 0;
        struct bio *bio;
-       int contig = 0;
-       int old_compressed = prev_bio_flags & EXTENT_BIO_COMPRESSED;
        size_t page_size = min_t(size_t, size, PAGE_SIZE);
        sector_t sector = offset >> 9;
 
-       if (bio_ret && *bio_ret) {
+       ASSERT(bio_ret);
+
+       if (*bio_ret) {
+               bool contig;
+               bool can_merge = true;
+
                bio = *bio_ret;
-               if (old_compressed)
+               if (prev_bio_flags & EXTENT_BIO_COMPRESSED)
                        contig = bio->bi_iter.bi_sector == sector;
                else
                        contig = bio_end_sector(bio) == sector;
 
-               if (prev_bio_flags != bio_flags || !contig ||
+               if (tree->ops && tree->ops->merge_bio_hook(page, offset,
+                                       page_size, bio, bio_flags))
+                       can_merge = false;
+
+               if (prev_bio_flags != bio_flags || !contig || !can_merge ||
                    force_bio_submit ||
-                   merge_bio(tree, page, pg_offset, page_size, bio, bio_flags) ||
                    bio_add_page(bio, page, page_size, pg_offset) < page_size) {
                        ret = submit_one_bio(bio, mirror_num, prev_bio_flags);
                        if (ret < 0) {
@@ -2813,10 +2820,7 @@ static int submit_extent_page(unsigned int opf, struct extent_io_tree *tree,
                wbc_account_io(wbc, page, page_size);
        }
 
-       if (bio_ret)
-               *bio_ret = bio;
-       else
-               ret = submit_one_bio(bio, mirror_num, bio_flags);
+       *bio_ret = bio;
 
        return ret;
 }
@@ -2886,8 +2890,7 @@ static int __do_readpage(struct extent_io_tree *tree,
 {
        struct inode *inode = page->mapping->host;
        u64 start = page_offset(page);
-       u64 page_end = start + PAGE_SIZE - 1;
-       u64 end;
+       const u64 end = start + PAGE_SIZE - 1;
        u64 cur = start;
        u64 extent_offset;
        u64 last_byte = i_size_read(inode);
@@ -2905,7 +2908,6 @@ static int __do_readpage(struct extent_io_tree *tree,
 
        set_page_extent_mapped(page);
 
-       end = page_end;
        if (!PageUptodate(page)) {
                if (cleancache_get_page(page) == 0) {
                        BUG_ON(blocksize != PAGE_SIZE);
@@ -5230,11 +5232,6 @@ void set_extent_buffer_uptodate(struct extent_buffer *eb)
        }
 }
 
-int extent_buffer_uptodate(struct extent_buffer *eb)
-{
-       return test_bit(EXTENT_BUFFER_UPTODATE, &eb->bflags);
-}
-
 int read_extent_buffer_pages(struct extent_io_tree *tree,
                             struct extent_buffer *eb, int wait, int mirror_num)
 {