Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

exfat: fix inode->i_blocks for non-512 byte sector size device

inode->i_blocks is not real number of blocks, but 512 byte ones.

Fixes: 98d917047e8b ("exfat: add file operations")
Cc: stable@vger.kernel.org # v5.7+
Reported-by: Wang Yugui <wangyugui@e16-tech.com>
Tested-by: Wang Yugui <wangyugui@e16-tech.com>
Signed-off-by: Yuezhang Mo <Yuezhang.Mo@sony.com>
Reviewed-by: Andy Wu <Andy.Wu@sony.com>
Signed-off-by: Namjae Jeon <linkinjeon@kernel.org>

authored by

Yuezhang Mo and committed by
Namjae Jeon
39c1ce8e bdaadfd3

+5 -9
+1 -2
fs/exfat/file.c
··· 209 209 if (err) 210 210 goto write_size; 211 211 212 - inode->i_blocks = round_up(i_size_read(inode), sbi->cluster_size) >> 213 - inode->i_blkbits; 212 + inode->i_blocks = round_up(i_size_read(inode), sbi->cluster_size) >> 9; 214 213 write_size: 215 214 aligned_size = i_size_read(inode); 216 215 if (aligned_size & (blocksize - 1)) {
+2 -4
fs/exfat/inode.c
··· 220 220 num_clusters += num_to_be_allocated; 221 221 *clu = new_clu.dir; 222 222 223 - inode->i_blocks += 224 - num_to_be_allocated << sbi->sect_per_clus_bits; 223 + inode->i_blocks += EXFAT_CLU_TO_B(num_to_be_allocated, sbi) >> 9; 225 224 226 225 /* 227 226 * Move *clu pointer along FAT chains (hole care) because the ··· 575 576 576 577 exfat_save_attr(inode, info->attr); 577 578 578 - inode->i_blocks = round_up(i_size_read(inode), sbi->cluster_size) >> 579 - inode->i_blkbits; 579 + inode->i_blocks = round_up(i_size_read(inode), sbi->cluster_size) >> 9; 580 580 inode->i_mtime = info->mtime; 581 581 inode->i_ctime = info->mtime; 582 582 ei->i_crtime = info->crtime;
+1 -1
fs/exfat/namei.c
··· 396 396 ei->i_size_ondisk += sbi->cluster_size; 397 397 ei->i_size_aligned += sbi->cluster_size; 398 398 ei->flags = p_dir->flags; 399 - inode->i_blocks += 1 << sbi->sect_per_clus_bits; 399 + inode->i_blocks += sbi->cluster_size >> 9; 400 400 } 401 401 402 402 return dentry;
+1 -2
fs/exfat/super.c
··· 373 373 inode->i_op = &exfat_dir_inode_operations; 374 374 inode->i_fop = &exfat_dir_operations; 375 375 376 - inode->i_blocks = round_up(i_size_read(inode), sbi->cluster_size) >> 377 - inode->i_blkbits; 376 + inode->i_blocks = round_up(i_size_read(inode), sbi->cluster_size) >> 9; 378 377 ei->i_pos = ((loff_t)sbi->root_dir << 32) | 0xffffffff; 379 378 ei->i_size_aligned = i_size_read(inode); 380 379 ei->i_size_ondisk = i_size_read(inode);