[dm-devel] convert dm_ulog_request data to little endian

Mike Snitzer snitzer at redhat.com
Mon Aug 11 03:15:56 UTC 2014


On Thu, Aug 07 2014 at  8:56pm -0400,
Dongmao Zhang <dmzhang at suse.com> wrote:

> the dm_ulog_request might be little endian or big endian depending on
> the architecture. This is not right. This patch is to convert
> dm_ulog_request to little endian.
> 
> I met a bug when running cmirrord on s390 linux
> 
> Signed-off-by: Dongmao Zhang <dmzhang at suse.com>
> ---
>  drivers/md/dm-log-userspace-transfer.c | 31 ++++++++++++++++++++++++++++++-
>  1 file changed, 30 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/md/dm-log-userspace-transfer.c b/drivers/md/dm-log-userspace-transfer.c
> index b428c0a..cddef2f 100644
> --- a/drivers/md/dm-log-userspace-transfer.c
> +++ b/drivers/md/dm-log-userspace-transfer.c
> @@ -53,6 +53,29 @@ struct receiving_pkg {
>  static DEFINE_SPINLOCK(receiving_list_lock);
>  static struct list_head receiving_list;
>  
> +static void cpu_to_network(struct dm_ulog_request *tfr)
> +{
> +	if (tfr == NULL)
> +		return;
> +	tfr->luid = cpu_to_le64(tfr->luid);
> +	tfr->version =  cpu_to_le32(tfr->version);
> +	tfr->seq = cpu_to_le32(tfr->seq);
> +	tfr->request_type = cpu_to_le32(tfr->request_type);
> +	tfr->data_size = cpu_to_le32(tfr->data_size);
> +}
> +
> +static void network_to_cpu(struct dm_ulog_request *tfr)
> +{
> +	if (tfr == NULL)
> +		return;
> +	tfr->luid = le64_to_cpu(tfr->luid);
> +	tfr->version =  le32_to_cpu(tfr->version);
> +	tfr->seq = le32_to_cpu(tfr->seq);
> +	tfr->request_type = le32_to_cpu(tfr->request_type);
> +	tfr->data_size = le32_to_cpu(tfr->data_size);
> +	tfr->error = le32_to_cpu(tfr->error);
> +}
> +
>  static int dm_ulog_sendto_server(struct dm_ulog_request *tfr)
>  {
>  	int r;
> @@ -66,6 +89,7 @@ static int dm_ulog_sendto_server(struct dm_ulog_request *tfr)
>  	msg->seq = tfr->seq;
>  	msg->len = sizeof(struct dm_ulog_request) + tfr->data_size;
>  
> +	cpu_to_network(tfr);
>  	r = cn_netlink_send(msg, 0, 0, gfp_any());
>  
>  	return r;
> @@ -81,8 +105,11 @@ static int dm_ulog_sendto_server(struct dm_ulog_request *tfr)
>   */
>  static int fill_pkg(struct cn_msg *msg, struct dm_ulog_request *tfr)
>  {
> -	uint32_t rtn_seq = (msg) ? msg->seq : (tfr) ? tfr->seq : 0;
>  	struct receiving_pkg *pkg;
> +	uint32_t rtn_seq;
> +
> +	network_to_cpu(tfr);
> +	rtn_seq = (msg) ? msg->seq : (tfr) ? tfr->seq : 0;
>  
>  	/*
>  	 * The 'receiving_pkg' entries in this list are statically
> @@ -148,6 +175,8 @@ static void cn_ulog_callback(struct cn_msg *msg, struct netlink_skb_parms *nsp)
>  	spin_unlock(&receiving_list_lock);
>  }
>  
> +
> +
>  /**
>   * dm_consult_userspace
>   * @uuid: log's universal unique identifier (must be DM_UUID_LEN in size)

Other than this last hunk (extra whitespace) this patch looks fine to me.

Jon/Mikulas/Alasdair: could you review this too?  If you guys agree I'll
get it staged for 3.17 (and mark it for stable).

Thanks,
Mike




More information about the dm-devel mailing list