[Cluster-devel] [PATCH] dlm: fix cross-platform error values
Fabio M. Di Nitto
fabbione at ubuntu.com
Tue Jan 15 06:15:28 UTC 2008
Hi guys,
On Mon, 14 Jan 2008, Patrick Caulfeld wrote:
> Some errno values differ across platforms. So if we return things like
> -EINPROGRESS from one node it can get misinterpreted or rejected on
> another one.
>
> This patch fixes up the errno values passed on the wire so that they
> match the x86 ones (so as not to break the protocol), and re-instates
> the platform-specific ones at the other end.
>
> Many thanks to Fabio for testing this patch.
>
> Signed-Off-By: Patrick Caulfield <pcaulfie at redhat.com
> Signed-off-by: Fabio M. Di Nitto <fabbione at ubuntu.com>
>
while doing some more testing in strange situations, i noticed that we had
more values going down the pipe.
This patch (based on Patrick's one) makes absolutely sure that all the -E
we use around fs/dlm/* are converted before hitting the wire. Mostlikely
not even half of them will go that far, but it's easier to catch them all
than finding them one at a time.
values and switch/case are also sorted in ascending order for pure
consistency paranoia.
Signed-off-by: Fabio M. Di Nitto <fabbione at ubuntu.com>
Thanks
Fabio
diff --git a/fs/dlm/dlm_internal.h b/fs/dlm/dlm_internal.h
index ec61bba..d0de852 100644
--- a/fs/dlm/dlm_internal.h
+++ b/fs/dlm/dlm_internal.h
@@ -220,6 +220,27 @@ struct dlm_args {
#define DLM_IFL_USER 0x00000001
#define DLM_IFL_ORPHAN 0x00000002
+
+/* arch-independant errno values */
+
+#define DLM_ERRNO_EDEADLK 35
+#define DLM_ERRNO_EBADE 52
+#define DLM_ERRNO_EBADR 53
+#define DLM_ERRNO_EBADSLT 57
+#define DLM_ERRNO_EPROTO 71
+#define DLM_ERRNO_EBADMSG 74
+#define DLM_ERRNO_EPROTONOSUPPORT 93
+#define DLM_ERRNO_EOPNOTSUPP 95
+#define DLM_ERRNO_EADDRINUSE 98
+#define DLM_ERRNO_ENETDOWN 100
+#define DLM_ERRNO_ENETUNREACH 101
+#define DLM_ERRNO_ECONNABORTED 103
+#define DLM_ERRNO_ENOBUFS 105
+#define DLM_ERRNO_ENOTCONN 107
+#define DLM_ERRNO_ETIMEDOUT 110
+#define DLM_ERRNO_EHOSTUNREACH 113
+#define DLM_ERRNO_EINPROGRESS 115
+
struct dlm_lkb {
struct dlm_rsb *lkb_resource; /* the rsb */
struct kref lkb_ref;
diff --git a/fs/dlm/util.c b/fs/dlm/util.c
index 963889c..e0f0ad4 100644
--- a/fs/dlm/util.c
+++ b/fs/dlm/util.c
@@ -36,6 +36,61 @@ void dlm_message_out(struct dlm_message *ms)
header_out(hd);
+ /* Use arch-independant errno values on the wire */
+ switch (ms->m_result) {
+ case -EDEADLK:
+ ms->m_result = -DLM_ERRNO_EDEADLK;
+ break;
+ case -EBADE:
+ ms->m_result = -DLM_ERRNO_EBADE;
+ break;
+ case -EBADR:
+ ms->m_result = -DLM_ERRNO_EBADR;
+ break;
+ case -EBADSLT:
+ ms->m_result = -DLM_ERRNO_EBADSLT;
+ break;
+ case -EPROTO:
+ ms->m_result = -DLM_ERRNO_EPROTO;
+ break;
+ case -EBADMSG:
+ ms->m_result = -DLM_ERRNO_EBADMSG;
+ break;
+ case -EPROTONOSUPPORT:
+ ms->m_result = -DLM_ERRNO_EPROTONOSUPPORT;
+ break;
+ case -EOPNOTSUPP:
+ ms->m_result = -DLM_ERRNO_EOPNOTSUPP;
+ break;
+ case -EADDRINUSE:
+ ms->m_result = -DLM_ERRNO_EADDRINUSE;
+ break;
+ case -ENETDOWN:
+ ms->m_result = -DLM_ERRNO_ENETDOWN;
+ break;
+ case -ENETUNREACH:
+ ms->m_result = -DLM_ERRNO_ENETUNREACH;
+ break;
+ case -ECONNABORTED:
+ ms->m_result = -DLM_ERRNO_ECONNABORTED;
+ break;
+ case -ENOBUFS:
+ ms->m_result = -DLM_ERRNO_ENOBUFS;
+ break;
+ case -ENOTCONN:
+ ms->m_result = -DLM_ERRNO_ENOTCONN;
+ break;
+ case -ETIMEDOUT:
+ ms->m_result = -DLM_ERRNO_ETIMEDOUT;
+ break;
+ case -EHOSTUNREACH:
+ ms->m_result = -DLM_ERRNO_EHOSTUNREACH;
+ break;
+ case -EINPROGRESS:
+ ms->m_result = -DLM_ERRNO_EINPROGRESS;
+ break;
+ }
+
ms->m_type = cpu_to_le32(ms->m_type);
ms->m_nodeid = cpu_to_le32(ms->m_nodeid);
ms->m_pid = cpu_to_le32(ms->m_pid);
@@ -80,6 +135,60 @@ void dlm_message_in(struct dlm_message *ms)
ms->m_bastmode = le32_to_cpu(ms->m_bastmode);
ms->m_asts = le32_to_cpu(ms->m_asts);
ms->m_result = le32_to_cpu(ms->m_result);
+
+ switch (ms->m_result) {
+ case -DLM_ERRNO_EDEADLK:
+ ms->m_result = -EDEADLK;
+ break;
+ case -DLM_ERRNO_EBADE:
+ ms->m_result = -EBADE;
+ break;
+ case -DLM_ERRNO_EBADR:
+ ms->m_result = -EBADR;
+ break;
+ case -DLM_ERRNO_EBADSLT:
+ ms->m_result = -EBADSLT;
+ break;
+ case -DLM_ERRNO_EPROTO:
+ ms->m_result = -EPROTO;
+ break;
+ case -DLM_ERRNO_EBADMSG:
+ ms->m_result = -EBADMSG;
+ break;
+ case -DLM_ERRNO_EPROTONOSUPPORT:
+ ms->m_result = -EPROTONOSUPPORT;
+ break;
+ case -DLM_ERRNO_EOPNOTSUPP:
+ ms->m_result = -EOPNOTSUPP;
+ break;
+ case -DLM_ERRNO_EADDRINUSE:
+ ms->m_result = -EADDRINUSE;
+ break;
+ case -DLM_ERRNO_ENETDOWN:
+ ms->m_result = -ENETDOWN;
+ break;
+ case -DLM_ERRNO_ENETUNREACH:
+ ms->m_result = -ENETUNREACH;
+ break;
+ case -DLM_ERRNO_ECONNABORTED:
+ ms->m_result = -ECONNABORTED;
+ break;
+ case -DLM_ERRNO_ENOBUFS:
+ ms->m_result = -ENOBUFS;
+ break;
+ case -DLM_ERRNO_ENOTCONN:
+ ms->m_result = -ENOTCONN;
+ break;
+ case -DLM_ERRNO_ETIMEDOUT:
+ ms->m_result = -ETIMEDOUT;
+ break;
+ case -DLM_ERRNO_EHOSTUNREACH:
+ ms->m_result = -EHOSTUNREACH;
+ break;
+ case -DLM_ERRNO_EINPROGRESS:
+ ms->m_result = -EINPROGRESS;
+ break;
+ }
}
static void rcom_lock_out(struct rcom_lock *rl)
--
I'm going to make him an offer he can't refuse.
More information about the Cluster-devel
mailing list