diff options
author | Jaegeuk Kim <jaegeuk.kim@samsung.com> | 2013-11-27 22:44:05 -0500 |
---|---|---|
committer | Jaegeuk Kim <jaegeuk.kim@samsung.com> | 2013-12-22 20:18:04 -0500 |
commit | f9a4e6df52edf8ce1040d1b8d340d31234a1bce3 (patch) | |
tree | 582de93c164bba60633884bc3834d546da5cb529 /fs | |
parent | 36795567942a033ef9e22d8eba86396ffb9aa80c (diff) |
f2fs: bug fix on bit overflow from 32bits to 64bits
This patch fixes some bit overflows by the shift operations.
Dan Carpenter reported potential bugs on bit overflows as follows.
fs/f2fs/segment.c:910 submit_write_page()
warn: should 'blk_addr << ((sbi)->log_blocksize - 9)' be a 64 bit type?
fs/f2fs/checkpoint.c:429 get_valid_checkpoint()
warn: should '1 << ()' be a 64 bit type?
fs/f2fs/data.c:408 f2fs_readpage()
warn: should 'blk_addr << ((sbi)->log_blocksize - 9)' be a 64 bit type?
fs/f2fs/data.c:457 submit_read_page()
warn: should 'blk_addr << ((sbi)->log_blocksize - 9)' be a 64 bit type?
fs/f2fs/data.c:525 get_data_block_ro()
warn: should 'i << blkbits' be a 64 bit type?
Bug-Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/f2fs/checkpoint.c | 3 | ||||
-rw-r--r-- | fs/f2fs/data.c | 2 | ||||
-rw-r--r-- | fs/f2fs/segment.c | 4 | ||||
-rw-r--r-- | fs/f2fs/segment.h | 4 |
4 files changed, 7 insertions, 6 deletions
diff --git a/fs/f2fs/checkpoint.c b/fs/f2fs/checkpoint.c index 3e62987e333a..21e721534965 100644 --- a/fs/f2fs/checkpoint.c +++ b/fs/f2fs/checkpoint.c | |||
@@ -426,7 +426,8 @@ int get_valid_checkpoint(struct f2fs_sb_info *sbi) | |||
426 | cp1 = validate_checkpoint(sbi, cp_start_blk_no, &cp1_version); | 426 | cp1 = validate_checkpoint(sbi, cp_start_blk_no, &cp1_version); |
427 | 427 | ||
428 | /* The second checkpoint pack should start at the next segment */ | 428 | /* The second checkpoint pack should start at the next segment */ |
429 | cp_start_blk_no += 1 << le32_to_cpu(fsb->log_blocks_per_seg); | 429 | cp_start_blk_no += ((unsigned long long)1) << |
430 | le32_to_cpu(fsb->log_blocks_per_seg); | ||
430 | cp2 = validate_checkpoint(sbi, cp_start_blk_no, &cp2_version); | 431 | cp2 = validate_checkpoint(sbi, cp_start_blk_no, &cp2_version); |
431 | 432 | ||
432 | if (cp1 && cp2) { | 433 | if (cp1 && cp2) { |
diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c index 2d02cf36d806..24f752de6a90 100644 --- a/fs/f2fs/data.c +++ b/fs/f2fs/data.c | |||
@@ -525,7 +525,7 @@ static int get_data_block_ro(struct inode *inode, sector_t iblock, | |||
525 | != (dn.data_blkaddr + i)) || maxblocks == i) | 525 | != (dn.data_blkaddr + i)) || maxblocks == i) |
526 | break; | 526 | break; |
527 | map_bh(bh_result, inode->i_sb, dn.data_blkaddr); | 527 | map_bh(bh_result, inode->i_sb, dn.data_blkaddr); |
528 | bh_result->b_size = (i << blkbits); | 528 | bh_result->b_size = (((size_t)i) << blkbits); |
529 | } | 529 | } |
530 | f2fs_put_dnode(&dn); | 530 | f2fs_put_dnode(&dn); |
531 | trace_f2fs_get_data_block(inode, iblock, bh_result, 0); | 531 | trace_f2fs_get_data_block(inode, iblock, bh_result, 0); |
diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c index 1e8371392dcd..03878634a0fe 100644 --- a/fs/f2fs/segment.c +++ b/fs/f2fs/segment.c | |||
@@ -270,8 +270,8 @@ static void locate_dirty_segment(struct f2fs_sb_info *sbi, unsigned int segno) | |||
270 | static void f2fs_issue_discard(struct f2fs_sb_info *sbi, | 270 | static void f2fs_issue_discard(struct f2fs_sb_info *sbi, |
271 | block_t blkstart, block_t blklen) | 271 | block_t blkstart, block_t blklen) |
272 | { | 272 | { |
273 | sector_t start = ((sector_t)blkstart) << sbi->log_sectors_per_block; | 273 | sector_t start = SECTOR_FROM_BLOCK(sbi, blkstart); |
274 | sector_t len = ((sector_t)blklen) << sbi->log_sectors_per_block; | 274 | sector_t len = SECTOR_FROM_BLOCK(sbi, blklen); |
275 | blkdev_issue_discard(sbi->sb->s_bdev, start, len, GFP_NOFS, 0); | 275 | blkdev_issue_discard(sbi->sb->s_bdev, start, len, GFP_NOFS, 0); |
276 | trace_f2fs_issue_discard(sbi->sb, blkstart, blklen); | 276 | trace_f2fs_issue_discard(sbi->sb, blkstart, blklen); |
277 | } | 277 | } |
diff --git a/fs/f2fs/segment.h b/fs/f2fs/segment.h index b84dd2396665..07887e1cc704 100644 --- a/fs/f2fs/segment.h +++ b/fs/f2fs/segment.h | |||
@@ -86,9 +86,9 @@ | |||
86 | #define TOTAL_SECS(sbi) (sbi->total_sections) | 86 | #define TOTAL_SECS(sbi) (sbi->total_sections) |
87 | 87 | ||
88 | #define SECTOR_FROM_BLOCK(sbi, blk_addr) \ | 88 | #define SECTOR_FROM_BLOCK(sbi, blk_addr) \ |
89 | (blk_addr << ((sbi)->log_blocksize - F2FS_LOG_SECTOR_SIZE)) | 89 | (((sector_t)blk_addr) << (sbi)->log_sectors_per_block) |
90 | #define SECTOR_TO_BLOCK(sbi, sectors) \ | 90 | #define SECTOR_TO_BLOCK(sbi, sectors) \ |
91 | (sectors >> ((sbi)->log_blocksize - F2FS_LOG_SECTOR_SIZE)) | 91 | (sectors >> (sbi)->log_sectors_per_block) |
92 | #define MAX_BIO_BLOCKS(max_hw_blocks) \ | 92 | #define MAX_BIO_BLOCKS(max_hw_blocks) \ |
93 | (min((int)max_hw_blocks, BIO_MAX_PAGES)) | 93 | (min((int)max_hw_blocks, BIO_MAX_PAGES)) |
94 | 94 | ||