blob: 78a7973a7c33e5803507e7e34eb446a5c87fabef [file] [log] [blame]
From 8a9b27ab7a0e33afe38c926bec21223391e13634 Mon Sep 17 00:00:00 2001
From: Alessio Balsini <balsini@google.com>
Date: Mon, 25 Jan 2021 16:58:50 +0000
Subject: [PATCH] FROMLIST: fs: Generic function to convert iocb to rw flags
OverlayFS implements its own function to translate iocb flags into rw
flags, so that they can be passed into another vfs call.
With commit ce71bfea207b4 ("fs: align IOCB_* flags with RWF_* flags")
Jens created a 1:1 matching between the iocb flags and rw flags,
simplifying the conversion.
Reduce the OverlayFS code by making the flag conversion function generic
and reusable.
[CPNOTE: 20/05/21] Lee: Still fresh - hopefully this will land upstream soon
Bug: 168023149
Link: https://lore.kernel.org/lkml/20210125153057.3623715-2-balsini@android.com/
Signed-off-by: Alessio Balsini <balsini@android.com>
Change-Id: I74aefeafd6ebbda2fbabee9024474dfe4cc6c2a7
Signed-off-by: Alessio Balsini <balsini@google.com>
[rebase515(groeck): Context conflicts]
Signed-off-by: Guenter Roeck <groeck@google.com>
---
fs/overlayfs/file.c | 6 ++++--
include/linux/fs.h | 5 +++++
2 files changed, 9 insertions(+), 2 deletions(-)
diff --git a/fs/overlayfs/file.c b/fs/overlayfs/file.c
index 131621daeb134ac3f9b78ea592b4639d5f29a3f3..a7f2261a292676ae5dff5949a2408bc4d05aab7c 100644
--- a/fs/overlayfs/file.c
+++ b/fs/overlayfs/file.c
@@ -17,6 +17,8 @@
#include "../internal.h" /* for sb_init_dio_done_wq */
+#define OVL_IOCB_MASK (IOCB_DSYNC | IOCB_HIPRI | IOCB_NOWAIT | IOCB_SYNC)
+
struct ovl_aio_req {
struct kiocb iocb;
refcount_t ref;
@@ -366,7 +368,7 @@ static ssize_t ovl_read_iter(struct kiocb *iocb, struct iov_iter *iter)
old_cred = ovl_override_creds(file_inode(file)->i_sb);
if (is_sync_kiocb(iocb)) {
- rwf_t rwf = iocb_to_rw_flags(iocb->ki_flags);
+ rwf_t rwf = iocb_to_rw_flags(iocb->ki_flags, OVL_IOCB_MASK);
ret = vfs_iter_read(real.file, iter, &iocb->ki_pos, rwf);
} else {
@@ -434,7 +436,7 @@ static ssize_t ovl_write_iter(struct kiocb *iocb, struct iov_iter *iter)
old_cred = ovl_override_creds(file_inode(file)->i_sb);
if (is_sync_kiocb(iocb)) {
- rwf_t rwf = iocb_to_rw_flags(ifl);
+ rwf_t rwf = iocb_to_rw_flags(ifl, OVL_IOCB_MASK);
file_start_write(real.file);
ret = vfs_iter_write(real.file, iter, &iocb->ki_pos, rwf);
diff --git a/include/linux/fs.h b/include/linux/fs.h
index 98b7a7a8c42e36cc140d14797cf8eb00f7c36f76..12ed23cd010cbec99e1b5cc1168e0cb879980245 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -3270,6 +3270,11 @@ static inline int kiocb_set_rw_flags(struct kiocb *ki, rwf_t flags)
return 0;
}
+static inline rwf_t iocb_to_rw_flags(int ifl, int iocb_mask)
+{
+ return ifl & iocb_mask;
+}
+
static inline ino_t parent_ino(struct dentry *dentry)
{
ino_t res;
--
2.43.0.rc2.451.g8631bc7472-goog