]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
erofs: clarify direct I/O support
authorGao Xiang <hsiangkao@linux.alibaba.com>
Fri, 15 Nov 2024 07:46:25 +0000 (15:46 +0800)
committerGao Xiang <hsiangkao@linux.alibaba.com>
Mon, 18 Nov 2024 10:50:14 +0000 (18:50 +0800)
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
fs/erofs/data.c
fs/erofs/inode.c

index 6a4f9abd3e0d660872487b866cec4c39d755663e..1c49f8962021f4fb975644ca38cc6fa0768151e0 100644 (file)
@@ -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);
 }
 
index db29190656eb2ba0a4907f6ac8264aa380bcb4dd..d4b89407822a753eb7f520805f65cdb60f96bc45 100644 (file)
@@ -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);