Message ID | 20211118212828.4360-2-cvubrugier@fastmail.fm (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | exfat: fix i_blocks for files truncated over 4 GiB | expand |
On Thu, Nov 18, 2021 at 10:28:28PM +0100, Christophe Vu-Brugier wrote: > inode->i_blocks = ((i_size_read(inode) + (sbi->cluster_size - 1)) & > - ~(sbi->cluster_size - 1)) >> inode->i_blkbits; > + ~((loff_t)sbi->cluster_size - 1)) >> inode->i_blkbits; Isn't this a convoluted way to write: inode->i_blocks = round_up(i_size_read(inode), sbi->cluster_size) >> inode->i_blkbits; ?
Hi Matthew, Le 18/11/2021 à 22:50, Matthew Wilcox a écrit : > On Thu, Nov 18, 2021 at 10:28:28PM +0100, Christophe Vu-Brugier wrote: >> inode->i_blocks = ((i_size_read(inode) + (sbi->cluster_size - 1)) & >> - ~(sbi->cluster_size - 1)) >> inode->i_blkbits; >> + ~((loff_t)sbi->cluster_size - 1)) >> inode->i_blkbits; > > Isn't this a convoluted way to write: > > inode->i_blocks = round_up(i_size_read(inode), sbi->cluster_size) >> > inode->i_blkbits; > ? Yes, it is. And we have evidence that it is more error prone. I will update my patch with what you suggest. Thanks!
diff --git a/fs/exfat/file.c b/fs/exfat/file.c index 6af0191b648f..109ade79da33 100644 --- a/fs/exfat/file.c +++ b/fs/exfat/file.c @@ -252,7 +252,7 @@ void exfat_truncate(struct inode *inode, loff_t size) mark_inode_dirty(inode); inode->i_blocks = ((i_size_read(inode) + (sbi->cluster_size - 1)) & - ~(sbi->cluster_size - 1)) >> inode->i_blkbits; + ~((loff_t)sbi->cluster_size - 1)) >> inode->i_blkbits; write_size: aligned_size = i_size_read(inode); if (aligned_size & (blocksize - 1)) { diff --git a/fs/exfat/super.c b/fs/exfat/super.c index 5539ffc20d16..ea16769380c6 100644 --- a/fs/exfat/super.c +++ b/fs/exfat/super.c @@ -364,8 +364,8 @@ static int exfat_read_root(struct inode *inode) inode->i_op = &exfat_dir_inode_operations; inode->i_fop = &exfat_dir_operations; - inode->i_blocks = ((i_size_read(inode) + (sbi->cluster_size - 1)) - & ~(sbi->cluster_size - 1)) >> inode->i_blkbits; + inode->i_blocks = ((i_size_read(inode) + (sbi->cluster_size - 1)) & + ~((loff_t)sbi->cluster_size - 1)) >> inode->i_blkbits; EXFAT_I(inode)->i_pos = ((loff_t)sbi->root_dir << 32) | 0xffffffff; EXFAT_I(inode)->i_size_aligned = i_size_read(inode); EXFAT_I(inode)->i_size_ondisk = i_size_read(inode);