affs_lookup: switch to d_splice_alias()
Subsystems (2)
Al Viro
maintainerRFC PATCH 1/1 affs_lookup: switch to d_splice_alias()
Making something exportable takes more than providing ->s_export_ops. In particular, ->lookup() *MUST* use d_splice_alias() instead of d_add().
Reading Documentation/filesystems/nfs/Exporting would've been a good idea; as it is, exporting AFFS is badly (and exploitably) broken.
Partially-Fixes: ed4433d72394 "fs/affs: make affs exportable"
fs/affs/namei.c +5 -6
@@ -201,6 +201,7 @@ affs_lookup(struct inode *dir, struct dentry *dentry, unsigned int flags)struct super_block *sb = dir->i_sb;struct buffer_head *bh;struct inode *inode =NULL ; +struct dentry *res;pr_debug ("%s(\"%pd\")\n" , __func__, dentry);
@@ -223,14 +224,12 @@ affs_lookup(struct inode *dir, struct dentry *dentry, unsigned int flags) }affs_brelse (bh); inode =affs_iget (sb, ino); -if (IS_ERR (inode)) { -affs_unlock_dir (dir); -return ERR_CAST (inode); - } } -d_add (dentry, inode); + res =d_splice_alias (inode, dentry); +if (!IS_ERR_OR_NULL (res)) + res->d_fsdata = dentry->d_fsdata;affs_unlock_dir (dir); -return NULL ; +return res; }int
Quoted 9 lines · Al Viro
Making something exportable takes more than providing ->s_export_ops. In particular, ->lookup() *MUST* use
d_splice_alias()instead ofd_add().Reading
Documentation/filesystems/nfs/Exportingwould've been a good idea; as it is, exporting AFFS is badly (and exploitably) broken.Partially-Fixes:
ed4433d72394"fs/affs: make affs exportable"Signed-off-by Al Viro <[email protected]>
Quoted 10 lines · On 13 May 2018 at 18:03 Al Viro <[email protected]> wrote:
Making something exportable takes more than providing ->s_export_ops. In particular, ->lookup() *MUST* use
d_splice_alias()instead ofd_add().Reading
Documentation/filesystems/nfs/Exportingwould've been a good idea; as it is, exporting AFFS is badly (and exploitably) broken.
Hi Al,
Could you tell me where Affs is broken ? affs_get_parent() uses d_obtain_alias() and
your patch fixes the lookup. Do you suggest other updates or to mark nfs support experimental in AFFS or
something else ?
(btw, other export functions arefh_to_dentry using generic_fh_to_dentry()fh_to_parent using generic_fh_to_parent()
)
Regards,
Fabian