Commit 53ac7ead authored by Nikolay Borisov's avatar Nikolay Borisov Committed by David Sterba

btrfs: make btrfs_invalidatepage work on btrfs_inode

Reviewed-by: default avatarJohannes Thumshirn <johannes.thumshirn@wdc.com>
Reviewed-by: default avatarJosef Bacik <josef@toxicpanda.com>
Signed-off-by: default avatarNikolay Borisov <nborisov@suse.com>
Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
parent 6fee248d
...@@ -8124,15 +8124,15 @@ static int btrfs_migratepage(struct address_space *mapping, ...@@ -8124,15 +8124,15 @@ static int btrfs_migratepage(struct address_space *mapping,
static void btrfs_invalidatepage(struct page *page, unsigned int offset, static void btrfs_invalidatepage(struct page *page, unsigned int offset,
unsigned int length) unsigned int length)
{ {
struct inode *inode = page->mapping->host; struct btrfs_inode *inode = BTRFS_I(page->mapping->host);
struct extent_io_tree *tree; struct extent_io_tree *tree = &inode->io_tree;
struct btrfs_ordered_extent *ordered; struct btrfs_ordered_extent *ordered;
struct extent_state *cached_state = NULL; struct extent_state *cached_state = NULL;
u64 page_start = page_offset(page); u64 page_start = page_offset(page);
u64 page_end = page_start + PAGE_SIZE - 1; u64 page_end = page_start + PAGE_SIZE - 1;
u64 start; u64 start;
u64 end; u64 end;
int inode_evicting = inode->i_state & I_FREEING; int inode_evicting = inode->vfs_inode.i_state & I_FREEING;
/* /*
* we have the page locked, so new writeback can't start, * we have the page locked, so new writeback can't start,
...@@ -8143,7 +8143,6 @@ static void btrfs_invalidatepage(struct page *page, unsigned int offset, ...@@ -8143,7 +8143,6 @@ static void btrfs_invalidatepage(struct page *page, unsigned int offset,
*/ */
wait_on_page_writeback(page); wait_on_page_writeback(page);
tree = &BTRFS_I(inode)->io_tree;
if (offset) { if (offset) {
btrfs_releasepage(page, GFP_NOFS); btrfs_releasepage(page, GFP_NOFS);
return; return;
...@@ -8153,8 +8152,7 @@ static void btrfs_invalidatepage(struct page *page, unsigned int offset, ...@@ -8153,8 +8152,7 @@ static void btrfs_invalidatepage(struct page *page, unsigned int offset,
lock_extent_bits(tree, page_start, page_end, &cached_state); lock_extent_bits(tree, page_start, page_end, &cached_state);
again: again:
start = page_start; start = page_start;
ordered = btrfs_lookup_ordered_range(BTRFS_I(inode), start, ordered = btrfs_lookup_ordered_range(inode, start, page_end - start + 1);
page_end - start + 1);
if (ordered) { if (ordered) {
end = min(page_end, end = min(page_end,
ordered->file_offset + ordered->num_bytes - 1); ordered->file_offset + ordered->num_bytes - 1);
...@@ -8175,7 +8173,7 @@ static void btrfs_invalidatepage(struct page *page, unsigned int offset, ...@@ -8175,7 +8173,7 @@ static void btrfs_invalidatepage(struct page *page, unsigned int offset,
struct btrfs_ordered_inode_tree *tree; struct btrfs_ordered_inode_tree *tree;
u64 new_len; u64 new_len;
tree = &BTRFS_I(inode)->ordered_tree; tree = &inode->ordered_tree;
spin_lock_irq(&tree->lock); spin_lock_irq(&tree->lock);
set_bit(BTRFS_ORDERED_TRUNCATED, &ordered->flags); set_bit(BTRFS_ORDERED_TRUNCATED, &ordered->flags);
...@@ -8184,8 +8182,8 @@ static void btrfs_invalidatepage(struct page *page, unsigned int offset, ...@@ -8184,8 +8182,8 @@ static void btrfs_invalidatepage(struct page *page, unsigned int offset,
ordered->truncated_len = new_len; ordered->truncated_len = new_len;
spin_unlock_irq(&tree->lock); spin_unlock_irq(&tree->lock);
if (btrfs_dec_test_ordered_pending(BTRFS_I(inode), if (btrfs_dec_test_ordered_pending(inode, &ordered,
&ordered, start, start,
end - start + 1, 1)) end - start + 1, 1))
btrfs_finish_ordered_io(ordered); btrfs_finish_ordered_io(ordered);
} }
...@@ -8214,7 +8212,7 @@ static void btrfs_invalidatepage(struct page *page, unsigned int offset, ...@@ -8214,7 +8212,7 @@ static void btrfs_invalidatepage(struct page *page, unsigned int offset,
* bit of its io_tree, and free the qgroup reserved data space. * bit of its io_tree, and free the qgroup reserved data space.
* Since the IO will never happen for this page. * Since the IO will never happen for this page.
*/ */
btrfs_qgroup_free_data(BTRFS_I(inode), NULL, page_start, PAGE_SIZE); btrfs_qgroup_free_data(inode, NULL, page_start, PAGE_SIZE);
if (!inode_evicting) { if (!inode_evicting) {
clear_extent_bit(tree, page_start, page_end, EXTENT_LOCKED | clear_extent_bit(tree, page_start, page_end, EXTENT_LOCKED |
EXTENT_DELALLOC | EXTENT_DELALLOC_NEW | EXTENT_DELALLOC | EXTENT_DELALLOC_NEW |
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment