From patchwork Sun Dec 22 15:43:37 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Pali_Roh=C3=A1r?= X-Patchwork-Id: 13918102 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 9816218FC85; Sun, 22 Dec 2024 15:44:50 +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=1734882290; cv=none; b=jv9v0SuzvZMzF3nrpalhkZqJvocBQ6/msO+IxtEsuWu44kWlY3ljdnHd+TD9NEBTXJHf8zI3PfEpIMYzkyxQCOsLnUuvwWcxJCeuBiKtdcJTOxUPj7tKLZkYw0TzUN2GbhcEZPqE5LcxuDMXlI6eOlJ1ES1O3/bBpzuRRppjr/Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1734882290; c=relaxed/simple; bh=3onlQYxHbJn5sSsJa75CcVW58TTix8UZLOMI9JMW5UY=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version:Content-Type; b=TBfQUgsNrX611VVeHBrT1cffe16Vh+cmUDYxqA6/BQsMH/N2DEz+GK/PukRRpWZb3mOk53ikfrU/k2G1r913ojwf7VccdCA+N7WXIOuggk91h0oIJtQacQvOEVZ1IS4PoVjba6oHCNeBelUr/uhJiIRBdl8d1glxxqAGOI+mRPE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Yu9ec+k7; 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="Yu9ec+k7" Received: by smtp.kernel.org (Postfix) with ESMTPSA id DF67BC4CEDD; Sun, 22 Dec 2024 15:44:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1734882290; bh=3onlQYxHbJn5sSsJa75CcVW58TTix8UZLOMI9JMW5UY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Yu9ec+k73YXeoiaYK8q4DDiLAxjwNaTRYBdnAy2F8Tq59EsWQ6H8KnZmjw1UcPh/6 +6Jn/BAhbN/gk0zoOZ5Rs6Lz8xRlBFeQKzvNDWhKlglS9L/Nb1bX2CQpx+2ABOHect r+/DFGWJp4uESrbHLXZuMAcds3e7L7Y4z8UdD2U3dJctK3wQKpVnh3CMcWuCd5yjpA 9HqRkkXG8ulmAd1YbQMB3oHzRUOApCaLg7Fx2eWQKRNXLVWYPrCH+u03T7HQmtMYXL tZO8tvUSQVAMwDooTStBwp2hZ+v4y8tUew3evBEvQ4+M0+ypjVXmsPuVdfu9qa+NCH zwh3YZinIsoyw== Received: by pali.im (Postfix) id 17DC2982; Sun, 22 Dec 2024 16:44:40 +0100 (CET) From: =?utf-8?q?Pali_Roh=C3=A1r?= To: Steve French , Paulo Alcantara , Ronnie Sahlberg Cc: linux-cifs@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 1/4] cifs: Split parse_reparse_point callback to functions: get buffer and parse buffer Date: Sun, 22 Dec 2024 16:43:37 +0100 Message-Id: <20241222154340.24104-2-pali@kernel.org> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20241222154340.24104-1-pali@kernel.org> References: <20241222154340.24104-1-pali@kernel.org> Precedence: bulk X-Mailing-List: linux-cifs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Parsing reparse point buffer is generic for all SMB versions and is already implemented by global function parse_reparse_point(). Getting reparse point buffer from the SMB response is SMB version specific, so introduce for it a new callback get_reparse_point_buffer. This functionality split is needed for next change - getting reparse point buffer without parsing it. Signed-off-by: Pali Rohár --- fs/smb/client/cifsglob.h | 6 ++---- fs/smb/client/inode.c | 11 +++++++---- fs/smb/client/reparse.c | 15 +++++---------- fs/smb/client/reparse.h | 5 +---- fs/smb/client/smb1ops.c | 17 ++++++----------- fs/smb/client/smb2ops.c | 8 ++++---- 6 files changed, 25 insertions(+), 37 deletions(-) diff --git a/fs/smb/client/cifsglob.h b/fs/smb/client/cifsglob.h index 369458d37f99..d4c60d85d7a4 100644 --- a/fs/smb/client/cifsglob.h +++ b/fs/smb/client/cifsglob.h @@ -629,10 +629,8 @@ struct smb_version_operations { bool (*is_status_io_timeout)(char *buf); /* Check for STATUS_NETWORK_NAME_DELETED */ bool (*is_network_name_deleted)(char *buf, struct TCP_Server_Info *srv); - int (*parse_reparse_point)(struct cifs_sb_info *cifs_sb, - const char *full_path, - struct kvec *rsp_iov, - struct cifs_open_info_data *data); + struct reparse_data_buffer * (*get_reparse_point_buffer)(const struct kvec *rsp_iov, + u32 *plen); int (*create_reparse_symlink)(const unsigned int xid, struct inode *inode, struct dentry *dentry, diff --git a/fs/smb/client/inode.c b/fs/smb/client/inode.c index ed32d78971f8..b295d161373c 100644 --- a/fs/smb/client/inode.c +++ b/fs/smb/client/inode.c @@ -1207,10 +1207,13 @@ static int reparse_info_to_fattr(struct cifs_open_info_data *data, /* Check for cached reparse point data */ if (data->symlink_target || data->reparse.buf) { rc = 0; - } else if (iov && server->ops->parse_reparse_point) { - rc = server->ops->parse_reparse_point(cifs_sb, - full_path, - iov, data); + } else if (iov && server->ops->get_reparse_point_buffer) { + struct reparse_data_buffer *reparse_buf; + u32 reparse_len; + + reparse_buf = server->ops->get_reparse_point_buffer(iov, &reparse_len); + rc = parse_reparse_point(reparse_buf, reparse_len, + cifs_sb, full_path, data); /* * If the reparse point was not handled but it is the * name surrogate which points to directory, then treat diff --git a/fs/smb/client/reparse.c b/fs/smb/client/reparse.c index 6ffda4455f9b..f01214d6c5d4 100644 --- a/fs/smb/client/reparse.c +++ b/fs/smb/client/reparse.c @@ -1096,18 +1096,13 @@ int parse_reparse_point(struct reparse_data_buffer *buf, } } -int smb2_parse_reparse_point(struct cifs_sb_info *cifs_sb, - const char *full_path, - struct kvec *rsp_iov, - struct cifs_open_info_data *data) +struct reparse_data_buffer *smb2_get_reparse_point_buffer(const struct kvec *rsp_iov, + u32 *plen) { - struct reparse_data_buffer *buf; struct smb2_ioctl_rsp *io = rsp_iov->iov_base; - u32 plen = le32_to_cpu(io->OutputCount); - - buf = (struct reparse_data_buffer *)((u8 *)io + - le32_to_cpu(io->OutputOffset)); - return parse_reparse_point(buf, plen, cifs_sb, full_path, data); + *plen = le32_to_cpu(io->OutputCount); + return (struct reparse_data_buffer *)((u8 *)io + + le32_to_cpu(io->OutputOffset)); } static void wsl_to_fattr(struct cifs_open_info_data *data, diff --git a/fs/smb/client/reparse.h b/fs/smb/client/reparse.h index 5a753fec7e2c..c17130657def 100644 --- a/fs/smb/client/reparse.h +++ b/fs/smb/client/reparse.h @@ -119,9 +119,6 @@ int smb2_create_reparse_symlink(const unsigned int xid, struct inode *inode, int smb2_mknod_reparse(unsigned int xid, struct inode *inode, struct dentry *dentry, struct cifs_tcon *tcon, const char *full_path, umode_t mode, dev_t dev); -int smb2_parse_reparse_point(struct cifs_sb_info *cifs_sb, - const char *full_path, - struct kvec *rsp_iov, - struct cifs_open_info_data *data); +struct reparse_data_buffer *smb2_get_reparse_point_buffer(const struct kvec *rsp_iov, u32 *len); #endif /* _CIFS_REPARSE_H */ diff --git a/fs/smb/client/smb1ops.c b/fs/smb/client/smb1ops.c index 3667fb94cbf5..01a7d6b23c7e 100644 --- a/fs/smb/client/smb1ops.c +++ b/fs/smb/client/smb1ops.c @@ -993,18 +993,13 @@ static int cifs_query_symlink(const unsigned int xid, return rc; } -static int cifs_parse_reparse_point(struct cifs_sb_info *cifs_sb, - const char *full_path, - struct kvec *rsp_iov, - struct cifs_open_info_data *data) +static struct reparse_data_buffer *cifs_get_reparse_point_buffer(const struct kvec *rsp_iov, + u32 *plen) { - struct reparse_data_buffer *buf; TRANSACT_IOCTL_RSP *io = rsp_iov->iov_base; - u32 plen = le16_to_cpu(io->ByteCount); - - buf = (struct reparse_data_buffer *)((__u8 *)&io->hdr.Protocol + - le32_to_cpu(io->DataOffset)); - return parse_reparse_point(buf, plen, cifs_sb, full_path, data); + *plen = le16_to_cpu(io->ByteCount); + return (struct reparse_data_buffer *)((__u8 *)&io->hdr.Protocol + + le32_to_cpu(io->DataOffset)); } static bool @@ -1139,7 +1134,7 @@ struct smb_version_operations smb1_operations = { .rename = CIFSSMBRename, .create_hardlink = CIFSCreateHardLink, .query_symlink = cifs_query_symlink, - .parse_reparse_point = cifs_parse_reparse_point, + .get_reparse_point_buffer = cifs_get_reparse_point_buffer, .open = cifs_open_file, .set_fid = cifs_set_fid, .close = cifs_close_file, diff --git a/fs/smb/client/smb2ops.c b/fs/smb/client/smb2ops.c index 87cb1872db28..0a91f18d4a54 100644 --- a/fs/smb/client/smb2ops.c +++ b/fs/smb/client/smb2ops.c @@ -5270,7 +5270,7 @@ struct smb_version_operations smb20_operations = { .unlink = smb2_unlink, .rename = smb2_rename_path, .create_hardlink = smb2_create_hardlink, - .parse_reparse_point = smb2_parse_reparse_point, + .get_reparse_point_buffer = smb2_get_reparse_point_buffer, .query_mf_symlink = smb3_query_mf_symlink, .create_mf_symlink = smb3_create_mf_symlink, .create_reparse_symlink = smb2_create_reparse_symlink, @@ -5373,7 +5373,7 @@ struct smb_version_operations smb21_operations = { .unlink = smb2_unlink, .rename = smb2_rename_path, .create_hardlink = smb2_create_hardlink, - .parse_reparse_point = smb2_parse_reparse_point, + .get_reparse_point_buffer = smb2_get_reparse_point_buffer, .query_mf_symlink = smb3_query_mf_symlink, .create_mf_symlink = smb3_create_mf_symlink, .create_reparse_symlink = smb2_create_reparse_symlink, @@ -5480,7 +5480,7 @@ struct smb_version_operations smb30_operations = { .unlink = smb2_unlink, .rename = smb2_rename_path, .create_hardlink = smb2_create_hardlink, - .parse_reparse_point = smb2_parse_reparse_point, + .get_reparse_point_buffer = smb2_get_reparse_point_buffer, .query_mf_symlink = smb3_query_mf_symlink, .create_mf_symlink = smb3_create_mf_symlink, .create_reparse_symlink = smb2_create_reparse_symlink, @@ -5596,7 +5596,7 @@ struct smb_version_operations smb311_operations = { .unlink = smb2_unlink, .rename = smb2_rename_path, .create_hardlink = smb2_create_hardlink, - .parse_reparse_point = smb2_parse_reparse_point, + .get_reparse_point_buffer = smb2_get_reparse_point_buffer, .query_mf_symlink = smb3_query_mf_symlink, .create_mf_symlink = smb3_create_mf_symlink, .create_reparse_symlink = smb2_create_reparse_symlink, From patchwork Sun Dec 22 15:43:38 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Pali_Roh=C3=A1r?= X-Patchwork-Id: 13918099 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 6F1FC188CC9; Sun, 22 Dec 2024 15:44:50 +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=1734882290; cv=none; b=BuejfDH1+6WPH3vZKQPWuUa5raiU8yHp43EYgvZbgYIMM+nKNkaR/ArCSB1VgCgGj/MgBAy9Xt2SLWspdZ7f3zKVWgwU/VtK7qb+LacllDT1fyCOGLatIhq2XseFxjCMhsN202qGrvkn3d3+4kHD1WV5k9LSCf51QqUxJ0RLB5s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1734882290; c=relaxed/simple; bh=hhLFChl282HxxjSG4TJYO7INCsXhOHPkcVj3YBbRMcA=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version:Content-Type; b=s3Q6hx9ATecoNurF7GSNnILONLf5JjLi8F5/cugpPIziqYWFAJolM8lgn4QKWkcnSeXxVLtiSyt9j38z3Li8FY4TLZa/jEUxEKk04MLs+RAhJxeDKI6i663Pnxa6VwKjr/+nsoiywurbRPcE4DRirbN7dgUj/0cvmGb3YWALYno= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=F2as0Tx5; 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="F2as0Tx5" Received: by smtp.kernel.org (Postfix) with ESMTPSA id DD3DBC4CED3; Sun, 22 Dec 2024 15:44:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1734882290; bh=hhLFChl282HxxjSG4TJYO7INCsXhOHPkcVj3YBbRMcA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=F2as0Tx525BoUPcfGFlp0OaBFgCRYfo1fYbircJ1kF/2n9lYLxY8Oc+ux0bMLzrEE a6n2g5W/GkYqDyshg36aG+Ex2RiX3ZyPZ4k11sevET/zEEQq67CiIUUOgmnuKaaW7+ 07tnf4nhsfs8ApLGPWAGh9z3FmalocvDF6FeBG2RgVx4/iFKWOrVkVJC3a6bV3B+hF eGqytPX74mus39HHyhEZZeqFz0Ogm8tFT62dbvGQfckfkqHc2GAXgBnsn6s6NDuggJ WxmKnUOp8zwWzdLmyqmKe50beSsr6k1Gfs/0BadXhnXs9GfdeeZZhV9/2PKmIJwkLy cBh0kJ87IB1Ag== Received: by pali.im (Postfix) id 49B01B9A; Sun, 22 Dec 2024 16:44:40 +0100 (CET) From: =?utf-8?q?Pali_Roh=C3=A1r?= To: Steve French , Paulo Alcantara , Ronnie Sahlberg Cc: linux-cifs@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 2/4] cifs: Add a new xattr system.reparse for querying repase point from SMB server Date: Sun, 22 Dec 2024 16:43:38 +0100 Message-Id: <20241222154340.24104-3-pali@kernel.org> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20241222154340.24104-1-pali@kernel.org> References: <20241222154340.24104-1-pali@kernel.org> Precedence: bulk X-Mailing-List: linux-cifs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Currently SMB client fetches and parses only few reparse point types, those which directly maps to Linux file types. This change introduce a new xattr system.reparse which allows userspace application to query reparse point buffer and then let application to parse and handle it as needed. Currently only get xattr is implemented. Setting new reparse point, changing it or deleting via set xattr is not implemented yet. Signed-off-by: Pali Rohár --- fs/smb/client/xattr.c | 46 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/fs/smb/client/xattr.c b/fs/smb/client/xattr.c index b88fa04f5792..7fb7662afaea 100644 --- a/fs/smb/client/xattr.c +++ b/fs/smb/client/xattr.c @@ -39,7 +39,10 @@ #define SMB3_XATTR_CREATETIME "smb3.creationtime" /* user.smb3.creationtime */ /* BB need to add server (Samba e.g) support for security and trusted prefix */ +#define SMB_XATTR_REPARSE "system.reparse" + enum { XATTR_USER, XATTR_CIFS_ACL, XATTR_ACL_ACCESS, XATTR_ACL_DEFAULT, + XATTR_REPARSE, XATTR_CIFS_NTSD_SACL, XATTR_CIFS_NTSD_OWNER, XATTR_CIFS_NTSD, XATTR_CIFS_NTSD_FULL }; @@ -162,6 +165,11 @@ static int cifs_xattr_set(const struct xattr_handler *handler, } break; + case XATTR_REPARSE: + /* TODO: Implementing setting, changing and deleting reparse point */ + rc = -EOPNOTSUPP; + break; + case XATTR_CIFS_ACL: case XATTR_CIFS_NTSD_SACL: case XATTR_CIFS_NTSD_OWNER: @@ -319,6 +327,36 @@ static int cifs_xattr_get(const struct xattr_handler *handler, full_path, name, value, size, cifs_sb); break; + case XATTR_REPARSE: { + struct reparse_data_buffer *reparse_buf; + int rsp_buftype = CIFS_NO_BUFFER; + struct kvec rsp_iov = {}; + u32 reparse_len; + u32 tag; + + if (!pTcon->ses->server->ops->query_reparse_point) + goto out; + + rc = pTcon->ses->server->ops->query_reparse_point(xid, pTcon, + cifs_sb, full_path, &tag, &rsp_iov, &rsp_buftype); + if (rc) + goto out; + + reparse_buf = pTcon->ses->server->ops->get_reparse_point_buffer(&rsp_iov, + &reparse_len); + + if (value) { + if (reparse_len > size) + reparse_len = -ERANGE; + else + memcpy(value, reparse_buf, reparse_len); + } + rc = reparse_len; + + free_rsp_buf(rsp_buftype, rsp_iov.iov_base); + break; + } + case XATTR_CIFS_ACL: case XATTR_CIFS_NTSD_SACL: case XATTR_CIFS_NTSD_OWNER: @@ -448,6 +486,13 @@ static const struct xattr_handler cifs_os2_xattr_handler = { .set = cifs_xattr_set, }; +static const struct xattr_handler cifs_reparse_xattr_handler = { + .name = SMB_XATTR_REPARSE, + .flags = XATTR_REPARSE, + .get = cifs_xattr_get, + .set = cifs_xattr_set, +}; + static const struct xattr_handler cifs_cifs_acl_xattr_handler = { .name = CIFS_XATTR_CIFS_ACL, .flags = XATTR_CIFS_ACL, @@ -525,6 +570,7 @@ static const struct xattr_handler smb3_ntsd_full_xattr_handler = { const struct xattr_handler * const cifs_xattr_handlers[] = { &cifs_user_xattr_handler, &cifs_os2_xattr_handler, + &cifs_reparse_xattr_handler, &cifs_cifs_acl_xattr_handler, &smb3_acl_xattr_handler, /* alias for above since avoiding "cifs" */ &smb3_ntsd_sacl_xattr_handler, From patchwork Sun Dec 22 15:43:39 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Pali_Roh=C3=A1r?= X-Patchwork-Id: 13918101 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 981CD18FDA9; Sun, 22 Dec 2024 15:44:50 +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=1734882290; cv=none; b=enucRBJk16GdpuP+ha6+yMLft55DMfhMME1fzBoONpmdaOWUTz3iKC8+ziGDwxjg4B8U/xU5KYpqBges/rYg6SVOkwNmTiUDuatpyV7fwathbb3PpaAinTwcFZwdQLU21fUrn1QmuDQjB+N5RQ7Lzq3K/PQ+0py28QO3uThyLP0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1734882290; c=relaxed/simple; bh=JDQEZOdsea2srLQIbWI7xsM4aLspm8HPEYwnQDEVrW0=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version:Content-Type; b=A/W5gvMwAX/FuYTTZmmJP72uc334Ht5tfvAi1OXAOm4a8bL7tMHq87ywGM+KGZqTAVFgZzmNNwMzQJd8YJheVjIl0H2cfht5ThtUQRtGNcc75JVreduvFOjpZqdTfzxyUFVwXocTddrkeZxqPTZqmyZOgCYk3qCgSXhZklTyFkU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=YU9heYRS; 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="YU9heYRS" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 18EE5C4CEDC; Sun, 22 Dec 2024 15:44:50 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1734882290; bh=JDQEZOdsea2srLQIbWI7xsM4aLspm8HPEYwnQDEVrW0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=YU9heYRSJlNR5u3F+kJKG8orYtIgtee58klEetcyP/yeUfYr5YYXvH75RrE7kzOA1 bQ+rVP8MW5mu2AwzAaCU1P12DzMhdM7iBkrH4vnODM1QCgyY4a/KoF2lJi4dCRhcuJ CN+uR4dyJDXeBQkmYeDpEdW8x0GuGSs3wGXN1QTQv8UdAbnPFeTWSa1jmBlUy2efPv bL88NtNTkINWQ56ookx53lKDeURHencsY97SXZBB59V2vl4LjRz1AUMyqOgM6zxsjF ED6i2h496Cfr+/487mF28/pmKEMvOWGOCo0zJ/a/F1OHH6+yy2XJE+fmX/tHpbMjh2 EGqw662TQH66Q== Received: by pali.im (Postfix) id 70ACAD48; Sun, 22 Dec 2024 16:44:40 +0100 (CET) From: =?utf-8?q?Pali_Roh=C3=A1r?= To: Steve French , Paulo Alcantara , Ronnie Sahlberg Cc: linux-cifs@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 3/4] cifs: Change translation of STATUS_NOT_A_REPARSE_POINT to -ENODATA Date: Sun, 22 Dec 2024 16:43:39 +0100 Message-Id: <20241222154340.24104-4-pali@kernel.org> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20241222154340.24104-1-pali@kernel.org> References: <20241222154340.24104-1-pali@kernel.org> Precedence: bulk X-Mailing-List: linux-cifs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 STATUS_NOT_A_REPARSE_POINT indicates that object does not have repase point buffer attached, for example returned by FSCTL_GET_REPARSE_POINT. Currently STATUS_NOT_A_REPARSE_POINT is translated to -EIO. Change it to -ENODATA which better describe the situation when no reparse point is set. Signed-off-by: Pali Rohár --- fs/smb/client/netmisc.c | 7 +++++++ fs/smb/client/nterr.c | 1 + fs/smb/client/nterr.h | 1 + fs/smb/client/smb2maperror.c | 2 +- 4 files changed, 10 insertions(+), 1 deletion(-) diff --git a/fs/smb/client/netmisc.c b/fs/smb/client/netmisc.c index a2fb1ae14d41..0ff3ccc7a356 100644 --- a/fs/smb/client/netmisc.c +++ b/fs/smb/client/netmisc.c @@ -871,6 +871,13 @@ map_smb_to_linux_error(char *buf, bool logErr) } /* else ERRHRD class errors or junk - return EIO */ + /* special cases for NT status codes which cannot be translated to DOS codes */ + if (smb->Flags2 & SMBFLG2_ERR_STATUS) { + __u32 err = le32_to_cpu(smb->Status.CifsError); + if (err == (NT_STATUS_NOT_A_REPARSE_POINT)) + rc = -ENODATA; + } + cifs_dbg(FYI, "Mapping smb error code 0x%x to POSIX err %d\n", le32_to_cpu(smb->Status.CifsError), rc); diff --git a/fs/smb/client/nterr.c b/fs/smb/client/nterr.c index 358a766375b4..777431912e64 100644 --- a/fs/smb/client/nterr.c +++ b/fs/smb/client/nterr.c @@ -667,6 +667,7 @@ const struct nt_err_code_struct nt_errs[] = { {"NT_STATUS_QUOTA_LIST_INCONSISTENT", NT_STATUS_QUOTA_LIST_INCONSISTENT}, {"NT_STATUS_FILE_IS_OFFLINE", NT_STATUS_FILE_IS_OFFLINE}, + {"NT_STATUS_NOT_A_REPARSE_POINT", NT_STATUS_NOT_A_REPARSE_POINT}, {"NT_STATUS_NO_MORE_ENTRIES", NT_STATUS_NO_MORE_ENTRIES}, {"NT_STATUS_MORE_ENTRIES", NT_STATUS_MORE_ENTRIES}, {"NT_STATUS_SOME_UNMAPPED", NT_STATUS_SOME_UNMAPPED}, diff --git a/fs/smb/client/nterr.h b/fs/smb/client/nterr.h index edd4741cab0a..180602c22355 100644 --- a/fs/smb/client/nterr.h +++ b/fs/smb/client/nterr.h @@ -546,6 +546,7 @@ extern const struct nt_err_code_struct nt_errs[]; #define NT_STATUS_TOO_MANY_LINKS 0xC0000000 | 0x0265 #define NT_STATUS_QUOTA_LIST_INCONSISTENT 0xC0000000 | 0x0266 #define NT_STATUS_FILE_IS_OFFLINE 0xC0000000 | 0x0267 +#define NT_STATUS_NOT_A_REPARSE_POINT 0xC0000000 | 0x0275 #define NT_STATUS_NO_SUCH_JOB 0xC0000000 | 0xEDE /* scheduler */ #endif /* _NTERR_H */ diff --git a/fs/smb/client/smb2maperror.c b/fs/smb/client/smb2maperror.c index 00c0bd79c074..daa56b2a2a1a 100644 --- a/fs/smb/client/smb2maperror.c +++ b/fs/smb/client/smb2maperror.c @@ -871,7 +871,7 @@ static const struct status_to_posix_error smb2_error_map_table[] = { {STATUS_VALIDATE_CONTINUE, -EIO, "STATUS_VALIDATE_CONTINUE"}, {STATUS_NO_MATCH, -EIO, "STATUS_NO_MATCH"}, {STATUS_NO_MORE_MATCHES, -EIO, "STATUS_NO_MORE_MATCHES"}, - {STATUS_NOT_A_REPARSE_POINT, -EIO, "STATUS_NOT_A_REPARSE_POINT"}, + {STATUS_NOT_A_REPARSE_POINT, -ENODATA, "STATUS_NOT_A_REPARSE_POINT"}, {STATUS_IO_REPARSE_TAG_INVALID, -EIO, "STATUS_IO_REPARSE_TAG_INVALID"}, {STATUS_IO_REPARSE_TAG_MISMATCH, -EIO, "STATUS_IO_REPARSE_TAG_MISMATCH"}, From patchwork Sun Dec 22 15:43:40 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Pali_Roh=C3=A1r?= X-Patchwork-Id: 13918103 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 B8541190051; Sun, 22 Dec 2024 15:44:50 +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=1734882290; cv=none; b=YDvYxZ8O2RKYIwszWkHMLV8Z+G40OI/J5BYDu3ZGjiWEkLebrXG6xlheQTH/TbRfhnR9prZ9JkErGaa+5ymqnS+hrM6ITA41fQWjKzQT7gWrCy9pefC1ErMgTg/BgV3g0F9OqDvpeORRzQLJQNqGy0kXXBLnNaaWPOtkvZlS/Zc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1734882290; c=relaxed/simple; bh=vZKFm2ZEqacVyuVEfxw0+dRyd+24gQiBndfQn3r89J0=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version:Content-Type; b=BRovRknQznlJ58V24nfExyRaFKuHjWU9+DKyCF13xas92eah70Tsj5gYtQA0eo7Asvb/DYSiEpKEokiapBYvlA6gzIT6rB58voXyiFqUQbFsyKxM4ysNq9tazAD21KCCvr31maelXw24NnT7o9Fy5Rjd1yBhCgo6UAL7o8jX2tE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=MsoE+Ehf; 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="MsoE+Ehf" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 70380C4CEDE; Sun, 22 Dec 2024 15:44:50 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1734882290; bh=vZKFm2ZEqacVyuVEfxw0+dRyd+24gQiBndfQn3r89J0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=MsoE+Ehf+u7SurXPtfe8LCch7VJqvwIp/F96oTySu30g3WMryazETaNVFDcUAZg61 oWoWUo1cLNHcJygfH2x6iXgOVJ0cI0M3PybzgG1ckEKqVQ/1SzemCiA0MMnsCk0J2o qFEXs/acyckSrNiyWOmvjIv/e5mlADgVcgAEt+dklyMCnUb4GYgIWZePaFPEnC+bMU Gg20U5q9fgjVZ4ntTld00+kGzOdC1XtuyEGEY/Oa7OefUOoAkJD2a8LN5Vu4hZsWZa 0jO7Y2lTEG/DQX1yejwJUiA13C3L84cuCFHini+Bwy+NanwtW8BAdGthfeqbh4TrQK 4oEy1ZmZqiYVA== Received: by pali.im (Postfix) id 9ADD1EEC; Sun, 22 Dec 2024 16:44:40 +0100 (CET) From: =?utf-8?q?Pali_Roh=C3=A1r?= To: Steve French , Paulo Alcantara , Ronnie Sahlberg Cc: linux-cifs@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 4/4] cifs: Check if server supports reparse points before using them Date: Sun, 22 Dec 2024 16:43:40 +0100 Message-Id: <20241222154340.24104-5-pali@kernel.org> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20241222154340.24104-1-pali@kernel.org> References: <20241222154340.24104-1-pali@kernel.org> Precedence: bulk X-Mailing-List: linux-cifs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Do not attempt to query or create reparse point when server fs does not support it. This will prevent creating unusable empty object on the server. Signed-off-by: Pali Rohár --- fs/smb/client/cifssmb.c | 3 +++ fs/smb/client/link.c | 3 ++- fs/smb/client/smb2inode.c | 8 ++++++++ fs/smb/client/smb2ops.c | 4 ++-- 4 files changed, 15 insertions(+), 3 deletions(-) diff --git a/fs/smb/client/cifssmb.c b/fs/smb/client/cifssmb.c index 2763db49b155..83365861a99c 100644 --- a/fs/smb/client/cifssmb.c +++ b/fs/smb/client/cifssmb.c @@ -2695,6 +2695,9 @@ int cifs_query_reparse_point(const unsigned int xid, if (cap_unix(tcon->ses)) return -EOPNOTSUPP; + if (!(le32_to_cpu(tcon->fsAttrInfo.Attributes) & FILE_SUPPORTS_REPARSE_POINTS)) + return -EOPNOTSUPP; + oparms = (struct cifs_open_parms) { .tcon = tcon, .cifs_sb = cifs_sb, diff --git a/fs/smb/client/link.c b/fs/smb/client/link.c index 6e6c09cc5ce7..a88253668286 100644 --- a/fs/smb/client/link.c +++ b/fs/smb/client/link.c @@ -643,7 +643,8 @@ cifs_symlink(struct mnt_idmap *idmap, struct inode *inode, case CIFS_SYMLINK_TYPE_NATIVE: case CIFS_SYMLINK_TYPE_NFS: case CIFS_SYMLINK_TYPE_WSL: - if (server->ops->create_reparse_symlink) { + if (server->ops->create_reparse_symlink && + (le32_to_cpu(pTcon->fsAttrInfo.Attributes) & FILE_SUPPORTS_REPARSE_POINTS)) { rc = server->ops->create_reparse_symlink(xid, inode, direntry, pTcon, diff --git a/fs/smb/client/smb2inode.c b/fs/smb/client/smb2inode.c index 379ac3cbad1f..818537c83d41 100644 --- a/fs/smb/client/smb2inode.c +++ b/fs/smb/client/smb2inode.c @@ -1289,6 +1289,14 @@ struct inode *smb2_get_reparse_inode(struct cifs_open_info_data *data, int rc; int i; + /* + * If server filesystem does not support reparse points then do not + * attempt to create reparse point. This will prevent creating unusable + * empty object on the server. + */ + if (!(le32_to_cpu(tcon->fsAttrInfo.Attributes) & FILE_SUPPORTS_REPARSE_POINTS)) + return ERR_PTR(-EOPNOTSUPP); + oparms = CIFS_OPARMS(cifs_sb, tcon, full_path, SYNCHRONIZE | DELETE | FILE_READ_ATTRIBUTES | diff --git a/fs/smb/client/smb2ops.c b/fs/smb/client/smb2ops.c index 0a91f18d4a54..50adb5cdfce9 100644 --- a/fs/smb/client/smb2ops.c +++ b/fs/smb/client/smb2ops.c @@ -5202,7 +5202,7 @@ static int smb2_make_node(unsigned int xid, struct inode *inode, const char *full_path, umode_t mode, dev_t dev) { struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb); - int rc; + int rc = -EOPNOTSUPP; /* * Check if mounted with mount parm 'sfu' mount parm. @@ -5213,7 +5213,7 @@ static int smb2_make_node(unsigned int xid, struct inode *inode, if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL) { rc = cifs_sfu_make_node(xid, inode, dentry, tcon, full_path, mode, dev); - } else { + } else if (le32_to_cpu(tcon->fsAttrInfo.Attributes) & FILE_SUPPORTS_REPARSE_POINTS) { rc = smb2_mknod_reparse(xid, inode, dentry, tcon, full_path, mode, dev); }