From: Dave Chinner <[email protected]>
To: Christian Brauner <[email protected]>
Cc: [email protected], Jan Kara <[email protected]>,
Christoph Hellwig <[email protected]>, Jens Axboe <[email protected]>,
Alexander Viro <[email protected]>,
[email protected]
Subject: Re: [PATCH] [RFC]: fs: claw back a few FMODE_* bits
Date: Tue, 2 Apr 2024 10:16:39 +1100 [thread overview]
Message-ID: <[email protected]> (raw)
In-Reply-To: <20240328-palladium-getappt-ce6ae1dc17aa@brauner>
On Thu, Mar 28, 2024 at 09:06:43AM +0100, Christian Brauner wrote:
> On Thu, Mar 28, 2024 at 12:18:06PM +1100, Dave Chinner wrote:
> > On Wed, Mar 27, 2024 at 05:45:09PM +0100, Christian Brauner wrote:
> > > There's a bunch of flags that are purely based on what the file
> > > operations support while also never being conditionally set or unset.
> > > IOW, they're not subject to change for individual file opens. Imho, such
> > > flags don't need to live in f_mode they might as well live in the fops
> > > structs itself. And the fops struct already has that lonely
> > > mmap_supported_flags member. We might as well turn that into a generic
> > > fops_flags member and move a few flags from FMODE_* space into FOP_*
> > > space. That gets us four FMODE_* bits back and the ability for new
> > > static flags that are about file ops to not have to live in FMODE_*
> > > space but in their own FOP_* space. It's not the most beautiful thing
> > > ever but it gets the job done. Yes, there'll be an additional pointer
> > > chase but hopefully that won't matter for these flags.
> > >
> > > If this is palatable I suspect there's a few more we can move into there
> > > and that we can also redirect new flag suggestions that follow this
> > > pattern into the fops_flags field instead of f_mode. As of yet untested.
> > >
> > > (Fwiw, FMODE_NOACCOUNT and FMODE_BACKING could live in fops_flags as
> > > well because they're also completely static but they aren't really
> > > about file operations so they're better suited for FMODE_* imho.)
> > >
> > > Signed-off-by: Christian Brauner <[email protected]>
> > .....
> > > diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c
> > > index 632653e00906..d13e21eb9a3c 100644
> > > --- a/fs/xfs/xfs_file.c
> > > +++ b/fs/xfs/xfs_file.c
> > > @@ -1230,8 +1230,7 @@ xfs_file_open(
> > > {
> > > if (xfs_is_shutdown(XFS_M(inode->i_sb)))
> > > return -EIO;
> > > - file->f_mode |= FMODE_NOWAIT | FMODE_BUF_RASYNC | FMODE_BUF_WASYNC |
> > > - FMODE_DIO_PARALLEL_WRITE | FMODE_CAN_ODIRECT;
> > > + file->f_mode |= FMODE_NOWAIT | FMODE_CAN_ODIRECT;
> > > return generic_file_open(inode, file);
> > > }
> > >
> > > @@ -1490,7 +1489,6 @@ const struct file_operations xfs_file_operations = {
> > > .compat_ioctl = xfs_file_compat_ioctl,
> > > #endif
> > > .mmap = xfs_file_mmap,
> > > - .mmap_supported_flags = MAP_SYNC,
> > > .open = xfs_file_open,
> > > .release = xfs_file_release,
> > > .fsync = xfs_file_fsync,
> > > @@ -1498,6 +1496,8 @@ const struct file_operations xfs_file_operations = {
> > > .fallocate = xfs_file_fallocate,
> > > .fadvise = xfs_file_fadvise,
> > > .remap_file_range = xfs_file_remap_range,
> > > + .fops_flags = FOP_MMAP_SYNC | FOP_BUF_RASYNC | FOP_BUF_WASYNC |
> > > + FOP_DIO_PARALLEL_WRITE,
> > > };
> > >
> > > const struct file_operations xfs_dir_file_operations = {
> > > @@ -1510,4 +1510,6 @@ const struct file_operations xfs_dir_file_operations = {
> > > .compat_ioctl = xfs_file_compat_ioctl,
> > > #endif
> > > .fsync = xfs_dir_fsync,
> > > + .fops_flags = FOP_MMAP_SYNC | FOP_BUF_RASYNC | FOP_BUF_WASYNC |
> > > + FOP_DIO_PARALLEL_WRITE,
> > > };
> >
> > Why do we need to set any of these for directory operations now that
> > we have a clear choice? i.e. we can't mmap directories, and the rest
> > of these flags are for read() and write() operations which we also
> > can't do on directories...
>
> Yeah, I know but since your current implementation raises them for both
> I just did it 1:1:
Sure, that's fine. I asked the question because your patch made the
issue obvious, regardless of the current state of the code.
i.e. a patch adding a flag to xfs_file_open() (e.g. adding
FMODE_DIO_PARALLEL_WRITE had nothing to do with XFS) does not touch
xfs_dir_open() and so it is not immediately clear from the diff that
it also affects directories as well. So it's not until someone
actually notices that flags only relevant to regular files are being
set on directories that someone comments and it becomes clear we
need to fix this...
As Christoph said, it doesn't need to be fixed in this patch, but we
should address this properly. The next question is this: how many
other filesystem implementations do the same thing?
-Dave.
--
Dave Chinner
[email protected]
next prev parent reply other threads:[~2024-04-01 23:16 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-03-27 16:45 [PATCH] [RFC]: fs: claw back a few FMODE_* bits Christian Brauner
2024-03-27 17:19 ` Jens Axboe
2024-03-28 9:40 ` Christian Brauner
2024-03-28 1:18 ` Dave Chinner
2024-03-28 5:36 ` Christoph Hellwig
2024-03-28 8:06 ` Christian Brauner
2024-03-28 8:13 ` Christoph Hellwig
2024-03-28 9:41 ` Christian Brauner
2024-04-01 23:16 ` Dave Chinner [this message]
2024-03-28 5:35 ` Christoph Hellwig
2024-03-28 9:29 ` Christian Brauner
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
[email protected] \
[email protected] \
[email protected] \
[email protected] \
[email protected] \
[email protected] \
[email protected] \
[email protected] \
[email protected] \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox