]> git.kernelconcepts.de Git - karo-tx-linux.git/blob - fs/dlm/util.c
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/teigland/dlm
[karo-tx-linux.git] / fs / dlm / util.c
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);
28         hd->h_lockspace         = cpu_to_le32(hd->h_lockspace);
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);
36         hd->h_lockspace         = le32_to_cpu(hd->h_lockspace);
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;
76         case -DLM_ERRNO_EOPNOTSUPP:
77                 return -EOPNOTSUPP;
78         case -DLM_ERRNO_ETIMEDOUT:
79                 return -ETIMEDOUT;
80         case -DLM_ERRNO_EINPROGRESS:
81                 return -EINPROGRESS;
82         }
83         return err;
84 }
85
86 void dlm_message_out(struct dlm_message *ms)
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);
95         ms->m_parent_lkid       = cpu_to_le32(ms->m_parent_lkid);
96         ms->m_parent_remid      = cpu_to_le32(ms->m_parent_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
110 void dlm_message_in(struct dlm_message *ms)
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);
119         ms->m_parent_lkid       = le32_to_cpu(ms->m_parent_lkid);
120         ms->m_parent_remid      = le32_to_cpu(ms->m_parent_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 static void rcom_lock_out(struct rcom_lock *rl)
135 {
136         rl->rl_ownpid           = cpu_to_le32(rl->rl_ownpid);
137         rl->rl_lkid             = cpu_to_le32(rl->rl_lkid);
138         rl->rl_remid            = cpu_to_le32(rl->rl_remid);
139         rl->rl_parent_lkid      = cpu_to_le32(rl->rl_parent_lkid);
140         rl->rl_parent_remid     = cpu_to_le32(rl->rl_parent_remid);
141         rl->rl_exflags          = cpu_to_le32(rl->rl_exflags);
142         rl->rl_flags            = cpu_to_le32(rl->rl_flags);
143         rl->rl_lvbseq           = cpu_to_le32(rl->rl_lvbseq);
144         rl->rl_result           = cpu_to_le32(rl->rl_result);
145         rl->rl_wait_type        = cpu_to_le16(rl->rl_wait_type);
146         rl->rl_namelen          = cpu_to_le16(rl->rl_namelen);
147 }
148
149 static void rcom_lock_in(struct rcom_lock *rl)
150 {
151         rl->rl_ownpid           = le32_to_cpu(rl->rl_ownpid);
152         rl->rl_lkid             = le32_to_cpu(rl->rl_lkid);
153         rl->rl_remid            = le32_to_cpu(rl->rl_remid);
154         rl->rl_parent_lkid      = le32_to_cpu(rl->rl_parent_lkid);
155         rl->rl_parent_remid     = le32_to_cpu(rl->rl_parent_remid);
156         rl->rl_exflags          = le32_to_cpu(rl->rl_exflags);
157         rl->rl_flags            = le32_to_cpu(rl->rl_flags);
158         rl->rl_lvbseq           = le32_to_cpu(rl->rl_lvbseq);
159         rl->rl_result           = le32_to_cpu(rl->rl_result);
160         rl->rl_wait_type        = le16_to_cpu(rl->rl_wait_type);
161         rl->rl_namelen          = le16_to_cpu(rl->rl_namelen);
162 }
163
164 static void rcom_config_out(struct rcom_config *rf)
165 {
166         rf->rf_lvblen           = cpu_to_le32(rf->rf_lvblen);
167         rf->rf_lsflags          = cpu_to_le32(rf->rf_lsflags);
168 }
169
170 static void rcom_config_in(struct rcom_config *rf)
171 {
172         rf->rf_lvblen           = le32_to_cpu(rf->rf_lvblen);
173         rf->rf_lsflags          = le32_to_cpu(rf->rf_lsflags);
174 }
175
176 void dlm_rcom_out(struct dlm_rcom *rc)
177 {
178         int type = rc->rc_type;
179
180         header_out(&rc->rc_header);
181
182         rc->rc_type             = cpu_to_le32(rc->rc_type);
183         rc->rc_result           = cpu_to_le32(rc->rc_result);
184         rc->rc_id               = cpu_to_le64(rc->rc_id);
185         rc->rc_seq              = cpu_to_le64(rc->rc_seq);
186         rc->rc_seq_reply        = cpu_to_le64(rc->rc_seq_reply);
187
188         if ((type == DLM_RCOM_LOCK) || (type == DLM_RCOM_LOCK_REPLY))
189                 rcom_lock_out((struct rcom_lock *) rc->rc_buf);
190
191         else if (type == DLM_RCOM_STATUS_REPLY)
192                 rcom_config_out((struct rcom_config *) rc->rc_buf);
193 }
194
195 void dlm_rcom_in(struct dlm_rcom *rc)
196 {
197         int type;
198
199         header_in(&rc->rc_header);
200
201         rc->rc_type             = le32_to_cpu(rc->rc_type);
202         rc->rc_result           = le32_to_cpu(rc->rc_result);
203         rc->rc_id               = le64_to_cpu(rc->rc_id);
204         rc->rc_seq              = le64_to_cpu(rc->rc_seq);
205         rc->rc_seq_reply        = le64_to_cpu(rc->rc_seq_reply);
206
207         type = rc->rc_type;
208
209         if ((type == DLM_RCOM_LOCK) || (type == DLM_RCOM_LOCK_REPLY))
210                 rcom_lock_in((struct rcom_lock *) rc->rc_buf);
211
212         else if (type == DLM_RCOM_STATUS_REPLY)
213                 rcom_config_in((struct rcom_config *) rc->rc_buf);
214 }
215