Paulo, please look at this patch as it is related to WSL attributes which you introduced in the mentioned commit. I think that the proper fix should be to change SMB2_OP_QUERY_WSL_EA code to not trigger that -EOPNOTSUPP error which is delivered to userspace. I just checked that this my patch works fine for Native NTFS symlinks and NFS-style reparse point special files. On Friday 13 September 2024 22:02:04 Pali Rohár wrote: > If SMB server does not support WSL EAs then for SMB2_OP_QUERY_WSL_EA > request it returns STATUS_EAS_NOT_SUPPORTED. Function smb2_compound_op() > translates STATUS_EAS_NOT_SUPPORTED to -EOPNOTSUPP which cause failure > during calling lstat() syscall from userspace on any reparse point, > including Native SMB symlink (which does not use any EAs). This issue > happen for example when trying to resolve Native NTFS symlink from SMB > server on Windows 8. > > Avoid this problem by calling SMB2_OP_QUERY_WSL_EA only when detected > reparse point is of WSL type. Note that this is not solve this problem > fully as WSL reparse points can be created also on other SMB server > which do not support Extended Attributes at all. > > Fixes: ea41367b2a60 ("smb: client: introduce SMB2_OP_QUERY_WSL_EA") > Signed-off-by: Pali Rohár <pali@xxxxxxxxxx> > --- > fs/smb/client/smb2inode.c | 15 ++++++++++++++- > 1 file changed, 14 insertions(+), 1 deletion(-) > > diff --git a/fs/smb/client/smb2inode.c b/fs/smb/client/smb2inode.c > index 11a1c53c64e0..d65471aa55e6 100644 > --- a/fs/smb/client/smb2inode.c > +++ b/fs/smb/client/smb2inode.c > @@ -941,7 +941,20 @@ int smb2_query_path_info(const unsigned int xid, > if (rc || !data->reparse_point) > goto out; > > - cmds[num_cmds++] = SMB2_OP_QUERY_WSL_EA; > + /* > + * Skip SMB2_OP_QUERY_WSL_EA if reparse point is not WSL. > + * The server file system does not have to support Extended > + * Attributes and in this case returns STATUS_EAS_NOT_SUPPORTED > + * which smb2_compound_op() translate to -EOPNOTSUPP. This will > + * present failure during reading of non-WSL special files. > + */ > + if (data->reparse.tag == IO_REPARSE_TAG_LX_SYMLINK || > + data->reparse.tag == IO_REPARSE_TAG_AF_UNIX || > + data->reparse.tag == IO_REPARSE_TAG_LX_FIFO || > + data->reparse.tag == IO_REPARSE_TAG_LX_CHR || > + data->reparse.tag == IO_REPARSE_TAG_LX_BLK) > + cmds[num_cmds++] = SMB2_OP_QUERY_WSL_EA; > + > /* > * Skip SMB2_OP_GET_REPARSE if symlink already parsed in create > * response. > -- > 2.20.1 >