xref: /kernel/linux/linux-5.10/fs/dlm/util.c (revision 8c2ecf20)
1// SPDX-License-Identifier: GPL-2.0-only
2/******************************************************************************
3*******************************************************************************
4**
5**  Copyright (C) 2005-2008 Red Hat, Inc.  All rights reserved.
6**
7**
8*******************************************************************************
9******************************************************************************/
10
11#include "dlm_internal.h"
12#include "rcom.h"
13#include "util.h"
14
15#define DLM_ERRNO_EDEADLK		35
16#define DLM_ERRNO_EBADR			53
17#define DLM_ERRNO_EBADSLT		57
18#define DLM_ERRNO_EPROTO		71
19#define DLM_ERRNO_EOPNOTSUPP		95
20#define DLM_ERRNO_ETIMEDOUT	       110
21#define DLM_ERRNO_EINPROGRESS	       115
22
23static void header_out(struct dlm_header *hd)
24{
25	hd->h_version		= cpu_to_le32(hd->h_version);
26	hd->h_lockspace		= cpu_to_le32(hd->h_lockspace);
27	hd->h_nodeid		= cpu_to_le32(hd->h_nodeid);
28	hd->h_length		= cpu_to_le16(hd->h_length);
29}
30
31static void header_in(struct dlm_header *hd)
32{
33	hd->h_version		= le32_to_cpu(hd->h_version);
34	hd->h_lockspace		= le32_to_cpu(hd->h_lockspace);
35	hd->h_nodeid		= le32_to_cpu(hd->h_nodeid);
36	hd->h_length		= le16_to_cpu(hd->h_length);
37}
38
39/* higher errno values are inconsistent across architectures, so select
40   one set of values for on the wire */
41
42static int to_dlm_errno(int err)
43{
44	switch (err) {
45	case -EDEADLK:
46		return -DLM_ERRNO_EDEADLK;
47	case -EBADR:
48		return -DLM_ERRNO_EBADR;
49	case -EBADSLT:
50		return -DLM_ERRNO_EBADSLT;
51	case -EPROTO:
52		return -DLM_ERRNO_EPROTO;
53	case -EOPNOTSUPP:
54		return -DLM_ERRNO_EOPNOTSUPP;
55	case -ETIMEDOUT:
56		return -DLM_ERRNO_ETIMEDOUT;
57	case -EINPROGRESS:
58		return -DLM_ERRNO_EINPROGRESS;
59	}
60	return err;
61}
62
63static int from_dlm_errno(int err)
64{
65	switch (err) {
66	case -DLM_ERRNO_EDEADLK:
67		return -EDEADLK;
68	case -DLM_ERRNO_EBADR:
69		return -EBADR;
70	case -DLM_ERRNO_EBADSLT:
71		return -EBADSLT;
72	case -DLM_ERRNO_EPROTO:
73		return -EPROTO;
74	case -DLM_ERRNO_EOPNOTSUPP:
75		return -EOPNOTSUPP;
76	case -DLM_ERRNO_ETIMEDOUT:
77		return -ETIMEDOUT;
78	case -DLM_ERRNO_EINPROGRESS:
79		return -EINPROGRESS;
80	}
81	return err;
82}
83
84void dlm_message_out(struct dlm_message *ms)
85{
86	header_out(&ms->m_header);
87
88	ms->m_type		= cpu_to_le32(ms->m_type);
89	ms->m_nodeid		= cpu_to_le32(ms->m_nodeid);
90	ms->m_pid		= cpu_to_le32(ms->m_pid);
91	ms->m_lkid		= cpu_to_le32(ms->m_lkid);
92	ms->m_remid		= cpu_to_le32(ms->m_remid);
93	ms->m_parent_lkid	= cpu_to_le32(ms->m_parent_lkid);
94	ms->m_parent_remid	= cpu_to_le32(ms->m_parent_remid);
95	ms->m_exflags		= cpu_to_le32(ms->m_exflags);
96	ms->m_sbflags		= cpu_to_le32(ms->m_sbflags);
97	ms->m_flags		= cpu_to_le32(ms->m_flags);
98	ms->m_lvbseq		= cpu_to_le32(ms->m_lvbseq);
99	ms->m_hash		= cpu_to_le32(ms->m_hash);
100	ms->m_status		= cpu_to_le32(ms->m_status);
101	ms->m_grmode		= cpu_to_le32(ms->m_grmode);
102	ms->m_rqmode		= cpu_to_le32(ms->m_rqmode);
103	ms->m_bastmode		= cpu_to_le32(ms->m_bastmode);
104	ms->m_asts		= cpu_to_le32(ms->m_asts);
105	ms->m_result		= cpu_to_le32(to_dlm_errno(ms->m_result));
106}
107
108void dlm_message_in(struct dlm_message *ms)
109{
110	header_in(&ms->m_header);
111
112	ms->m_type		= le32_to_cpu(ms->m_type);
113	ms->m_nodeid		= le32_to_cpu(ms->m_nodeid);
114	ms->m_pid		= le32_to_cpu(ms->m_pid);
115	ms->m_lkid		= le32_to_cpu(ms->m_lkid);
116	ms->m_remid		= le32_to_cpu(ms->m_remid);
117	ms->m_parent_lkid	= le32_to_cpu(ms->m_parent_lkid);
118	ms->m_parent_remid	= le32_to_cpu(ms->m_parent_remid);
119	ms->m_exflags		= le32_to_cpu(ms->m_exflags);
120	ms->m_sbflags		= le32_to_cpu(ms->m_sbflags);
121	ms->m_flags		= le32_to_cpu(ms->m_flags);
122	ms->m_lvbseq		= le32_to_cpu(ms->m_lvbseq);
123	ms->m_hash		= le32_to_cpu(ms->m_hash);
124	ms->m_status		= le32_to_cpu(ms->m_status);
125	ms->m_grmode		= le32_to_cpu(ms->m_grmode);
126	ms->m_rqmode		= le32_to_cpu(ms->m_rqmode);
127	ms->m_bastmode		= le32_to_cpu(ms->m_bastmode);
128	ms->m_asts		= le32_to_cpu(ms->m_asts);
129	ms->m_result		= from_dlm_errno(le32_to_cpu(ms->m_result));
130}
131
132void dlm_rcom_out(struct dlm_rcom *rc)
133{
134	header_out(&rc->rc_header);
135
136	rc->rc_type		= cpu_to_le32(rc->rc_type);
137	rc->rc_result		= cpu_to_le32(rc->rc_result);
138	rc->rc_id		= cpu_to_le64(rc->rc_id);
139	rc->rc_seq		= cpu_to_le64(rc->rc_seq);
140	rc->rc_seq_reply	= cpu_to_le64(rc->rc_seq_reply);
141}
142
143void dlm_rcom_in(struct dlm_rcom *rc)
144{
145	header_in(&rc->rc_header);
146
147	rc->rc_type		= le32_to_cpu(rc->rc_type);
148	rc->rc_result		= le32_to_cpu(rc->rc_result);
149	rc->rc_id		= le64_to_cpu(rc->rc_id);
150	rc->rc_seq		= le64_to_cpu(rc->rc_seq);
151	rc->rc_seq_reply	= le64_to_cpu(rc->rc_seq_reply);
152}
153