On Mon, Nov 03, 2025 at 07:52:38AM -0500, Jeff Layton wrote:
quoted hunk ↗ jump to hunk
In order to add directory delegation support, we need to break
delegations on the parent whenever there is going to be a change in the
directory.
Add a delegated_inode parameter to struct createdata. Most callers just
leave that as a NULL pointer, but do_mknodat() is changed to wait for a
delegation break if there is one.
Signed-off-by: Jeff Layton <jlayton@kernel.org>
---
fs/namei.c | 26 +++++++++++++++++---------
include/linux/fs.h | 2 +-
2 files changed, 18 insertions(+), 10 deletions(-)
diff --git a/fs/namei.c b/fs/namei.c
...
quoted hunk ↗ jump to hunk
@@ -4359,6 +4362,8 @@ static int may_mknod(umode_t mode)
static int do_mknodat(int dfd, struct filename *name, umode_t mode,
unsigned int dev)
{
+ struct delegated_inode delegated_inode = { };
+ struct createdata cargs = { };
struct mnt_idmap *idmap;
struct dentry *dentry;
struct path path;@@ -4383,18 +4388,16 @@ static int do_mknodat(int dfd, struct filename *name, umode_t mode,
switch (mode & S_IFMT) {
case 0:
case S_IFREG:
- {
- struct createdata args = { .idmap = idmap,
- .dir = path.dentry->d_inode,
- .dentry = dentry,
- .mode = mode,
- .excl = true };
-
- error = vfs_create(&args);
+ cargs.idmap = idmap,
+ cargs.dir = path.dentry->d_inode,
+ cargs.dentry = dentry,
+ cargs.delegated_inode = &delegated_inode;
+ cargs.mode = mode,
+ cargs.excl = true,
Hi Jeff,
I don't think it makes any difference to the generated code.
But I think it would be more intuitive to use ';' rather than ','
at the end of the lines immediately above.
+ error = vfs_create(&cargs);
if (!error)
security_path_post_mknod(idmap, dentry);
break;
- }
case S_IFCHR: case S_IFBLK:
error = vfs_mknod(idmap, path.dentry->d_inode,
dentry, mode, new_decode_dev(dev));
...