Commit 35ebb934 authored by Chris Mason's avatar Chris Mason

Btrfs: Fix PAGE_CACHE_SHIFT shifts on 32 bit machines

Signed-off-by: default avatarChris Mason <chris.mason@oracle.com>
parent 2ff3e9b6
...@@ -159,7 +159,7 @@ static int csum_tree_block(struct btrfs_root *root, struct extent_buffer *buf, ...@@ -159,7 +159,7 @@ static int csum_tree_block(struct btrfs_root *root, struct extent_buffer *buf,
int csum_dirty_buffer(struct btrfs_root *root, struct page *page) int csum_dirty_buffer(struct btrfs_root *root, struct page *page)
{ {
struct extent_map_tree *tree; struct extent_map_tree *tree;
u64 start = page->index << PAGE_CACHE_SHIFT; u64 start = (u64)page->index << PAGE_CACHE_SHIFT;
u64 found_start; u64 found_start;
int found_level; int found_level;
unsigned long len; unsigned long len;
......
...@@ -1229,7 +1229,7 @@ EXPORT_SYMBOL(test_range_bit); ...@@ -1229,7 +1229,7 @@ EXPORT_SYMBOL(test_range_bit);
static int check_page_uptodate(struct extent_map_tree *tree, static int check_page_uptodate(struct extent_map_tree *tree,
struct page *page) struct page *page)
{ {
u64 start = page->index << PAGE_CACHE_SHIFT; u64 start = (u64)page->index << PAGE_CACHE_SHIFT;
u64 end = start + PAGE_CACHE_SIZE - 1; u64 end = start + PAGE_CACHE_SIZE - 1;
if (test_range_bit(tree, start, end, EXTENT_UPTODATE, 1)) if (test_range_bit(tree, start, end, EXTENT_UPTODATE, 1))
SetPageUptodate(page); SetPageUptodate(page);
...@@ -1243,7 +1243,7 @@ static int check_page_uptodate(struct extent_map_tree *tree, ...@@ -1243,7 +1243,7 @@ static int check_page_uptodate(struct extent_map_tree *tree,
static int check_page_locked(struct extent_map_tree *tree, static int check_page_locked(struct extent_map_tree *tree,
struct page *page) struct page *page)
{ {
u64 start = page->index << PAGE_CACHE_SHIFT; u64 start = (u64)page->index << PAGE_CACHE_SHIFT;
u64 end = start + PAGE_CACHE_SIZE - 1; u64 end = start + PAGE_CACHE_SIZE - 1;
if (!test_range_bit(tree, start, end, EXTENT_LOCKED, 0)) if (!test_range_bit(tree, start, end, EXTENT_LOCKED, 0))
unlock_page(page); unlock_page(page);
...@@ -1257,7 +1257,7 @@ static int check_page_locked(struct extent_map_tree *tree, ...@@ -1257,7 +1257,7 @@ static int check_page_locked(struct extent_map_tree *tree,
static int check_page_writeback(struct extent_map_tree *tree, static int check_page_writeback(struct extent_map_tree *tree,
struct page *page) struct page *page)
{ {
u64 start = page->index << PAGE_CACHE_SHIFT; u64 start = (u64)page->index << PAGE_CACHE_SHIFT;
u64 end = start + PAGE_CACHE_SIZE - 1; u64 end = start + PAGE_CACHE_SIZE - 1;
if (!test_range_bit(tree, start, end, EXTENT_WRITEBACK, 0)) if (!test_range_bit(tree, start, end, EXTENT_WRITEBACK, 0))
end_page_writeback(page); end_page_writeback(page);
...@@ -1296,7 +1296,8 @@ static int end_bio_extent_writepage(struct bio *bio, ...@@ -1296,7 +1296,8 @@ static int end_bio_extent_writepage(struct bio *bio,
do { do {
struct page *page = bvec->bv_page; struct page *page = bvec->bv_page;
start = (page->index << PAGE_CACHE_SHIFT) + bvec->bv_offset; start = ((u64)page->index << PAGE_CACHE_SHIFT) +
bvec->bv_offset;
end = start + bvec->bv_len - 1; end = start + bvec->bv_len - 1;
if (bvec->bv_offset == 0 && bvec->bv_len == PAGE_CACHE_SIZE) if (bvec->bv_offset == 0 && bvec->bv_len == PAGE_CACHE_SIZE)
...@@ -1361,7 +1362,8 @@ static int end_bio_extent_readpage(struct bio *bio, ...@@ -1361,7 +1362,8 @@ static int end_bio_extent_readpage(struct bio *bio,
do { do {
struct page *page = bvec->bv_page; struct page *page = bvec->bv_page;
start = (page->index << PAGE_CACHE_SHIFT) + bvec->bv_offset; start = ((u64)page->index << PAGE_CACHE_SHIFT) +
bvec->bv_offset;
end = start + bvec->bv_len - 1; end = start + bvec->bv_len - 1;
if (bvec->bv_offset == 0 && bvec->bv_len == PAGE_CACHE_SIZE) if (bvec->bv_offset == 0 && bvec->bv_len == PAGE_CACHE_SIZE)
...@@ -1427,7 +1429,8 @@ static int end_bio_extent_preparewrite(struct bio *bio, ...@@ -1427,7 +1429,8 @@ static int end_bio_extent_preparewrite(struct bio *bio,
do { do {
struct page *page = bvec->bv_page; struct page *page = bvec->bv_page;
start = (page->index << PAGE_CACHE_SHIFT) + bvec->bv_offset; start = ((u64)page->index << PAGE_CACHE_SHIFT) +
bvec->bv_offset;
end = start + bvec->bv_len - 1; end = start + bvec->bv_len - 1;
if (--bvec >= bio->bi_io_vec) if (--bvec >= bio->bi_io_vec)
...@@ -1503,7 +1506,7 @@ int extent_read_full_page(struct extent_map_tree *tree, struct page *page, ...@@ -1503,7 +1506,7 @@ int extent_read_full_page(struct extent_map_tree *tree, struct page *page,
get_extent_t *get_extent) get_extent_t *get_extent)
{ {
struct inode *inode = page->mapping->host; struct inode *inode = page->mapping->host;
u64 start = page->index << PAGE_CACHE_SHIFT; u64 start = (u64)page->index << PAGE_CACHE_SHIFT;
u64 page_end = start + PAGE_CACHE_SIZE - 1; u64 page_end = start + PAGE_CACHE_SIZE - 1;
u64 end; u64 end;
u64 cur = start; u64 cur = start;
...@@ -1608,7 +1611,7 @@ int extent_write_full_page(struct extent_map_tree *tree, struct page *page, ...@@ -1608,7 +1611,7 @@ int extent_write_full_page(struct extent_map_tree *tree, struct page *page,
struct writeback_control *wbc) struct writeback_control *wbc)
{ {
struct inode *inode = page->mapping->host; struct inode *inode = page->mapping->host;
u64 start = page->index << PAGE_CACHE_SHIFT; u64 start = (u64)page->index << PAGE_CACHE_SHIFT;
u64 page_end = start + PAGE_CACHE_SIZE - 1; u64 page_end = start + PAGE_CACHE_SIZE - 1;
u64 end; u64 end;
u64 cur = start; u64 cur = start;
...@@ -1750,7 +1753,7 @@ EXPORT_SYMBOL(extent_write_full_page); ...@@ -1750,7 +1753,7 @@ EXPORT_SYMBOL(extent_write_full_page);
int extent_invalidatepage(struct extent_map_tree *tree, int extent_invalidatepage(struct extent_map_tree *tree,
struct page *page, unsigned long offset) struct page *page, unsigned long offset)
{ {
u64 start = (page->index << PAGE_CACHE_SHIFT); u64 start = ((u64)page->index << PAGE_CACHE_SHIFT);
u64 end = start + PAGE_CACHE_SIZE - 1; u64 end = start + PAGE_CACHE_SIZE - 1;
size_t blocksize = page->mapping->host->i_sb->s_blocksize; size_t blocksize = page->mapping->host->i_sb->s_blocksize;
...@@ -1792,7 +1795,7 @@ int extent_prepare_write(struct extent_map_tree *tree, ...@@ -1792,7 +1795,7 @@ int extent_prepare_write(struct extent_map_tree *tree,
struct inode *inode, struct page *page, struct inode *inode, struct page *page,
unsigned from, unsigned to, get_extent_t *get_extent) unsigned from, unsigned to, get_extent_t *get_extent)
{ {
u64 page_start = page->index << PAGE_CACHE_SHIFT; u64 page_start = (u64)page->index << PAGE_CACHE_SHIFT;
u64 page_end = page_start + PAGE_CACHE_SIZE - 1; u64 page_end = page_start + PAGE_CACHE_SIZE - 1;
u64 block_start; u64 block_start;
u64 orig_block_start; u64 orig_block_start;
...@@ -1890,7 +1893,7 @@ EXPORT_SYMBOL(extent_prepare_write); ...@@ -1890,7 +1893,7 @@ EXPORT_SYMBOL(extent_prepare_write);
int try_release_extent_mapping(struct extent_map_tree *tree, struct page *page) int try_release_extent_mapping(struct extent_map_tree *tree, struct page *page)
{ {
struct extent_map *em; struct extent_map *em;
u64 start = page->index << PAGE_CACHE_SHIFT; u64 start = (u64)page->index << PAGE_CACHE_SHIFT;
u64 end = start + PAGE_CACHE_SIZE - 1; u64 end = start + PAGE_CACHE_SIZE - 1;
u64 orig_start = start; u64 orig_start = start;
int ret = 1; int ret = 1;
...@@ -2202,7 +2205,7 @@ int clear_extent_buffer_dirty(struct extent_map_tree *tree, ...@@ -2202,7 +2205,7 @@ int clear_extent_buffer_dirty(struct extent_map_tree *tree,
if ((i == 0 && (eb->start & (PAGE_CACHE_SIZE - 1))) || if ((i == 0 && (eb->start & (PAGE_CACHE_SIZE - 1))) ||
((i == num_pages - 1) && ((i == num_pages - 1) &&
((eb->start + eb->len) & (PAGE_CACHE_SIZE - 1)))) { ((eb->start + eb->len) & (PAGE_CACHE_SIZE - 1)))) {
start = page->index << PAGE_CACHE_SHIFT; start = (u64)page->index << PAGE_CACHE_SHIFT;
end = start + PAGE_CACHE_SIZE - 1; end = start + PAGE_CACHE_SIZE - 1;
if (test_range_bit(tree, start, end, if (test_range_bit(tree, start, end,
EXTENT_DIRTY, 0)) { EXTENT_DIRTY, 0)) {
......
...@@ -301,7 +301,8 @@ static int dirty_and_release_pages(struct btrfs_trans_handle *trans, ...@@ -301,7 +301,8 @@ static int dirty_and_release_pages(struct btrfs_trans_handle *trans,
SetPageUptodate(p); SetPageUptodate(p);
set_page_dirty(p); set_page_dirty(p);
} }
last_end = pages[num_pages -1]->index << PAGE_CACHE_SHIFT; last_end = (u64)(pages[num_pages -1]->index) <<
PAGE_CACHE_SHIFT;
last_end += PAGE_CACHE_SIZE - 1; last_end += PAGE_CACHE_SIZE - 1;
set_extent_delalloc(em_tree, start_pos, end_of_last_block, set_extent_delalloc(em_tree, start_pos, end_of_last_block,
GFP_NOFS); GFP_NOFS);
......
...@@ -111,7 +111,7 @@ int btrfs_writepage_io_hook(struct page *page, u64 start, u64 end) ...@@ -111,7 +111,7 @@ int btrfs_writepage_io_hook(struct page *page, u64 start, u64 end)
struct btrfs_trans_handle *trans; struct btrfs_trans_handle *trans;
char *kaddr; char *kaddr;
int ret; int ret;
u64 page_start = page->index << PAGE_CACHE_SHIFT; u64 page_start = (u64)page->index << PAGE_CACHE_SHIFT;
size_t offset = start - page_start; size_t offset = start - page_start;
mutex_lock(&root->fs_info->fs_mutex); mutex_lock(&root->fs_info->fs_mutex);
...@@ -160,7 +160,7 @@ int btrfs_readpage_io_hook(struct page *page, u64 start, u64 end) ...@@ -160,7 +160,7 @@ int btrfs_readpage_io_hook(struct page *page, u64 start, u64 end)
int btrfs_readpage_end_io_hook(struct page *page, u64 start, u64 end) int btrfs_readpage_end_io_hook(struct page *page, u64 start, u64 end)
{ {
size_t offset = start - (page->index << PAGE_CACHE_SHIFT); size_t offset = start - ((u64)page->index << PAGE_CACHE_SHIFT);
struct inode *inode = page->mapping->host; struct inode *inode = page->mapping->host;
struct extent_map_tree *em_tree = &BTRFS_I(inode)->extent_tree; struct extent_map_tree *em_tree = &BTRFS_I(inode)->extent_tree;
char *kaddr; char *kaddr;
...@@ -688,7 +688,7 @@ static int btrfs_cow_one_page(struct inode *inode, struct page *page, ...@@ -688,7 +688,7 @@ static int btrfs_cow_one_page(struct inode *inode, struct page *page,
char *kaddr; char *kaddr;
int ret = 0; int ret = 0;
struct extent_map_tree *em_tree = &BTRFS_I(inode)->extent_tree; struct extent_map_tree *em_tree = &BTRFS_I(inode)->extent_tree;
u64 page_start = page->index << PAGE_CACHE_SHIFT; u64 page_start = (u64)page->index << PAGE_CACHE_SHIFT;
u64 page_end = page_start + PAGE_CACHE_SIZE - 1; u64 page_end = page_start + PAGE_CACHE_SIZE - 1;
set_page_extent_mapped(page); set_page_extent_mapped(page);
...@@ -739,7 +739,7 @@ static int btrfs_truncate_page(struct address_space *mapping, loff_t from) ...@@ -739,7 +739,7 @@ static int btrfs_truncate_page(struct address_space *mapping, loff_t from)
goto out; goto out;
} }
} }
page_start = page->index << PAGE_CACHE_SHIFT; page_start = (u64)page->index << PAGE_CACHE_SHIFT;
ret = btrfs_cow_one_page(inode, page, offset); ret = btrfs_cow_one_page(inode, page, offset);
...@@ -1618,7 +1618,7 @@ struct extent_map *btrfs_get_extent(struct inode *inode, struct page *page, ...@@ -1618,7 +1618,7 @@ struct extent_map *btrfs_get_extent(struct inode *inode, struct page *page,
goto out; goto out;
} }
extent_offset = (page->index << PAGE_CACHE_SHIFT) - extent_offset = ((u64)page->index << PAGE_CACHE_SHIFT) -
extent_start + page_offset; extent_start + page_offset;
copy_size = min_t(u64, PAGE_CACHE_SIZE - page_offset, copy_size = min_t(u64, PAGE_CACHE_SIZE - page_offset,
size - extent_offset); size - extent_offset);
...@@ -1769,7 +1769,7 @@ int btrfs_page_mkwrite(struct vm_area_struct *vma, struct page *page) ...@@ -1769,7 +1769,7 @@ int btrfs_page_mkwrite(struct vm_area_struct *vma, struct page *page)
lock_page(page); lock_page(page);
wait_on_page_writeback(page); wait_on_page_writeback(page);
size = i_size_read(inode); size = i_size_read(inode);
page_start = page->index << PAGE_CACHE_SHIFT; page_start = (u64)page->index << PAGE_CACHE_SHIFT;
if ((page->mapping != inode->i_mapping) || if ((page->mapping != inode->i_mapping) ||
(page_start > size)) { (page_start > size)) {
...@@ -2065,7 +2065,7 @@ int btrfs_defrag_file(struct file *file) { ...@@ -2065,7 +2065,7 @@ int btrfs_defrag_file(struct file *file) {
goto out_unlock; goto out_unlock;
} }
} }
page_start = page->index << PAGE_CACHE_SHIFT; page_start = (u64)page->index << PAGE_CACHE_SHIFT;
page_end = page_start + PAGE_CACHE_SIZE - 1; page_end = page_start + PAGE_CACHE_SIZE - 1;
lock_extent(em_tree, page_start, page_end, GFP_NOFS); lock_extent(em_tree, page_start, page_end, GFP_NOFS);
......
...@@ -169,7 +169,7 @@ int btrfs_write_and_wait_transaction(struct btrfs_trans_handle *trans, ...@@ -169,7 +169,7 @@ int btrfs_write_and_wait_transaction(struct btrfs_trans_handle *trans,
clear_extent_dirty(dirty_pages, start, end, GFP_NOFS); clear_extent_dirty(dirty_pages, start, end, GFP_NOFS);
while(start <= end) { while(start <= end) {
index = start >> PAGE_CACHE_SHIFT; index = start >> PAGE_CACHE_SHIFT;
start = (index + 1) << PAGE_CACHE_SHIFT; start = (u64)(index + 1) << PAGE_CACHE_SHIFT;
page = find_lock_page(btree_inode->i_mapping, index); page = find_lock_page(btree_inode->i_mapping, index);
if (!page) if (!page)
continue; continue;
......
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