Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
util.c
Go to the documentation of this file.
1 /******************************************************************************
2 *******************************************************************************
3 **
4 ** Copyright (C) 2005-2008 Red Hat, Inc. All rights reserved.
5 **
6 ** This copyrighted material is made available to anyone wishing to use,
7 ** modify, copy, or redistribute it subject to the terms and conditions
8 ** of the GNU General Public License v.2.
9 **
10 *******************************************************************************
11 ******************************************************************************/
12 
13 #include "dlm_internal.h"
14 #include "rcom.h"
15 #include "util.h"
16 
17 #define DLM_ERRNO_EDEADLK 35
18 #define DLM_ERRNO_EBADR 53
19 #define DLM_ERRNO_EBADSLT 57
20 #define DLM_ERRNO_EPROTO 71
21 #define DLM_ERRNO_EOPNOTSUPP 95
22 #define DLM_ERRNO_ETIMEDOUT 110
23 #define DLM_ERRNO_EINPROGRESS 115
24 
25 static void header_out(struct dlm_header *hd)
26 {
27  hd->h_version = cpu_to_le32(hd->h_version);
29  hd->h_nodeid = cpu_to_le32(hd->h_nodeid);
30  hd->h_length = cpu_to_le16(hd->h_length);
31 }
32 
33 static void header_in(struct dlm_header *hd)
34 {
35  hd->h_version = le32_to_cpu(hd->h_version);
37  hd->h_nodeid = le32_to_cpu(hd->h_nodeid);
38  hd->h_length = le16_to_cpu(hd->h_length);
39 }
40 
41 /* higher errno values are inconsistent across architectures, so select
42  one set of values for on the wire */
43 
44 static int to_dlm_errno(int err)
45 {
46  switch (err) {
47  case -EDEADLK:
48  return -DLM_ERRNO_EDEADLK;
49  case -EBADR:
50  return -DLM_ERRNO_EBADR;
51  case -EBADSLT:
52  return -DLM_ERRNO_EBADSLT;
53  case -EPROTO:
54  return -DLM_ERRNO_EPROTO;
55  case -EOPNOTSUPP:
56  return -DLM_ERRNO_EOPNOTSUPP;
57  case -ETIMEDOUT:
58  return -DLM_ERRNO_ETIMEDOUT;
59  case -EINPROGRESS:
60  return -DLM_ERRNO_EINPROGRESS;
61  }
62  return err;
63 }
64 
65 static int from_dlm_errno(int err)
66 {
67  switch (err) {
68  case -DLM_ERRNO_EDEADLK:
69  return -EDEADLK;
70  case -DLM_ERRNO_EBADR:
71  return -EBADR;
72  case -DLM_ERRNO_EBADSLT:
73  return -EBADSLT;
74  case -DLM_ERRNO_EPROTO:
75  return -EPROTO;
77  return -EOPNOTSUPP;
78  case -DLM_ERRNO_ETIMEDOUT:
79  return -ETIMEDOUT;
81  return -EINPROGRESS;
82  }
83  return err;
84 }
85 
87 {
88  header_out(&ms->m_header);
89 
90  ms->m_type = cpu_to_le32(ms->m_type);
91  ms->m_nodeid = cpu_to_le32(ms->m_nodeid);
92  ms->m_pid = cpu_to_le32(ms->m_pid);
93  ms->m_lkid = cpu_to_le32(ms->m_lkid);
94  ms->m_remid = cpu_to_le32(ms->m_remid);
97  ms->m_exflags = cpu_to_le32(ms->m_exflags);
98  ms->m_sbflags = cpu_to_le32(ms->m_sbflags);
99  ms->m_flags = cpu_to_le32(ms->m_flags);
100  ms->m_lvbseq = cpu_to_le32(ms->m_lvbseq);
101  ms->m_hash = cpu_to_le32(ms->m_hash);
102  ms->m_status = cpu_to_le32(ms->m_status);
103  ms->m_grmode = cpu_to_le32(ms->m_grmode);
104  ms->m_rqmode = cpu_to_le32(ms->m_rqmode);
105  ms->m_bastmode = cpu_to_le32(ms->m_bastmode);
106  ms->m_asts = cpu_to_le32(ms->m_asts);
107  ms->m_result = cpu_to_le32(to_dlm_errno(ms->m_result));
108 }
109 
111 {
112  header_in(&ms->m_header);
113 
114  ms->m_type = le32_to_cpu(ms->m_type);
115  ms->m_nodeid = le32_to_cpu(ms->m_nodeid);
116  ms->m_pid = le32_to_cpu(ms->m_pid);
117  ms->m_lkid = le32_to_cpu(ms->m_lkid);
118  ms->m_remid = le32_to_cpu(ms->m_remid);
121  ms->m_exflags = le32_to_cpu(ms->m_exflags);
122  ms->m_sbflags = le32_to_cpu(ms->m_sbflags);
123  ms->m_flags = le32_to_cpu(ms->m_flags);
124  ms->m_lvbseq = le32_to_cpu(ms->m_lvbseq);
125  ms->m_hash = le32_to_cpu(ms->m_hash);
126  ms->m_status = le32_to_cpu(ms->m_status);
127  ms->m_grmode = le32_to_cpu(ms->m_grmode);
128  ms->m_rqmode = le32_to_cpu(ms->m_rqmode);
129  ms->m_bastmode = le32_to_cpu(ms->m_bastmode);
130  ms->m_asts = le32_to_cpu(ms->m_asts);
131  ms->m_result = from_dlm_errno(le32_to_cpu(ms->m_result));
132 }
133 
134 void dlm_rcom_out(struct dlm_rcom *rc)
135 {
136  header_out(&rc->rc_header);
137 
138  rc->rc_type = cpu_to_le32(rc->rc_type);
139  rc->rc_result = cpu_to_le32(rc->rc_result);
140  rc->rc_id = cpu_to_le64(rc->rc_id);
141  rc->rc_seq = cpu_to_le64(rc->rc_seq);
143 }
144 
145 void dlm_rcom_in(struct dlm_rcom *rc)
146 {
147  header_in(&rc->rc_header);
148 
149  rc->rc_type = le32_to_cpu(rc->rc_type);
150  rc->rc_result = le32_to_cpu(rc->rc_result);
151  rc->rc_id = le64_to_cpu(rc->rc_id);
152  rc->rc_seq = le64_to_cpu(rc->rc_seq);
154 }