| 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 |
| |