path_from_stashed() assumes that inode->i_private is identical to the caller data used to find or create a dentry. That is too strict for an inode whose stable identity can later resolve through another object. Add an optional data_matches() callback to stashed_operations. Existing users retain the pointer-identity check when no callback is provided. Assisted-by: Codex:gpt-5.6-sol Signed-off-by: Li Chen --- fs/internal.h | 1 + fs/libfs.c | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/fs/internal.h b/fs/internal.h index 174f063575558..71cc43e72b33e 100644 --- a/fs/internal.h +++ b/fs/internal.h @@ -334,6 +334,7 @@ struct stashed_operations { struct dentry *dentry); void (*put_data)(void *data); int (*init_inode)(struct inode *inode, void *data); + bool (*data_matches)(const struct inode *inode, const void *data); }; int path_from_stashed(struct dentry **stashed, struct vfsmount *mnt, void *data, struct path *path); diff --git a/fs/libfs.c b/fs/libfs.c index 5a0d276379d13..68cc1671b4699 100644 --- a/fs/libfs.c +++ b/fs/libfs.c @@ -2260,7 +2260,10 @@ int path_from_stashed(struct dentry **stashed, struct vfsmount *mnt, void *data, path->dentry = res; path->mnt = mntget(mnt); VFS_WARN_ON_ONCE(path->dentry->d_fsdata != stashed); - VFS_WARN_ON_ONCE(d_inode(path->dentry)->i_private != data); + if (sops->data_matches) + VFS_WARN_ON_ONCE(!sops->data_matches(d_inode(path->dentry), data)); + else + VFS_WARN_ON_ONCE(d_inode(path->dentry)->i_private != data); return 0; } -- 2.52.0