diff options
author | Chris Mason <clm@fb.com> | 2014-10-04 12:56:45 -0400 |
---|---|---|
committer | Chris Mason <clm@fb.com> | 2014-10-04 12:56:45 -0400 |
commit | bbf65cf0b5b67843ca094df01019222b85af2183 (patch) | |
tree | 35e1a8c54876cc8a105a2ad0230526195d3cafbf /fs/btrfs/extent_io.c | |
parent | bf8e8ca6fd4ac6e8edc58b92cffb2ffd51933138 (diff) | |
parent | fccb84c94a9755f48668e43d0a44d6ecc750900f (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.c | 66 |
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 | */ |
4515 | static void btrfs_release_extent_buffer_page(struct extent_buffer *eb, | 4515 | static 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 | */ |
4569 | static inline void btrfs_release_extent_buffer(struct extent_buffer *eb) | 4566 | static 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, | |||
5155 | unlock_exit: | 5153 | unlock_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 | ||