|
@@ -2064,7 +2064,7 @@ int repair_eb_io_failure(struct btrfs_root *root, struct extent_buffer *eb,
|
|
|
return -EROFS;
|
|
|
|
|
|
for (i = 0; i < num_pages; i++) {
|
|
|
- struct page *p = extent_buffer_page(eb, i);
|
|
|
+ struct page *p = eb->pages[i];
|
|
|
|
|
|
ret = repair_io_failure(root->fs_info->btree_inode, start,
|
|
|
PAGE_CACHE_SIZE, start, p,
|
|
@@ -3580,7 +3580,7 @@ lock_extent_buffer_for_io(struct extent_buffer *eb,
|
|
|
|
|
|
num_pages = num_extent_pages(eb->start, eb->len);
|
|
|
for (i = 0; i < num_pages; i++) {
|
|
|
- struct page *p = extent_buffer_page(eb, i);
|
|
|
+ struct page *p = eb->pages[i];
|
|
|
|
|
|
if (!trylock_page(p)) {
|
|
|
if (!flush) {
|
|
@@ -3712,7 +3712,7 @@ static noinline_for_stack int write_one_eb(struct extent_buffer *eb,
|
|
|
bio_flags = EXTENT_BIO_TREE_LOG;
|
|
|
|
|
|
for (i = 0; i < num_pages; i++) {
|
|
|
- struct page *p = extent_buffer_page(eb, i);
|
|
|
+ struct page *p = eb->pages[i];
|
|
|
|
|
|
clear_page_dirty_for_io(p);
|
|
|
set_page_writeback(p);
|
|
@@ -3736,7 +3736,7 @@ static noinline_for_stack int write_one_eb(struct extent_buffer *eb,
|
|
|
|
|
|
if (unlikely(ret)) {
|
|
|
for (; i < num_pages; i++) {
|
|
|
- struct page *p = extent_buffer_page(eb, i);
|
|
|
+ struct page *p = eb->pages[i];
|
|
|
clear_page_dirty_for_io(p);
|
|
|
unlock_page(p);
|
|
|
}
|
|
@@ -4512,24 +4512,21 @@ int extent_buffer_under_io(struct extent_buffer *eb)
|
|
|
/*
|
|
|
* Helper for releasing extent buffer page.
|
|
|
*/
|
|
|
-static void btrfs_release_extent_buffer_page(struct extent_buffer *eb,
|
|
|
- unsigned long start_idx)
|
|
|
+static void btrfs_release_extent_buffer_page(struct extent_buffer *eb)
|
|
|
{
|
|
|
unsigned long index;
|
|
|
- unsigned long num_pages;
|
|
|
struct page *page;
|
|
|
int mapped = !test_bit(EXTENT_BUFFER_DUMMY, &eb->bflags);
|
|
|
|
|
|
BUG_ON(extent_buffer_under_io(eb));
|
|
|
|
|
|
- num_pages = num_extent_pages(eb->start, eb->len);
|
|
|
- index = start_idx + num_pages;
|
|
|
- if (start_idx >= index)
|
|
|
+ index = num_extent_pages(eb->start, eb->len);
|
|
|
+ if (index == 0)
|
|
|
return;
|
|
|
|
|
|
do {
|
|
|
index--;
|
|
|
- page = extent_buffer_page(eb, index);
|
|
|
+ page = eb->pages[index];
|
|
|
if (page && mapped) {
|
|
|
spin_lock(&page->mapping->private_lock);
|
|
|
/*
|
|
@@ -4560,7 +4557,7 @@ static void btrfs_release_extent_buffer_page(struct extent_buffer *eb,
|
|
|
/* One for when we alloced the page */
|
|
|
page_cache_release(page);
|
|
|
}
|
|
|
- } while (index != start_idx);
|
|
|
+ } while (index != 0);
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -4568,7 +4565,7 @@ static void btrfs_release_extent_buffer_page(struct extent_buffer *eb,
|
|
|
*/
|
|
|
static inline void btrfs_release_extent_buffer(struct extent_buffer *eb)
|
|
|
{
|
|
|
- btrfs_release_extent_buffer_page(eb, 0);
|
|
|
+ btrfs_release_extent_buffer_page(eb);
|
|
|
__free_extent_buffer(eb);
|
|
|
}
|
|
|
|
|
@@ -4711,7 +4708,8 @@ static void mark_extent_buffer_accessed(struct extent_buffer *eb,
|
|
|
|
|
|
num_pages = num_extent_pages(eb->start, eb->len);
|
|
|
for (i = 0; i < num_pages; i++) {
|
|
|
- struct page *p = extent_buffer_page(eb, i);
|
|
|
+ struct page *p = eb->pages[i];
|
|
|
+
|
|
|
if (p != accessed)
|
|
|
mark_page_accessed(p);
|
|
|
}
|
|
@@ -4880,7 +4878,7 @@ again:
|
|
|
*/
|
|
|
SetPageChecked(eb->pages[0]);
|
|
|
for (i = 1; i < num_pages; i++) {
|
|
|
- p = extent_buffer_page(eb, i);
|
|
|
+ p = eb->pages[i];
|
|
|
ClearPageChecked(p);
|
|
|
unlock_page(p);
|
|
|
}
|
|
@@ -4925,7 +4923,7 @@ static int release_extent_buffer(struct extent_buffer *eb)
|
|
|
}
|
|
|
|
|
|
/* Should be safe to release our pages at this point */
|
|
|
- btrfs_release_extent_buffer_page(eb, 0);
|
|
|
+ btrfs_release_extent_buffer_page(eb);
|
|
|
call_rcu(&eb->rcu_head, btrfs_release_extent_buffer_rcu);
|
|
|
return 1;
|
|
|
}
|
|
@@ -4991,7 +4989,7 @@ void clear_extent_buffer_dirty(struct extent_buffer *eb)
|
|
|
num_pages = num_extent_pages(eb->start, eb->len);
|
|
|
|
|
|
for (i = 0; i < num_pages; i++) {
|
|
|
- page = extent_buffer_page(eb, i);
|
|
|
+ page = eb->pages[i];
|
|
|
if (!PageDirty(page))
|
|
|
continue;
|
|
|
|
|
@@ -5027,7 +5025,7 @@ int set_extent_buffer_dirty(struct extent_buffer *eb)
|
|
|
WARN_ON(!test_bit(EXTENT_BUFFER_TREE_REF, &eb->bflags));
|
|
|
|
|
|
for (i = 0; i < num_pages; i++)
|
|
|
- set_page_dirty(extent_buffer_page(eb, i));
|
|
|
+ set_page_dirty(eb->pages[i]);
|
|
|
return was_dirty;
|
|
|
}
|
|
|
|
|
@@ -5040,7 +5038,7 @@ int clear_extent_buffer_uptodate(struct extent_buffer *eb)
|
|
|
clear_bit(EXTENT_BUFFER_UPTODATE, &eb->bflags);
|
|
|
num_pages = num_extent_pages(eb->start, eb->len);
|
|
|
for (i = 0; i < num_pages; i++) {
|
|
|
- page = extent_buffer_page(eb, i);
|
|
|
+ page = eb->pages[i];
|
|
|
if (page)
|
|
|
ClearPageUptodate(page);
|
|
|
}
|
|
@@ -5056,7 +5054,7 @@ int set_extent_buffer_uptodate(struct extent_buffer *eb)
|
|
|
set_bit(EXTENT_BUFFER_UPTODATE, &eb->bflags);
|
|
|
num_pages = num_extent_pages(eb->start, eb->len);
|
|
|
for (i = 0; i < num_pages; i++) {
|
|
|
- page = extent_buffer_page(eb, i);
|
|
|
+ page = eb->pages[i];
|
|
|
SetPageUptodate(page);
|
|
|
}
|
|
|
return 0;
|
|
@@ -5096,7 +5094,7 @@ int read_extent_buffer_pages(struct extent_io_tree *tree,
|
|
|
|
|
|
num_pages = num_extent_pages(eb->start, eb->len);
|
|
|
for (i = start_i; i < num_pages; i++) {
|
|
|
- page = extent_buffer_page(eb, i);
|
|
|
+ page = eb->pages[i];
|
|
|
if (wait == WAIT_NONE) {
|
|
|
if (!trylock_page(page))
|
|
|
goto unlock_exit;
|
|
@@ -5119,7 +5117,7 @@ int read_extent_buffer_pages(struct extent_io_tree *tree,
|
|
|
eb->read_mirror = 0;
|
|
|
atomic_set(&eb->io_pages, num_reads);
|
|
|
for (i = start_i; i < num_pages; i++) {
|
|
|
- page = extent_buffer_page(eb, i);
|
|
|
+ page = eb->pages[i];
|
|
|
if (!PageUptodate(page)) {
|
|
|
ClearPageError(page);
|
|
|
err = __extent_read_full_page(tree, page,
|
|
@@ -5144,7 +5142,7 @@ int read_extent_buffer_pages(struct extent_io_tree *tree,
|
|
|
return ret;
|
|
|
|
|
|
for (i = start_i; i < num_pages; i++) {
|
|
|
- page = extent_buffer_page(eb, i);
|
|
|
+ page = eb->pages[i];
|
|
|
wait_on_page_locked(page);
|
|
|
if (!PageUptodate(page))
|
|
|
ret = -EIO;
|
|
@@ -5155,7 +5153,7 @@ int read_extent_buffer_pages(struct extent_io_tree *tree,
|
|
|
unlock_exit:
|
|
|
i = start_i;
|
|
|
while (locked_pages > 0) {
|
|
|
- page = extent_buffer_page(eb, i);
|
|
|
+ page = eb->pages[i];
|
|
|
i++;
|
|
|
unlock_page(page);
|
|
|
locked_pages--;
|
|
@@ -5181,7 +5179,7 @@ void read_extent_buffer(struct extent_buffer *eb, void *dstv,
|
|
|
offset = (start_offset + start) & (PAGE_CACHE_SIZE - 1);
|
|
|
|
|
|
while (len > 0) {
|
|
|
- page = extent_buffer_page(eb, i);
|
|
|
+ page = eb->pages[i];
|
|
|
|
|
|
cur = min(len, (PAGE_CACHE_SIZE - offset));
|
|
|
kaddr = page_address(page);
|
|
@@ -5213,7 +5211,7 @@ int read_extent_buffer_to_user(struct extent_buffer *eb, void __user *dstv,
|
|
|
offset = (start_offset + start) & (PAGE_CACHE_SIZE - 1);
|
|
|
|
|
|
while (len > 0) {
|
|
|
- page = extent_buffer_page(eb, i);
|
|
|
+ page = eb->pages[i];
|
|
|
|
|
|
cur = min(len, (PAGE_CACHE_SIZE - offset));
|
|
|
kaddr = page_address(page);
|
|
@@ -5262,7 +5260,7 @@ int map_private_extent_buffer(struct extent_buffer *eb, unsigned long start,
|
|
|
return -EINVAL;
|
|
|
}
|
|
|
|
|
|
- p = extent_buffer_page(eb, i);
|
|
|
+ p = eb->pages[i];
|
|
|
kaddr = page_address(p);
|
|
|
*map = kaddr + offset;
|
|
|
*map_len = PAGE_CACHE_SIZE - offset;
|
|
@@ -5288,7 +5286,7 @@ int memcmp_extent_buffer(struct extent_buffer *eb, const void *ptrv,
|
|
|
offset = (start_offset + start) & (PAGE_CACHE_SIZE - 1);
|
|
|
|
|
|
while (len > 0) {
|
|
|
- page = extent_buffer_page(eb, i);
|
|
|
+ page = eb->pages[i];
|
|
|
|
|
|
cur = min(len, (PAGE_CACHE_SIZE - offset));
|
|
|
|
|
@@ -5322,7 +5320,7 @@ void write_extent_buffer(struct extent_buffer *eb, const void *srcv,
|
|
|
offset = (start_offset + start) & (PAGE_CACHE_SIZE - 1);
|
|
|
|
|
|
while (len > 0) {
|
|
|
- page = extent_buffer_page(eb, i);
|
|
|
+ page = eb->pages[i];
|
|
|
WARN_ON(!PageUptodate(page));
|
|
|
|
|
|
cur = min(len, PAGE_CACHE_SIZE - offset);
|
|
@@ -5352,7 +5350,7 @@ void memset_extent_buffer(struct extent_buffer *eb, char c,
|
|
|
offset = (start_offset + start) & (PAGE_CACHE_SIZE - 1);
|
|
|
|
|
|
while (len > 0) {
|
|
|
- page = extent_buffer_page(eb, i);
|
|
|
+ page = eb->pages[i];
|
|
|
WARN_ON(!PageUptodate(page));
|
|
|
|
|
|
cur = min(len, PAGE_CACHE_SIZE - offset);
|
|
@@ -5383,7 +5381,7 @@ void copy_extent_buffer(struct extent_buffer *dst, struct extent_buffer *src,
|
|
|
(PAGE_CACHE_SIZE - 1);
|
|
|
|
|
|
while (len > 0) {
|
|
|
- page = extent_buffer_page(dst, i);
|
|
|
+ page = dst->pages[i];
|
|
|
WARN_ON(!PageUptodate(page));
|
|
|
|
|
|
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,
|
|
|
cur = min_t(unsigned long, cur,
|
|
|
(unsigned long)(PAGE_CACHE_SIZE - dst_off_in_page));
|
|
|
|
|
|
- copy_pages(extent_buffer_page(dst, dst_i),
|
|
|
- extent_buffer_page(dst, src_i),
|
|
|
+ copy_pages(dst->pages[dst_i], dst->pages[src_i],
|
|
|
dst_off_in_page, src_off_in_page, cur);
|
|
|
|
|
|
src_offset += cur;
|
|
@@ -5508,8 +5505,7 @@ void memmove_extent_buffer(struct extent_buffer *dst, unsigned long dst_offset,
|
|
|
|
|
|
cur = min_t(unsigned long, len, src_off_in_page + 1);
|
|
|
cur = min(cur, dst_off_in_page + 1);
|
|
|
- copy_pages(extent_buffer_page(dst, dst_i),
|
|
|
- extent_buffer_page(dst, src_i),
|
|
|
+ copy_pages(dst->pages[dst_i], dst->pages[src_i],
|
|
|
dst_off_in_page - cur + 1,
|
|
|
src_off_in_page - cur + 1, cur);
|
|
|
|