Commit 56c0bea5 authored by Pali Rohár's avatar Pali Rohár Committed by Steve French
Browse files

cifs: Split parse_reparse_point callback to functions: get buffer and parse buffer



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: default avatarPali Rohár <pali@kernel.org>
Signed-off-by: default avatarSteve French <stfrench@microsoft.com>
parent 12193b98
Loading
Loading
Loading
Loading
+2 −4
Original line number Diff line number Diff line
@@ -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,
+7 −4
Original line number Diff line number Diff line
@@ -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
+5 −10
Original line number Diff line number Diff line
@@ -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 +
	*plen = le32_to_cpu(io->OutputCount);
	return (struct reparse_data_buffer *)((u8 *)io +
					      le32_to_cpu(io->OutputOffset));
	return parse_reparse_point(buf, plen, cifs_sb, full_path, data);
}

static bool wsl_to_fattr(struct cifs_open_info_data *data,
+1 −4
Original line number Diff line number Diff line
@@ -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 */
+6 −11
Original line number Diff line number Diff line
@@ -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 +
	*plen = le16_to_cpu(io->ByteCount);
	return (struct reparse_data_buffer *)((__u8 *)&io->hdr.Protocol +
					      le32_to_cpu(io->DataOffset));
	return parse_reparse_point(buf, plen, cifs_sb, full_path, data);
}

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,
Loading