ipoib: switch to netif_napi_add_weight()
[linux-2.6-microblaze.git] / fs / btrfs / compression.c
index 19bf36d..f4564f3 100644 (file)
@@ -425,7 +425,6 @@ out:
 }
 
 static blk_status_t submit_compressed_bio(struct btrfs_fs_info *fs_info,
-                                         struct compressed_bio *cb,
                                          struct bio *bio, int mirror_num)
 {
        blk_status_t ret;
@@ -604,7 +603,7 @@ blk_status_t btrfs_submit_compressed_write(struct btrfs_inode *inode, u64 start,
                                        goto finish_cb;
                        }
 
-                       ret = submit_compressed_bio(fs_info, cb, bio, 0);
+                       ret = submit_compressed_bio(fs_info, bio, 0);
                        if (ret)
                                goto finish_cb;
                        bio = NULL;
@@ -802,15 +801,13 @@ static noinline int add_ra_bio_pages(struct inode *inode,
  * After the compressed pages are read, we copy the bytes into the
  * bio we were passed and then call the bio end_io calls
  */
-blk_status_t btrfs_submit_compressed_read(struct inode *inode, struct bio *bio,
-                                int mirror_num, unsigned long bio_flags)
+void btrfs_submit_compressed_read(struct inode *inode, struct bio *bio,
+                                 int mirror_num)
 {
        struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb);
        struct extent_map_tree *em_tree;
        struct compressed_bio *cb;
        unsigned int compressed_len;
-       unsigned int nr_pages;
-       unsigned int pg_index;
        struct bio *comp_bio = NULL;
        const u64 disk_bytenr = bio->bi_iter.bi_sector << SECTOR_SHIFT;
        u64 cur_disk_byte = disk_bytenr;
@@ -820,7 +817,8 @@ blk_status_t btrfs_submit_compressed_read(struct inode *inode, struct bio *bio,
        u64 em_start;
        struct extent_map *em;
        blk_status_t ret;
-       int faili = 0;
+       int ret2;
+       int i;
        u8 *sums;
 
        em_tree = &BTRFS_I(inode)->extent_tree;
@@ -855,32 +853,26 @@ blk_status_t btrfs_submit_compressed_read(struct inode *inode, struct bio *bio,
        em_len = em->len;
        em_start = em->start;
 
-       free_extent_map(em);
-       em = NULL;
-
        cb->len = bio->bi_iter.bi_size;
        cb->compressed_len = compressed_len;
-       cb->compress_type = extent_compress_type(bio_flags);
+       cb->compress_type = em->compress_type;
        cb->orig_bio = bio;
 
-       nr_pages = DIV_ROUND_UP(compressed_len, PAGE_SIZE);
-       cb->compressed_pages = kcalloc(nr_pages, sizeof(struct page *),
-                                      GFP_NOFS);
+       free_extent_map(em);
+       em = NULL;
+
+       cb->nr_pages = DIV_ROUND_UP(compressed_len, PAGE_SIZE);
+       cb->compressed_pages = kcalloc(cb->nr_pages, sizeof(struct page *), GFP_NOFS);
        if (!cb->compressed_pages) {
                ret = BLK_STS_RESOURCE;
-               goto fail1;
+               goto fail;
        }
 
-       for (pg_index = 0; pg_index < nr_pages; pg_index++) {
-               cb->compressed_pages[pg_index] = alloc_page(GFP_NOFS);
-               if (!cb->compressed_pages[pg_index]) {
-                       faili = pg_index - 1;
-                       ret = BLK_STS_RESOURCE;
-                       goto fail2;
-               }
+       ret2 = btrfs_alloc_page_array(cb->nr_pages, cb->compressed_pages);
+       if (ret2) {
+               ret = BLK_STS_RESOURCE;
+               goto fail;
        }
-       faili = nr_pages - 1;
-       cb->nr_pages = nr_pages;
 
        add_ra_bio_pages(inode, em_start + em_len, cb);
 
@@ -949,28 +941,29 @@ blk_status_t btrfs_submit_compressed_read(struct inode *inode, struct bio *bio,
                                                  fs_info->sectorsize);
                        sums += fs_info->csum_size * nr_sectors;
 
-                       ret = submit_compressed_bio(fs_info, cb, comp_bio, mirror_num);
+                       ret = submit_compressed_bio(fs_info, comp_bio, mirror_num);
                        if (ret)
                                goto finish_cb;
                        comp_bio = NULL;
                }
        }
-       return BLK_STS_OK;
+       return;
 
-fail2:
-       while (faili >= 0) {
-               __free_page(cb->compressed_pages[faili]);
-               faili--;
+fail:
+       if (cb->compressed_pages) {
+               for (i = 0; i < cb->nr_pages; i++) {
+                       if (cb->compressed_pages[i])
+                               __free_page(cb->compressed_pages[i]);
+               }
        }
 
        kfree(cb->compressed_pages);
-fail1:
        kfree(cb);
 out:
        free_extent_map(em);
        bio->bi_status = ret;
        bio_endio(bio);
-       return ret;
+       return;
 finish_cb:
        if (comp_bio) {
                comp_bio->bi_status = ret;
@@ -978,7 +971,7 @@ finish_cb:
        }
        /* All bytes of @cb is submitted, endio will free @cb */
        if (cur_disk_byte == disk_bytenr + compressed_len)
-               return ret;
+               return;
 
        wait_var_event(cb, refcount_read(&cb->pending_sectors) ==
                           (disk_bytenr + compressed_len - cur_disk_byte) >>
@@ -990,7 +983,6 @@ finish_cb:
        ASSERT(refcount_read(&cb->pending_sectors));
        /* Now we are the only one referring @cb, can finish it safely. */
        finish_compressed_bio_read(cb);
-       return ret;
 }
 
 /*