diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2022-05-22 11:38:11 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2022-06-10 16:10:23 -0400 |
commit | 164f4064ca81eefcea29f7f5dcf394f92be1d0c0 (patch) | |
tree | 5275b76d52a540bb1e9c91118e6c9510f71d3b2e /fs/file_table.c | |
parent | 91b94c5d6ae55d1161633047ffeea644b110b35f (diff) | |
download | lwn-164f4064ca81eefcea29f7f5dcf394f92be1d0c0.tar.gz lwn-164f4064ca81eefcea29f7f5dcf394f92be1d0c0.zip |
keep iocb_flags() result cached in struct file
* calculate at the time we set FMODE_OPENED (do_dentry_open() for normal
opens, alloc_file() for pipe()/socket()/etc.)
* update when handling F_SETFL
* keep in a new field - file->f_iocb_flags; since that thing is needed only
before the refcount reaches zero, we can put it into the same anon union
where ->f_rcuhead and ->f_llist live - those are used only after refcount
reaches zero.
Reviewed-by: Christian Brauner (Microsoft) <brauner@kernel.org>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/file_table.c')
-rw-r--r-- | fs/file_table.c | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/fs/file_table.c b/fs/file_table.c index b989e33aacda..905792b0521c 100644 --- a/fs/file_table.c +++ b/fs/file_table.c @@ -241,6 +241,7 @@ static struct file *alloc_file(const struct path *path, int flags, if ((file->f_mode & FMODE_WRITE) && likely(fop->write || fop->write_iter)) file->f_mode |= FMODE_CAN_WRITE; + file->f_iocb_flags = iocb_flags(file); file->f_mode |= FMODE_OPENED; file->f_op = fop; if ((file->f_mode & (FMODE_READ | FMODE_WRITE)) == FMODE_READ) |