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 216