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 ce71bfea20 ("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.

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>
This commit is contained in:
Alessio Balsini
2021-01-25 16:58:50 +00:00
parent 95209e20ae
commit c0a8393584
2 changed files with 10 additions and 18 deletions

View File

@@ -15,6 +15,8 @@
#include <linux/fs.h> #include <linux/fs.h>
#include "overlayfs.h" #include "overlayfs.h"
#define OVL_IOCB_MASK (IOCB_DSYNC | IOCB_HIPRI | IOCB_NOWAIT | IOCB_SYNC)
struct ovl_aio_req { struct ovl_aio_req {
struct kiocb iocb; struct kiocb iocb;
struct kiocb *orig_iocb; struct kiocb *orig_iocb;
@@ -241,22 +243,6 @@ static void ovl_file_accessed(struct file *file)
touch_atime(&file->f_path); touch_atime(&file->f_path);
} }
static rwf_t ovl_iocb_to_rwf(int ifl)
{
rwf_t flags = 0;
if (ifl & IOCB_NOWAIT)
flags |= RWF_NOWAIT;
if (ifl & IOCB_HIPRI)
flags |= RWF_HIPRI;
if (ifl & IOCB_DSYNC)
flags |= RWF_DSYNC;
if (ifl & IOCB_SYNC)
flags |= RWF_SYNC;
return flags;
}
static void ovl_aio_cleanup_handler(struct ovl_aio_req *aio_req) static void ovl_aio_cleanup_handler(struct ovl_aio_req *aio_req)
{ {
struct kiocb *iocb = &aio_req->iocb; struct kiocb *iocb = &aio_req->iocb;
@@ -304,7 +290,8 @@ static ssize_t ovl_read_iter(struct kiocb *iocb, struct iov_iter *iter)
old_cred = ovl_override_creds(file_inode(file)->i_sb); old_cred = ovl_override_creds(file_inode(file)->i_sb);
if (is_sync_kiocb(iocb)) { if (is_sync_kiocb(iocb)) {
ret = vfs_iter_read(real.file, iter, &iocb->ki_pos, ret = vfs_iter_read(real.file, iter, &iocb->ki_pos,
ovl_iocb_to_rwf(iocb->ki_flags)); iocb_to_rw_flags(iocb->ki_flags,
OVL_IOCB_MASK));
} else { } else {
struct ovl_aio_req *aio_req; struct ovl_aio_req *aio_req;
@@ -362,7 +349,7 @@ static ssize_t ovl_write_iter(struct kiocb *iocb, struct iov_iter *iter)
if (is_sync_kiocb(iocb)) { if (is_sync_kiocb(iocb)) {
file_start_write(real.file); file_start_write(real.file);
ret = vfs_iter_write(real.file, iter, &iocb->ki_pos, ret = vfs_iter_write(real.file, iter, &iocb->ki_pos,
ovl_iocb_to_rwf(ifl)); iocb_to_rw_flags(ifl, OVL_IOCB_MASK));
file_end_write(real.file); file_end_write(real.file);
/* Update size */ /* Update size */
ovl_copyattr(ovl_inode_real(inode), inode); ovl_copyattr(ovl_inode_real(inode), inode);

View File

@@ -3279,6 +3279,11 @@ static inline int kiocb_set_rw_flags(struct kiocb *ki, rwf_t flags)
return 0; 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) static inline ino_t parent_ino(struct dentry *dentry)
{ {
ino_t res; ino_t res;