diff mbox series

[07/13] fs: add FOP_UNCACHED flag

Message ID 20241108174505.1214230-8-axboe@kernel.dk (mailing list archive)
State New
Headers show
Series [01/13] mm/filemap: change filemap_create_folio() to take a struct kiocb | expand

Commit Message

Jens Axboe Nov. 8, 2024, 5:43 p.m. UTC
If a file system supports uncached buffered IO, it may set FOP_UNCACHED
and enable RWF_UNCACHED. If RWF_UNCACHED is attempted without the file
system supporting it, it'll get errored with -EOPNOTSUPP.

Signed-off-by: Jens Axboe <axboe@kernel.dk>
---
 include/linux/fs.h | 6 ++++++
 1 file changed, 6 insertions(+)

Comments

Matthew Wilcox Nov. 8, 2024, 6:27 p.m. UTC | #1
On Fri, Nov 08, 2024 at 10:43:30AM -0700, Jens Axboe wrote:
> +	if (flags & RWF_UNCACHED) {

You introduce RWF_UNCACHED in the next patch, so this one's a bisection
hazard.
Jens Axboe Nov. 8, 2024, 7:23 p.m. UTC | #2
On 11/8/24 11:27 AM, Matthew Wilcox wrote:
> On Fri, Nov 08, 2024 at 10:43:30AM -0700, Jens Axboe wrote:
>> +	if (flags & RWF_UNCACHED) {
> 
> You introduce RWF_UNCACHED in the next patch, so this one's a bisection
> hazard.

Oops, I did reshuffle before sending. I'll sort that out.
diff mbox series

Patch

diff --git a/include/linux/fs.h b/include/linux/fs.h
index 3559446279c1..491eeb73e725 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -2116,6 +2116,8 @@  struct file_operations {
 #define FOP_HUGE_PAGES		((__force fop_flags_t)(1 << 4))
 /* Treat loff_t as unsigned (e.g., /dev/mem) */
 #define FOP_UNSIGNED_OFFSET	((__force fop_flags_t)(1 << 5))
+/* File system supports uncached read/write buffered IO */
+#define FOP_UNCACHED		((__force fop_flags_t)(1 << 6))
 
 /* Wrap a directory iterator that needs exclusive inode access */
 int wrap_directory_iterator(struct file *, struct dir_context *,
@@ -3532,6 +3534,10 @@  static inline int kiocb_set_rw_flags(struct kiocb *ki, rwf_t flags,
 		if (!(ki->ki_filp->f_mode & FMODE_CAN_ATOMIC_WRITE))
 			return -EOPNOTSUPP;
 	}
+	if (flags & RWF_UNCACHED) {
+		if (!(ki->ki_filp->f_op->fop_flags & FOP_UNCACHED))
+			return -EOPNOTSUPP;
+	}
 	kiocb_flags |= (__force int) (flags & RWF_SUPPORTED);
 	if (flags & RWF_SYNC)
 		kiocb_flags |= IOCB_DSYNC;