From: Al Viro <viro@zeniv.linux.org.uk>
To: Mateusz Guzik <mjguzik@gmail.com>
Cc: brauner@kernel.org, jack@suse.cz, linux-kernel@vger.kernel.org,
linux-fsdevel@vger.kernel.org
Subject: [PATCH 2/3] lift grabbing path into caller of do_dentry_open()
Date: Thu, 22 Aug 2024 01:41:01 +0100 [thread overview]
Message-ID: <20240822004101.GQ504335@ZenIV> (raw)
In-Reply-To: <20240822003359.GO504335@ZenIV>
... and do that after the call. Legitimate, since no ->open()
instance tries to modify ->f_path. Never had been promised to
work, never had been done by any such instance, now it's clearly
forbidden.
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
---
Documentation/filesystems/porting.rst | 9 +++++++++
fs/open.c | 10 +++++++---
2 files changed, 16 insertions(+), 3 deletions(-)
diff --git a/Documentation/filesystems/porting.rst b/Documentation/filesystems/porting.rst
index 92bffcc6747a..34f83613ad6f 100644
--- a/Documentation/filesystems/porting.rst
+++ b/Documentation/filesystems/porting.rst
@@ -1141,3 +1141,12 @@ pointer are gone.
set_blocksize() takes opened struct file instead of struct block_device now
and it *must* be opened exclusive.
+
+
+---
+
+**mandatory**
+
+do not even think of modifying ->f_path in ->open() instance; it never had
+been expected to work and nobody had been insane enough to try it. Now
+it is explicitly forbidden.
diff --git a/fs/open.c b/fs/open.c
index 2bda3aadfa24..0ec2e9a33856 100644
--- a/fs/open.c
+++ b/fs/open.c
@@ -912,7 +912,6 @@ static int do_dentry_open(struct file *f,
struct inode *inode = f->f_path.dentry->d_inode;
int error;
- path_get(&f->f_path);
f->f_inode = inode;
f->f_mapping = inode->i_mapping;
f->f_wb_err = filemap_sample_wb_err(f->f_mapping);
@@ -1015,7 +1014,6 @@ static int do_dentry_open(struct file *f,
fops_put(f->f_op);
put_file_access(f);
cleanup_file:
- path_put(&f->f_path);
f->f_path.mnt = NULL;
f->f_path.dentry = NULL;
f->f_inode = NULL;
@@ -1042,10 +1040,14 @@ static int do_dentry_open(struct file *f,
int finish_open(struct file *file, struct dentry *dentry,
int (*open)(struct inode *, struct file *))
{
+ int err;
BUG_ON(file->f_mode & FMODE_OPENED); /* once it's opened, it's opened */
file->f_path.dentry = dentry;
- return do_dentry_open(file, open);
+ err = do_dentry_open(file, open);
+ if (file->f_mode & FMODE_OPENED)
+ path_get(&file->f_path);
+ return err;
}
EXPORT_SYMBOL(finish_open);
@@ -1095,6 +1097,8 @@ int vfs_open(const struct path *path, struct file *file)
*/
fsnotify_open(file);
}
+ if (file->f_mode & FMODE_OPENED)
+ path_get(&file->f_path);
return ret;
}
--
2.39.2
next prev parent reply other threads:[~2024-08-22 0:41 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-08-06 14:46 [PATCH] vfs: avoid spurious dentry ref/unref cycle on open Mateusz Guzik
2024-08-06 15:53 ` Al Viro
2024-08-06 16:09 ` Mateusz Guzik
2024-08-06 16:14 ` Mateusz Guzik
2024-08-07 3:38 ` Al Viro
2024-08-07 3:57 ` Mateusz Guzik
2024-08-07 5:32 ` Al Viro
2024-08-07 5:46 ` Mateusz Guzik
2024-08-07 6:23 ` Al Viro
2024-08-07 6:33 ` Al Viro
2024-08-07 6:40 ` Mateusz Guzik
2024-08-07 7:05 ` Al Viro
2024-08-07 7:22 ` Mateusz Guzik
2024-08-07 7:52 ` Al Viro
2024-08-07 7:59 ` Mateusz Guzik
2024-08-07 9:50 ` Mateusz Guzik
2024-08-07 12:43 ` Al Viro
2024-08-07 20:38 ` Al Viro
2024-08-20 11:38 ` Mateusz Guzik
2024-08-22 0:33 ` Al Viro
2024-08-22 0:34 ` [PATCH 1/3] don't duplicate vfs_open() in kernel_file_open() Al Viro
2024-08-22 7:53 ` Christian Brauner
2024-08-22 0:41 ` Al Viro [this message]
2024-08-22 7:54 ` [PATCH 2/3] lift grabbing path into caller of do_dentry_open() Christian Brauner
2024-08-22 0:41 ` [PATCH 3/3] avoid extra path_get/path_put cycle in path_openat() Al Viro
2024-08-22 9:31 ` Christian Brauner
2024-08-22 10:21 ` Mateusz Guzik
2024-08-22 15:16 ` kernel test robot
2024-08-22 16:28 ` kernel test robot
2025-02-17 8:03 ` [PATCH] vfs: avoid spurious dentry ref/unref cycle on open Mateusz Guzik
2024-08-08 6:26 ` Mateusz Guzik
2024-08-06 22:51 ` Dave Chinner
2024-08-06 22:55 ` Mateusz Guzik
2024-08-07 2:56 ` Dave Chinner
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 \
--in-reply-to=20240822004101.GQ504335@ZenIV \
--to=viro@zeniv.linux.org.uk \
--cc=brauner@kernel.org \
--cc=jack@suse.cz \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mjguzik@gmail.com \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.