Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=861e2369e9e7e003677f99f22c4d1f05d3ed66d3
Commit:     861e2369e9e7e003677f99f22c4d1f05d3ed66d3
Parent:     550283e30ccec5ddab9749a77b0022ebcaf0f3af
Author:     David Teigland <[EMAIL PROTECTED]>
AuthorDate: Tue Jan 15 15:43:24 2008 -0600
Committer:  David Teigland <[EMAIL PROTECTED]>
CommitDate: Wed Jan 30 11:04:42 2008 -0600

    dlm: use fixed errno values in messages
    
    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.
    Initial patch from Patrick.
    
    Signed-off-by: Patrick Caulfield <[EMAIL PROTECTED]>
    Signed-off-by: Fabio M. Di Nitto <[EMAIL PROTECTED]>
    Signed-off-by: David Teigland <[EMAIL PROTECTED]>
---
 fs/dlm/util.c |   57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 55 insertions(+), 2 deletions(-)

diff --git a/fs/dlm/util.c b/fs/dlm/util.c
index 38dcfeb..11c6a45 100644
--- a/fs/dlm/util.c
+++ b/fs/dlm/util.c
@@ -14,6 +14,14 @@
 #include "rcom.h"
 #include "util.h"
 
+#define DLM_ERRNO_EDEADLK              35
+#define DLM_ERRNO_EBADR                        53
+#define DLM_ERRNO_EBADSLT              57
+#define DLM_ERRNO_EPROTO               71
+#define DLM_ERRNO_EOPNOTSUPP           95
+#define DLM_ERRNO_ETIMEDOUT           110
+#define DLM_ERRNO_EINPROGRESS         115
+
 static void header_out(struct dlm_header *hd)
 {
        hd->h_version           = cpu_to_le32(hd->h_version);
@@ -30,6 +38,51 @@ static void header_in(struct dlm_header *hd)
        hd->h_length            = le16_to_cpu(hd->h_length);
 }
 
+/* higher errno values are inconsistent across architectures, so select
+   one set of values for on the wire */
+
+static int to_dlm_errno(int err)
+{
+       switch (err) {
+       case -EDEADLK:
+               return -DLM_ERRNO_EDEADLK;
+       case -EBADR:
+               return -DLM_ERRNO_EBADR;
+       case -EBADSLT:
+               return -DLM_ERRNO_EBADSLT;
+       case -EPROTO:
+               return -DLM_ERRNO_EPROTO;
+       case -EOPNOTSUPP:
+               return -DLM_ERRNO_EOPNOTSUPP;
+       case -ETIMEDOUT:
+               return -DLM_ERRNO_ETIMEDOUT;
+       case -EINPROGRESS:
+               return -DLM_ERRNO_EINPROGRESS;
+       }
+       return err;
+}
+
+static int from_dlm_errno(int err)
+{
+       switch (err) {
+       case -DLM_ERRNO_EDEADLK:
+               return -EDEADLK;
+       case -DLM_ERRNO_EBADR:
+               return -EBADR;
+       case -DLM_ERRNO_EBADSLT:
+               return -EBADSLT;
+       case -DLM_ERRNO_EPROTO:
+               return -EPROTO;
+       case -DLM_ERRNO_EOPNOTSUPP:
+               return -EOPNOTSUPP;
+       case -DLM_ERRNO_ETIMEDOUT:
+               return -ETIMEDOUT;
+       case -DLM_ERRNO_EINPROGRESS:
+               return -EINPROGRESS;
+       }
+       return err;
+}
+
 void dlm_message_out(struct dlm_message *ms)
 {
        struct dlm_header *hd = (struct dlm_header *) ms;
@@ -53,7 +106,7 @@ void dlm_message_out(struct dlm_message *ms)
        ms->m_rqmode            = cpu_to_le32(ms->m_rqmode);
        ms->m_bastmode          = cpu_to_le32(ms->m_bastmode);
        ms->m_asts              = cpu_to_le32(ms->m_asts);
-       ms->m_result            = cpu_to_le32(ms->m_result);
+       ms->m_result            = cpu_to_le32(to_dlm_errno(ms->m_result));
 }
 
 void dlm_message_in(struct dlm_message *ms)
@@ -79,7 +132,7 @@ void dlm_message_in(struct dlm_message *ms)
        ms->m_rqmode            = le32_to_cpu(ms->m_rqmode);
        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);
+       ms->m_result            = from_dlm_errno(le32_to_cpu(ms->m_result));
 }
 
 static void rcom_lock_out(struct rcom_lock *rl)
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to