cpos has type loff_t (long long), while s_blocksize has type u32. The inversion wil happen on u32, the coercion to s64 happens afterwards and will do 0-left-paddding, resulting in the upper bits getting masked out. Cast s_blocksize to loff_t before negating it. Found by static code analysis using Klocwork. Signed-off-by: Philipp Hahn --- fs/exfat/dir.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/exfat/dir.c b/fs/exfat/dir.c index 3a4853693d8bf..e710dd196e2f0 100644 --- a/fs/exfat/dir.c +++ b/fs/exfat/dir.c @@ -249,7 +249,7 @@ static int exfat_iterate(struct file *file, struct dir_context *ctx) */ if (err == -EIO) { cpos += 1 << (sb->s_blocksize_bits); - cpos &= ~(sb->s_blocksize - 1); + cpos &= ~(loff_t)(sb->s_blocksize - 1); } err = -EIO; -- 2.43.0