Skip to content

Commit 35ebb93

Browse files
committed
Btrfs: Fix PAGE_CACHE_SHIFT shifts on 32 bit machines
Signed-off-by: Chris Mason <[email protected]>
1 parent 2ff3e9b commit 35ebb93

File tree

5 files changed

+26
-22
lines changed

5 files changed

+26
-22
lines changed

fs/btrfs/disk-io.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ static int csum_tree_block(struct btrfs_root *root, struct extent_buffer *buf,
159159
int csum_dirty_buffer(struct btrfs_root *root, struct page *page)
160160
{
161161
struct extent_map_tree *tree;
162-
u64 start = page->index << PAGE_CACHE_SHIFT;
162+
u64 start = (u64)page->index << PAGE_CACHE_SHIFT;
163163
u64 found_start;
164164
int found_level;
165165
unsigned long len;

fs/btrfs/extent_map.c

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1229,7 +1229,7 @@ EXPORT_SYMBOL(test_range_bit);
12291229
static int check_page_uptodate(struct extent_map_tree *tree,
12301230
struct page *page)
12311231
{
1232-
u64 start = page->index << PAGE_CACHE_SHIFT;
1232+
u64 start = (u64)page->index << PAGE_CACHE_SHIFT;
12331233
u64 end = start + PAGE_CACHE_SIZE - 1;
12341234
if (test_range_bit(tree, start, end, EXTENT_UPTODATE, 1))
12351235
SetPageUptodate(page);
@@ -1243,7 +1243,7 @@ static int check_page_uptodate(struct extent_map_tree *tree,
12431243
static int check_page_locked(struct extent_map_tree *tree,
12441244
struct page *page)
12451245
{
1246-
u64 start = page->index << PAGE_CACHE_SHIFT;
1246+
u64 start = (u64)page->index << PAGE_CACHE_SHIFT;
12471247
u64 end = start + PAGE_CACHE_SIZE - 1;
12481248
if (!test_range_bit(tree, start, end, EXTENT_LOCKED, 0))
12491249
unlock_page(page);
@@ -1257,7 +1257,7 @@ static int check_page_locked(struct extent_map_tree *tree,
12571257
static int check_page_writeback(struct extent_map_tree *tree,
12581258
struct page *page)
12591259
{
1260-
u64 start = page->index << PAGE_CACHE_SHIFT;
1260+
u64 start = (u64)page->index << PAGE_CACHE_SHIFT;
12611261
u64 end = start + PAGE_CACHE_SIZE - 1;
12621262
if (!test_range_bit(tree, start, end, EXTENT_WRITEBACK, 0))
12631263
end_page_writeback(page);
@@ -1296,7 +1296,8 @@ static int end_bio_extent_writepage(struct bio *bio,
12961296

12971297
do {
12981298
struct page *page = bvec->bv_page;
1299-
start = (page->index << PAGE_CACHE_SHIFT) + bvec->bv_offset;
1299+
start = ((u64)page->index << PAGE_CACHE_SHIFT) +
1300+
bvec->bv_offset;
13001301
end = start + bvec->bv_len - 1;
13011302

13021303
if (bvec->bv_offset == 0 && bvec->bv_len == PAGE_CACHE_SIZE)
@@ -1361,7 +1362,8 @@ static int end_bio_extent_readpage(struct bio *bio,
13611362

13621363
do {
13631364
struct page *page = bvec->bv_page;
1364-
start = (page->index << PAGE_CACHE_SHIFT) + bvec->bv_offset;
1365+
start = ((u64)page->index << PAGE_CACHE_SHIFT) +
1366+
bvec->bv_offset;
13651367
end = start + bvec->bv_len - 1;
13661368

13671369
if (bvec->bv_offset == 0 && bvec->bv_len == PAGE_CACHE_SIZE)
@@ -1427,7 +1429,8 @@ static int end_bio_extent_preparewrite(struct bio *bio,
14271429

14281430
do {
14291431
struct page *page = bvec->bv_page;
1430-
start = (page->index << PAGE_CACHE_SHIFT) + bvec->bv_offset;
1432+
start = ((u64)page->index << PAGE_CACHE_SHIFT) +
1433+
bvec->bv_offset;
14311434
end = start + bvec->bv_len - 1;
14321435

14331436
if (--bvec >= bio->bi_io_vec)
@@ -1503,7 +1506,7 @@ int extent_read_full_page(struct extent_map_tree *tree, struct page *page,
15031506
get_extent_t *get_extent)
15041507
{
15051508
struct inode *inode = page->mapping->host;
1506-
u64 start = page->index << PAGE_CACHE_SHIFT;
1509+
u64 start = (u64)page->index << PAGE_CACHE_SHIFT;
15071510
u64 page_end = start + PAGE_CACHE_SIZE - 1;
15081511
u64 end;
15091512
u64 cur = start;
@@ -1608,7 +1611,7 @@ int extent_write_full_page(struct extent_map_tree *tree, struct page *page,
16081611
struct writeback_control *wbc)
16091612
{
16101613
struct inode *inode = page->mapping->host;
1611-
u64 start = page->index << PAGE_CACHE_SHIFT;
1614+
u64 start = (u64)page->index << PAGE_CACHE_SHIFT;
16121615
u64 page_end = start + PAGE_CACHE_SIZE - 1;
16131616
u64 end;
16141617
u64 cur = start;
@@ -1750,7 +1753,7 @@ EXPORT_SYMBOL(extent_write_full_page);
17501753
int extent_invalidatepage(struct extent_map_tree *tree,
17511754
struct page *page, unsigned long offset)
17521755
{
1753-
u64 start = (page->index << PAGE_CACHE_SHIFT);
1756+
u64 start = ((u64)page->index << PAGE_CACHE_SHIFT);
17541757
u64 end = start + PAGE_CACHE_SIZE - 1;
17551758
size_t blocksize = page->mapping->host->i_sb->s_blocksize;
17561759

@@ -1792,7 +1795,7 @@ int extent_prepare_write(struct extent_map_tree *tree,
17921795
struct inode *inode, struct page *page,
17931796
unsigned from, unsigned to, get_extent_t *get_extent)
17941797
{
1795-
u64 page_start = page->index << PAGE_CACHE_SHIFT;
1798+
u64 page_start = (u64)page->index << PAGE_CACHE_SHIFT;
17961799
u64 page_end = page_start + PAGE_CACHE_SIZE - 1;
17971800
u64 block_start;
17981801
u64 orig_block_start;
@@ -1890,7 +1893,7 @@ EXPORT_SYMBOL(extent_prepare_write);
18901893
int try_release_extent_mapping(struct extent_map_tree *tree, struct page *page)
18911894
{
18921895
struct extent_map *em;
1893-
u64 start = page->index << PAGE_CACHE_SHIFT;
1896+
u64 start = (u64)page->index << PAGE_CACHE_SHIFT;
18941897
u64 end = start + PAGE_CACHE_SIZE - 1;
18951898
u64 orig_start = start;
18961899
int ret = 1;
@@ -2202,7 +2205,7 @@ int clear_extent_buffer_dirty(struct extent_map_tree *tree,
22022205
if ((i == 0 && (eb->start & (PAGE_CACHE_SIZE - 1))) ||
22032206
((i == num_pages - 1) &&
22042207
((eb->start + eb->len) & (PAGE_CACHE_SIZE - 1)))) {
2205-
start = page->index << PAGE_CACHE_SHIFT;
2208+
start = (u64)page->index << PAGE_CACHE_SHIFT;
22062209
end = start + PAGE_CACHE_SIZE - 1;
22072210
if (test_range_bit(tree, start, end,
22082211
EXTENT_DIRTY, 0)) {

fs/btrfs/file.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -301,7 +301,8 @@ static int dirty_and_release_pages(struct btrfs_trans_handle *trans,
301301
SetPageUptodate(p);
302302
set_page_dirty(p);
303303
}
304-
last_end = pages[num_pages -1]->index << PAGE_CACHE_SHIFT;
304+
last_end = (u64)(pages[num_pages -1]->index) <<
305+
PAGE_CACHE_SHIFT;
305306
last_end += PAGE_CACHE_SIZE - 1;
306307
set_extent_delalloc(em_tree, start_pos, end_of_last_block,
307308
GFP_NOFS);

fs/btrfs/inode.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ int btrfs_writepage_io_hook(struct page *page, u64 start, u64 end)
111111
struct btrfs_trans_handle *trans;
112112
char *kaddr;
113113
int ret;
114-
u64 page_start = page->index << PAGE_CACHE_SHIFT;
114+
u64 page_start = (u64)page->index << PAGE_CACHE_SHIFT;
115115
size_t offset = start - page_start;
116116

117117
mutex_lock(&root->fs_info->fs_mutex);
@@ -160,7 +160,7 @@ int btrfs_readpage_io_hook(struct page *page, u64 start, u64 end)
160160

161161
int btrfs_readpage_end_io_hook(struct page *page, u64 start, u64 end)
162162
{
163-
size_t offset = start - (page->index << PAGE_CACHE_SHIFT);
163+
size_t offset = start - ((u64)page->index << PAGE_CACHE_SHIFT);
164164
struct inode *inode = page->mapping->host;
165165
struct extent_map_tree *em_tree = &BTRFS_I(inode)->extent_tree;
166166
char *kaddr;
@@ -688,7 +688,7 @@ static int btrfs_cow_one_page(struct inode *inode, struct page *page,
688688
char *kaddr;
689689
int ret = 0;
690690
struct extent_map_tree *em_tree = &BTRFS_I(inode)->extent_tree;
691-
u64 page_start = page->index << PAGE_CACHE_SHIFT;
691+
u64 page_start = (u64)page->index << PAGE_CACHE_SHIFT;
692692
u64 page_end = page_start + PAGE_CACHE_SIZE - 1;
693693

694694
set_page_extent_mapped(page);
@@ -739,7 +739,7 @@ static int btrfs_truncate_page(struct address_space *mapping, loff_t from)
739739
goto out;
740740
}
741741
}
742-
page_start = page->index << PAGE_CACHE_SHIFT;
742+
page_start = (u64)page->index << PAGE_CACHE_SHIFT;
743743

744744
ret = btrfs_cow_one_page(inode, page, offset);
745745

@@ -1618,7 +1618,7 @@ struct extent_map *btrfs_get_extent(struct inode *inode, struct page *page,
16181618
goto out;
16191619
}
16201620

1621-
extent_offset = (page->index << PAGE_CACHE_SHIFT) -
1621+
extent_offset = ((u64)page->index << PAGE_CACHE_SHIFT) -
16221622
extent_start + page_offset;
16231623
copy_size = min_t(u64, PAGE_CACHE_SIZE - page_offset,
16241624
size - extent_offset);
@@ -1769,7 +1769,7 @@ int btrfs_page_mkwrite(struct vm_area_struct *vma, struct page *page)
17691769
lock_page(page);
17701770
wait_on_page_writeback(page);
17711771
size = i_size_read(inode);
1772-
page_start = page->index << PAGE_CACHE_SHIFT;
1772+
page_start = (u64)page->index << PAGE_CACHE_SHIFT;
17731773

17741774
if ((page->mapping != inode->i_mapping) ||
17751775
(page_start > size)) {
@@ -2065,7 +2065,7 @@ int btrfs_defrag_file(struct file *file) {
20652065
goto out_unlock;
20662066
}
20672067
}
2068-
page_start = page->index << PAGE_CACHE_SHIFT;
2068+
page_start = (u64)page->index << PAGE_CACHE_SHIFT;
20692069
page_end = page_start + PAGE_CACHE_SIZE - 1;
20702070

20712071
lock_extent(em_tree, page_start, page_end, GFP_NOFS);

fs/btrfs/transaction.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ int btrfs_write_and_wait_transaction(struct btrfs_trans_handle *trans,
169169
clear_extent_dirty(dirty_pages, start, end, GFP_NOFS);
170170
while(start <= end) {
171171
index = start >> PAGE_CACHE_SHIFT;
172-
start = (index + 1) << PAGE_CACHE_SHIFT;
172+
start = (u64)(index + 1) << PAGE_CACHE_SHIFT;
173173
page = find_lock_page(btree_inode->i_mapping, index);
174174
if (!page)
175175
continue;

0 commit comments

Comments
 (0)