From: Martin Wilck <mwilck@suse.com>
To: Christophe Varoqui <christophe.varoqui@opensvc.com>,
Bart Van Assche <Bart.VanAssche@sandisk.com>,
Benjamin Marzinski <bmarzins@redhat.com>
Cc: dm-devel@redhat.com, Martin Wilck <mwilck@suse.com>
Subject: [PATCH v3 06/10] libmpathpersist: fix byte swapping for big endian systems
Date: Sun, 24 Jun 2018 21:09:40 +0200 [thread overview]
Message-ID: <20180624190944.27158-7-mwilck@suse.com> (raw)
In-Reply-To: <20180624190944.27158-1-mwilck@suse.com>
The functions "mpath_reverse_uintXY_byteorder" were apparently meant to
convert BE integers to native. This leads to wrong results on big-endian
systems. Make these functions use the get_unaligned_beXY API, and rename.
Also, remove the unused endianness test in mpath_pr_ioctl.c.
Signed-off-by: Martin Wilck <mwilck@suse.com>
---
libmpathpersist/mpath_persist.c | 8 ++---
libmpathpersist/mpath_pr_ioctl.c | 54 +++++++++-----------------------
2 files changed, 16 insertions(+), 46 deletions(-)
diff --git a/libmpathpersist/mpath_persist.c b/libmpathpersist/mpath_persist.c
index 6e9e67f9..435ef4b6 100644
--- a/libmpathpersist/mpath_persist.c
+++ b/libmpathpersist/mpath_persist.c
@@ -20,6 +20,7 @@
#include <ctype.h>
#include "propsel.h"
#include "util.h"
+#include "unaligned.h"
#include "mpath_persist.h"
#include "mpathpr.h"
@@ -560,12 +561,7 @@ int mpath_prout_reg(struct multipath *mpp,int rq_servact, int rq_scope,
}
if (!rollback && (thread[i].param.status == MPATH_PR_RESERV_CONFLICT)){
rollback = 1;
- sa_key = 0;
- for (i = 0; i < 8; ++i){
- if (i > 0)
- sa_key <<= 8;
- sa_key |= paramp->sa_key[i];
- }
+ sa_key = get_unaligned_be64(¶mp->sa_key[0]);
status = MPATH_PR_RESERV_CONFLICT ;
}
if (!rollback && (status == MPATH_PR_SUCCESS)){
diff --git a/libmpathpersist/mpath_pr_ioctl.c b/libmpathpersist/mpath_pr_ioctl.c
index 347f21b2..8416a3bf 100644
--- a/libmpathpersist/mpath_pr_ioctl.c
+++ b/libmpathpersist/mpath_pr_ioctl.c
@@ -31,8 +31,8 @@ void dumpHex(const char* str, int len, int no_ascii);
int prout_do_scsi_ioctl( char * dev, int rq_servact, int rq_scope,
unsigned int rq_type, struct prout_param_descriptor *paramp, int noisy);
uint32_t format_transportids(struct prout_param_descriptor *paramp);
-void mpath_reverse_uint32_byteorder(uint32_t *num);
-void mpath_reverse_uint16_byteorder(uint16_t *num);
+void convert_be32_to_cpu(uint32_t *num);
+void convert_be16_to_cpu(uint16_t *num);
void decode_transport_id(struct prin_fulldescr *fdesc, unsigned char * p, int length);
int get_prin_length(int rq_servact);
int mpath_isLittleEndian(void);
@@ -183,23 +183,23 @@ uint32_t format_transportids(struct prout_param_descriptor *paramp)
void mpath_format_readkeys( struct prin_resp *pr_buff, int len, int noisy)
{
- mpath_reverse_uint32_byteorder(&pr_buff->prin_descriptor.prin_readkeys.prgeneration);
- mpath_reverse_uint32_byteorder(&pr_buff->prin_descriptor.prin_readkeys.additional_length);
+ convert_be32_to_cpu(&pr_buff->prin_descriptor.prin_readkeys.prgeneration);
+ convert_be32_to_cpu(&pr_buff->prin_descriptor.prin_readkeys.additional_length);
}
void mpath_format_readresv(struct prin_resp *pr_buff, int len, int noisy)
{
- mpath_reverse_uint32_byteorder(&pr_buff->prin_descriptor.prin_readkeys.prgeneration);
- mpath_reverse_uint32_byteorder(&pr_buff->prin_descriptor.prin_readkeys.additional_length);
+ convert_be32_to_cpu(&pr_buff->prin_descriptor.prin_readkeys.prgeneration);
+ convert_be32_to_cpu(&pr_buff->prin_descriptor.prin_readkeys.additional_length);
return;
}
void mpath_format_reportcapabilities(struct prin_resp *pr_buff, int len, int noisy)
{
- mpath_reverse_uint16_byteorder(&pr_buff->prin_descriptor.prin_readcap.length);
- mpath_reverse_uint16_byteorder(&pr_buff->prin_descriptor.prin_readcap.pr_type_mask);
+ convert_be16_to_cpu(&pr_buff->prin_descriptor.prin_readcap.length);
+ convert_be16_to_cpu(&pr_buff->prin_descriptor.prin_readcap.pr_type_mask);
return;
}
@@ -213,8 +213,8 @@ void mpath_format_readfullstatus(struct prin_resp *pr_buff, int len, int noisy)
uint32_t additional_length;
- mpath_reverse_uint32_byteorder(&pr_buff->prin_descriptor.prin_readfd.prgeneration);
- mpath_reverse_uint32_byteorder(&pr_buff->prin_descriptor.prin_readfd.number_of_descriptor);
+ convert_be32_to_cpu(&pr_buff->prin_descriptor.prin_readfd.prgeneration);
+ convert_be32_to_cpu(&pr_buff->prin_descriptor.prin_readfd.number_of_descriptor);
if (pr_buff->prin_descriptor.prin_readfd.number_of_descriptor == 0)
{
@@ -469,40 +469,14 @@ int mpath_translate_response (char * dev, struct sg_io_hdr io_hdr,
return MPATH_PR_SUCCESS;
}
-int mpath_isLittleEndian(void)
+void convert_be16_to_cpu(uint16_t *num)
{
- int num = 1;
- if(*(char *)&num == 1)
- {
- condlog(4, "Little-Endian");
- }
- else
- {
- condlog(4, "Big-Endian");
- }
- return 0;
-}
-
-void mpath_reverse_uint16_byteorder(uint16_t *num)
-{
- uint16_t byte0, byte1;
-
- byte0 = (*num & 0x000000FF) >> 0 ;
- byte1 = (*num & 0x0000FF00) >> 8 ;
-
- *num = ((byte0 << 8) | (byte1 << 0));
+ *num = get_unaligned_be16(num);
}
-void mpath_reverse_uint32_byteorder(uint32_t *num)
+void convert_be32_to_cpu(uint32_t *num)
{
- uint32_t byte0, byte1, byte2, byte3;
-
- byte0 = (*num & 0x000000FF) >> 0 ;
- byte1 = (*num & 0x0000FF00) >> 8 ;
- byte2 = (*num & 0x00FF0000) >> 16 ;
- byte3 = (*num & 0xFF000000) >> 24 ;
-
- *num = ((byte0 << 24) | (byte1 << 16) | (byte2 << 8) | (byte3 << 0));
+ *num = get_unaligned_be32(num);
}
void
--
2.17.1
next prev parent reply other threads:[~2018-06-24 19:09 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-06-24 19:09 [PATCH v3 00/10] libmpathpersist fixes and some more Martin Wilck
2018-06-24 19:09 ` [PATCH v3 01/10] libmpathpersist: remove duplicate test in readfullstatus Martin Wilck
2018-06-24 19:09 ` [PATCH v3 02/10] libmpathpersist: fix typo in mpath_format_readfullstatus Martin Wilck
2018-06-24 19:09 ` [PATCH v3 03/10] libmpathpersist: fix stack overflow in mpath_format_readfullstatus() Martin Wilck
2018-06-24 19:09 ` [PATCH v3 04/10] libmultipath: add (get|put)_unaligned_be64 Martin Wilck
2018-06-24 19:09 ` [PATCH v3 05/10] multipath-tools/tests: add tests for get_unaligned_beXX Martin Wilck
2018-06-24 19:09 ` Martin Wilck [this message]
2018-06-24 19:09 ` [PATCH v3 07/10] (lib)mpathpersist: use O_RDONLY file descriptors Martin Wilck
2018-06-24 19:09 ` [PATCH v3 08/10] libmultipath: fix gcc 8.1 "truncated output" warnings Martin Wilck
2018-06-24 19:09 ` [PATCH v3 09/10] multipathd: fix buffer size in cli_getprkey() Martin Wilck
2018-06-24 19:09 ` [PATCH v3 10/10] libmultipath: avoid error messages from RDAC check Martin Wilck
2018-06-25 22:32 ` [PATCH v3 00/10] libmpathpersist fixes and some more Benjamin Marzinski
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180624190944.27158-7-mwilck@suse.com \
--to=mwilck@suse.com \
--cc=Bart.VanAssche@sandisk.com \
--cc=bmarzins@redhat.com \
--cc=christophe.varoqui@opensvc.com \
--cc=dm-devel@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox