Skip to content

Commit d8e1e0d

Browse files
fs/ntfs3: check minimum alignment for direct I/O
Add a check for minimum alignment when performing direct I/O reads. If the file offset or user buffer is not aligned to the device's logical block size, fall back to buffered I/O instead of continuing with unaligned direct I/O. Signed-off-by: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
1 parent ae91dfe commit d8e1e0d

3 files changed

Lines changed: 12 additions & 0 deletions

File tree

fs/ntfs3/file.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -941,6 +941,16 @@ static ssize_t ntfs_file_read_iter(struct kiocb *iocb, struct iov_iter *iter)
941941
file->f_ra.ra_pages = 0;
942942
}
943943

944+
/* Check minimum alignment for dio. */
945+
if (iocb->ki_flags & IOCB_DIRECT) {
946+
struct super_block *sb = inode->i_sb;
947+
struct ntfs_sb_info *sbi = sb->s_fs_info;
948+
if ((iocb->ki_pos | iov_iter_alignment(iter)) &
949+
sbi->bdev_blocksize_mask) {
950+
iocb->ki_flags &= ~IOCB_DIRECT;
951+
}
952+
}
953+
944954
return generic_file_read_iter(iocb, iter);
945955
}
946956

fs/ntfs3/ntfs_fs.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,7 @@ struct ntfs_sb_info {
212212

213213
u32 discard_granularity;
214214
u64 discard_granularity_mask_inv; // ~(discard_granularity_mask_inv-1)
215+
u32 bdev_blocksize_mask; // bdev_logical_block_size(bdev) - 1;
215216

216217
u32 cluster_size; // bytes per cluster
217218
u32 cluster_mask; // == cluster_size - 1

fs/ntfs3/super.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1075,6 +1075,7 @@ static int ntfs_init_from_boot(struct super_block *sb, u32 sector_size,
10751075
dev_size += sector_size - 1;
10761076
}
10771077

1078+
sbi->bdev_blocksize_mask = max(boot_sector_size, sector_size) - 1;
10781079
sbi->mft.lbo = mlcn << cluster_bits;
10791080
sbi->mft.lbo2 = mlcn2 << cluster_bits;
10801081

0 commit comments

Comments
 (0)