aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/extent_io.c
diff options
context:
space:
mode:
authorChris Mason <clm@fb.com>2014-10-04 12:56:45 -0400
committerChris Mason <clm@fb.com>2014-10-04 12:56:45 -0400
commitbbf65cf0b5b67843ca094df01019222b85af2183 (patch)
tree35e1a8c54876cc8a105a2ad0230526195d3cafbf /fs/btrfs/extent_io.c
parentbf8e8ca6fd4ac6e8edc58b92cffb2ffd51933138 (diff)
parentfccb84c94a9755f48668e43d0a44d6ecc750900f (diff)
Merge branch 'cleanup/misc-for-3.18' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux into for-linus
Signed-off-by: Chris Mason <clm@fb.com> Conflicts: fs/btrfs/extent_io.c
Diffstat (limited to 'fs/btrfs/extent_io.c')
-rw-r--r--fs/btrfs/extent_io.c66
1 files changed, 31 insertions, 35 deletions
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
index 215603b911f1..bf3f424e0013 100644
--- a/fs/btrfs/extent_io.c
+++ b/fs/btrfs/extent_io.c
@@ -2064,7 +2064,7 @@ int repair_eb_io_failure(struct btrfs_root *root, struct extent_buffer *eb,
2064 return -EROFS; 2064 return -EROFS;
2065 2065
2066 for (i = 0; i < num_pages; i++) { 2066 for (i = 0; i < num_pages; i++) {
2067 struct page *p = extent_buffer_page(eb, i); 2067 struct page *p = eb->pages[i];
2068 2068
2069 ret = repair_io_failure(root->fs_info->btree_inode, start, 2069 ret = repair_io_failure(root->fs_info->btree_inode, start,
2070 PAGE_CACHE_SIZE, start, p, 2070 PAGE_CACHE_SIZE, start, p,
@@ -3580,7 +3580,7 @@ lock_extent_buffer_for_io(struct extent_buffer *eb,
3580 3580
3581 num_pages = num_extent_pages(eb->start, eb->len); 3581 num_pages = num_extent_pages(eb->start, eb->len);
3582 for (i = 0; i < num_pages; i++) { 3582 for (i = 0; i < num_pages; i++) {
3583 struct page *p = extent_buffer_page(eb, i); 3583 struct page *p = eb->pages[i];
3584 3584
3585 if (!trylock_page(p)) { 3585 if (!trylock_page(p)) {
3586 if (!flush) { 3586 if (!flush) {
@@ -3712,7 +3712,7 @@ static noinline_for_stack int write_one_eb(struct extent_buffer *eb,
3712 bio_flags = EXTENT_BIO_TREE_LOG; 3712 bio_flags = EXTENT_BIO_TREE_LOG;
3713 3713
3714 for (i = 0; i < num_pages; i++) { 3714 for (i = 0; i < num_pages; i++) {
3715 struct page *p = extent_buffer_page(eb, i); 3715 struct page *p = eb->pages[i];
3716 3716
3717 clear_page_dirty_for_io(p); 3717 clear_page_dirty_for_io(p);
3718 set_page_writeback(p); 3718 set_page_writeback(p);
@@ -3736,7 +3736,7 @@ static noinline_for_stack int write_one_eb(struct extent_buffer *eb,
3736 3736
3737 if (unlikely(ret)) { 3737 if (unlikely(ret)) {
3738 for (; i < num_pages; i++) { 3738 for (; i < num_pages; i++) {
3739 struct page *p = extent_buffer_page(eb, i); 3739 struct page *p = eb->pages[i];
3740 clear_page_dirty_for_io(p); 3740 clear_page_dirty_for_io(p);
3741 unlock_page(p); 3741 unlock_page(p);
3742 } 3742 }
@@ -4512,24 +4512,21 @@ int extent_buffer_under_io(struct extent_buffer *eb)
4512/* 4512/*
4513 * Helper for releasing extent buffer page. 4513 * Helper for releasing extent buffer page.
4514 */ 4514 */
4515static void btrfs_release_extent_buffer_page(struct extent_buffer *eb, 4515static void btrfs_release_extent_buffer_page(struct extent_buffer *eb)
4516 unsigned long start_idx)
4517{ 4516{
4518 unsigned long index; 4517 unsigned long index;
4519 unsigned long num_pages;
4520 struct page *page; 4518 struct page *page;
4521 int mapped = !test_bit(EXTENT_BUFFER_DUMMY, &eb->bflags); 4519 int mapped = !test_bit(EXTENT_BUFFER_DUMMY, &eb->bflags);
4522 4520
4523 BUG_ON(extent_buffer_under_io(eb)); 4521 BUG_ON(extent_buffer_under_io(eb));
4524 4522
4525 num_pages = num_extent_pages(eb->start, eb->len); 4523 index = num_extent_pages(eb->start, eb->len);
4526 index = start_idx + num_pages; 4524 if (index == 0)
4527 if (start_idx >= index)
4528 return; 4525 return;
4529 4526
4530 do { 4527 do {
4531 index--; 4528 index--;
4532 page = extent_buffer_page(eb, index); 4529 page = eb->pages[index];
4533 if (page && mapped) { 4530 if (page && mapped) {
4534 spin_lock(&page->mapping->private_lock); 4531 spin_lock(&page->mapping->private_lock);
4535 /* 4532 /*
@@ -4560,7 +4557,7 @@ static void btrfs_release_extent_buffer_page(struct extent_buffer *eb,
4560 /* One for when we alloced the page */ 4557 /* One for when we alloced the page */
4561 page_cache_release(page); 4558 page_cache_release(page);
4562 } 4559 }
4563 } while (index != start_idx); 4560 } while (index != 0);
4564} 4561}
4565 4562
4566/* 4563/*
@@ -4568,7 +4565,7 @@ static void btrfs_release_extent_buffer_page(struct extent_buffer *eb,
4568 */ 4565 */
4569static inline void btrfs_release_extent_buffer(struct extent_buffer *eb) 4566static inline void btrfs_release_extent_buffer(struct extent_buffer *eb)
4570{ 4567{
4571 btrfs_release_extent_buffer_page(eb, 0); 4568 btrfs_release_extent_buffer_page(eb);
4572 __free_extent_buffer(eb); 4569 __free_extent_buffer(eb);
4573} 4570}
4574 4571
@@ -4711,7 +4708,8 @@ static void mark_extent_buffer_accessed(struct extent_buffer *eb,
4711 4708
4712 num_pages = num_extent_pages(eb->start, eb->len); 4709 num_pages = num_extent_pages(eb->start, eb->len);
4713 for (i = 0; i < num_pages; i++) { 4710 for (i = 0; i < num_pages; i++) {
4714 struct page *p = extent_buffer_page(eb, i); 4711 struct page *p = eb->pages[i];
4712
4715 if (p != accessed) 4713 if (p != accessed)
4716 mark_page_accessed(p); 4714 mark_page_accessed(p);
4717 } 4715 }
@@ -4880,7 +4878,7 @@ again:
4880 */ 4878 */
4881 SetPageChecked(eb->pages[0]); 4879 SetPageChecked(eb->pages[0]);
4882 for (i = 1; i < num_pages; i++) { 4880 for (i = 1; i < num_pages; i++) {
4883 p = extent_buffer_page(eb, i); 4881 p = eb->pages[i];
4884 ClearPageChecked(p); 4882 ClearPageChecked(p);
4885 unlock_page(p); 4883 unlock_page(p);
4886 } 4884 }
@@ -4925,7 +4923,7 @@ static int release_extent_buffer(struct extent_buffer *eb)
4925 } 4923 }
4926 4924
4927 /* Should be safe to release our pages at this point */ 4925 /* Should be safe to release our pages at this point */
4928 btrfs_release_extent_buffer_page(eb, 0); 4926 btrfs_release_extent_buffer_page(eb);
4929 call_rcu(&eb->rcu_head, btrfs_release_extent_buffer_rcu); 4927 call_rcu(&eb->rcu_head, btrfs_release_extent_buffer_rcu);
4930 return 1; 4928 return 1;
4931 } 4929 }
@@ -4991,7 +4989,7 @@ void clear_extent_buffer_dirty(struct extent_buffer *eb)
4991 num_pages = num_extent_pages(eb->start, eb->len); 4989 num_pages = num_extent_pages(eb->start, eb->len);
4992 4990
4993 for (i = 0; i < num_pages; i++) { 4991 for (i = 0; i < num_pages; i++) {
4994 page = extent_buffer_page(eb, i); 4992 page = eb->pages[i];
4995 if (!PageDirty(page)) 4993 if (!PageDirty(page))
4996 continue; 4994 continue;
4997 4995
@@ -5027,7 +5025,7 @@ int set_extent_buffer_dirty(struct extent_buffer *eb)
5027 WARN_ON(!test_bit(EXTENT_BUFFER_TREE_REF, &eb->bflags)); 5025 WARN_ON(!test_bit(EXTENT_BUFFER_TREE_REF, &eb->bflags));
5028 5026
5029 for (i = 0; i < num_pages; i++) 5027 for (i = 0; i < num_pages; i++)
5030 set_page_dirty(extent_buffer_page(eb, i)); 5028 set_page_dirty(eb->pages[i]);
5031 return was_dirty; 5029 return was_dirty;
5032} 5030}
5033 5031
@@ -5040,7 +5038,7 @@ int clear_extent_buffer_uptodate(struct extent_buffer *eb)
5040 clear_bit(EXTENT_BUFFER_UPTODATE, &eb->bflags); 5038 clear_bit(EXTENT_BUFFER_UPTODATE, &eb->bflags);
5041 num_pages = num_extent_pages(eb->start, eb->len); 5039 num_pages = num_extent_pages(eb->start, eb->len);
5042 for (i = 0; i < num_pages; i++) { 5040 for (i = 0; i < num_pages; i++) {
5043 page = extent_buffer_page(eb, i); 5041 page = eb->pages[i];
5044 if (page) 5042 if (page)
5045 ClearPageUptodate(page); 5043 ClearPageUptodate(page);
5046 } 5044 }
@@ -5056,7 +5054,7 @@ int set_extent_buffer_uptodate(struct extent_buffer *eb)
5056 set_bit(EXTENT_BUFFER_UPTODATE, &eb->bflags); 5054 set_bit(EXTENT_BUFFER_UPTODATE, &eb->bflags);
5057 num_pages = num_extent_pages(eb->start, eb->len); 5055 num_pages = num_extent_pages(eb->start, eb->len);
5058 for (i = 0; i < num_pages; i++) { 5056 for (i = 0; i < num_pages; i++) {
5059 page = extent_buffer_page(eb, i); 5057 page = eb->pages[i];
5060 SetPageUptodate(page); 5058 SetPageUptodate(page);
5061 } 5059 }
5062 return 0; 5060 return 0;
@@ -5096,7 +5094,7 @@ int read_extent_buffer_pages(struct extent_io_tree *tree,
5096 5094
5097 num_pages = num_extent_pages(eb->start, eb->len); 5095 num_pages = num_extent_pages(eb->start, eb->len);
5098 for (i = start_i; i < num_pages; i++) { 5096 for (i = start_i; i < num_pages; i++) {
5099 page = extent_buffer_page(eb, i); 5097 page = eb->pages[i];
5100 if (wait == WAIT_NONE) { 5098 if (wait == WAIT_NONE) {
5101 if (!trylock_page(page)) 5099 if (!trylock_page(page))
5102 goto unlock_exit; 5100 goto unlock_exit;
@@ -5119,7 +5117,7 @@ int read_extent_buffer_pages(struct extent_io_tree *tree,
5119 eb->read_mirror = 0; 5117 eb->read_mirror = 0;
5120 atomic_set(&eb->io_pages, num_reads); 5118 atomic_set(&eb->io_pages, num_reads);
5121 for (i = start_i; i < num_pages; i++) { 5119 for (i = start_i; i < num_pages; i++) {
5122 page = extent_buffer_page(eb, i); 5120 page = eb->pages[i];
5123 if (!PageUptodate(page)) { 5121 if (!PageUptodate(page)) {
5124 ClearPageError(page); 5122 ClearPageError(page);
5125 err = __extent_read_full_page(tree, page, 5123 err = __extent_read_full_page(tree, page,
@@ -5144,7 +5142,7 @@ int read_extent_buffer_pages(struct extent_io_tree *tree,
5144 return ret; 5142 return ret;
5145 5143
5146 for (i = start_i; i < num_pages; i++) { 5144 for (i = start_i; i < num_pages; i++) {
5147 page = extent_buffer_page(eb, i); 5145 page = eb->pages[i];
5148 wait_on_page_locked(page); 5146 wait_on_page_locked(page);
5149 if (!PageUptodate(page)) 5147 if (!PageUptodate(page))
5150 ret = -EIO; 5148 ret = -EIO;
@@ -5155,7 +5153,7 @@ int read_extent_buffer_pages(struct extent_io_tree *tree,
5155unlock_exit: 5153unlock_exit:
5156 i = start_i; 5154 i = start_i;
5157 while (locked_pages > 0) { 5155 while (locked_pages > 0) {
5158 page = extent_buffer_page(eb, i); 5156 page = eb->pages[i];
5159 i++; 5157 i++;
5160 unlock_page(page); 5158 unlock_page(page);
5161 locked_pages--; 5159 locked_pages--;
@@ -5181,7 +5179,7 @@ void read_extent_buffer(struct extent_buffer *eb, void *dstv,
5181 offset = (start_offset + start) & (PAGE_CACHE_SIZE - 1); 5179 offset = (start_offset + start) & (PAGE_CACHE_SIZE - 1);
5182 5180
5183 while (len > 0) { 5181 while (len > 0) {
5184 page = extent_buffer_page(eb, i); 5182 page = eb->pages[i];
5185 5183
5186 cur = min(len, (PAGE_CACHE_SIZE - offset)); 5184 cur = min(len, (PAGE_CACHE_SIZE - offset));
5187 kaddr = page_address(page); 5185 kaddr = page_address(page);
@@ -5213,7 +5211,7 @@ int read_extent_buffer_to_user(struct extent_buffer *eb, void __user *dstv,
5213 offset = (start_offset + start) & (PAGE_CACHE_SIZE - 1); 5211 offset = (start_offset + start) & (PAGE_CACHE_SIZE - 1);
5214 5212
5215 while (len > 0) { 5213 while (len > 0) {
5216 page = extent_buffer_page(eb, i); 5214 page = eb->pages[i];
5217 5215
5218 cur = min(len, (PAGE_CACHE_SIZE - offset)); 5216 cur = min(len, (PAGE_CACHE_SIZE - offset));
5219 kaddr = page_address(page); 5217 kaddr = page_address(page);
@@ -5262,7 +5260,7 @@ int map_private_extent_buffer(struct extent_buffer *eb, unsigned long start,
5262 return -EINVAL; 5260 return -EINVAL;
5263 } 5261 }
5264 5262
5265 p = extent_buffer_page(eb, i); 5263 p = eb->pages[i];
5266 kaddr = page_address(p); 5264 kaddr = page_address(p);
5267 *map = kaddr + offset; 5265 *map = kaddr + offset;
5268 *map_len = PAGE_CACHE_SIZE - offset; 5266 *map_len = PAGE_CACHE_SIZE - offset;
@@ -5288,7 +5286,7 @@ int memcmp_extent_buffer(struct extent_buffer *eb, const void *ptrv,
5288 offset = (start_offset + start) & (PAGE_CACHE_SIZE - 1); 5286 offset = (start_offset + start) & (PAGE_CACHE_SIZE - 1);
5289 5287
5290 while (len > 0) { 5288 while (len > 0) {
5291 page = extent_buffer_page(eb, i); 5289 page = eb->pages[i];
5292 5290
5293 cur = min(len, (PAGE_CACHE_SIZE - offset)); 5291 cur = min(len, (PAGE_CACHE_SIZE - offset));
5294 5292
@@ -5322,7 +5320,7 @@ void write_extent_buffer(struct extent_buffer *eb, const void *srcv,
5322 offset = (start_offset + start) & (PAGE_CACHE_SIZE - 1); 5320 offset = (start_offset + start) & (PAGE_CACHE_SIZE - 1);
5323 5321
5324 while (len > 0) { 5322 while (len > 0) {
5325 page = extent_buffer_page(eb, i); 5323 page = eb->pages[i];
5326 WARN_ON(!PageUptodate(page)); 5324 WARN_ON(!PageUptodate(page));
5327 5325
5328 cur = min(len, PAGE_CACHE_SIZE - offset); 5326 cur = min(len, PAGE_CACHE_SIZE - offset);
@@ -5352,7 +5350,7 @@ void memset_extent_buffer(struct extent_buffer *eb, char c,
5352 offset = (start_offset + start) & (PAGE_CACHE_SIZE - 1); 5350 offset = (start_offset + start) & (PAGE_CACHE_SIZE - 1);
5353 5351
5354 while (len > 0) { 5352 while (len > 0) {
5355 page = extent_buffer_page(eb, i); 5353 page = eb->pages[i];
5356 WARN_ON(!PageUptodate(page)); 5354 WARN_ON(!PageUptodate(page));
5357 5355
5358 cur = min(len, PAGE_CACHE_SIZE - offset); 5356 cur = min(len, PAGE_CACHE_SIZE - offset);
@@ -5383,7 +5381,7 @@ void copy_extent_buffer(struct extent_buffer *dst, struct extent_buffer *src,
5383 (PAGE_CACHE_SIZE - 1); 5381 (PAGE_CACHE_SIZE - 1);
5384 5382
5385 while (len > 0) { 5383 while (len > 0) {
5386 page = extent_buffer_page(dst, i); 5384 page = dst->pages[i];
5387 WARN_ON(!PageUptodate(page)); 5385 WARN_ON(!PageUptodate(page));
5388 5386
5389 cur = min(len, (unsigned long)(PAGE_CACHE_SIZE - offset)); 5387 cur = min(len, (unsigned long)(PAGE_CACHE_SIZE - offset));
@@ -5461,8 +5459,7 @@ void memcpy_extent_buffer(struct extent_buffer *dst, unsigned long dst_offset,
5461 cur = min_t(unsigned long, cur, 5459 cur = min_t(unsigned long, cur,
5462 (unsigned long)(PAGE_CACHE_SIZE - dst_off_in_page)); 5460 (unsigned long)(PAGE_CACHE_SIZE - dst_off_in_page));
5463 5461
5464 copy_pages(extent_buffer_page(dst, dst_i), 5462 copy_pages(dst->pages[dst_i], dst->pages[src_i],
5465 extent_buffer_page(dst, src_i),
5466 dst_off_in_page, src_off_in_page, cur); 5463 dst_off_in_page, src_off_in_page, cur);
5467 5464
5468 src_offset += cur; 5465 src_offset += cur;
@@ -5508,8 +5505,7 @@ void memmove_extent_buffer(struct extent_buffer *dst, unsigned long dst_offset,
5508 5505
5509 cur = min_t(unsigned long, len, src_off_in_page + 1); 5506 cur = min_t(unsigned long, len, src_off_in_page + 1);
5510 cur = min(cur, dst_off_in_page + 1); 5507 cur = min(cur, dst_off_in_page + 1);
5511 copy_pages(extent_buffer_page(dst, dst_i), 5508 copy_pages(dst->pages[dst_i], dst->pages[src_i],
5512 extent_buffer_page(dst, src_i),
5513 dst_off_in_page - cur + 1, 5509 dst_off_in_page - cur + 1,
5514 src_off_in_page - cur + 1, cur); 5510 src_off_in_page - cur + 1, cur);
5515 5511