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.

Bug: 168023149
Link: https://lore.kernel.org/lkml/[email protected]/
Signed-off-by: Alessio Balsini <[email protected]>
Change-Id: I74aefeafd6ebbda2fbabee9024474dfe4cc6c2a7
Signed-off-by: Alessio Balsini <[email protected]>
This commit is contained in:
Alessio Balsini 2021-01-25 16:58:50 +00:00 • committed by Michael Bestas
commit f8329955e6
No known key found for this signature in database
GPG key ID: CC95044519BE6669
2 changed files with 9 additions and 19 deletions

View file

@ -14,6 +14,8 @@
#include <linux/fs.h>
#include "overlayfs.h"
#define OVL_IOCB_MASK (IOCB_DSYNC | IOCB_HIPRI | IOCB_NOWAIT | IOCB_SYNC)
static char ovl_whatisit(struct inode *inode, struct inode *realinode)
{
if (realinode != ovl_inode_upper(inode))
@ -213,23 +215,6 @@ static void ovl_file_accessed(struct file *file)
touch_atime(&file->f_path);
}
static rwf_t ovl_iocb_to_rwf(struct kiocb *iocb)
{
int ifl = iocb->ki_flags;
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 ssize_t ovl_read_iter(struct kiocb *iocb, struct iov_iter *iter)
{
struct file *file = iocb->ki_filp;
@ -246,7 +231,7 @@ static ssize_t ovl_read_iter(struct kiocb *iocb, struct iov_iter *iter)
old_cred = ovl_override_creds(file_inode(file)->i_sb);
ret = vfs_iter_read(real.file, iter, &iocb->ki_pos,
ovl_iocb_to_rwf(iocb));
iocb_to_rw_flags(iocb->ki_flags, OVL_IOCB_MASK));
ovl_revert_creds(file_inode(file)->i_sb, old_cred);
ovl_file_accessed(file);
@ -281,7 +266,7 @@ static ssize_t ovl_write_iter(struct kiocb *iocb, struct iov_iter *iter)
old_cred = ovl_override_creds(file_inode(file)->i_sb);
file_start_write(real.file);
ret = vfs_iter_write(real.file, iter, &iocb->ki_pos,
ovl_iocb_to_rwf(iocb));
iocb_to_rw_flags(iocb->ki_flags, OVL_IOCB_MASK));
file_end_write(real.file);
ovl_revert_creds(file_inode(file)->i_sb, old_cred);