Re: [PATCH RESEND 09/11] cifs: Create native Window socket file compatible also with WSL subsystem

Pali Rohár <[email protected]>
Newsgroups org.kernel.vger.linux-cifs,org.kernel.vger.linux-kernel
Message-ID <20260809120913.ohng2tilnv3dc6wo@pali>
Just to note that this change depends on previous change:
08/11 cifs: Extend ->set_EA() callback to allow operate on reparse point

(without it, compile errors happens)

On Monday 06 July 2026 20:48:17 Pali Rohár wrote:
> After creating a native socket via the IO_REPARSE_TAG_AF_UNIX reparse
> point, try to set also the WSL EA $LXMOD.
> 
> This makes the native Win32 / NT socket file recognized also under
> WSL subsystem. WSL subsystem uses same reparse point tag but requires also
> to be EA $LXMOD set.
> 
> Fixes: 45a99d5d1173 ("cifs: Add support for creating native Windows sockets")
> Signed-off-by: Pali Rohár <[email protected]>
> ---
>  fs/smb/client/reparse.c | 30 ++++++++++++++++++++++++++++--
>  1 file changed, 28 insertions(+), 2 deletions(-)
> 
> diff --git a/fs/smb/client/reparse.c b/fs/smb/client/reparse.c
> index e2ea59a17c9c..50eeea127a42 100644
> --- a/fs/smb/client/reparse.c
> +++ b/fs/smb/client/reparse.c
> @@ -384,7 +384,7 @@ static int detect_directory_symlink_target(struct cifs_sb_info *cifs_sb,
>  
>  static int create_native_socket(const unsigned int xid, struct inode *inode,
>  				struct dentry *dentry, struct cifs_tcon *tcon,
> -				const char *full_path)
> +				const char *full_path, umode_t mode)
>  {
>  	struct reparse_data_buffer buf = {
>  		.ReparseTag = cpu_to_le32(IO_REPARSE_TAG_AF_UNIX),
> @@ -398,6 +398,10 @@ static int create_native_socket(const unsigned int xid, struct inode *inode,
>  		.iov_base = &buf,
>  		.iov_len = sizeof(buf),
>  	};
> +#ifdef CONFIG_CIFS_XATTR
> +	const __le64 xattr_mode_val = cpu_to_le64(mode);
> +	struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
> +#endif
>  	struct inode *new;
>  	int rc = 0;
>  
> @@ -408,6 +412,28 @@ static int create_native_socket(const unsigned int xid, struct inode *inode,
>  		d_instantiate(dentry, new);
>  	else
>  		rc = PTR_ERR(new);
> +
> +	/*
> +	 * Try to set also optional WSL EA $LXMOD but ignore errors.
> +	 * WSL socket and native Win32/NT sockets uses same reparse point
> +	 * tag IO_REPARSE_TAG_AF_UNIX. WSL subsystem additionally requires
> +	 * EA $LXMOD to be set with the S_IFSOCK value. So setting this EA
> +	 * allows native socket to be recognized also by WSL subsystem.
> +	 * Note that setting of both EAs and reparse points is not supported
> +	 * by NTFS filesystem on Windows 8 / Windows Server 2012 and always
> +	 * fails. So ignore failures from this set_EA call.
> +	 */
> +#ifdef CONFIG_CIFS_XATTR
> +	if (!rc && tcon->ses->server->ops->set_EA &&
> +	    (le32_to_cpu(tcon->fsAttrInfo.Attributes) & FILE_SUPPORTS_EXTENDED_ATTRIBUTES))
> +		tcon->ses->server->ops->set_EA(xid, tcon, full_path,
> +					       true /* open reparse point */,
> +					       SMB2_WSL_XATTR_MODE,
> +					       &xattr_mode_val,
> +					       SMB2_WSL_XATTR_MODE_SIZE,
> +					       cifs_sb->local_nls, cifs_sb);
> +#endif
> +
>  	cifs_free_open_info(&data);
>  	return rc;
>  }
> @@ -717,7 +743,7 @@ int mknod_reparse(unsigned int xid, struct inode *inode,
>  	struct smb3_fs_context *ctx = CIFS_SB(inode->i_sb)->ctx;
>  
>  	if (S_ISSOCK(mode) && !ctx->nonativesocket && ctx->reparse_type != CIFS_REPARSE_TYPE_NONE)
> -		return create_native_socket(xid, inode, dentry, tcon, full_path);
> +		return create_native_socket(xid, inode, dentry, tcon, full_path, mode);
>  
>  	switch (ctx->reparse_type) {
>  	case CIFS_REPARSE_TYPE_NFS:
> -- 
> 2.20.1
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.