~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/fs/btrfs/compression.c

Version: ~ [ linux-5.8-rc4 ] ~ [ linux-5.7.7 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.50 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.131 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.187 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.229 ] ~ [ linux-4.8.17 ] ~ [ linux-4.7.10 ] ~ [ linux-4.6.7 ] ~ [ linux-4.5.7 ] ~ [ linux-4.4.229 ] ~ [ linux-4.3.6 ] ~ [ linux-4.2.8 ] ~ [ linux-4.1.52 ] ~ [ linux-4.0.9 ] ~ [ linux-3.19.8 ] ~ [ linux-3.18.140 ] ~ [ linux-3.17.8 ] ~ [ linux-3.16.85 ] ~ [ linux-3.15.10 ] ~ [ linux-3.14.79 ] ~ [ linux-3.13.11 ] ~ [ linux-3.12.74 ] ~ [ linux-3.11.10 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.5 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  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_bio(int type, struct page **pages_in,
 85                                    u64 disk_start, struct bio *orig_bio,
 86                                    size_t srclen);
 87 
 88 static inline int compressed_bio_size(struct btrfs_fs_info *fs_info,
 89                                       unsigned long disk_size)
 90 {
 91         u16 csum_size = btrfs_super_csum_size(fs_info->super_copy);
 92 
 93         return sizeof(struct compressed_bio) +
 94                 (DIV_ROUND_UP(disk_size, fs_info->sectorsize)) * csum_size;
 95 }
 96 
 97 static struct bio *compressed_bio_alloc(struct block_device *bdev,
 98                                         u64 first_byte, gfp_t gfp_flags)
 99 {
100         return btrfs_bio_alloc(bdev, first_byte >> 9, BIO_MAX_PAGES, gfp_flags);
101 }
102 
103 static int check_compressed_csum(struct btrfs_inode *inode,
104                                  struct compressed_bio *cb,
105                                  u64 disk_start)
106 {
107         int ret;
108         struct page *page;
109         unsigned long i;
110         char *kaddr;
111         u32 csum;
112         u32 *cb_sum = &cb->sums;
113 
114         if (inode->flags & BTRFS_INODE_NODATASUM)
115                 return 0;
116 
117         for (i = 0; i < cb->nr_pages; i++) {
118                 page = cb->compressed_pages[i];
119                 csum = ~(u32)0;
120 
121                 kaddr = kmap_atomic(page);
122                 csum = btrfs_csum_data(kaddr, csum, PAGE_SIZE);
123                 btrfs_csum_final(csum, (u8 *)&csum);
124                 kunmap_atomic(kaddr);
125 
126                 if (csum != *cb_sum) {
127                         btrfs_print_data_csum_error(inode, disk_start, csum,
128                                         *cb_sum, cb->mirror_num);
129                         ret = -EIO;
130                         goto fail;
131                 }
132                 cb_sum++;
133 
134         }
135         ret = 0;
136 fail:
137         return ret;
138 }
139 
140 /* when we finish reading compressed pages from the disk, we
141  * decompress them and then run the bio end_io routines on the
142  * decompressed pages (in the inode address space).
143  *
144  * This allows the checksumming and other IO error handling routines
145  * to work normally
146  *
147  * The compressed pages are freed here, and it must be run
148  * in process context
149  */
150 static void end_compressed_bio_read(struct bio *bio)
151 {
152         struct compressed_bio *cb = bio->bi_private;
153         struct inode *inode;
154         struct page *page;
155         unsigned long index;
156         int ret;
157 
158         if (bio->bi_error)
159                 cb->errors = 1;
160 
161         /* if there are more bios still pending for this compressed
162          * extent, just exit
163          */
164         if (!atomic_dec_and_test(&cb->pending_bios))
165                 goto out;
166 
167         inode = cb->inode;
168         ret = check_compressed_csum(BTRFS_I(inode), cb,
169                                     (u64)bio->bi_iter.bi_sector << 9);
170         if (ret)
171                 goto csum_failed;
172 
173         /* ok, we're the last bio for this extent, lets start
174          * the decompression.
175          */
176         ret = btrfs_decompress_bio(cb->compress_type,
177                                       cb->compressed_pages,
178                                       cb->start,
179                                       cb->orig_bio,
180                                       cb->compressed_len);
181 csum_failed:
182         if (ret)
183                 cb->errors = 1;
184 
185         /* release the compressed pages */
186         index = 0;
187         for (index = 0; index < cb->nr_pages; index++) {
188                 page = cb->compressed_pages[index];
189                 page->mapping = NULL;
190                 put_page(page);
191         }
192 
193         /* do io completion on the original bio */
194         if (cb->errors) {
195                 bio_io_error(cb->orig_bio);
196         } else {
197                 int i;
198                 struct bio_vec *bvec;
199 
200                 /*
201                  * we have verified the checksum already, set page
202                  * checked so the end_io handlers know about it
203                  */
204                 bio_for_each_segment_all(bvec, cb->orig_bio, i)
205                         SetPageChecked(bvec->bv_page);
206 
207                 bio_endio(cb->orig_bio);
208         }
209 
210         /* finally free the cb struct */
211         kfree(cb->compressed_pages);
212         kfree(cb);
213 out:
214         bio_put(bio);
215 }
216 
217 /*
218  * Clear the writeback bits on all of the file
219  * pages for a compressed write
220  */
221 static noinline void end_compressed_writeback(struct inode *inode,
222                                               const struct compressed_bio *cb)
223 {
224         unsigned long index = cb->start >> PAGE_SHIFT;
225         unsigned long end_index = (cb->start + cb->len - 1) >> PAGE_SHIFT;
226         struct page *pages[16];
227         unsigned long nr_pages = end_index - index + 1;
228         int i;
229         int ret;
230 
231         if (cb->errors)
232                 mapping_set_error(inode->i_mapping, -EIO);
233 
234         while (nr_pages > 0) {
235                 ret = find_get_pages_contig(inode->i_mapping, index,
236                                      min_t(unsigned long,
237                                      nr_pages, ARRAY_SIZE(pages)), pages);
238                 if (ret == 0) {
239                         nr_pages -= 1;
240                         index += 1;
241                         continue;
242                 }
243                 for (i = 0; i < ret; i++) {
244                         if (cb->errors)
245                                 SetPageError(pages[i]);
246                         end_page_writeback(pages[i]);
247                         put_page(pages[i]);
248                 }
249                 nr_pages -= ret;
250                 index += ret;
251         }
252         /* the inode may be gone now */
253 }
254 
255 /*
256  * do the cleanup once all the compressed pages hit the disk.
257  * This will clear writeback on the file pages and free the compressed
258  * pages.
259  *
260  * This also calls the writeback end hooks for the file pages so that
261  * metadata and checksums can be updated in the file.
262  */
263 static void end_compressed_bio_write(struct bio *bio)
264 {
265         struct extent_io_tree *tree;
266         struct compressed_bio *cb = bio->bi_private;
267         struct inode *inode;
268         struct page *page;
269         unsigned long index;
270 
271         if (bio->bi_error)
272                 cb->errors = 1;
273 
274         /* if there are more bios still pending for this compressed
275          * extent, just exit
276          */
277         if (!atomic_dec_and_test(&cb->pending_bios))
278                 goto out;
279 
280         /* ok, we're the last bio for this extent, step one is to
281          * call back into the FS and do all the end_io operations
282          */
283         inode = cb->inode;
284         tree = &BTRFS_I(inode)->io_tree;
285         cb->compressed_pages[0]->mapping = cb->inode->i_mapping;
286         tree->ops->writepage_end_io_hook(cb->compressed_pages[0],
287                                          cb->start,
288                                          cb->start + cb->len - 1,
289                                          NULL,
290                                          bio->bi_error ? 0 : 1);
291         cb->compressed_pages[0]->mapping = NULL;
292 
293         end_compressed_writeback(inode, cb);
294         /* note, our inode could be gone now */
295 
296         /*
297          * release the compressed pages, these came from alloc_page and
298          * are not attached to the inode at all
299          */
300         index = 0;
301         for (index = 0; index < cb->nr_pages; index++) {
302                 page = cb->compressed_pages[index];
303                 page->mapping = NULL;
304                 put_page(page);
305         }
306 
307         /* finally free the cb struct */
308         kfree(cb->compressed_pages);
309         kfree(cb);
310 out:
311         bio_put(bio);
312 }
313 
314 /*
315  * worker function to build and submit bios for previously compressed pages.
316  * The corresponding pages in the inode should be marked for writeback
317  * and the compressed pages should have a reference on them for dropping
318  * when the IO is complete.
319  *
320  * This also checksums the file bytes and gets things ready for
321  * the end io hooks.
322  */
323 int btrfs_submit_compressed_write(struct inode *inode, u64 start,
324                                  unsigned long len, u64 disk_start,
325                                  unsigned long compressed_len,
326                                  struct page **compressed_pages,
327                                  unsigned long nr_pages)
328 {
329         struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb);
330         struct bio *bio = NULL;
331         struct compressed_bio *cb;
332         unsigned long bytes_left;
333         struct extent_io_tree *io_tree = &BTRFS_I(inode)->io_tree;
334         int pg_index = 0;
335         struct page *page;
336         u64 first_byte = disk_start;
337         struct block_device *bdev;
338         int ret;
339         int skip_sum = BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM;
340 
341         WARN_ON(start & ((u64)PAGE_SIZE - 1));
342         cb = kmalloc(compressed_bio_size(fs_info, compressed_len), GFP_NOFS);
343         if (!cb)
344                 return -ENOMEM;
345         atomic_set(&cb->pending_bios, 0);
346         cb->errors = 0;
347         cb->inode = inode;
348         cb->start = start;
349         cb->len = len;
350         cb->mirror_num = 0;
351         cb->compressed_pages = compressed_pages;
352         cb->compressed_len = compressed_len;
353         cb->orig_bio = NULL;
354         cb->nr_pages = nr_pages;
355 
356         bdev = fs_info->fs_devices->latest_bdev;
357 
358         bio = compressed_bio_alloc(bdev, first_byte, GFP_NOFS);
359         if (!bio) {
360                 kfree(cb);
361                 return -ENOMEM;
362         }
363         bio_set_op_attrs(bio, REQ_OP_WRITE, 0);
364         bio->bi_private = cb;
365         bio->bi_end_io = end_compressed_bio_write;
366         atomic_inc(&cb->pending_bios);
367 
368         /* create and submit bios for the compressed pages */
369         bytes_left = compressed_len;
370         for (pg_index = 0; pg_index < cb->nr_pages; pg_index++) {
371                 page = compressed_pages[pg_index];
372                 page->mapping = inode->i_mapping;
373                 if (bio->bi_iter.bi_size)
374                         ret = io_tree->ops->merge_bio_hook(page, 0,
375                                                            PAGE_SIZE,
376                                                            bio, 0);
377                 else
378                         ret = 0;
379 
380                 page->mapping = NULL;
381                 if (ret || bio_add_page(bio, page, PAGE_SIZE, 0) <
382                     PAGE_SIZE) {
383                         bio_get(bio);
384 
385                         /*
386                          * inc the count before we submit the bio so
387                          * we know the end IO handler won't happen before
388                          * we inc the count.  Otherwise, the cb might get
389                          * freed before we're done setting it up
390                          */
391                         atomic_inc(&cb->pending_bios);
392                         ret = btrfs_bio_wq_end_io(fs_info, bio,
393                                                   BTRFS_WQ_ENDIO_DATA);
394                         BUG_ON(ret); /* -ENOMEM */
395 
396                         if (!skip_sum) {
397                                 ret = btrfs_csum_one_bio(inode, bio, start, 1);
398                                 BUG_ON(ret); /* -ENOMEM */
399                         }
400 
401                         ret = btrfs_map_bio(fs_info, bio, 0, 1);
402                         if (ret) {
403                                 bio->bi_error = ret;
404                                 bio_endio(bio);
405                         }
406 
407                         bio_put(bio);
408 
409                         bio = compressed_bio_alloc(bdev, first_byte, GFP_NOFS);
410                         BUG_ON(!bio);
411                         bio_set_op_attrs(bio, REQ_OP_WRITE, 0);
412                         bio->bi_private = cb;
413                         bio->bi_end_io = end_compressed_bio_write;
414                         bio_add_page(bio, page, PAGE_SIZE, 0);
415                 }
416                 if (bytes_left < PAGE_SIZE) {
417                         btrfs_info(fs_info,
418                                         "bytes left %lu compress len %lu nr %lu",
419                                bytes_left, cb->compressed_len, cb->nr_pages);
420                 }
421                 bytes_left -= PAGE_SIZE;
422                 first_byte += PAGE_SIZE;
423                 cond_resched();
424         }
425         bio_get(bio);
426 
427         ret = btrfs_bio_wq_end_io(fs_info, bio, BTRFS_WQ_ENDIO_DATA);
428         BUG_ON(ret); /* -ENOMEM */
429 
430         if (!skip_sum) {
431                 ret = btrfs_csum_one_bio(inode, bio, start, 1);
432                 BUG_ON(ret); /* -ENOMEM */
433         }
434 
435         ret = btrfs_map_bio(fs_info, bio, 0, 1);
436         if (ret) {
437                 bio->bi_error = ret;
438                 bio_endio(bio);
439         }
440 
441         bio_put(bio);
442         return 0;
443 }
444 
445 static u64 bio_end_offset(struct bio *bio)
446 {
447         struct bio_vec *last = &bio->bi_io_vec[bio->bi_vcnt - 1];
448 
449         return page_offset(last->bv_page) + last->bv_len + last->bv_offset;
450 }
451 
452 static noinline int add_ra_bio_pages(struct inode *inode,
453                                      u64 compressed_end,
454                                      struct compressed_bio *cb)
455 {
456         unsigned long end_index;
457         unsigned long pg_index;
458         u64 last_offset;
459         u64 isize = i_size_read(inode);
460         int ret;
461         struct page *page;
462         unsigned long nr_pages = 0;
463         struct extent_map *em;
464         struct address_space *mapping = inode->i_mapping;
465         struct extent_map_tree *em_tree;
466         struct extent_io_tree *tree;
467         u64 end;
468         int misses = 0;
469 
470         last_offset = bio_end_offset(cb->orig_bio);
471         em_tree = &BTRFS_I(inode)->extent_tree;
472         tree = &BTRFS_I(inode)->io_tree;
473 
474         if (isize == 0)
475                 return 0;
476 
477         end_index = (i_size_read(inode) - 1) >> PAGE_SHIFT;
478 
479         while (last_offset < compressed_end) {
480                 pg_index = last_offset >> PAGE_SHIFT;
481 
482                 if (pg_index > end_index)
483                         break;
484 
485                 rcu_read_lock();
486                 page = radix_tree_lookup(&mapping->page_tree, pg_index);
487                 rcu_read_unlock();
488                 if (page && !radix_tree_exceptional_entry(page)) {
489                         misses++;
490                         if (misses > 4)
491                                 break;
492                         goto next;
493                 }
494 
495                 page = __page_cache_alloc(mapping_gfp_constraint(mapping,
496                                                                  ~__GFP_FS));
497                 if (!page)
498                         break;
499 
500                 if (add_to_page_cache_lru(page, mapping, pg_index, GFP_NOFS)) {
501                         put_page(page);
502                         goto next;
503                 }
504 
505                 end = last_offset + PAGE_SIZE - 1;
506                 /*
507                  * at this point, we have a locked page in the page cache
508                  * for these bytes in the file.  But, we have to make
509                  * sure they map to this compressed extent on disk.
510                  */
511                 set_page_extent_mapped(page);
512                 lock_extent(tree, last_offset, end);
513                 read_lock(&em_tree->lock);
514                 em = lookup_extent_mapping(em_tree, last_offset,
515                                            PAGE_SIZE);
516                 read_unlock(&em_tree->lock);
517 
518                 if (!em || last_offset < em->start ||
519                     (last_offset + PAGE_SIZE > extent_map_end(em)) ||
520                     (em->block_start >> 9) != cb->orig_bio->bi_iter.bi_sector) {
521                         free_extent_map(em);
522                         unlock_extent(tree, last_offset, end);
523                         unlock_page(page);
524                         put_page(page);
525                         break;
526                 }
527                 free_extent_map(em);
528 
529                 if (page->index == end_index) {
530                         char *userpage;
531                         size_t zero_offset = isize & (PAGE_SIZE - 1);
532 
533                         if (zero_offset) {
534                                 int zeros;
535                                 zeros = PAGE_SIZE - zero_offset;
536                                 userpage = kmap_atomic(page);
537                                 memset(userpage + zero_offset, 0, zeros);
538                                 flush_dcache_page(page);
539                                 kunmap_atomic(userpage);
540                         }
541                 }
542 
543                 ret = bio_add_page(cb->orig_bio, page,
544                                    PAGE_SIZE, 0);
545 
546                 if (ret == PAGE_SIZE) {
547                         nr_pages++;
548                         put_page(page);
549                 } else {
550                         unlock_extent(tree, last_offset, end);
551                         unlock_page(page);
552                         put_page(page);
553                         break;
554                 }
555 next:
556                 last_offset += PAGE_SIZE;
557         }
558         return 0;
559 }
560 
561 /*
562  * for a compressed read, the bio we get passed has all the inode pages
563  * in it.  We don't actually do IO on those pages but allocate new ones
564  * to hold the compressed pages on disk.
565  *
566  * bio->bi_iter.bi_sector points to the compressed extent on disk
567  * bio->bi_io_vec points to all of the inode pages
568  *
569  * After the compressed pages are read, we copy the bytes into the
570  * bio we were passed and then call the bio end_io calls
571  */
572 int btrfs_submit_compressed_read(struct inode *inode, struct bio *bio,
573                                  int mirror_num, unsigned long bio_flags)
574 {
575         struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb);
576         struct extent_io_tree *tree;
577         struct extent_map_tree *em_tree;
578         struct compressed_bio *cb;
579         unsigned long compressed_len;
580         unsigned long nr_pages;
581         unsigned long pg_index;
582         struct page *page;
583         struct block_device *bdev;
584         struct bio *comp_bio;
585         u64 cur_disk_byte = (u64)bio->bi_iter.bi_sector << 9;
586         u64 em_len;
587         u64 em_start;
588         struct extent_map *em;
589         int ret = -ENOMEM;
590         int faili = 0;
591         u32 *sums;
592 
593         tree = &BTRFS_I(inode)->io_tree;
594         em_tree = &BTRFS_I(inode)->extent_tree;
595 
596         /* we need the actual starting offset of this extent in the file */
597         read_lock(&em_tree->lock);
598         em = lookup_extent_mapping(em_tree,
599                                    page_offset(bio->bi_io_vec->bv_page),
600                                    PAGE_SIZE);
601         read_unlock(&em_tree->lock);
602         if (!em)
603                 return -EIO;
604 
605         compressed_len = em->block_len;
606         cb = kmalloc(compressed_bio_size(fs_info, compressed_len), GFP_NOFS);
607         if (!cb)
608                 goto out;
609 
610         atomic_set(&cb->pending_bios, 0);
611         cb->errors = 0;
612         cb->inode = inode;
613         cb->mirror_num = mirror_num;
614         sums = &cb->sums;
615 
616         cb->start = em->orig_start;
617         em_len = em->len;
618         em_start = em->start;
619 
620         free_extent_map(em);
621         em = NULL;
622 
623         cb->len = bio->bi_iter.bi_size;
624         cb->compressed_len = compressed_len;
625         cb->compress_type = extent_compress_type(bio_flags);
626         cb->orig_bio = bio;
627 
628         nr_pages = DIV_ROUND_UP(compressed_len, PAGE_SIZE);
629         cb->compressed_pages = kcalloc(nr_pages, sizeof(struct page *),
630                                        GFP_NOFS);
631         if (!cb->compressed_pages)
632                 goto fail1;
633 
634         bdev = fs_info->fs_devices->latest_bdev;
635 
636         for (pg_index = 0; pg_index < nr_pages; pg_index++) {
637                 cb->compressed_pages[pg_index] = alloc_page(GFP_NOFS |
638                                                               __GFP_HIGHMEM);
639                 if (!cb->compressed_pages[pg_index]) {
640                         faili = pg_index - 1;
641                         ret = -ENOMEM;
642                         goto fail2;
643                 }
644         }
645         faili = nr_pages - 1;
646         cb->nr_pages = nr_pages;
647 
648         add_ra_bio_pages(inode, em_start + em_len, cb);
649 
650         /* include any pages we added in add_ra-bio_pages */
651         cb->len = bio->bi_iter.bi_size;
652 
653         comp_bio = compressed_bio_alloc(bdev, cur_disk_byte, GFP_NOFS);
654         if (!comp_bio)
655                 goto fail2;
656         bio_set_op_attrs (comp_bio, REQ_OP_READ, 0);
657         comp_bio->bi_private = cb;
658         comp_bio->bi_end_io = end_compressed_bio_read;
659         atomic_inc(&cb->pending_bios);
660 
661         for (pg_index = 0; pg_index < nr_pages; pg_index++) {
662                 page = cb->compressed_pages[pg_index];
663                 page->mapping = inode->i_mapping;
664                 page->index = em_start >> PAGE_SHIFT;
665 
666                 if (comp_bio->bi_iter.bi_size)
667                         ret = tree->ops->merge_bio_hook(page, 0,
668                                                         PAGE_SIZE,
669                                                         comp_bio, 0);
670                 else
671                         ret = 0;
672 
673                 page->mapping = NULL;
674                 if (ret || bio_add_page(comp_bio, page, PAGE_SIZE, 0) <
675                     PAGE_SIZE) {
676                         bio_get(comp_bio);
677 
678                         ret = btrfs_bio_wq_end_io(fs_info, comp_bio,
679                                                   BTRFS_WQ_ENDIO_DATA);
680                         BUG_ON(ret); /* -ENOMEM */
681 
682                         /*
683                          * inc the count before we submit the bio so
684                          * we know the end IO handler won't happen before
685                          * we inc the count.  Otherwise, the cb might get
686                          * freed before we're done setting it up
687                          */
688                         atomic_inc(&cb->pending_bios);
689 
690                         if (!(BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM)) {
691                                 ret = btrfs_lookup_bio_sums(inode, comp_bio,
692                                                             sums);
693                                 BUG_ON(ret); /* -ENOMEM */
694                         }
695                         sums += DIV_ROUND_UP(comp_bio->bi_iter.bi_size,
696                                              fs_info->sectorsize);
697 
698                         ret = btrfs_map_bio(fs_info, comp_bio, mirror_num, 0);
699                         if (ret) {
700                                 comp_bio->bi_error = ret;
701                                 bio_endio(comp_bio);
702                         }
703 
704                         bio_put(comp_bio);
705 
706                         comp_bio = compressed_bio_alloc(bdev, cur_disk_byte,
707                                                         GFP_NOFS);
708                         BUG_ON(!comp_bio);
709                         bio_set_op_attrs(comp_bio, REQ_OP_READ, 0);
710                         comp_bio->bi_private = cb;
711                         comp_bio->bi_end_io = end_compressed_bio_read;
712 
713                         bio_add_page(comp_bio, page, PAGE_SIZE, 0);
714                 }
715                 cur_disk_byte += PAGE_SIZE;
716         }
717         bio_get(comp_bio);
718 
719         ret = btrfs_bio_wq_end_io(fs_info, comp_bio, BTRFS_WQ_ENDIO_DATA);
720         BUG_ON(ret); /* -ENOMEM */
721 
722         if (!(BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM)) {
723                 ret = btrfs_lookup_bio_sums(inode, comp_bio, sums);
724                 BUG_ON(ret); /* -ENOMEM */
725         }
726 
727         ret = btrfs_map_bio(fs_info, comp_bio, mirror_num, 0);
728         if (ret) {
729                 comp_bio->bi_error = ret;
730                 bio_endio(comp_bio);
731         }
732 
733         bio_put(comp_bio);
734         return 0;
735 
736 fail2:
737         while (faili >= 0) {
738                 __free_page(cb->compressed_pages[faili]);
739                 faili--;
740         }
741 
742         kfree(cb->compressed_pages);
743 fail1:
744         kfree(cb);
745 out:
746         free_extent_map(em);
747         return ret;
748 }
749 
750 static struct {
751         struct list_head idle_ws;
752         spinlock_t ws_lock;
753         /* Number of free workspaces */
754         int free_ws;
755         /* Total number of allocated workspaces */
756         atomic_t total_ws;
757         /* Waiters for a free workspace */
758         wait_queue_head_t ws_wait;
759 } btrfs_comp_ws[BTRFS_COMPRESS_TYPES];
760 
761 static const struct btrfs_compress_op * const btrfs_compress_op[] = {
762         &btrfs_zlib_compress,
763         &btrfs_lzo_compress,
764 };
765 
766 void __init btrfs_init_compress(void)
767 {
768         int i;
769 
770         for (i = 0; i < BTRFS_COMPRESS_TYPES; i++) {
771                 struct list_head *workspace;
772 
773                 INIT_LIST_HEAD(&btrfs_comp_ws[i].idle_ws);
774                 spin_lock_init(&btrfs_comp_ws[i].ws_lock);
775                 atomic_set(&btrfs_comp_ws[i].total_ws, 0);
776                 init_waitqueue_head(&btrfs_comp_ws[i].ws_wait);
777 
778                 /*
779                  * Preallocate one workspace for each compression type so
780                  * we can guarantee forward progress in the worst case
781                  */
782                 workspace = btrfs_compress_op[i]->alloc_workspace();
783                 if (IS_ERR(workspace)) {
784                         pr_warn("BTRFS: cannot preallocate compression workspace, will try later\n");
785                 } else {
786                         atomic_set(&btrfs_comp_ws[i].total_ws, 1);
787                         btrfs_comp_ws[i].free_ws = 1;
788                         list_add(workspace, &btrfs_comp_ws[i].idle_ws);
789                 }
790         }
791 }
792 
793 /*
794  * This finds an available workspace or allocates a new one.
795  * If it's not possible to allocate a new one, waits until there's one.
796  * Preallocation makes a forward progress guarantees and we do not return
797  * errors.
798  */
799 static struct list_head *find_workspace(int type)
800 {
801         struct list_head *workspace;
802         int cpus = num_online_cpus();
803         int idx = type - 1;
804 
805         struct list_head *idle_ws       = &btrfs_comp_ws[idx].idle_ws;
806         spinlock_t *ws_lock             = &btrfs_comp_ws[idx].ws_lock;
807         atomic_t *total_ws              = &btrfs_comp_ws[idx].total_ws;
808         wait_queue_head_t *ws_wait      = &btrfs_comp_ws[idx].ws_wait;
809         int *free_ws                    = &btrfs_comp_ws[idx].free_ws;
810 again:
811         spin_lock(ws_lock);
812         if (!list_empty(idle_ws)) {
813                 workspace = idle_ws->next;
814                 list_del(workspace);
815                 (*free_ws)--;
816                 spin_unlock(ws_lock);
817                 return workspace;
818 
819         }
820         if (atomic_read(total_ws) > cpus) {
821                 DEFINE_WAIT(wait);
822 
823                 spin_unlock(ws_lock);
824                 prepare_to_wait(ws_wait, &wait, TASK_UNINTERRUPTIBLE);
825                 if (atomic_read(total_ws) > cpus && !*free_ws)
826                         schedule();
827                 finish_wait(ws_wait, &wait);
828                 goto again;
829         }
830         atomic_inc(total_ws);
831         spin_unlock(ws_lock);
832 
833         workspace = btrfs_compress_op[idx]->alloc_workspace();
834         if (IS_ERR(workspace)) {
835                 atomic_dec(total_ws);
836                 wake_up(ws_wait);
837 
838                 /*
839                  * Do not return the error but go back to waiting. There's a
840                  * workspace preallocated for each type and the compression
841                  * time is bounded so we get to a workspace eventually. This
842                  * makes our caller's life easier.
843                  *
844                  * To prevent silent and low-probability deadlocks (when the
845                  * initial preallocation fails), check if there are any
846                  * workspaces at all.
847                  */
848                 if (atomic_read(total_ws) == 0) {
849                         static DEFINE_RATELIMIT_STATE(_rs,
850                                         /* once per minute */ 60 * HZ,
851                                         /* no burst */ 1);
852 
853                         if (__ratelimit(&_rs)) {
854                                 pr_warn("BTRFS: no compression workspaces, low memory, retrying\n");
855                         }
856                 }
857                 goto again;
858         }
859         return workspace;
860 }
861 
862 /*
863  * put a workspace struct back on the list or free it if we have enough
864  * idle ones sitting around
865  */
866 static void free_workspace(int type, struct list_head *workspace)
867 {
868         int idx = type - 1;
869         struct list_head *idle_ws       = &btrfs_comp_ws[idx].idle_ws;
870         spinlock_t *ws_lock             = &btrfs_comp_ws[idx].ws_lock;
871         atomic_t *total_ws              = &btrfs_comp_ws[idx].total_ws;
872         wait_queue_head_t *ws_wait      = &btrfs_comp_ws[idx].ws_wait;
873         int *free_ws                    = &btrfs_comp_ws[idx].free_ws;
874 
875         spin_lock(ws_lock);
876         if (*free_ws < num_online_cpus()) {
877                 list_add(workspace, idle_ws);
878                 (*free_ws)++;
879                 spin_unlock(ws_lock);
880                 goto wake;
881         }
882         spin_unlock(ws_lock);
883 
884         btrfs_compress_op[idx]->free_workspace(workspace);
885         atomic_dec(total_ws);
886 wake:
887         /*
888          * Make sure counter is updated before we wake up waiters.
889          */
890         smp_mb();
891         if (waitqueue_active(ws_wait))
892                 wake_up(ws_wait);
893 }
894 
895 /*
896  * cleanup function for module exit
897  */
898 static void free_workspaces(void)
899 {
900         struct list_head *workspace;
901         int i;
902 
903         for (i = 0; i < BTRFS_COMPRESS_TYPES; i++) {
904                 while (!list_empty(&btrfs_comp_ws[i].idle_ws)) {
905                         workspace = btrfs_comp_ws[i].idle_ws.next;
906                         list_del(workspace);
907                         btrfs_compress_op[i]->free_workspace(workspace);
908                         atomic_dec(&btrfs_comp_ws[i].total_ws);
909                 }
910         }
911 }
912 
913 /*
914  * Given an address space and start and length, compress the bytes into @pages
915  * that are allocated on demand.
916  *
917  * @out_pages is an in/out parameter, holds maximum number of pages to allocate
918  * and returns number of actually allocated pages
919  *
920  * @total_in is used to return the number of bytes actually read.  It
921  * may be smaller than the input length if we had to exit early because we
922  * ran out of room in the pages array or because we cross the
923  * max_out threshold.
924  *
925  * @total_out is an in/out parameter, must be set to the input length and will
926  * be also used to return the total number of compressed bytes
927  *
928  * @max_out tells us the max number of bytes that we're allowed to
929  * stuff into pages
930  */
931 int btrfs_compress_pages(int type, struct address_space *mapping,
932                          u64 start, struct page **pages,
933                          unsigned long *out_pages,
934                          unsigned long *total_in,
935                          unsigned long *total_out)
936 {
937         struct list_head *workspace;
938         int ret;
939 
940         workspace = find_workspace(type);
941 
942         ret = btrfs_compress_op[type-1]->compress_pages(workspace, mapping,
943                                                       start, pages,
944                                                       out_pages,
945                                                       total_in, total_out);
946         free_workspace(type, workspace);
947         return ret;
948 }
949 
950 /*
951  * pages_in is an array of pages with compressed data.
952  *
953  * disk_start is the starting logical offset of this array in the file
954  *
955  * orig_bio contains the pages from the file that we want to decompress into
956  *
957  * srclen is the number of bytes in pages_in
958  *
959  * The basic idea is that we have a bio that was created by readpages.
960  * The pages in the bio are for the uncompressed data, and they may not
961  * be contiguous.  They all correspond to the range of bytes covered by
962  * the compressed extent.
963  */
964 static int btrfs_decompress_bio(int type, struct page **pages_in,
965                                    u64 disk_start, struct bio *orig_bio,
966                                    size_t srclen)
967 {
968         struct list_head *workspace;
969         int ret;
970 
971         workspace = find_workspace(type);
972 
973         ret = btrfs_compress_op[type-1]->decompress_bio(workspace, pages_in,
974                                                          disk_start, orig_bio,
975                                                          srclen);
976         free_workspace(type, workspace);
977         return ret;
978 }
979 
980 /*
981  * a less complex decompression routine.  Our compressed data fits in a
982  * single page, and we want to read a single page out of it.
983  * start_byte tells us the offset into the compressed data we're interested in
984  */
985 int btrfs_decompress(int type, unsigned char *data_in, struct page *dest_page,
986                      unsigned long start_byte, size_t srclen, size_t destlen)
987 {
988         struct list_head *workspace;
989         int ret;
990 
991         workspace = find_workspace(type);
992 
993         ret = btrfs_compress_op[type-1]->decompress(workspace, data_in,
994                                                   dest_page, start_byte,
995                                                   srclen, destlen);
996 
997         free_workspace(type, workspace);
998         return ret;
999 }
1000 
1001 void btrfs_exit_compress(void)
1002 {
1003         free_workspaces();
1004 }
1005 
1006 /*
1007  * Copy uncompressed data from working buffer to pages.
1008  *
1009  * buf_start is the byte offset we're of the start of our workspace buffer.
1010  *
1011  * total_out is the last byte of the buffer
1012  */
1013 int btrfs_decompress_buf2page(const char *buf, unsigned long buf_start,
1014                               unsigned long total_out, u64 disk_start,
1015                               struct bio *bio)
1016 {
1017         unsigned long buf_offset;
1018         unsigned long current_buf_start;
1019         unsigned long start_byte;
1020         unsigned long prev_start_byte;
1021         unsigned long working_bytes = total_out - buf_start;
1022         unsigned long bytes;
1023         char *kaddr;
1024         struct bio_vec bvec = bio_iter_iovec(bio, bio->bi_iter);
1025 
1026         /*
1027          * start byte is the first byte of the page we're currently
1028          * copying into relative to the start of the compressed data.
1029          */
1030         start_byte = page_offset(bvec.bv_page) - disk_start;
1031 
1032         /* we haven't yet hit data corresponding to this page */
1033         if (total_out <= start_byte)
1034                 return 1;
1035 
1036         /*
1037          * the start of the data we care about is offset into
1038          * the middle of our working buffer
1039          */
1040         if (total_out > start_byte && buf_start < start_byte) {
1041                 buf_offset = start_byte - buf_start;
1042                 working_bytes -= buf_offset;
1043         } else {
1044                 buf_offset = 0;
1045         }
1046         current_buf_start = buf_start;
1047 
1048         /* copy bytes from the working buffer into the pages */
1049         while (working_bytes > 0) {
1050                 bytes = min_t(unsigned long, bvec.bv_len,
1051                                 PAGE_SIZE - buf_offset);
1052                 bytes = min(bytes, working_bytes);
1053 
1054                 kaddr = kmap_atomic(bvec.bv_page);
1055                 memcpy(kaddr + bvec.bv_offset, buf + buf_offset, bytes);
1056                 kunmap_atomic(kaddr);
1057                 flush_dcache_page(bvec.bv_page);
1058 
1059                 buf_offset += bytes;
1060                 working_bytes -= bytes;
1061                 current_buf_start += bytes;
1062 
1063                 /* check if we need to pick another page */
1064                 bio_advance(bio, bytes);
1065                 if (!bio->bi_iter.bi_size)
1066                         return 0;
1067                 bvec = bio_iter_iovec(bio, bio->bi_iter);
1068                 prev_start_byte = start_byte;
1069                 start_byte = page_offset(bvec.bv_page) - disk_start;
1070 
1071                 /*
1072                  * We need to make sure we're only adjusting
1073                  * our offset into compression working buffer when
1074                  * we're switching pages.  Otherwise we can incorrectly
1075                  * keep copying when we were actually done.
1076                  */
1077                 if (start_byte != prev_start_byte) {
1078                         /*
1079                          * make sure our new page is covered by this
1080                          * working buffer
1081                          */
1082                         if (total_out <= start_byte)
1083                                 return 1;
1084 
1085                         /*
1086                          * the next page in the biovec might not be adjacent
1087                          * to the last page, but it might still be found
1088                          * inside this working buffer. bump our offset pointer
1089                          */
1090                         if (total_out > start_byte &&
1091                             current_buf_start < start_byte) {
1092                                 buf_offset = start_byte - buf_start;
1093                                 working_bytes = total_out - start_byte;
1094                                 current_buf_start = buf_start + buf_offset;
1095                         }
1096                 }
1097         }
1098 
1099         return 1;
1100 }
1101 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | Wiki (Japanese) | Wiki (English) | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

osdn.jp