LCOV - code coverage report
Current view: top level - fs/btrfs - compression.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 0 380 0.0 %
Date: 2014-02-18 Functions: 0 17 0.0 %
Branches: 0 178 0.0 %

           Branch data     Line data    Source code
       1                 :            : /*
       2                 :            :  * Copyright (C) 2008 Oracle.  All rights reserved.
       3                 :            :  *
       4                 :            :  * This program is free software; you can redistribute it and/or
       5                 :            :  * modify it under the terms of the GNU General Public
       6                 :            :  * License v2 as published by the Free Software Foundation.
       7                 :            :  *
       8                 :            :  * This program is distributed in the hope that it will be useful,
       9                 :            :  * but WITHOUT ANY WARRANTY; without even the implied warranty of
      10                 :            :  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      11                 :            :  * General Public License for more details.
      12                 :            :  *
      13                 :            :  * You should have received a copy of the GNU General Public
      14                 :            :  * License along with this program; if not, write to the
      15                 :            :  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
      16                 :            :  * Boston, MA 021110-1307, USA.
      17                 :            :  */
      18                 :            : 
      19                 :            : #include <linux/kernel.h>
      20                 :            : #include <linux/bio.h>
      21                 :            : #include <linux/buffer_head.h>
      22                 :            : #include <linux/file.h>
      23                 :            : #include <linux/fs.h>
      24                 :            : #include <linux/pagemap.h>
      25                 :            : #include <linux/highmem.h>
      26                 :            : #include <linux/time.h>
      27                 :            : #include <linux/init.h>
      28                 :            : #include <linux/string.h>
      29                 :            : #include <linux/backing-dev.h>
      30                 :            : #include <linux/mpage.h>
      31                 :            : #include <linux/swap.h>
      32                 :            : #include <linux/writeback.h>
      33                 :            : #include <linux/bit_spinlock.h>
      34                 :            : #include <linux/slab.h>
      35                 :            : #include "ctree.h"
      36                 :            : #include "disk-io.h"
      37                 :            : #include "transaction.h"
      38                 :            : #include "btrfs_inode.h"
      39                 :            : #include "volumes.h"
      40                 :            : #include "ordered-data.h"
      41                 :            : #include "compression.h"
      42                 :            : #include "extent_io.h"
      43                 :            : #include "extent_map.h"
      44                 :            : 
      45                 :            : struct compressed_bio {
      46                 :            :         /* number of bios pending for this compressed extent */
      47                 :            :         atomic_t pending_bios;
      48                 :            : 
      49                 :            :         /* the pages with the compressed data on them */
      50                 :            :         struct page **compressed_pages;
      51                 :            : 
      52                 :            :         /* inode that owns this data */
      53                 :            :         struct inode *inode;
      54                 :            : 
      55                 :            :         /* starting offset in the inode for our pages */
      56                 :            :         u64 start;
      57                 :            : 
      58                 :            :         /* number of bytes in the inode we're working on */
      59                 :            :         unsigned long len;
      60                 :            : 
      61                 :            :         /* number of bytes on disk */
      62                 :            :         unsigned long compressed_len;
      63                 :            : 
      64                 :            :         /* the compression algorithm for this bio */
      65                 :            :         int compress_type;
      66                 :            : 
      67                 :            :         /* number of compressed pages in the array */
      68                 :            :         unsigned long nr_pages;
      69                 :            : 
      70                 :            :         /* IO errors */
      71                 :            :         int errors;
      72                 :            :         int mirror_num;
      73                 :            : 
      74                 :            :         /* for reads, this is the bio we are copying the data into */
      75                 :            :         struct bio *orig_bio;
      76                 :            : 
      77                 :            :         /*
      78                 :            :          * the start of a variable length array of checksums only
      79                 :            :          * used by reads
      80                 :            :          */
      81                 :            :         u32 sums;
      82                 :            : };
      83                 :            : 
      84                 :            : static int btrfs_decompress_biovec(int type, struct page **pages_in,
      85                 :            :                                    u64 disk_start, struct bio_vec *bvec,
      86                 :            :                                    int vcnt, size_t srclen);
      87                 :            : 
      88                 :            : static inline int compressed_bio_size(struct btrfs_root *root,
      89                 :            :                                       unsigned long disk_size)
      90                 :            : {
      91                 :          0 :         u16 csum_size = btrfs_super_csum_size(root->fs_info->super_copy);
      92                 :            : 
      93                 :          0 :         return sizeof(struct compressed_bio) +
      94                 :          0 :                 ((disk_size + root->sectorsize - 1) / root->sectorsize) *
      95                 :            :                 csum_size;
      96                 :            : }
      97                 :            : 
      98                 :          0 : static struct bio *compressed_bio_alloc(struct block_device *bdev,
      99                 :            :                                         u64 first_byte, gfp_t gfp_flags)
     100                 :            : {
     101                 :            :         int nr_vecs;
     102                 :            : 
     103                 :          0 :         nr_vecs = bio_get_nr_vecs(bdev);
     104                 :          0 :         return btrfs_bio_alloc(bdev, first_byte >> 9, nr_vecs, gfp_flags);
     105                 :            : }
     106                 :            : 
     107                 :          0 : static int check_compressed_csum(struct inode *inode,
     108                 :            :                                  struct compressed_bio *cb,
     109                 :            :                                  u64 disk_start)
     110                 :            : {
     111                 :            :         int ret;
     112                 :            :         struct page *page;
     113                 :            :         unsigned long i;
     114                 :            :         char *kaddr;
     115                 :            :         u32 csum;
     116                 :          0 :         u32 *cb_sum = &cb->sums;
     117                 :            : 
     118         [ #  # ]:          0 :         if (BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM)
     119                 :            :                 return 0;
     120                 :            : 
     121         [ #  # ]:          0 :         for (i = 0; i < cb->nr_pages; i++) {
     122                 :          0 :                 page = cb->compressed_pages[i];
     123                 :          0 :                 csum = ~(u32)0;
     124                 :            : 
     125                 :          0 :                 kaddr = kmap_atomic(page);
     126                 :          0 :                 csum = btrfs_csum_data(kaddr, csum, PAGE_CACHE_SIZE);
     127                 :          0 :                 btrfs_csum_final(csum, (char *)&csum);
     128                 :          0 :                 kunmap_atomic(kaddr);
     129                 :            : 
     130         [ #  # ]:          0 :                 if (csum != *cb_sum) {
     131                 :          0 :                         printk(KERN_INFO "btrfs csum failed ino %llu "
     132                 :            :                                "extent %llu csum %u "
     133                 :            :                                "wanted %u mirror %d\n",
     134                 :            :                                btrfs_ino(inode), disk_start, csum, *cb_sum,
     135                 :            :                                cb->mirror_num);
     136                 :            :                         ret = -EIO;
     137                 :          0 :                         goto fail;
     138                 :            :                 }
     139                 :          0 :                 cb_sum++;
     140                 :            : 
     141                 :            :         }
     142                 :            :         ret = 0;
     143                 :            : fail:
     144                 :          0 :         return ret;
     145                 :            : }
     146                 :            : 
     147                 :            : /* when we finish reading compressed pages from the disk, we
     148                 :            :  * decompress them and then run the bio end_io routines on the
     149                 :            :  * decompressed pages (in the inode address space).
     150                 :            :  *
     151                 :            :  * This allows the checksumming and other IO error handling routines
     152                 :            :  * to work normally
     153                 :            :  *
     154                 :            :  * The compressed pages are freed here, and it must be run
     155                 :            :  * in process context
     156                 :            :  */
     157                 :          0 : static void end_compressed_bio_read(struct bio *bio, int err)
     158                 :            : {
     159                 :          0 :         struct compressed_bio *cb = bio->bi_private;
     160                 :            :         struct inode *inode;
     161                 :            :         struct page *page;
     162                 :            :         unsigned long index;
     163                 :            :         int ret;
     164                 :            : 
     165         [ #  # ]:          0 :         if (err)
     166                 :          0 :                 cb->errors = 1;
     167                 :            : 
     168                 :            :         /* if there are more bios still pending for this compressed
     169                 :            :          * extent, just exit
     170                 :            :          */
     171         [ #  # ]:          0 :         if (!atomic_dec_and_test(&cb->pending_bios))
     172                 :            :                 goto out;
     173                 :            : 
     174                 :          0 :         inode = cb->inode;
     175                 :          0 :         ret = check_compressed_csum(inode, cb, (u64)bio->bi_sector << 9);
     176         [ #  # ]:          0 :         if (ret)
     177                 :            :                 goto csum_failed;
     178                 :            : 
     179                 :            :         /* ok, we're the last bio for this extent, lets start
     180                 :            :          * the decompression.
     181                 :            :          */
     182                 :          0 :         ret = btrfs_decompress_biovec(cb->compress_type,
     183                 :            :                                       cb->compressed_pages,
     184                 :            :                                       cb->start,
     185                 :          0 :                                       cb->orig_bio->bi_io_vec,
     186                 :          0 :                                       cb->orig_bio->bi_vcnt,
     187                 :          0 :                                       cb->compressed_len);
     188                 :            : csum_failed:
     189         [ #  # ]:          0 :         if (ret)
     190                 :          0 :                 cb->errors = 1;
     191                 :            : 
     192                 :            :         /* release the compressed pages */
     193                 :            :         index = 0;
     194         [ #  # ]:          0 :         for (index = 0; index < cb->nr_pages; index++) {
     195                 :          0 :                 page = cb->compressed_pages[index];
     196                 :          0 :                 page->mapping = NULL;
     197                 :          0 :                 page_cache_release(page);
     198                 :            :         }
     199                 :            : 
     200                 :            :         /* do io completion on the original bio */
     201         [ #  # ]:          0 :         if (cb->errors) {
     202                 :          0 :                 bio_io_error(cb->orig_bio);
     203                 :            :         } else {
     204                 :            :                 int bio_index = 0;
     205                 :          0 :                 struct bio_vec *bvec = cb->orig_bio->bi_io_vec;
     206                 :            : 
     207                 :            :                 /*
     208                 :            :                  * we have verified the checksum already, set page
     209                 :            :                  * checked so the end_io handlers know about it
     210                 :            :                  */
     211         [ #  # ]:          0 :                 while (bio_index < cb->orig_bio->bi_vcnt) {
     212                 :          0 :                         SetPageChecked(bvec->bv_page);
     213                 :          0 :                         bvec++;
     214                 :          0 :                         bio_index++;
     215                 :            :                 }
     216                 :          0 :                 bio_endio(cb->orig_bio, 0);
     217                 :            :         }
     218                 :            : 
     219                 :            :         /* finally free the cb struct */
     220                 :          0 :         kfree(cb->compressed_pages);
     221                 :          0 :         kfree(cb);
     222                 :            : out:
     223                 :          0 :         bio_put(bio);
     224                 :          0 : }
     225                 :            : 
     226                 :            : /*
     227                 :            :  * Clear the writeback bits on all of the file
     228                 :            :  * pages for a compressed write
     229                 :            :  */
     230                 :          0 : static noinline void end_compressed_writeback(struct inode *inode, u64 start,
     231                 :            :                                               unsigned long ram_size)
     232                 :            : {
     233                 :          0 :         unsigned long index = start >> PAGE_CACHE_SHIFT;
     234                 :          0 :         unsigned long end_index = (start + ram_size - 1) >> PAGE_CACHE_SHIFT;
     235                 :            :         struct page *pages[16];
     236                 :          0 :         unsigned long nr_pages = end_index - index + 1;
     237                 :            :         int i;
     238                 :            :         int ret;
     239                 :            : 
     240         [ #  # ]:          0 :         while (nr_pages > 0) {
     241                 :          0 :                 ret = find_get_pages_contig(inode->i_mapping, index,
     242                 :          0 :                                      min_t(unsigned long,
     243                 :            :                                      nr_pages, ARRAY_SIZE(pages)), pages);
     244         [ #  # ]:          0 :                 if (ret == 0) {
     245                 :          0 :                         nr_pages -= 1;
     246                 :          0 :                         index += 1;
     247                 :          0 :                         continue;
     248                 :            :                 }
     249         [ #  # ]:          0 :                 for (i = 0; i < ret; i++) {
     250                 :          0 :                         end_page_writeback(pages[i]);
     251                 :          0 :                         page_cache_release(pages[i]);
     252                 :            :                 }
     253                 :          0 :                 nr_pages -= ret;
     254                 :          0 :                 index += ret;
     255                 :            :         }
     256                 :            :         /* the inode may be gone now */
     257                 :          0 : }
     258                 :            : 
     259                 :            : /*
     260                 :            :  * do the cleanup once all the compressed pages hit the disk.
     261                 :            :  * This will clear writeback on the file pages and free the compressed
     262                 :            :  * pages.
     263                 :            :  *
     264                 :            :  * This also calls the writeback end hooks for the file pages so that
     265                 :            :  * metadata and checksums can be updated in the file.
     266                 :            :  */
     267                 :          0 : static void end_compressed_bio_write(struct bio *bio, int err)
     268                 :            : {
     269                 :            :         struct extent_io_tree *tree;
     270                 :          0 :         struct compressed_bio *cb = bio->bi_private;
     271                 :            :         struct inode *inode;
     272                 :            :         struct page *page;
     273                 :            :         unsigned long index;
     274                 :            : 
     275         [ #  # ]:          0 :         if (err)
     276                 :          0 :                 cb->errors = 1;
     277                 :            : 
     278                 :            :         /* if there are more bios still pending for this compressed
     279                 :            :          * extent, just exit
     280                 :            :          */
     281         [ #  # ]:          0 :         if (!atomic_dec_and_test(&cb->pending_bios))
     282                 :            :                 goto out;
     283                 :            : 
     284                 :            :         /* ok, we're the last bio for this extent, step one is to
     285                 :            :          * call back into the FS and do all the end_io operations
     286                 :            :          */
     287                 :          0 :         inode = cb->inode;
     288                 :            :         tree = &BTRFS_I(inode)->io_tree;
     289                 :          0 :         cb->compressed_pages[0]->mapping = cb->inode->i_mapping;
     290                 :          0 :         tree->ops->writepage_end_io_hook(cb->compressed_pages[0],
     291                 :            :                                          cb->start,
     292                 :          0 :                                          cb->start + cb->len - 1,
     293                 :            :                                          NULL, 1);
     294                 :          0 :         cb->compressed_pages[0]->mapping = NULL;
     295                 :            : 
     296                 :          0 :         end_compressed_writeback(inode, cb->start, cb->len);
     297                 :            :         /* note, our inode could be gone now */
     298                 :            : 
     299                 :            :         /*
     300                 :            :          * release the compressed pages, these came from alloc_page and
     301                 :            :          * are not attached to the inode at all
     302                 :            :          */
     303                 :            :         index = 0;
     304         [ #  # ]:          0 :         for (index = 0; index < cb->nr_pages; index++) {
     305                 :          0 :                 page = cb->compressed_pages[index];
     306                 :          0 :                 page->mapping = NULL;
     307                 :          0 :                 page_cache_release(page);
     308                 :            :         }
     309                 :            : 
     310                 :            :         /* finally free the cb struct */
     311                 :          0 :         kfree(cb->compressed_pages);
     312                 :          0 :         kfree(cb);
     313                 :            : out:
     314                 :          0 :         bio_put(bio);
     315                 :          0 : }
     316                 :            : 
     317                 :            : /*
     318                 :            :  * worker function to build and submit bios for previously compressed pages.
     319                 :            :  * The corresponding pages in the inode should be marked for writeback
     320                 :            :  * and the compressed pages should have a reference on them for dropping
     321                 :            :  * when the IO is complete.
     322                 :            :  *
     323                 :            :  * This also checksums the file bytes and gets things ready for
     324                 :            :  * the end io hooks.
     325                 :            :  */
     326                 :          0 : int btrfs_submit_compressed_write(struct inode *inode, u64 start,
     327                 :            :                                  unsigned long len, u64 disk_start,
     328                 :            :                                  unsigned long compressed_len,
     329                 :            :                                  struct page **compressed_pages,
     330                 :            :                                  unsigned long nr_pages)
     331                 :            : {
     332                 :            :         struct bio *bio = NULL;
     333                 :          0 :         struct btrfs_root *root = BTRFS_I(inode)->root;
     334                 :            :         struct compressed_bio *cb;
     335                 :            :         unsigned long bytes_left;
     336                 :            :         struct extent_io_tree *io_tree = &BTRFS_I(inode)->io_tree;
     337                 :            :         int pg_index = 0;
     338                 :            :         struct page *page;
     339                 :            :         u64 first_byte = disk_start;
     340                 :            :         struct block_device *bdev;
     341                 :            :         int ret;
     342                 :          0 :         int skip_sum = BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM;
     343                 :            : 
     344         [ #  # ]:          0 :         WARN_ON(start & ((u64)PAGE_CACHE_SIZE - 1));
     345                 :            :         cb = kmalloc(compressed_bio_size(root, compressed_len), GFP_NOFS);
     346         [ #  # ]:          0 :         if (!cb)
     347                 :            :                 return -ENOMEM;
     348                 :          0 :         atomic_set(&cb->pending_bios, 0);
     349                 :          0 :         cb->errors = 0;
     350                 :          0 :         cb->inode = inode;
     351                 :          0 :         cb->start = start;
     352                 :          0 :         cb->len = len;
     353                 :          0 :         cb->mirror_num = 0;
     354                 :          0 :         cb->compressed_pages = compressed_pages;
     355                 :          0 :         cb->compressed_len = compressed_len;
     356                 :          0 :         cb->orig_bio = NULL;
     357                 :          0 :         cb->nr_pages = nr_pages;
     358                 :            : 
     359                 :          0 :         bdev = BTRFS_I(inode)->root->fs_info->fs_devices->latest_bdev;
     360                 :            : 
     361                 :          0 :         bio = compressed_bio_alloc(bdev, first_byte, GFP_NOFS);
     362         [ #  # ]:          0 :         if (!bio) {
     363                 :          0 :                 kfree(cb);
     364                 :          0 :                 return -ENOMEM;
     365                 :            :         }
     366                 :          0 :         bio->bi_private = cb;
     367                 :          0 :         bio->bi_end_io = end_compressed_bio_write;
     368                 :          0 :         atomic_inc(&cb->pending_bios);
     369                 :            : 
     370                 :            :         /* create and submit bios for the compressed pages */
     371                 :            :         bytes_left = compressed_len;
     372         [ #  # ]:          0 :         for (pg_index = 0; pg_index < cb->nr_pages; pg_index++) {
     373                 :          0 :                 page = compressed_pages[pg_index];
     374                 :          0 :                 page->mapping = inode->i_mapping;
     375         [ #  # ]:          0 :                 if (bio->bi_size)
     376                 :          0 :                         ret = io_tree->ops->merge_bio_hook(WRITE, page, 0,
     377                 :            :                                                            PAGE_CACHE_SIZE,
     378                 :            :                                                            bio, 0);
     379                 :            :                 else
     380                 :            :                         ret = 0;
     381                 :            : 
     382                 :          0 :                 page->mapping = NULL;
     383 [ #  # ][ #  # ]:          0 :                 if (ret || bio_add_page(bio, page, PAGE_CACHE_SIZE, 0) <
     384                 :            :                     PAGE_CACHE_SIZE) {
     385                 :          0 :                         bio_get(bio);
     386                 :            : 
     387                 :            :                         /*
     388                 :            :                          * inc the count before we submit the bio so
     389                 :            :                          * we know the end IO handler won't happen before
     390                 :            :                          * we inc the count.  Otherwise, the cb might get
     391                 :            :                          * freed before we're done setting it up
     392                 :            :                          */
     393                 :            :                         atomic_inc(&cb->pending_bios);
     394                 :          0 :                         ret = btrfs_bio_wq_end_io(root->fs_info, bio, 0);
     395         [ #  # ]:          0 :                         BUG_ON(ret); /* -ENOMEM */
     396                 :            : 
     397         [ #  # ]:          0 :                         if (!skip_sum) {
     398                 :          0 :                                 ret = btrfs_csum_one_bio(root, inode, bio,
     399                 :            :                                                          start, 1);
     400         [ #  # ]:          0 :                                 BUG_ON(ret); /* -ENOMEM */
     401                 :            :                         }
     402                 :            : 
     403                 :          0 :                         ret = btrfs_map_bio(root, WRITE, bio, 0, 1);
     404         [ #  # ]:          0 :                         BUG_ON(ret); /* -ENOMEM */
     405                 :            : 
     406                 :          0 :                         bio_put(bio);
     407                 :            : 
     408                 :          0 :                         bio = compressed_bio_alloc(bdev, first_byte, GFP_NOFS);
     409         [ #  # ]:          0 :                         BUG_ON(!bio);
     410                 :          0 :                         bio->bi_private = cb;
     411                 :          0 :                         bio->bi_end_io = end_compressed_bio_write;
     412                 :          0 :                         bio_add_page(bio, page, PAGE_CACHE_SIZE, 0);
     413                 :            :                 }
     414         [ #  # ]:          0 :                 if (bytes_left < PAGE_CACHE_SIZE) {
     415                 :          0 :                         printk("bytes left %lu compress len %lu nr %lu\n",
     416                 :            :                                bytes_left, cb->compressed_len, cb->nr_pages);
     417                 :            :                 }
     418                 :          0 :                 bytes_left -= PAGE_CACHE_SIZE;
     419                 :          0 :                 first_byte += PAGE_CACHE_SIZE;
     420                 :          0 :                 cond_resched();
     421                 :            :         }
     422                 :          0 :         bio_get(bio);
     423                 :            : 
     424                 :          0 :         ret = btrfs_bio_wq_end_io(root->fs_info, bio, 0);
     425         [ #  # ]:          0 :         BUG_ON(ret); /* -ENOMEM */
     426                 :            : 
     427         [ #  # ]:          0 :         if (!skip_sum) {
     428                 :          0 :                 ret = btrfs_csum_one_bio(root, inode, bio, start, 1);
     429         [ #  # ]:          0 :                 BUG_ON(ret); /* -ENOMEM */
     430                 :            :         }
     431                 :            : 
     432                 :          0 :         ret = btrfs_map_bio(root, WRITE, bio, 0, 1);
     433         [ #  # ]:          0 :         BUG_ON(ret); /* -ENOMEM */
     434                 :            : 
     435                 :          0 :         bio_put(bio);
     436                 :          0 :         return 0;
     437                 :            : }
     438                 :            : 
     439                 :          0 : static noinline int add_ra_bio_pages(struct inode *inode,
     440                 :            :                                      u64 compressed_end,
     441                 :            :                                      struct compressed_bio *cb)
     442                 :            : {
     443                 :            :         unsigned long end_index;
     444                 :            :         unsigned long pg_index;
     445                 :            :         u64 last_offset;
     446                 :          0 :         u64 isize = i_size_read(inode);
     447                 :            :         int ret;
     448                 :          0 :         struct page *page;
     449                 :            :         unsigned long nr_pages = 0;
     450                 :            :         struct extent_map *em;
     451                 :          0 :         struct address_space *mapping = inode->i_mapping;
     452                 :            :         struct extent_map_tree *em_tree;
     453                 :            :         struct extent_io_tree *tree;
     454                 :            :         u64 end;
     455                 :            :         int misses = 0;
     456                 :            : 
     457                 :          0 :         page = cb->orig_bio->bi_io_vec[cb->orig_bio->bi_vcnt - 1].bv_page;
     458                 :          0 :         last_offset = (page_offset(page) + PAGE_CACHE_SIZE);
     459                 :          0 :         em_tree = &BTRFS_I(inode)->extent_tree;
     460                 :          0 :         tree = &BTRFS_I(inode)->io_tree;
     461                 :            : 
     462         [ #  # ]:          0 :         if (isize == 0)
     463                 :            :                 return 0;
     464                 :            : 
     465                 :          0 :         end_index = (i_size_read(inode) - 1) >> PAGE_CACHE_SHIFT;
     466                 :            : 
     467         [ #  # ]:          0 :         while (last_offset < compressed_end) {
     468                 :          0 :                 pg_index = last_offset >> PAGE_CACHE_SHIFT;
     469                 :            : 
     470         [ #  # ]:          0 :                 if (pg_index > end_index)
     471                 :            :                         break;
     472                 :            : 
     473                 :            :                 rcu_read_lock();
     474                 :          0 :                 page = radix_tree_lookup(&mapping->page_tree, pg_index);
     475                 :            :                 rcu_read_unlock();
     476         [ #  # ]:          0 :                 if (page) {
     477                 :          0 :                         misses++;
     478         [ #  # ]:          0 :                         if (misses > 4)
     479                 :            :                                 break;
     480                 :            :                         goto next;
     481                 :            :                 }
     482                 :            : 
     483                 :          0 :                 page = __page_cache_alloc(mapping_gfp_mask(mapping) &
     484                 :            :                                                                 ~__GFP_FS);
     485         [ #  # ]:          0 :                 if (!page)
     486                 :            :                         break;
     487                 :            : 
     488         [ #  # ]:          0 :                 if (add_to_page_cache_lru(page, mapping, pg_index,
     489                 :            :                                                                 GFP_NOFS)) {
     490                 :          0 :                         page_cache_release(page);
     491                 :            :                         goto next;
     492                 :            :                 }
     493                 :            : 
     494                 :          0 :                 end = last_offset + PAGE_CACHE_SIZE - 1;
     495                 :            :                 /*
     496                 :            :                  * at this point, we have a locked page in the page cache
     497                 :            :                  * for these bytes in the file.  But, we have to make
     498                 :            :                  * sure they map to this compressed extent on disk.
     499                 :            :                  */
     500                 :          0 :                 set_page_extent_mapped(page);
     501                 :          0 :                 lock_extent(tree, last_offset, end);
     502                 :          0 :                 read_lock(&em_tree->lock);
     503                 :          0 :                 em = lookup_extent_mapping(em_tree, last_offset,
     504                 :            :                                            PAGE_CACHE_SIZE);
     505                 :            :                 read_unlock(&em_tree->lock);
     506                 :            : 
     507 [ #  # ][ #  # ]:          0 :                 if (!em || last_offset < em->start ||
                 [ #  # ]
     508         [ #  # ]:          0 :                     (last_offset + PAGE_CACHE_SIZE > extent_map_end(em)) ||
     509                 :          0 :                     (em->block_start >> 9) != cb->orig_bio->bi_sector) {
     510                 :          0 :                         free_extent_map(em);
     511                 :          0 :                         unlock_extent(tree, last_offset, end);
     512                 :          0 :                         unlock_page(page);
     513                 :          0 :                         page_cache_release(page);
     514                 :            :                         break;
     515                 :            :                 }
     516                 :          0 :                 free_extent_map(em);
     517                 :            : 
     518         [ #  # ]:          0 :                 if (page->index == end_index) {
     519                 :            :                         char *userpage;
     520                 :          0 :                         size_t zero_offset = isize & (PAGE_CACHE_SIZE - 1);
     521                 :            : 
     522         [ #  # ]:          0 :                         if (zero_offset) {
     523                 :            :                                 int zeros;
     524                 :          0 :                                 zeros = PAGE_CACHE_SIZE - zero_offset;
     525                 :          0 :                                 userpage = kmap_atomic(page);
     526         [ #  # ]:          0 :                                 memset(userpage + zero_offset, 0, zeros);
     527                 :          0 :                                 flush_dcache_page(page);
     528                 :          0 :                                 kunmap_atomic(userpage);
     529                 :            :                         }
     530                 :            :                 }
     531                 :            : 
     532                 :          0 :                 ret = bio_add_page(cb->orig_bio, page,
     533                 :            :                                    PAGE_CACHE_SIZE, 0);
     534                 :            : 
     535         [ #  # ]:          0 :                 if (ret == PAGE_CACHE_SIZE) {
     536                 :            :                         nr_pages++;
     537                 :          0 :                         page_cache_release(page);
     538                 :            :                 } else {
     539                 :          0 :                         unlock_extent(tree, last_offset, end);
     540                 :          0 :                         unlock_page(page);
     541                 :          0 :                         page_cache_release(page);
     542                 :            :                         break;
     543                 :            :                 }
     544                 :            : next:
     545                 :          0 :                 last_offset += PAGE_CACHE_SIZE;
     546                 :            :         }
     547                 :            :         return 0;
     548                 :            : }
     549                 :            : 
     550                 :            : /*
     551                 :            :  * for a compressed read, the bio we get passed has all the inode pages
     552                 :            :  * in it.  We don't actually do IO on those pages but allocate new ones
     553                 :            :  * to hold the compressed pages on disk.
     554                 :            :  *
     555                 :            :  * bio->bi_sector points to the compressed extent on disk
     556                 :            :  * bio->bi_io_vec points to all of the inode pages
     557                 :            :  * bio->bi_vcnt is a count of pages
     558                 :            :  *
     559                 :            :  * After the compressed pages are read, we copy the bytes into the
     560                 :            :  * bio we were passed and then call the bio end_io calls
     561                 :            :  */
     562                 :          0 : int btrfs_submit_compressed_read(struct inode *inode, struct bio *bio,
     563                 :            :                                  int mirror_num, unsigned long bio_flags)
     564                 :            : {
     565                 :            :         struct extent_io_tree *tree;
     566                 :            :         struct extent_map_tree *em_tree;
     567                 :            :         struct compressed_bio *cb;
     568                 :          0 :         struct btrfs_root *root = BTRFS_I(inode)->root;
     569                 :          0 :         unsigned long uncompressed_len = bio->bi_vcnt * PAGE_CACHE_SIZE;
     570                 :            :         unsigned long compressed_len;
     571                 :            :         unsigned long nr_pages;
     572                 :            :         unsigned long pg_index;
     573                 :            :         struct page *page;
     574                 :            :         struct block_device *bdev;
     575                 :            :         struct bio *comp_bio;
     576                 :          0 :         u64 cur_disk_byte = (u64)bio->bi_sector << 9;
     577                 :            :         u64 em_len;
     578                 :            :         u64 em_start;
     579                 :            :         struct extent_map *em;
     580                 :            :         int ret = -ENOMEM;
     581                 :            :         int faili = 0;
     582                 :            :         u32 *sums;
     583                 :            : 
     584                 :            :         tree = &BTRFS_I(inode)->io_tree;
     585                 :          0 :         em_tree = &BTRFS_I(inode)->extent_tree;
     586                 :            : 
     587                 :            :         /* we need the actual starting offset of this extent in the file */
     588                 :          0 :         read_lock(&em_tree->lock);
     589                 :          0 :         em = lookup_extent_mapping(em_tree,
     590                 :          0 :                                    page_offset(bio->bi_io_vec->bv_page),
     591                 :            :                                    PAGE_CACHE_SIZE);
     592                 :            :         read_unlock(&em_tree->lock);
     593         [ #  # ]:          0 :         if (!em)
     594                 :            :                 return -EIO;
     595                 :            : 
     596                 :          0 :         compressed_len = em->block_len;
     597                 :            :         cb = kmalloc(compressed_bio_size(root, compressed_len), GFP_NOFS);
     598         [ #  # ]:          0 :         if (!cb)
     599                 :            :                 goto out;
     600                 :            : 
     601                 :          0 :         atomic_set(&cb->pending_bios, 0);
     602                 :          0 :         cb->errors = 0;
     603                 :          0 :         cb->inode = inode;
     604                 :          0 :         cb->mirror_num = mirror_num;
     605                 :          0 :         sums = &cb->sums;
     606                 :            : 
     607                 :          0 :         cb->start = em->orig_start;
     608                 :          0 :         em_len = em->len;
     609                 :          0 :         em_start = em->start;
     610                 :            : 
     611                 :          0 :         free_extent_map(em);
     612                 :            :         em = NULL;
     613                 :            : 
     614                 :          0 :         cb->len = uncompressed_len;
     615                 :          0 :         cb->compressed_len = compressed_len;
     616                 :          0 :         cb->compress_type = extent_compress_type(bio_flags);
     617                 :          0 :         cb->orig_bio = bio;
     618                 :            : 
     619                 :          0 :         nr_pages = (compressed_len + PAGE_CACHE_SIZE - 1) /
     620                 :            :                                  PAGE_CACHE_SIZE;
     621                 :          0 :         cb->compressed_pages = kzalloc(sizeof(struct page *) * nr_pages,
     622                 :            :                                        GFP_NOFS);
     623         [ #  # ]:          0 :         if (!cb->compressed_pages)
     624                 :            :                 goto fail1;
     625                 :            : 
     626                 :          0 :         bdev = BTRFS_I(inode)->root->fs_info->fs_devices->latest_bdev;
     627                 :            : 
     628         [ #  # ]:          0 :         for (pg_index = 0; pg_index < nr_pages; pg_index++) {
     629                 :          0 :                 cb->compressed_pages[pg_index] = alloc_page(GFP_NOFS |
     630                 :            :                                                               __GFP_HIGHMEM);
     631         [ #  # ]:          0 :                 if (!cb->compressed_pages[pg_index]) {
     632                 :          0 :                         faili = pg_index - 1;
     633                 :            :                         ret = -ENOMEM;
     634                 :          0 :                         goto fail2;
     635                 :            :                 }
     636                 :            :         }
     637                 :          0 :         faili = nr_pages - 1;
     638                 :          0 :         cb->nr_pages = nr_pages;
     639                 :            : 
     640                 :            :         /* In the parent-locked case, we only locked the range we are
     641                 :            :          * interested in.  In all other cases, we can opportunistically
     642                 :            :          * cache decompressed data that goes beyond the requested range. */
     643         [ #  # ]:          0 :         if (!(bio_flags & EXTENT_BIO_PARENT_LOCKED))
     644                 :          0 :                 add_ra_bio_pages(inode, em_start + em_len, cb);
     645                 :            : 
     646                 :            :         /* include any pages we added in add_ra-bio_pages */
     647                 :          0 :         uncompressed_len = bio->bi_vcnt * PAGE_CACHE_SIZE;
     648                 :          0 :         cb->len = uncompressed_len;
     649                 :            : 
     650                 :          0 :         comp_bio = compressed_bio_alloc(bdev, cur_disk_byte, GFP_NOFS);
     651         [ #  # ]:          0 :         if (!comp_bio)
     652                 :            :                 goto fail2;
     653                 :          0 :         comp_bio->bi_private = cb;
     654                 :          0 :         comp_bio->bi_end_io = end_compressed_bio_read;
     655                 :          0 :         atomic_inc(&cb->pending_bios);
     656                 :            : 
     657         [ #  # ]:          0 :         for (pg_index = 0; pg_index < nr_pages; pg_index++) {
     658                 :          0 :                 page = cb->compressed_pages[pg_index];
     659                 :          0 :                 page->mapping = inode->i_mapping;
     660                 :          0 :                 page->index = em_start >> PAGE_CACHE_SHIFT;
     661                 :            : 
     662         [ #  # ]:          0 :                 if (comp_bio->bi_size)
     663                 :          0 :                         ret = tree->ops->merge_bio_hook(READ, page, 0,
     664                 :            :                                                         PAGE_CACHE_SIZE,
     665                 :            :                                                         comp_bio, 0);
     666                 :            :                 else
     667                 :            :                         ret = 0;
     668                 :            : 
     669                 :          0 :                 page->mapping = NULL;
     670 [ #  # ][ #  # ]:          0 :                 if (ret || bio_add_page(comp_bio, page, PAGE_CACHE_SIZE, 0) <
     671                 :            :                     PAGE_CACHE_SIZE) {
     672                 :          0 :                         bio_get(comp_bio);
     673                 :            : 
     674                 :          0 :                         ret = btrfs_bio_wq_end_io(root->fs_info, comp_bio, 0);
     675         [ #  # ]:          0 :                         BUG_ON(ret); /* -ENOMEM */
     676                 :            : 
     677                 :            :                         /*
     678                 :            :                          * inc the count before we submit the bio so
     679                 :            :                          * we know the end IO handler won't happen before
     680                 :            :                          * we inc the count.  Otherwise, the cb might get
     681                 :            :                          * freed before we're done setting it up
     682                 :            :                          */
     683                 :            :                         atomic_inc(&cb->pending_bios);
     684                 :            : 
     685         [ #  # ]:          0 :                         if (!(BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM)) {
     686                 :          0 :                                 ret = btrfs_lookup_bio_sums(root, inode,
     687                 :            :                                                         comp_bio, sums);
     688         [ #  # ]:          0 :                                 BUG_ON(ret); /* -ENOMEM */
     689                 :            :                         }
     690                 :          0 :                         sums += (comp_bio->bi_size + root->sectorsize - 1) /
     691                 :            :                                 root->sectorsize;
     692                 :            : 
     693                 :          0 :                         ret = btrfs_map_bio(root, READ, comp_bio,
     694                 :            :                                             mirror_num, 0);
     695         [ #  # ]:          0 :                         if (ret)
     696                 :          0 :                                 bio_endio(comp_bio, ret);
     697                 :            : 
     698                 :          0 :                         bio_put(comp_bio);
     699                 :            : 
     700                 :          0 :                         comp_bio = compressed_bio_alloc(bdev, cur_disk_byte,
     701                 :            :                                                         GFP_NOFS);
     702         [ #  # ]:          0 :                         BUG_ON(!comp_bio);
     703                 :          0 :                         comp_bio->bi_private = cb;
     704                 :          0 :                         comp_bio->bi_end_io = end_compressed_bio_read;
     705                 :            : 
     706                 :          0 :                         bio_add_page(comp_bio, page, PAGE_CACHE_SIZE, 0);
     707                 :            :                 }
     708                 :          0 :                 cur_disk_byte += PAGE_CACHE_SIZE;
     709                 :            :         }
     710                 :          0 :         bio_get(comp_bio);
     711                 :            : 
     712                 :          0 :         ret = btrfs_bio_wq_end_io(root->fs_info, comp_bio, 0);
     713         [ #  # ]:          0 :         BUG_ON(ret); /* -ENOMEM */
     714                 :            : 
     715         [ #  # ]:          0 :         if (!(BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM)) {
     716                 :          0 :                 ret = btrfs_lookup_bio_sums(root, inode, comp_bio, sums);
     717         [ #  # ]:          0 :                 BUG_ON(ret); /* -ENOMEM */
     718                 :            :         }
     719                 :            : 
     720                 :          0 :         ret = btrfs_map_bio(root, READ, comp_bio, mirror_num, 0);
     721         [ #  # ]:          0 :         if (ret)
     722                 :          0 :                 bio_endio(comp_bio, ret);
     723                 :            : 
     724                 :          0 :         bio_put(comp_bio);
     725                 :          0 :         return 0;
     726                 :            : 
     727                 :            : fail2:
     728         [ #  # ]:          0 :         while (faili >= 0) {
     729                 :          0 :                 __free_page(cb->compressed_pages[faili]);
     730                 :          0 :                 faili--;
     731                 :            :         }
     732                 :            : 
     733                 :          0 :         kfree(cb->compressed_pages);
     734                 :            : fail1:
     735                 :          0 :         kfree(cb);
     736                 :            : out:
     737                 :          0 :         free_extent_map(em);
     738                 :          0 :         return ret;
     739                 :            : }
     740                 :            : 
     741                 :            : static struct list_head comp_idle_workspace[BTRFS_COMPRESS_TYPES];
     742                 :            : static spinlock_t comp_workspace_lock[BTRFS_COMPRESS_TYPES];
     743                 :            : static int comp_num_workspace[BTRFS_COMPRESS_TYPES];
     744                 :            : static atomic_t comp_alloc_workspace[BTRFS_COMPRESS_TYPES];
     745                 :            : static wait_queue_head_t comp_workspace_wait[BTRFS_COMPRESS_TYPES];
     746                 :            : 
     747                 :            : static struct btrfs_compress_op *btrfs_compress_op[] = {
     748                 :            :         &btrfs_zlib_compress,
     749                 :            :         &btrfs_lzo_compress,
     750                 :            : };
     751                 :            : 
     752                 :          0 : void __init btrfs_init_compress(void)
     753                 :            : {
     754                 :            :         int i;
     755                 :            : 
     756         [ #  # ]:          0 :         for (i = 0; i < BTRFS_COMPRESS_TYPES; i++) {
     757                 :          0 :                 INIT_LIST_HEAD(&comp_idle_workspace[i]);
     758                 :          0 :                 spin_lock_init(&comp_workspace_lock[i]);
     759                 :          0 :                 atomic_set(&comp_alloc_workspace[i], 0);
     760                 :          0 :                 init_waitqueue_head(&comp_workspace_wait[i]);
     761                 :            :         }
     762                 :          0 : }
     763                 :            : 
     764                 :            : /*
     765                 :            :  * this finds an available workspace or allocates a new one
     766                 :            :  * ERR_PTR is returned if things go bad.
     767                 :            :  */
     768                 :          0 : static struct list_head *find_workspace(int type)
     769                 :            : {
     770                 :            :         struct list_head *workspace;
     771                 :          0 :         int cpus = num_online_cpus();
     772                 :          0 :         int idx = type - 1;
     773                 :            : 
     774                 :          0 :         struct list_head *idle_workspace        = &comp_idle_workspace[idx];
     775                 :          0 :         spinlock_t *workspace_lock              = &comp_workspace_lock[idx];
     776                 :          0 :         atomic_t *alloc_workspace               = &comp_alloc_workspace[idx];
     777                 :          0 :         wait_queue_head_t *workspace_wait       = &comp_workspace_wait[idx];
     778                 :            :         int *num_workspace                      = &comp_num_workspace[idx];
     779                 :            : again:
     780                 :            :         spin_lock(workspace_lock);
     781         [ #  # ]:          0 :         if (!list_empty(idle_workspace)) {
     782                 :            :                 workspace = idle_workspace->next;
     783                 :            :                 list_del(workspace);
     784                 :          0 :                 (*num_workspace)--;
     785                 :            :                 spin_unlock(workspace_lock);
     786                 :          0 :                 return workspace;
     787                 :            : 
     788                 :            :         }
     789         [ #  # ]:          0 :         if (atomic_read(alloc_workspace) > cpus) {
     790                 :          0 :                 DEFINE_WAIT(wait);
     791                 :            : 
     792                 :            :                 spin_unlock(workspace_lock);
     793                 :          0 :                 prepare_to_wait(workspace_wait, &wait, TASK_UNINTERRUPTIBLE);
     794 [ #  # ][ #  # ]:          0 :                 if (atomic_read(alloc_workspace) > cpus && !*num_workspace)
     795                 :          0 :                         schedule();
     796                 :          0 :                 finish_wait(workspace_wait, &wait);
     797                 :            :                 goto again;
     798                 :            :         }
     799                 :            :         atomic_inc(alloc_workspace);
     800                 :            :         spin_unlock(workspace_lock);
     801                 :            : 
     802                 :          0 :         workspace = btrfs_compress_op[idx]->alloc_workspace();
     803         [ #  # ]:          0 :         if (IS_ERR(workspace)) {
     804                 :            :                 atomic_dec(alloc_workspace);
     805                 :          0 :                 wake_up(workspace_wait);
     806                 :            :         }
     807                 :          0 :         return workspace;
     808                 :            : }
     809                 :            : 
     810                 :            : /*
     811                 :            :  * put a workspace struct back on the list or free it if we have enough
     812                 :            :  * idle ones sitting around
     813                 :            :  */
     814                 :          0 : static void free_workspace(int type, struct list_head *workspace)
     815                 :            : {
     816                 :          0 :         int idx = type - 1;
     817                 :          0 :         struct list_head *idle_workspace        = &comp_idle_workspace[idx];
     818                 :          0 :         spinlock_t *workspace_lock              = &comp_workspace_lock[idx];
     819                 :          0 :         atomic_t *alloc_workspace               = &comp_alloc_workspace[idx];
     820                 :          0 :         wait_queue_head_t *workspace_wait       = &comp_workspace_wait[idx];
     821                 :            :         int *num_workspace                      = &comp_num_workspace[idx];
     822                 :            : 
     823                 :            :         spin_lock(workspace_lock);
     824         [ #  # ]:          0 :         if (*num_workspace < num_online_cpus()) {
     825                 :            :                 list_add_tail(workspace, idle_workspace);
     826                 :          0 :                 (*num_workspace)++;
     827                 :            :                 spin_unlock(workspace_lock);
     828                 :            :                 goto wake;
     829                 :            :         }
     830                 :            :         spin_unlock(workspace_lock);
     831                 :            : 
     832                 :          0 :         btrfs_compress_op[idx]->free_workspace(workspace);
     833                 :            :         atomic_dec(alloc_workspace);
     834                 :            : wake:
     835                 :          0 :         smp_mb();
     836         [ #  # ]:          0 :         if (waitqueue_active(workspace_wait))
     837                 :          0 :                 wake_up(workspace_wait);
     838                 :          0 : }
     839                 :            : 
     840                 :            : /*
     841                 :            :  * cleanup function for module exit
     842                 :            :  */
     843                 :          0 : static void free_workspaces(void)
     844                 :            : {
     845                 :            :         struct list_head *workspace;
     846                 :            :         int i;
     847                 :            : 
     848         [ #  # ]:          0 :         for (i = 0; i < BTRFS_COMPRESS_TYPES; i++) {
     849         [ #  # ]:          0 :                 while (!list_empty(&comp_idle_workspace[i])) {
     850                 :          0 :                         workspace = comp_idle_workspace[i].next;
     851                 :            :                         list_del(workspace);
     852                 :          0 :                         btrfs_compress_op[i]->free_workspace(workspace);
     853                 :          0 :                         atomic_dec(&comp_alloc_workspace[i]);
     854                 :            :                 }
     855                 :            :         }
     856                 :          0 : }
     857                 :            : 
     858                 :            : /*
     859                 :            :  * given an address space and start/len, compress the bytes.
     860                 :            :  *
     861                 :            :  * pages are allocated to hold the compressed result and stored
     862                 :            :  * in 'pages'
     863                 :            :  *
     864                 :            :  * out_pages is used to return the number of pages allocated.  There
     865                 :            :  * may be pages allocated even if we return an error
     866                 :            :  *
     867                 :            :  * total_in is used to return the number of bytes actually read.  It
     868                 :            :  * may be smaller then len if we had to exit early because we
     869                 :            :  * ran out of room in the pages array or because we cross the
     870                 :            :  * max_out threshold.
     871                 :            :  *
     872                 :            :  * total_out is used to return the total number of compressed bytes
     873                 :            :  *
     874                 :            :  * max_out tells us the max number of bytes that we're allowed to
     875                 :            :  * stuff into pages
     876                 :            :  */
     877                 :          0 : int btrfs_compress_pages(int type, struct address_space *mapping,
     878                 :            :                          u64 start, unsigned long len,
     879                 :            :                          struct page **pages,
     880                 :            :                          unsigned long nr_dest_pages,
     881                 :            :                          unsigned long *out_pages,
     882                 :            :                          unsigned long *total_in,
     883                 :            :                          unsigned long *total_out,
     884                 :            :                          unsigned long max_out)
     885                 :            : {
     886                 :            :         struct list_head *workspace;
     887                 :            :         int ret;
     888                 :            : 
     889                 :          0 :         workspace = find_workspace(type);
     890         [ #  # ]:          0 :         if (IS_ERR(workspace))
     891                 :            :                 return -1;
     892                 :            : 
     893                 :          0 :         ret = btrfs_compress_op[type-1]->compress_pages(workspace, mapping,
     894                 :            :                                                       start, len, pages,
     895                 :            :                                                       nr_dest_pages, out_pages,
     896                 :            :                                                       total_in, total_out,
     897                 :            :                                                       max_out);
     898                 :          0 :         free_workspace(type, workspace);
     899                 :          0 :         return ret;
     900                 :            : }
     901                 :            : 
     902                 :            : /*
     903                 :            :  * pages_in is an array of pages with compressed data.
     904                 :            :  *
     905                 :            :  * disk_start is the starting logical offset of this array in the file
     906                 :            :  *
     907                 :            :  * bvec is a bio_vec of pages from the file that we want to decompress into
     908                 :            :  *
     909                 :            :  * vcnt is the count of pages in the biovec
     910                 :            :  *
     911                 :            :  * srclen is the number of bytes in pages_in
     912                 :            :  *
     913                 :            :  * The basic idea is that we have a bio that was created by readpages.
     914                 :            :  * The pages in the bio are for the uncompressed data, and they may not
     915                 :            :  * be contiguous.  They all correspond to the range of bytes covered by
     916                 :            :  * the compressed extent.
     917                 :            :  */
     918                 :          0 : static int btrfs_decompress_biovec(int type, struct page **pages_in,
     919                 :            :                                    u64 disk_start, struct bio_vec *bvec,
     920                 :            :                                    int vcnt, size_t srclen)
     921                 :            : {
     922                 :            :         struct list_head *workspace;
     923                 :            :         int ret;
     924                 :            : 
     925                 :          0 :         workspace = find_workspace(type);
     926         [ #  # ]:          0 :         if (IS_ERR(workspace))
     927                 :            :                 return -ENOMEM;
     928                 :            : 
     929                 :          0 :         ret = btrfs_compress_op[type-1]->decompress_biovec(workspace, pages_in,
     930                 :            :                                                          disk_start,
     931                 :            :                                                          bvec, vcnt, srclen);
     932                 :          0 :         free_workspace(type, workspace);
     933                 :          0 :         return ret;
     934                 :            : }
     935                 :            : 
     936                 :            : /*
     937                 :            :  * a less complex decompression routine.  Our compressed data fits in a
     938                 :            :  * single page, and we want to read a single page out of it.
     939                 :            :  * start_byte tells us the offset into the compressed data we're interested in
     940                 :            :  */
     941                 :          0 : int btrfs_decompress(int type, unsigned char *data_in, struct page *dest_page,
     942                 :            :                      unsigned long start_byte, size_t srclen, size_t destlen)
     943                 :            : {
     944                 :            :         struct list_head *workspace;
     945                 :            :         int ret;
     946                 :            : 
     947                 :          0 :         workspace = find_workspace(type);
     948         [ #  # ]:          0 :         if (IS_ERR(workspace))
     949                 :            :                 return -ENOMEM;
     950                 :            : 
     951                 :          0 :         ret = btrfs_compress_op[type-1]->decompress(workspace, data_in,
     952                 :            :                                                   dest_page, start_byte,
     953                 :            :                                                   srclen, destlen);
     954                 :            : 
     955                 :          0 :         free_workspace(type, workspace);
     956                 :          0 :         return ret;
     957                 :            : }
     958                 :            : 
     959                 :          0 : void btrfs_exit_compress(void)
     960                 :            : {
     961                 :          0 :         free_workspaces();
     962                 :          0 : }
     963                 :            : 
     964                 :            : /*
     965                 :            :  * Copy uncompressed data from working buffer to pages.
     966                 :            :  *
     967                 :            :  * buf_start is the byte offset we're of the start of our workspace buffer.
     968                 :            :  *
     969                 :            :  * total_out is the last byte of the buffer
     970                 :            :  */
     971                 :          0 : int btrfs_decompress_buf2page(char *buf, unsigned long buf_start,
     972                 :            :                               unsigned long total_out, u64 disk_start,
     973                 :            :                               struct bio_vec *bvec, int vcnt,
     974                 :            :                               unsigned long *pg_index,
     975                 :            :                               unsigned long *pg_offset)
     976                 :            : {
     977                 :            :         unsigned long buf_offset;
     978                 :            :         unsigned long current_buf_start;
     979                 :            :         unsigned long start_byte;
     980                 :          0 :         unsigned long working_bytes = total_out - buf_start;
     981                 :            :         unsigned long bytes;
     982                 :            :         char *kaddr;
     983                 :          0 :         struct page *page_out = bvec[*pg_index].bv_page;
     984                 :            : 
     985                 :            :         /*
     986                 :            :          * start byte is the first byte of the page we're currently
     987                 :            :          * copying into relative to the start of the compressed data.
     988                 :            :          */
     989                 :          0 :         start_byte = page_offset(page_out) - disk_start;
     990                 :            : 
     991                 :            :         /* we haven't yet hit data corresponding to this page */
     992         [ #  # ]:          0 :         if (total_out <= start_byte)
     993                 :            :                 return 1;
     994                 :            : 
     995                 :            :         /*
     996                 :            :          * the start of the data we care about is offset into
     997                 :            :          * the middle of our working buffer
     998                 :            :          */
     999         [ #  # ]:          0 :         if (total_out > start_byte && buf_start < start_byte) {
    1000                 :          0 :                 buf_offset = start_byte - buf_start;
    1001                 :          0 :                 working_bytes -= buf_offset;
    1002                 :            :         } else {
    1003                 :            :                 buf_offset = 0;
    1004                 :            :         }
    1005                 :            :         current_buf_start = buf_start;
    1006                 :            : 
    1007                 :            :         /* copy bytes from the working buffer into the pages */
    1008         [ #  # ]:          0 :         while (working_bytes > 0) {
    1009                 :          0 :                 bytes = min(PAGE_CACHE_SIZE - *pg_offset,
    1010                 :            :                             PAGE_CACHE_SIZE - buf_offset);
    1011                 :          0 :                 bytes = min(bytes, working_bytes);
    1012                 :          0 :                 kaddr = kmap_atomic(page_out);
    1013                 :          0 :                 memcpy(kaddr + *pg_offset, buf + buf_offset, bytes);
    1014                 :          0 :                 kunmap_atomic(kaddr);
    1015                 :          0 :                 flush_dcache_page(page_out);
    1016                 :            : 
    1017                 :          0 :                 *pg_offset += bytes;
    1018                 :          0 :                 buf_offset += bytes;
    1019                 :          0 :                 working_bytes -= bytes;
    1020                 :          0 :                 current_buf_start += bytes;
    1021                 :            : 
    1022                 :            :                 /* check if we need to pick another page */
    1023         [ #  # ]:          0 :                 if (*pg_offset == PAGE_CACHE_SIZE) {
    1024                 :          0 :                         (*pg_index)++;
    1025         [ #  # ]:          0 :                         if (*pg_index >= vcnt)
    1026                 :            :                                 return 0;
    1027                 :            : 
    1028                 :          0 :                         page_out = bvec[*pg_index].bv_page;
    1029                 :          0 :                         *pg_offset = 0;
    1030                 :          0 :                         start_byte = page_offset(page_out) - disk_start;
    1031                 :            : 
    1032                 :            :                         /*
    1033                 :            :                          * make sure our new page is covered by this
    1034                 :            :                          * working buffer
    1035                 :            :                          */
    1036         [ #  # ]:          0 :                         if (total_out <= start_byte)
    1037                 :            :                                 return 1;
    1038                 :            : 
    1039                 :            :                         /*
    1040                 :            :                          * the next page in the biovec might not be adjacent
    1041                 :            :                          * to the last page, but it might still be found
    1042                 :            :                          * inside this working buffer. bump our offset pointer
    1043                 :            :                          */
    1044         [ #  # ]:          0 :                         if (total_out > start_byte &&
    1045                 :          0 :                             current_buf_start < start_byte) {
    1046                 :          0 :                                 buf_offset = start_byte - buf_start;
    1047                 :          0 :                                 working_bytes = total_out - start_byte;
    1048                 :            :                                 current_buf_start = buf_start + buf_offset;
    1049                 :            :                         }
    1050                 :            :                 }
    1051                 :            :         }
    1052                 :            : 
    1053                 :            :         return 1;
    1054                 :            : }

Generated by: LCOV version 1.9