From 04735e9c5578dd4f3584be5454b9779e8e5c2af9 Mon Sep 17 00:00:00 2001 From: Frederic Leroy Date: Wed, 26 Jun 2013 18:11:25 +0200 Subject: Fix ext2/ext4 filesystem accesses beyond 2TiB MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit With CONFIG_SYS_64BIT_LBA, lbaint_t gets defined as a 64-bit type, which is required to represent block numbers for storage devices that exceed 2TiB (the block size usually is 512B), e.g. recent hard drives We now use lbaint_t for partition offset to reflect the lbaint_t change, and access partitions beyond or crossing the 2.1TiB limit. This required changes to signature of ext4fs_devread(), and type of all variables relatives to block sector. ext2/ext4 fs uses logical block represented by a 32 bit value. Logical block is a multiple of device block sector. To avoid overflow problem when calling ext4fs_devread(), we need to cast the sector parameter. Signed-off-by: Frédéric Leroy --- fs/ext4/dev.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) (limited to 'fs/ext4/dev.c') diff --git a/fs/ext4/dev.c b/fs/ext4/dev.c index 81b7633b59..2cd182cb15 100644 --- a/fs/ext4/dev.c +++ b/fs/ext4/dev.c @@ -42,7 +42,7 @@ #include #include "ext4_common.h" -unsigned long part_offset; +lbaint_t part_offset; static block_dev_desc_t *ext4fs_block_dev_desc; static disk_partition_t *part_info; @@ -58,7 +58,7 @@ void ext4fs_set_blk_dev(block_dev_desc_t *rbdd, disk_partition_t *info) get_fs()->dev_desc->log2blksz; } -int ext4fs_devread(int sector, int byte_offset, int byte_len, char *buf) +int ext4fs_devread(lbaint_t sector, int byte_offset, int byte_len, char *buf) { unsigned block_len; int log2blksz = ext4fs_block_dev_desc->log2blksz; @@ -74,7 +74,8 @@ int ext4fs_devread(int sector, int byte_offset, int byte_len, char *buf) if ((sector < 0) || ((sector + ((byte_offset + byte_len - 1) >> log2blksz)) >= part_info->size)) { - printf("%s read outside partition %d\n", __func__, sector); + printf("%s read outside partition " LBAFU "\n", __func__, + sector); return 0; } @@ -82,7 +83,7 @@ int ext4fs_devread(int sector, int byte_offset, int byte_len, char *buf) sector += byte_offset >> log2blksz; byte_offset &= ext4fs_block_dev_desc->blksz - 1; - debug(" <%d, %d, %d>\n", sector, byte_offset, byte_len); + debug(" <" LBAFU ", %d, %d>\n", sector, byte_offset, byte_len); if (byte_offset != 0) { /* read first part which isn't aligned with start of sector */ -- cgit v1.2.3