The original code did not check for size of device. A truncated device would mount, I/O failures would occur when "attempt to access beyond end of device", leading to data lost. Fix this by comparing total-sectors field in BPB with size of device. This commit also prints a KERN_INFO message if there are extra sectors at end of device (ie. total sectors < device sectors). Signed-off-by: Zheng Lv <lv.zheng.2015@xxxxxxxxx> --- fs/fat/inode.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/fs/fat/inode.c b/fs/fat/inode.c index 3bcf579..211f7bb 100644 --- a/fs/fat/inode.c +++ b/fs/fat/inode.c @@ -1583,6 +1583,7 @@ int fat_fill_super(struct super_block *sb, void *data, int silent, int isvfat, struct msdos_sb_info *sbi; u16 logical_sector_size; u32 total_sectors, total_clusters, fat_clusters, rootdir_sectors; + u64 device_sectors; int debug; long error; char buf[50]; @@ -1738,6 +1739,17 @@ int fat_fill_super(struct super_block *sb, void *data, int silent, int isvfat, if (total_sectors == 0) total_sectors = bpb.fat_total_sect; + device_sectors = sb->s_bdev->bd_inode->i_size / logical_sector_size; + if (device_sectors && total_sectors > device_sectors) { + fat_msg(sb, KERN_ERR, "total sectors %u " + "exceeds size of device (%llu sectors)", + total_sectors, device_sectors); + goto out_invalid; + } else if (device_sectors && total_sectors < device_sectors) { + fat_msg(sb, KERN_INFO, "%llu unused sectors at end of device", + device_sectors - total_sectors); + } + total_clusters = (total_sectors - sbi->data_start) / sbi->sec_per_clus; if (sbi->fat_bits != 32) -- 2.7.4 -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html