diff options
Diffstat (limited to 'fs/btrfs/compression.c')
-rw-r--r-- | fs/btrfs/compression.c | 84 |
1 files changed, 42 insertions, 42 deletions
diff --git a/fs/btrfs/compression.c b/fs/btrfs/compression.c index 3346cd8f9910..ff61a41ac90b 100644 --- a/fs/btrfs/compression.c +++ b/fs/btrfs/compression.c | |||
@@ -119,7 +119,7 @@ static int check_compressed_csum(struct inode *inode, | |||
119 | csum = ~(u32)0; | 119 | csum = ~(u32)0; |
120 | 120 | ||
121 | kaddr = kmap_atomic(page); | 121 | kaddr = kmap_atomic(page); |
122 | csum = btrfs_csum_data(kaddr, csum, PAGE_CACHE_SIZE); | 122 | csum = btrfs_csum_data(kaddr, csum, PAGE_SIZE); |
123 | btrfs_csum_final(csum, (char *)&csum); | 123 | btrfs_csum_final(csum, (char *)&csum); |
124 | kunmap_atomic(kaddr); | 124 | kunmap_atomic(kaddr); |
125 | 125 | ||
@@ -190,7 +190,7 @@ csum_failed: | |||
190 | for (index = 0; index < cb->nr_pages; index++) { | 190 | for (index = 0; index < cb->nr_pages; index++) { |
191 | page = cb->compressed_pages[index]; | 191 | page = cb->compressed_pages[index]; |
192 | page->mapping = NULL; | 192 | page->mapping = NULL; |
193 | page_cache_release(page); | 193 | put_page(page); |
194 | } | 194 | } |
195 | 195 | ||
196 | /* do io completion on the original bio */ | 196 | /* do io completion on the original bio */ |
@@ -224,8 +224,8 @@ out: | |||
224 | static noinline void end_compressed_writeback(struct inode *inode, | 224 | static noinline void end_compressed_writeback(struct inode *inode, |
225 | const struct compressed_bio *cb) | 225 | const struct compressed_bio *cb) |
226 | { | 226 | { |
227 | unsigned long index = cb->start >> PAGE_CACHE_SHIFT; | 227 | unsigned long index = cb->start >> PAGE_SHIFT; |
228 | unsigned long end_index = (cb->start + cb->len - 1) >> PAGE_CACHE_SHIFT; | 228 | unsigned long end_index = (cb->start + cb->len - 1) >> PAGE_SHIFT; |
229 | struct page *pages[16]; | 229 | struct page *pages[16]; |
230 | unsigned long nr_pages = end_index - index + 1; | 230 | unsigned long nr_pages = end_index - index + 1; |
231 | int i; | 231 | int i; |
@@ -247,7 +247,7 @@ static noinline void end_compressed_writeback(struct inode *inode, | |||
247 | if (cb->errors) | 247 | if (cb->errors) |
248 | SetPageError(pages[i]); | 248 | SetPageError(pages[i]); |
249 | end_page_writeback(pages[i]); | 249 | end_page_writeback(pages[i]); |
250 | page_cache_release(pages[i]); | 250 | put_page(pages[i]); |
251 | } | 251 | } |
252 | nr_pages -= ret; | 252 | nr_pages -= ret; |
253 | index += ret; | 253 | index += ret; |
@@ -304,7 +304,7 @@ static void end_compressed_bio_write(struct bio *bio) | |||
304 | for (index = 0; index < cb->nr_pages; index++) { | 304 | for (index = 0; index < cb->nr_pages; index++) { |
305 | page = cb->compressed_pages[index]; | 305 | page = cb->compressed_pages[index]; |
306 | page->mapping = NULL; | 306 | page->mapping = NULL; |
307 | page_cache_release(page); | 307 | put_page(page); |
308 | } | 308 | } |
309 | 309 | ||
310 | /* finally free the cb struct */ | 310 | /* finally free the cb struct */ |
@@ -341,7 +341,7 @@ int btrfs_submit_compressed_write(struct inode *inode, u64 start, | |||
341 | int ret; | 341 | int ret; |
342 | int skip_sum = BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM; | 342 | int skip_sum = BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM; |
343 | 343 | ||
344 | WARN_ON(start & ((u64)PAGE_CACHE_SIZE - 1)); | 344 | WARN_ON(start & ((u64)PAGE_SIZE - 1)); |
345 | cb = kmalloc(compressed_bio_size(root, compressed_len), GFP_NOFS); | 345 | cb = kmalloc(compressed_bio_size(root, compressed_len), GFP_NOFS); |
346 | if (!cb) | 346 | if (!cb) |
347 | return -ENOMEM; | 347 | return -ENOMEM; |
@@ -374,14 +374,14 @@ int btrfs_submit_compressed_write(struct inode *inode, u64 start, | |||
374 | page->mapping = inode->i_mapping; | 374 | page->mapping = inode->i_mapping; |
375 | if (bio->bi_iter.bi_size) | 375 | if (bio->bi_iter.bi_size) |
376 | ret = io_tree->ops->merge_bio_hook(WRITE, page, 0, | 376 | ret = io_tree->ops->merge_bio_hook(WRITE, page, 0, |
377 | PAGE_CACHE_SIZE, | 377 | PAGE_SIZE, |
378 | bio, 0); | 378 | bio, 0); |
379 | else | 379 | else |
380 | ret = 0; | 380 | ret = 0; |
381 | 381 | ||
382 | page->mapping = NULL; | 382 | page->mapping = NULL; |
383 | if (ret || bio_add_page(bio, page, PAGE_CACHE_SIZE, 0) < | 383 | if (ret || bio_add_page(bio, page, PAGE_SIZE, 0) < |
384 | PAGE_CACHE_SIZE) { | 384 | PAGE_SIZE) { |
385 | bio_get(bio); | 385 | bio_get(bio); |
386 | 386 | ||
387 | /* | 387 | /* |
@@ -410,15 +410,15 @@ int btrfs_submit_compressed_write(struct inode *inode, u64 start, | |||
410 | BUG_ON(!bio); | 410 | BUG_ON(!bio); |
411 | bio->bi_private = cb; | 411 | bio->bi_private = cb; |
412 | bio->bi_end_io = end_compressed_bio_write; | 412 | bio->bi_end_io = end_compressed_bio_write; |
413 | bio_add_page(bio, page, PAGE_CACHE_SIZE, 0); | 413 | bio_add_page(bio, page, PAGE_SIZE, 0); |
414 | } | 414 | } |
415 | if (bytes_left < PAGE_CACHE_SIZE) { | 415 | if (bytes_left < PAGE_SIZE) { |
416 | btrfs_info(BTRFS_I(inode)->root->fs_info, | 416 | btrfs_info(BTRFS_I(inode)->root->fs_info, |
417 | "bytes left %lu compress len %lu nr %lu", | 417 | "bytes left %lu compress len %lu nr %lu", |
418 | bytes_left, cb->compressed_len, cb->nr_pages); | 418 | bytes_left, cb->compressed_len, cb->nr_pages); |
419 | } | 419 | } |
420 | bytes_left -= PAGE_CACHE_SIZE; | 420 | bytes_left -= PAGE_SIZE; |
421 | first_byte += PAGE_CACHE_SIZE; | 421 | first_byte += PAGE_SIZE; |
422 | cond_resched(); | 422 | cond_resched(); |
423 | } | 423 | } |
424 | bio_get(bio); | 424 | bio_get(bio); |
@@ -457,17 +457,17 @@ static noinline int add_ra_bio_pages(struct inode *inode, | |||
457 | int misses = 0; | 457 | int misses = 0; |
458 | 458 | ||
459 | page = cb->orig_bio->bi_io_vec[cb->orig_bio->bi_vcnt - 1].bv_page; | 459 | page = cb->orig_bio->bi_io_vec[cb->orig_bio->bi_vcnt - 1].bv_page; |
460 | last_offset = (page_offset(page) + PAGE_CACHE_SIZE); | 460 | last_offset = (page_offset(page) + PAGE_SIZE); |
461 | em_tree = &BTRFS_I(inode)->extent_tree; | 461 | em_tree = &BTRFS_I(inode)->extent_tree; |
462 | tree = &BTRFS_I(inode)->io_tree; | 462 | tree = &BTRFS_I(inode)->io_tree; |
463 | 463 | ||
464 | if (isize == 0) | 464 | if (isize == 0) |
465 | return 0; | 465 | return 0; |
466 | 466 | ||
467 | end_index = (i_size_read(inode) - 1) >> PAGE_CACHE_SHIFT; | 467 | end_index = (i_size_read(inode) - 1) >> PAGE_SHIFT; |
468 | 468 | ||
469 | while (last_offset < compressed_end) { | 469 | while (last_offset < compressed_end) { |
470 | pg_index = last_offset >> PAGE_CACHE_SHIFT; | 470 | pg_index = last_offset >> PAGE_SHIFT; |
471 | 471 | ||
472 | if (pg_index > end_index) | 472 | if (pg_index > end_index) |
473 | break; | 473 | break; |
@@ -488,11 +488,11 @@ static noinline int add_ra_bio_pages(struct inode *inode, | |||
488 | break; | 488 | break; |
489 | 489 | ||
490 | if (add_to_page_cache_lru(page, mapping, pg_index, GFP_NOFS)) { | 490 | if (add_to_page_cache_lru(page, mapping, pg_index, GFP_NOFS)) { |
491 | page_cache_release(page); | 491 | put_page(page); |
492 | goto next; | 492 | goto next; |
493 | } | 493 | } |
494 | 494 | ||
495 | end = last_offset + PAGE_CACHE_SIZE - 1; | 495 | end = last_offset + PAGE_SIZE - 1; |
496 | /* | 496 | /* |
497 | * at this point, we have a locked page in the page cache | 497 | * at this point, we have a locked page in the page cache |
498 | * for these bytes in the file. But, we have to make | 498 | * for these bytes in the file. But, we have to make |
@@ -502,27 +502,27 @@ static noinline int add_ra_bio_pages(struct inode *inode, | |||
502 | lock_extent(tree, last_offset, end); | 502 | lock_extent(tree, last_offset, end); |
503 | read_lock(&em_tree->lock); | 503 | read_lock(&em_tree->lock); |
504 | em = lookup_extent_mapping(em_tree, last_offset, | 504 | em = lookup_extent_mapping(em_tree, last_offset, |
505 | PAGE_CACHE_SIZE); | 505 | PAGE_SIZE); |
506 | read_unlock(&em_tree->lock); | 506 | read_unlock(&em_tree->lock); |
507 | 507 | ||
508 | if (!em || last_offset < em->start || | 508 | if (!em || last_offset < em->start || |
509 | (last_offset + PAGE_CACHE_SIZE > extent_map_end(em)) || | 509 | (last_offset + PAGE_SIZE > extent_map_end(em)) || |
510 | (em->block_start >> 9) != cb->orig_bio->bi_iter.bi_sector) { | 510 | (em->block_start >> 9) != cb->orig_bio->bi_iter.bi_sector) { |
511 | free_extent_map(em); | 511 | free_extent_map(em); |
512 | unlock_extent(tree, last_offset, end); | 512 | unlock_extent(tree, last_offset, end); |
513 | unlock_page(page); | 513 | unlock_page(page); |
514 | page_cache_release(page); | 514 | put_page(page); |
515 | break; | 515 | break; |
516 | } | 516 | } |
517 | free_extent_map(em); | 517 | free_extent_map(em); |
518 | 518 | ||
519 | if (page->index == end_index) { | 519 | if (page->index == end_index) { |
520 | char *userpage; | 520 | char *userpage; |
521 | size_t zero_offset = isize & (PAGE_CACHE_SIZE - 1); | 521 | size_t zero_offset = isize & (PAGE_SIZE - 1); |
522 | 522 | ||
523 | if (zero_offset) { | 523 | if (zero_offset) { |
524 | int zeros; | 524 | int zeros; |
525 | zeros = PAGE_CACHE_SIZE - zero_offset; | 525 | zeros = PAGE_SIZE - zero_offset; |
526 | userpage = kmap_atomic(page); | 526 | userpage = kmap_atomic(page); |
527 | memset(userpage + zero_offset, 0, zeros); | 527 | memset(userpage + zero_offset, 0, zeros); |
528 | flush_dcache_page(page); | 528 | flush_dcache_page(page); |
@@ -531,19 +531,19 @@ static noinline int add_ra_bio_pages(struct inode *inode, | |||
531 | } | 531 | } |
532 | 532 | ||
533 | ret = bio_add_page(cb->orig_bio, page, | 533 | ret = bio_add_page(cb->orig_bio, page, |
534 | PAGE_CACHE_SIZE, 0); | 534 | PAGE_SIZE, 0); |
535 | 535 | ||
536 | if (ret == PAGE_CACHE_SIZE) { | 536 | if (ret == PAGE_SIZE) { |
537 | nr_pages++; | 537 | nr_pages++; |
538 | page_cache_release(page); | 538 | put_page(page); |
539 | } else { | 539 | } else { |
540 | unlock_extent(tree, last_offset, end); | 540 | unlock_extent(tree, last_offset, end); |
541 | unlock_page(page); | 541 | unlock_page(page); |
542 | page_cache_release(page); | 542 | put_page(page); |
543 | break; | 543 | break; |
544 | } | 544 | } |
545 | next: | 545 | next: |
546 | last_offset += PAGE_CACHE_SIZE; | 546 | last_offset += PAGE_SIZE; |
547 | } | 547 | } |
548 | return 0; | 548 | return 0; |
549 | } | 549 | } |
@@ -567,7 +567,7 @@ int btrfs_submit_compressed_read(struct inode *inode, struct bio *bio, | |||
567 | struct extent_map_tree *em_tree; | 567 | struct extent_map_tree *em_tree; |
568 | struct compressed_bio *cb; | 568 | struct compressed_bio *cb; |
569 | struct btrfs_root *root = BTRFS_I(inode)->root; | 569 | struct btrfs_root *root = BTRFS_I(inode)->root; |
570 | unsigned long uncompressed_len = bio->bi_vcnt * PAGE_CACHE_SIZE; | 570 | unsigned long uncompressed_len = bio->bi_vcnt * PAGE_SIZE; |
571 | unsigned long compressed_len; | 571 | unsigned long compressed_len; |
572 | unsigned long nr_pages; | 572 | unsigned long nr_pages; |
573 | unsigned long pg_index; | 573 | unsigned long pg_index; |
@@ -589,7 +589,7 @@ int btrfs_submit_compressed_read(struct inode *inode, struct bio *bio, | |||
589 | read_lock(&em_tree->lock); | 589 | read_lock(&em_tree->lock); |
590 | em = lookup_extent_mapping(em_tree, | 590 | em = lookup_extent_mapping(em_tree, |
591 | page_offset(bio->bi_io_vec->bv_page), | 591 | page_offset(bio->bi_io_vec->bv_page), |
592 | PAGE_CACHE_SIZE); | 592 | PAGE_SIZE); |
593 | read_unlock(&em_tree->lock); | 593 | read_unlock(&em_tree->lock); |
594 | if (!em) | 594 | if (!em) |
595 | return -EIO; | 595 | return -EIO; |
@@ -617,7 +617,7 @@ int btrfs_submit_compressed_read(struct inode *inode, struct bio *bio, | |||
617 | cb->compress_type = extent_compress_type(bio_flags); | 617 | cb->compress_type = extent_compress_type(bio_flags); |
618 | cb->orig_bio = bio; | 618 | cb->orig_bio = bio; |
619 | 619 | ||
620 | nr_pages = DIV_ROUND_UP(compressed_len, PAGE_CACHE_SIZE); | 620 | nr_pages = DIV_ROUND_UP(compressed_len, PAGE_SIZE); |
621 | cb->compressed_pages = kcalloc(nr_pages, sizeof(struct page *), | 621 | cb->compressed_pages = kcalloc(nr_pages, sizeof(struct page *), |
622 | GFP_NOFS); | 622 | GFP_NOFS); |
623 | if (!cb->compressed_pages) | 623 | if (!cb->compressed_pages) |
@@ -640,7 +640,7 @@ int btrfs_submit_compressed_read(struct inode *inode, struct bio *bio, | |||
640 | add_ra_bio_pages(inode, em_start + em_len, cb); | 640 | add_ra_bio_pages(inode, em_start + em_len, cb); |
641 | 641 | ||
642 | /* include any pages we added in add_ra-bio_pages */ | 642 | /* include any pages we added in add_ra-bio_pages */ |
643 | uncompressed_len = bio->bi_vcnt * PAGE_CACHE_SIZE; | 643 | uncompressed_len = bio->bi_vcnt * PAGE_SIZE; |
644 | cb->len = uncompressed_len; | 644 | cb->len = uncompressed_len; |
645 | 645 | ||
646 | comp_bio = compressed_bio_alloc(bdev, cur_disk_byte, GFP_NOFS); | 646 | comp_bio = compressed_bio_alloc(bdev, cur_disk_byte, GFP_NOFS); |
@@ -653,18 +653,18 @@ int btrfs_submit_compressed_read(struct inode *inode, struct bio *bio, | |||
653 | for (pg_index = 0; pg_index < nr_pages; pg_index++) { | 653 | for (pg_index = 0; pg_index < nr_pages; pg_index++) { |
654 | page = cb->compressed_pages[pg_index]; | 654 | page = cb->compressed_pages[pg_index]; |
655 | page->mapping = inode->i_mapping; | 655 | page->mapping = inode->i_mapping; |
656 | page->index = em_start >> PAGE_CACHE_SHIFT; | 656 | page->index = em_start >> PAGE_SHIFT; |
657 | 657 | ||
658 | if (comp_bio->bi_iter.bi_size) | 658 | if (comp_bio->bi_iter.bi_size) |
659 | ret = tree->ops->merge_bio_hook(READ, page, 0, | 659 | ret = tree->ops->merge_bio_hook(READ, page, 0, |
660 | PAGE_CACHE_SIZE, | 660 | PAGE_SIZE, |
661 | comp_bio, 0); | 661 | comp_bio, 0); |
662 | else | 662 | else |
663 | ret = 0; | 663 | ret = 0; |
664 | 664 | ||
665 | page->mapping = NULL; | 665 | page->mapping = NULL; |
666 | if (ret || bio_add_page(comp_bio, page, PAGE_CACHE_SIZE, 0) < | 666 | if (ret || bio_add_page(comp_bio, page, PAGE_SIZE, 0) < |
667 | PAGE_CACHE_SIZE) { | 667 | PAGE_SIZE) { |
668 | bio_get(comp_bio); | 668 | bio_get(comp_bio); |
669 | 669 | ||
670 | ret = btrfs_bio_wq_end_io(root->fs_info, comp_bio, | 670 | ret = btrfs_bio_wq_end_io(root->fs_info, comp_bio, |
@@ -702,9 +702,9 @@ int btrfs_submit_compressed_read(struct inode *inode, struct bio *bio, | |||
702 | comp_bio->bi_private = cb; | 702 | comp_bio->bi_private = cb; |
703 | comp_bio->bi_end_io = end_compressed_bio_read; | 703 | comp_bio->bi_end_io = end_compressed_bio_read; |
704 | 704 | ||
705 | bio_add_page(comp_bio, page, PAGE_CACHE_SIZE, 0); | 705 | bio_add_page(comp_bio, page, PAGE_SIZE, 0); |
706 | } | 706 | } |
707 | cur_disk_byte += PAGE_CACHE_SIZE; | 707 | cur_disk_byte += PAGE_SIZE; |
708 | } | 708 | } |
709 | bio_get(comp_bio); | 709 | bio_get(comp_bio); |
710 | 710 | ||
@@ -1013,8 +1013,8 @@ int btrfs_decompress_buf2page(char *buf, unsigned long buf_start, | |||
1013 | 1013 | ||
1014 | /* copy bytes from the working buffer into the pages */ | 1014 | /* copy bytes from the working buffer into the pages */ |
1015 | while (working_bytes > 0) { | 1015 | while (working_bytes > 0) { |
1016 | bytes = min(PAGE_CACHE_SIZE - *pg_offset, | 1016 | bytes = min(PAGE_SIZE - *pg_offset, |
1017 | PAGE_CACHE_SIZE - buf_offset); | 1017 | PAGE_SIZE - buf_offset); |
1018 | bytes = min(bytes, working_bytes); | 1018 | bytes = min(bytes, working_bytes); |
1019 | kaddr = kmap_atomic(page_out); | 1019 | kaddr = kmap_atomic(page_out); |
1020 | memcpy(kaddr + *pg_offset, buf + buf_offset, bytes); | 1020 | memcpy(kaddr + *pg_offset, buf + buf_offset, bytes); |
@@ -1027,7 +1027,7 @@ int btrfs_decompress_buf2page(char *buf, unsigned long buf_start, | |||
1027 | current_buf_start += bytes; | 1027 | current_buf_start += bytes; |
1028 | 1028 | ||
1029 | /* check if we need to pick another page */ | 1029 | /* check if we need to pick another page */ |
1030 | if (*pg_offset == PAGE_CACHE_SIZE) { | 1030 | if (*pg_offset == PAGE_SIZE) { |
1031 | (*pg_index)++; | 1031 | (*pg_index)++; |
1032 | if (*pg_index >= vcnt) | 1032 | if (*pg_index >= vcnt) |
1033 | return 0; | 1033 | return 0; |