[2/2] fs: build the legacy direct I/O code conditionally
Commit Message
Add a new LEGACY_DIRECT_IO config symbol that is only selected by the
file systems that still use the legacy blockdev_direct_IO code, so that
kernels without support for those file systems don't need to build the
code.
Signed-off-by: Christoph Hellwig <hch@lst.de>
---
fs/Kconfig | 4 ++++
fs/Makefile | 3 ++-
fs/affs/Kconfig | 1 +
fs/exfat/Kconfig | 1 +
fs/ext2/Kconfig | 1 +
fs/fat/Kconfig | 1 +
fs/hfs/Kconfig | 1 +
fs/hfsplus/Kconfig | 1 +
fs/jfs/Kconfig | 1 +
fs/nilfs2/Kconfig | 1 +
fs/ntfs3/Kconfig | 1 +
fs/ocfs2/Kconfig | 1 +
fs/reiserfs/Kconfig | 1 +
fs/udf/Kconfig | 1 +
14 files changed, 18 insertions(+), 1 deletion(-)
Comments
On Wed 25-01-23 07:58:39, Christoph Hellwig wrote:
> Add a new LEGACY_DIRECT_IO config symbol that is only selected by the
> file systems that still use the legacy blockdev_direct_IO code, so that
> kernels without support for those file systems don't need to build the
> code.
>
> Signed-off-by: Christoph Hellwig <hch@lst.de>
Looks good to me. Feel free to add:
Reviewed-by: Jan Kara <jack@suse.cz>
Honza
> ---
> fs/Kconfig | 4 ++++
> fs/Makefile | 3 ++-
> fs/affs/Kconfig | 1 +
> fs/exfat/Kconfig | 1 +
> fs/ext2/Kconfig | 1 +
> fs/fat/Kconfig | 1 +
> fs/hfs/Kconfig | 1 +
> fs/hfsplus/Kconfig | 1 +
> fs/jfs/Kconfig | 1 +
> fs/nilfs2/Kconfig | 1 +
> fs/ntfs3/Kconfig | 1 +
> fs/ocfs2/Kconfig | 1 +
> fs/reiserfs/Kconfig | 1 +
> fs/udf/Kconfig | 1 +
> 14 files changed, 18 insertions(+), 1 deletion(-)
>
> diff --git a/fs/Kconfig b/fs/Kconfig
> index 2685a4d0d35318..e99830c650336a 100644
> --- a/fs/Kconfig
> +++ b/fs/Kconfig
> @@ -18,6 +18,10 @@ config VALIDATE_FS_PARSER
> config FS_IOMAP
> bool
>
> +# old blockdev_direct_IO implementation. Use iomap for new code instead
> +config LEGACY_DIRECT_IO
> + bool
> +
> if BLOCK
>
> source "fs/ext2/Kconfig"
> diff --git a/fs/Makefile b/fs/Makefile
> index 4dea17840761a0..606c029e1c9bc3 100644
> --- a/fs/Makefile
> +++ b/fs/Makefile
> @@ -19,13 +19,14 @@ obj-y := open.o read_write.o file_table.o super.o \
> kernel_read_file.o remap_range.o
>
> ifeq ($(CONFIG_BLOCK),y)
> -obj-y += buffer.o direct-io.o mpage.o
> +obj-y += buffer.o mpage.o
> else
> obj-y += no-block.o
> endif
>
> obj-$(CONFIG_PROC_FS) += proc_namespace.o
>
> +obj-$(CONFIG_LEGACY_DIRECT_IO) += direct-io.o
> obj-y += notify/
> obj-$(CONFIG_EPOLL) += eventpoll.o
> obj-y += anon_inodes.o
> diff --git a/fs/affs/Kconfig b/fs/affs/Kconfig
> index eb9d0ab850cb1d..962b86374e1c15 100644
> --- a/fs/affs/Kconfig
> +++ b/fs/affs/Kconfig
> @@ -2,6 +2,7 @@
> config AFFS_FS
> tristate "Amiga FFS file system support"
> depends on BLOCK
> + select LEGACY_DIRECT_IO
> help
> The Fast File System (FFS) is the common file system used on hard
> disks by Amiga(tm) systems since AmigaOS Version 1.3 (34.20). Say Y
> diff --git a/fs/exfat/Kconfig b/fs/exfat/Kconfig
> index 5a65071b5ecf10..147edeb044691d 100644
> --- a/fs/exfat/Kconfig
> +++ b/fs/exfat/Kconfig
> @@ -3,6 +3,7 @@
> config EXFAT_FS
> tristate "exFAT filesystem support"
> select NLS
> + select LEGACY_DIRECT_IO
> help
> This allows you to mount devices formatted with the exFAT file system.
> exFAT is typically used on SD-Cards or USB sticks.
> diff --git a/fs/ext2/Kconfig b/fs/ext2/Kconfig
> index 1248ff4ef56254..77393fda99af09 100644
> --- a/fs/ext2/Kconfig
> +++ b/fs/ext2/Kconfig
> @@ -2,6 +2,7 @@
> config EXT2_FS
> tristate "Second extended fs support"
> select FS_IOMAP
> + select LEGACY_DIRECT_IO
> help
> Ext2 is a standard Linux file system for hard disks.
>
> diff --git a/fs/fat/Kconfig b/fs/fat/Kconfig
> index 238cc55f84c429..afe83b4e717280 100644
> --- a/fs/fat/Kconfig
> +++ b/fs/fat/Kconfig
> @@ -2,6 +2,7 @@
> config FAT_FS
> tristate
> select NLS
> + select LEGACY_DIRECT_IO
> help
> If you want to use one of the FAT-based file systems (the MS-DOS and
> VFAT (Windows 95) file systems), then you must say Y or M here
> diff --git a/fs/hfs/Kconfig b/fs/hfs/Kconfig
> index 129926b5142d8f..d985066006d588 100644
> --- a/fs/hfs/Kconfig
> +++ b/fs/hfs/Kconfig
> @@ -3,6 +3,7 @@ config HFS_FS
> tristate "Apple Macintosh file system support"
> depends on BLOCK
> select NLS
> + select LEGACY_DIRECT_IO
> help
> If you say Y here, you will be able to mount Macintosh-formatted
> floppy disks and hard drive partitions with full read-write access.
> diff --git a/fs/hfsplus/Kconfig b/fs/hfsplus/Kconfig
> index 7d4229aecec05b..8034e7827a690b 100644
> --- a/fs/hfsplus/Kconfig
> +++ b/fs/hfsplus/Kconfig
> @@ -4,6 +4,7 @@ config HFSPLUS_FS
> depends on BLOCK
> select NLS
> select NLS_UTF8
> + select LEGACY_DIRECT_IO
> help
> If you say Y here, you will be able to mount extended format
> Macintosh-formatted hard drive partitions with full read-write access.
> diff --git a/fs/jfs/Kconfig b/fs/jfs/Kconfig
> index 05cb0e8e4382ee..51e856f0e4b8d6 100644
> --- a/fs/jfs/Kconfig
> +++ b/fs/jfs/Kconfig
> @@ -3,6 +3,7 @@ config JFS_FS
> tristate "JFS filesystem support"
> select NLS
> select CRC32
> + select LEGACY_DIRECT_IO
> help
> This is a port of IBM's Journaled Filesystem . More information is
> available in the file <file:Documentation/admin-guide/jfs.rst>.
> diff --git a/fs/nilfs2/Kconfig b/fs/nilfs2/Kconfig
> index 254d102e79c99b..7d59567465e121 100644
> --- a/fs/nilfs2/Kconfig
> +++ b/fs/nilfs2/Kconfig
> @@ -2,6 +2,7 @@
> config NILFS2_FS
> tristate "NILFS2 file system support"
> select CRC32
> + select LEGACY_DIRECT_IO
> help
> NILFS2 is a log-structured file system (LFS) supporting continuous
> snapshotting. In addition to versioning capability of the entire
> diff --git a/fs/ntfs3/Kconfig b/fs/ntfs3/Kconfig
> index 6e4cbc48ab8e43..96cc236f7f7bd3 100644
> --- a/fs/ntfs3/Kconfig
> +++ b/fs/ntfs3/Kconfig
> @@ -2,6 +2,7 @@
> config NTFS3_FS
> tristate "NTFS Read-Write file system support"
> select NLS
> + select LEGACY_DIRECT_IO
> help
> Windows OS native file system (NTFS) support up to NTFS version 3.1.
>
> diff --git a/fs/ocfs2/Kconfig b/fs/ocfs2/Kconfig
> index 5d11380d872417..304d12186ccd38 100644
> --- a/fs/ocfs2/Kconfig
> +++ b/fs/ocfs2/Kconfig
> @@ -7,6 +7,7 @@ config OCFS2_FS
> select QUOTA
> select QUOTA_TREE
> select FS_POSIX_ACL
> + select LEGACY_DIRECT_IO
> help
> OCFS2 is a general purpose extent based shared disk cluster file
> system with many similarities to ext3. It supports 64 bit inode
> diff --git a/fs/reiserfs/Kconfig b/fs/reiserfs/Kconfig
> index 33c8b0dd07a2e7..4d22ecfe0fab65 100644
> --- a/fs/reiserfs/Kconfig
> +++ b/fs/reiserfs/Kconfig
> @@ -2,6 +2,7 @@
> config REISERFS_FS
> tristate "Reiserfs support (deprecated)"
> select CRC32
> + select LEGACY_DIRECT_IO
> help
> Reiserfs is deprecated and scheduled to be removed from the kernel
> in 2025. If you are still using it, please migrate to another
> diff --git a/fs/udf/Kconfig b/fs/udf/Kconfig
> index 26e1a49f3ba795..82e8bfa2dfd989 100644
> --- a/fs/udf/Kconfig
> +++ b/fs/udf/Kconfig
> @@ -3,6 +3,7 @@ config UDF_FS
> tristate "UDF file system support"
> select CRC_ITU_T
> select NLS
> + select LEGACY_DIRECT_IO
> help
> This is a file system used on some CD-ROMs and DVDs. Since the
> file system is supported by multiple operating systems and is more
> --
> 2.39.0
>
On Wed, Jan 25, 2023 at 07:58:39AM +0100, Christoph Hellwig wrote:
> Add a new LEGACY_DIRECT_IO config symbol that is only selected by the
> file systems that still use the legacy blockdev_direct_IO code, so that
> kernels without support for those file systems don't need to build the
> code.
>
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> ---
> fs/Kconfig | 4 ++++
> fs/Makefile | 3 ++-
> fs/affs/Kconfig | 1 +
> fs/exfat/Kconfig | 1 +
> fs/ext2/Kconfig | 1 +
> fs/fat/Kconfig | 1 +
> fs/hfs/Kconfig | 1 +
> fs/hfsplus/Kconfig | 1 +
> fs/jfs/Kconfig | 1 +
> fs/nilfs2/Kconfig | 1 +
> fs/ntfs3/Kconfig | 1 +
> fs/ocfs2/Kconfig | 1 +
> fs/reiserfs/Kconfig | 1 +
> fs/udf/Kconfig | 1 +
> 14 files changed, 18 insertions(+), 1 deletion(-)
>
> diff --git a/fs/Kconfig b/fs/Kconfig
> index 2685a4d0d35318..e99830c650336a 100644
> --- a/fs/Kconfig
> +++ b/fs/Kconfig
> @@ -18,6 +18,10 @@ config VALIDATE_FS_PARSER
> config FS_IOMAP
> bool
>
> +# old blockdev_direct_IO implementation. Use iomap for new code instead
> +config LEGACY_DIRECT_IO
> + bool
> +
> if BLOCK
>
Reviewed-by: Eric Biggers <ebiggers@google.com>
- Eric
On Wed, Jan 25, 2023 at 07:58:39AM +0100, Christoph Hellwig wrote:
> Add a new LEGACY_DIRECT_IO config symbol that is only selected by the
> file systems that still use the legacy blockdev_direct_IO code, so that
> kernels without support for those file systems don't need to build the
> code.
Looks sane... FWIW, I've got this in the misc pile; doesn't seem to
conflict anything in your series, thankfully...
commit 193010cdc86da0126c58f58bbeacfcb5a15e6cee
Author: Al Viro <viro@zeniv.linux.org.uk>
Date: Thu Jan 19 19:22:22 2023 -0500
__blockdev_direct_IO(): get rid of submit_io callback
always NULL...
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
diff --git a/fs/direct-io.c b/fs/direct-io.c
index 03d381377ae1..c2736da875cc 100644
--- a/fs/direct-io.c
+++ b/fs/direct-io.c
@@ -86,7 +86,6 @@ struct dio_submit {
sector_t final_block_in_request;/* doesn't change */
int boundary; /* prev block is at a boundary */
get_block_t *get_block; /* block mapping function */
- dio_submit_t *submit_io; /* IO submition function */
loff_t logical_offset_in_bio; /* current first logical block in bio */
sector_t final_block_in_bio; /* current final block in bio + 1 */
@@ -431,10 +430,7 @@ static inline void dio_bio_submit(struct dio *dio, struct dio_submit *sdio)
dio->bio_disk = bio->bi_bdev->bd_disk;
- if (sdio->submit_io)
- sdio->submit_io(bio, dio->inode, sdio->logical_offset_in_bio);
- else
- submit_bio(bio);
+ submit_bio(bio);
sdio->bio = NULL;
sdio->boundary = 0;
@@ -1122,7 +1118,7 @@ static inline int drop_refcount(struct dio *dio)
ssize_t __blockdev_direct_IO(struct kiocb *iocb, struct inode *inode,
struct block_device *bdev, struct iov_iter *iter,
get_block_t get_block, dio_iodone_t end_io,
- dio_submit_t submit_io, int flags)
+ int flags)
{
unsigned i_blkbits = READ_ONCE(inode->i_blkbits);
unsigned blkbits = i_blkbits;
@@ -1239,7 +1235,6 @@ ssize_t __blockdev_direct_IO(struct kiocb *iocb, struct inode *inode,
sdio.get_block = get_block;
dio->end_io = end_io;
- sdio.submit_io = submit_io;
sdio.final_block_in_bio = -1;
sdio.next_block_for_io = -1;
diff --git a/fs/ocfs2/aops.c b/fs/ocfs2/aops.c
index 1d65f6ef00ca..50448ba5fda8 100644
--- a/fs/ocfs2/aops.c
+++ b/fs/ocfs2/aops.c
@@ -2448,7 +2448,7 @@ static ssize_t ocfs2_direct_IO(struct kiocb *iocb, struct iov_iter *iter)
return __blockdev_direct_IO(iocb, inode, inode->i_sb->s_bdev,
iter, get_block,
- ocfs2_dio_end_io, NULL, 0);
+ ocfs2_dio_end_io, 0);
}
const struct address_space_operations ocfs2_aops = {
diff --git a/include/linux/fs.h b/include/linux/fs.h
index c1769a2c5d70..544b29a96fb0 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -3205,7 +3205,7 @@ enum {
ssize_t __blockdev_direct_IO(struct kiocb *iocb, struct inode *inode,
struct block_device *bdev, struct iov_iter *iter,
get_block_t get_block,
- dio_iodone_t end_io, dio_submit_t submit_io,
+ dio_iodone_t end_io,
int flags);
static inline ssize_t blockdev_direct_IO(struct kiocb *iocb,
@@ -3214,7 +3214,7 @@ static inline ssize_t blockdev_direct_IO(struct kiocb *iocb,
get_block_t get_block)
{
return __blockdev_direct_IO(iocb, inode, inode->i_sb->s_bdev, iter,
- get_block, NULL, NULL, DIO_LOCKING | DIO_SKIP_HOLES);
+ get_block, NULL, DIO_LOCKING | DIO_SKIP_HOLES);
}
#endif
On Thu, Jan 26, 2023 at 09:20:20PM +0000, Al Viro wrote:
> On Wed, Jan 25, 2023 at 07:58:39AM +0100, Christoph Hellwig wrote:
> > Add a new LEGACY_DIRECT_IO config symbol that is only selected by the
> > file systems that still use the legacy blockdev_direct_IO code, so that
> > kernels without support for those file systems don't need to build the
> > code.
>
> Looks sane... FWIW, I've got this in the misc pile; doesn't seem to
> conflict anything in your series, thankfully...
Yes, this looks good:
Reviewed-by: Christoph Hellwig <hch@lst.de>
If someone had time to convert ocfs2 to iomap we could also kill
the entire __blockdev_direct_IO variant.
@@ -18,6 +18,10 @@ config VALIDATE_FS_PARSER
config FS_IOMAP
bool
+# old blockdev_direct_IO implementation. Use iomap for new code instead
+config LEGACY_DIRECT_IO
+ bool
+
if BLOCK
source "fs/ext2/Kconfig"
@@ -19,13 +19,14 @@ obj-y := open.o read_write.o file_table.o super.o \
kernel_read_file.o remap_range.o
ifeq ($(CONFIG_BLOCK),y)
-obj-y += buffer.o direct-io.o mpage.o
+obj-y += buffer.o mpage.o
else
obj-y += no-block.o
endif
obj-$(CONFIG_PROC_FS) += proc_namespace.o
+obj-$(CONFIG_LEGACY_DIRECT_IO) += direct-io.o
obj-y += notify/
obj-$(CONFIG_EPOLL) += eventpoll.o
obj-y += anon_inodes.o
@@ -2,6 +2,7 @@
config AFFS_FS
tristate "Amiga FFS file system support"
depends on BLOCK
+ select LEGACY_DIRECT_IO
help
The Fast File System (FFS) is the common file system used on hard
disks by Amiga(tm) systems since AmigaOS Version 1.3 (34.20). Say Y
@@ -3,6 +3,7 @@
config EXFAT_FS
tristate "exFAT filesystem support"
select NLS
+ select LEGACY_DIRECT_IO
help
This allows you to mount devices formatted with the exFAT file system.
exFAT is typically used on SD-Cards or USB sticks.
@@ -2,6 +2,7 @@
config EXT2_FS
tristate "Second extended fs support"
select FS_IOMAP
+ select LEGACY_DIRECT_IO
help
Ext2 is a standard Linux file system for hard disks.
@@ -2,6 +2,7 @@
config FAT_FS
tristate
select NLS
+ select LEGACY_DIRECT_IO
help
If you want to use one of the FAT-based file systems (the MS-DOS and
VFAT (Windows 95) file systems), then you must say Y or M here
@@ -3,6 +3,7 @@ config HFS_FS
tristate "Apple Macintosh file system support"
depends on BLOCK
select NLS
+ select LEGACY_DIRECT_IO
help
If you say Y here, you will be able to mount Macintosh-formatted
floppy disks and hard drive partitions with full read-write access.
@@ -4,6 +4,7 @@ config HFSPLUS_FS
depends on BLOCK
select NLS
select NLS_UTF8
+ select LEGACY_DIRECT_IO
help
If you say Y here, you will be able to mount extended format
Macintosh-formatted hard drive partitions with full read-write access.
@@ -3,6 +3,7 @@ config JFS_FS
tristate "JFS filesystem support"
select NLS
select CRC32
+ select LEGACY_DIRECT_IO
help
This is a port of IBM's Journaled Filesystem . More information is
available in the file <file:Documentation/admin-guide/jfs.rst>.
@@ -2,6 +2,7 @@
config NILFS2_FS
tristate "NILFS2 file system support"
select CRC32
+ select LEGACY_DIRECT_IO
help
NILFS2 is a log-structured file system (LFS) supporting continuous
snapshotting. In addition to versioning capability of the entire
@@ -2,6 +2,7 @@
config NTFS3_FS
tristate "NTFS Read-Write file system support"
select NLS
+ select LEGACY_DIRECT_IO
help
Windows OS native file system (NTFS) support up to NTFS version 3.1.
@@ -7,6 +7,7 @@ config OCFS2_FS
select QUOTA
select QUOTA_TREE
select FS_POSIX_ACL
+ select LEGACY_DIRECT_IO
help
OCFS2 is a general purpose extent based shared disk cluster file
system with many similarities to ext3. It supports 64 bit inode
@@ -2,6 +2,7 @@
config REISERFS_FS
tristate "Reiserfs support (deprecated)"
select CRC32
+ select LEGACY_DIRECT_IO
help
Reiserfs is deprecated and scheduled to be removed from the kernel
in 2025. If you are still using it, please migrate to another
@@ -3,6 +3,7 @@ config UDF_FS
tristate "UDF file system support"
select CRC_ITU_T
select NLS
+ select LEGACY_DIRECT_IO
help
This is a file system used on some CD-ROMs and DVDs. Since the
file system is supported by multiple operating systems and is more