]> www.infradead.org Git - users/hch/misc.git/commitdiff
cifs: Split parse_reparse_point callback to functions: get buffer and parse buffer
authorPali Rohár <pali@kernel.org>
Mon, 14 Oct 2024 13:00:05 +0000 (15:00 +0200)
committerSteve French <stfrench@microsoft.com>
Wed, 9 Apr 2025 20:37:35 +0000 (15:37 -0500)
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 followup change - getting reparse
point buffer without parsing it.

Signed-off-by: Pali Rohár <pali@kernel.org>
Signed-off-by: Steve French <stfrench@microsoft.com>
fs/smb/client/cifsglob.h
fs/smb/client/inode.c
fs/smb/client/reparse.c
fs/smb/client/reparse.h
fs/smb/client/smb1ops.c
fs/smb/client/smb2ops.c

index 07c4688ec4c99e467f40654bc24eafae55b5e6f7..3b32116b0b4964920c866110bcaeb121c2a22b75 100644 (file)
@@ -625,10 +625,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,
index 33d699c5cf37f788bc3db5a5d1c923004c1318ba..75be4b46bc6f18e40b879cf798e0fa107f594f51 100644 (file)
@@ -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
index d79d88e324f4660b7957ab5c8be8a884e0a3424e..bb25e77c5540c26871ec6ad10d17af630c4fb5a4 100644 (file)
@@ -1099,18 +1099,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 bool wsl_to_fattr(struct cifs_open_info_data *data,
index c0be5ab45a78a026c1da1025a6db65d2d3d4b3a3..08de853b36a8a9c6b7d3fae184bffbf6acb89286 100644 (file)
@@ -135,9 +135,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 */
index 26df807fbe7a9acb651152b38a021ea655e5f68d..b1d665f6ae759fd04eba7626c2dc78d28bf956c9 100644 (file)
@@ -970,18 +970,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
@@ -1157,7 +1152,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,
index 3f7fe74688a922d0ecc09d9ae8dd1b9367e529fa..2fe8eeb98535631e7e70b226617707827ec58999 100644 (file)
@@ -5303,7 +5303,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,
@@ -5406,7 +5406,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,
@@ -5513,7 +5513,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,
@@ -5629,7 +5629,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,