mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2024-12-28 16:52:18 +00:00
erofs: clarify direct I/O support
Currently, only filesystems backed by block devices support direct I/O. Also remove the unnecessary strict checks that can be supported with iomap. Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com> Link: https://lore.kernel.org/r/20241115074625.2520728-1-hsiangkao@linux.alibaba.com
This commit is contained in:
parent
bae0854160
commit
b49c0215b1
@ -405,22 +405,9 @@ static ssize_t erofs_file_read_iter(struct kiocb *iocb, struct iov_iter *to)
|
||||
if (IS_DAX(inode))
|
||||
return dax_iomap_rw(iocb, to, &erofs_iomap_ops);
|
||||
#endif
|
||||
if (iocb->ki_flags & IOCB_DIRECT) {
|
||||
struct block_device *bdev = inode->i_sb->s_bdev;
|
||||
unsigned int blksize_mask;
|
||||
|
||||
if (bdev)
|
||||
blksize_mask = bdev_logical_block_size(bdev) - 1;
|
||||
else
|
||||
blksize_mask = i_blocksize(inode) - 1;
|
||||
|
||||
if ((iocb->ki_pos | iov_iter_count(to) |
|
||||
iov_iter_alignment(to)) & blksize_mask)
|
||||
return -EINVAL;
|
||||
|
||||
if ((iocb->ki_flags & IOCB_DIRECT) && inode->i_sb->s_bdev)
|
||||
return iomap_dio_rw(iocb, to, &erofs_iomap_ops,
|
||||
NULL, 0, NULL, 0);
|
||||
}
|
||||
return filemap_read(iocb, to, 0);
|
||||
}
|
||||
|
||||
|
@ -318,6 +318,7 @@ int erofs_getattr(struct mnt_idmap *idmap, const struct path *path,
|
||||
unsigned int query_flags)
|
||||
{
|
||||
struct inode *const inode = d_inode(path->dentry);
|
||||
struct block_device *bdev = inode->i_sb->s_bdev;
|
||||
bool compressed =
|
||||
erofs_inode_is_data_compressed(EROFS_I(inode)->datalayout);
|
||||
|
||||
@ -330,15 +331,14 @@ int erofs_getattr(struct mnt_idmap *idmap, const struct path *path,
|
||||
/*
|
||||
* Return the DIO alignment restrictions if requested.
|
||||
*
|
||||
* In EROFS, STATX_DIOALIGN is not supported in ondemand mode and
|
||||
* compressed files, so in these cases we report no DIO support.
|
||||
* In EROFS, STATX_DIOALIGN is only supported in bdev-based mode
|
||||
* and uncompressed inodes, otherwise we report no DIO support.
|
||||
*/
|
||||
if ((request_mask & STATX_DIOALIGN) && S_ISREG(inode->i_mode)) {
|
||||
stat->result_mask |= STATX_DIOALIGN;
|
||||
if (!erofs_is_fscache_mode(inode->i_sb) && !compressed) {
|
||||
stat->dio_mem_align =
|
||||
bdev_logical_block_size(inode->i_sb->s_bdev);
|
||||
stat->dio_offset_align = stat->dio_mem_align;
|
||||
if (bdev && !compressed) {
|
||||
stat->dio_mem_align = bdev_dma_alignment(bdev) + 1;
|
||||
stat->dio_offset_align = bdev_logical_block_size(bdev);
|
||||
}
|
||||
}
|
||||
generic_fillattr(idmap, request_mask, inode, stat);
|
||||
|
Loading…
Reference in New Issue
Block a user