From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 07EC12741DA; Mon, 14 Apr 2025 13:30:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744637447; cv=none; b=fdiSjKhruOInKqVSGbn64DN2WxVT5Z0fsuYmOg+cxITv+IIDWgiaO8sXmJDVuAW5fxN0AZfD+RKmIfVn/HeOwvHaV8aI0bCr5hT++ZpWQHlnoO54QQ1g5zWAA/b645VaK8eP9fsRYqguagRke44Nk/TMwtj8hOCFgxujGU3XvQc= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744637447; c=relaxed/simple; bh=zsRSf9fp8MSn8c3VsCnm1YDAdg57nmrfq2o9gzhTuBo=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version:Content-Type; b=Me805K6Y/+sxOk6nCWuNEnWjR2TE6AFNlKyvSs4FTQFjgfH3TYZS3LH5iId0uS4BPHZb8VeTRH6E8+kJpsw2hzv8iCAtefL1nJuY5PLuZYRnyKmOU18E7sVQGYrwHSpZYGxmthWV8AVpcJ7JFHSqDgAaFCtCYy+bi5i4yHnjl10= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=CWeDVg/q; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="CWeDVg/q" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 6798CC4CEEE; Mon, 14 Apr 2025 13:30:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1744637445; bh=zsRSf9fp8MSn8c3VsCnm1YDAdg57nmrfq2o9gzhTuBo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=CWeDVg/qymqRYZ8jIS+mrKWB7MTzn4G/dssYopQ2zJPrRl3a15LB8eTfPPZjGZSic jBqfgArQF0lqn2Utwc4WDaJUHJDdq+WXWjui0tNftnGN1h1nbVAoEe3i5bvb7ioSUb cVTvqnxf21a2OztuyXikc6aRKMFoT6m3o0a2EKmgpv0EY8fX8csS59o6m1S5KEqRau vvf6LZb529FEUmfg4oO/Q4D0pdcEP3DblG4xiO0pBhCcpueHInxKz/Saml7JZ6R8Gd tLNfUTdJjyCOOZLKXTBIvEfBdE2nYg8Vhe58OOkGVOA1enYvl6t0OgIjacqIGFIc04 Ij+X5PqRLK6/Q== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: =?UTF-8?q?Pali=20Roh=C3=A1r?= , Steve French , Sasha Levin , sfrench@samba.org, linux-cifs@vger.kernel.org, samba-technical@lists.samba.org Subject: [PATCH AUTOSEL 6.6 23/24] cifs: Fix querying of WSL CHR and BLK reparse points over SMB1 Date: Mon, 14 Apr 2025 09:29:56 -0400 Message-Id: <20250414132957.680250-23-sashal@kernel.org> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250414132957.680250-1-sashal@kernel.org> References: <20250414132957.680250-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 X-stable: review X-Patchwork-Hint: Ignore X-stable-base: Linux 6.6.87 Content-Transfer-Encoding: 8bit From: Pali Rohár [ Upstream commit ef86ab131d9127dfbfa8f06e12441d05fdfb090b ] When reparse point in SMB1 query_path_info() callback was detected then query also for EA $LXDEV. In this EA are stored device major and minor numbers used by WSL CHR and BLK reparse points. Without major and minor numbers, stat() syscall does not work for char and block devices. Similar code is already in SMB2+ query_path_info() callback function. Signed-off-by: Pali Rohár Signed-off-by: Steve French Signed-off-by: Sasha Levin --- fs/smb/client/smb1ops.c | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/fs/smb/client/smb1ops.c b/fs/smb/client/smb1ops.c index bc1bac36c1b29..caa1d852ece49 100644 --- a/fs/smb/client/smb1ops.c +++ b/fs/smb/client/smb1ops.c @@ -597,6 +597,42 @@ static int cifs_query_path_info(const unsigned int xid, CIFSSMBClose(xid, tcon, fid.netfid); } +#ifdef CONFIG_CIFS_XATTR + /* + * For WSL CHR and BLK reparse points it is required to fetch + * EA $LXDEV which contains major and minor device numbers. + */ + if (!rc && data->reparse_point) { + struct smb2_file_full_ea_info *ea; + + ea = (struct smb2_file_full_ea_info *)data->wsl.eas; + rc = CIFSSMBQAllEAs(xid, tcon, full_path, SMB2_WSL_XATTR_DEV, + &ea->ea_data[SMB2_WSL_XATTR_NAME_LEN + 1], + SMB2_WSL_XATTR_DEV_SIZE, cifs_sb); + if (rc == SMB2_WSL_XATTR_DEV_SIZE) { + ea->next_entry_offset = cpu_to_le32(0); + ea->flags = 0; + ea->ea_name_length = SMB2_WSL_XATTR_NAME_LEN; + ea->ea_value_length = cpu_to_le16(SMB2_WSL_XATTR_DEV_SIZE); + memcpy(&ea->ea_data[0], SMB2_WSL_XATTR_DEV, SMB2_WSL_XATTR_NAME_LEN + 1); + data->wsl.eas_len = sizeof(*ea) + SMB2_WSL_XATTR_NAME_LEN + 1 + + SMB2_WSL_XATTR_DEV_SIZE; + rc = 0; + } else if (rc >= 0) { + /* It is an error if EA $LXDEV has wrong size. */ + rc = -EINVAL; + } else { + /* + * In all other cases ignore error if fetching + * of EA $LXDEV failed. It is needed only for + * WSL CHR and BLK reparse points and wsl_to_fattr() + * handle the case when EA is missing. + */ + rc = 0; + } + } +#endif + return rc; } -- 2.39.5