Unverified Commit d072148a authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Christian Brauner
Browse files

fs: add a FMODE_ flag to indicate IOCB_HAS_METADATA availability



Currently the kernel will happily route io_uring requests with metadata
to file operations that don't support it.  Add a FMODE_ flag to guard
that.

Fixes: 4de2ce04 ("fs: introduce IOCB_HAS_METADATA for metadata")
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Link: https://lore.kernel.org/20250819082517.2038819-2-hch@lst.de


Signed-off-by: default avatarChristian Brauner <brauner@kernel.org>
parent b19a97d5
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -7,6 +7,7 @@
#include <linux/init.h>
#include <linux/mm.h>
#include <linux/blkdev.h>
#include <linux/blk-integrity.h>
#include <linux/buffer_head.h>
#include <linux/mpage.h>
#include <linux/uio.h>
@@ -687,6 +688,8 @@ static int blkdev_open(struct inode *inode, struct file *filp)

	if (bdev_can_atomic_write(bdev))
		filp->f_mode |= FMODE_CAN_ATOMIC_WRITE;
	if (blk_get_integrity(bdev->bd_disk))
		filp->f_mode |= FMODE_HAS_METADATA;

	ret = bdev_open(bdev, mode, filp->private_data, NULL, filp);
	if (ret)
+2 −1
Original line number Diff line number Diff line
@@ -149,7 +149,8 @@ typedef int (dio_iodone_t)(struct kiocb *iocb, loff_t offset,
/* Expect random access pattern */
#define FMODE_RANDOM		((__force fmode_t)(1 << 12))

/* FMODE_* bit 13 */
/* Supports IOCB_HAS_METADATA */
#define FMODE_HAS_METADATA	((__force fmode_t)(1 << 13))

/* File is opened with O_PATH; almost nothing can be done with it */
#define FMODE_PATH		((__force fmode_t)(1 << 14))
+3 −0
Original line number Diff line number Diff line
@@ -886,6 +886,9 @@ static int io_rw_init_file(struct io_kiocb *req, fmode_t mode, int rw_type)
	if (req->flags & REQ_F_HAS_METADATA) {
		struct io_async_rw *io = req->async_data;

		if (!(file->f_mode & FMODE_HAS_METADATA))
			return -EINVAL;

		/*
		 * We have a union of meta fields with wpq used for buffered-io
		 * in io_async_rw, so fail it here.