Whamcloud - gitweb
bfa1d8f69c03dce1e4617a7ff59bd9677562bd1e
[fs/lustre-release.git] / lustre / ptlrpc / pack_generic.c
1 /*
2  * GPL HEADER START
3  *
4  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 only,
8  * as published by the Free Software Foundation.
9  *
10  * This program is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * General Public License version 2 for more details (a copy is included
14  * in the LICENSE file that accompanied this code).
15  *
16  * You should have received a copy of the GNU General Public License
17  * version 2 along with this program; If not, see
18  * http://www.gnu.org/licenses/gpl-2.0.html
19  *
20  * GPL HEADER END
21  */
22 /*
23  * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved.
24  * Use is subject to license terms.
25  *
26  * Copyright (c) 2011, 2017, Intel Corporation.
27  */
28 /*
29  * This file is part of Lustre, http://www.lustre.org/
30  *
31  * lustre/ptlrpc/pack_generic.c
32  *
33  * (Un)packing of OST requests
34  *
35  * Author: Peter J. Braam <braam@clusterfs.com>
36  * Author: Phil Schwan <phil@clusterfs.com>
37  * Author: Eric Barton <eeb@clusterfs.com>
38  */
39
40 #define DEBUG_SUBSYSTEM S_RPC
41
42 #include <linux/crc32.h>
43
44 #include <libcfs/libcfs.h>
45
46 #include <llog_swab.h>
47 #include <lustre_net.h>
48 #include <lustre_swab.h>
49 #include <obd_cksum.h>
50 #include <obd_class.h>
51 #include <obd_support.h>
52 #include "ptlrpc_internal.h"
53
54 static inline __u32 lustre_msg_hdr_size_v2(__u32 count)
55 {
56         return cfs_size_round(offsetof(struct lustre_msg_v2,
57                                        lm_buflens[count]));
58 }
59
60 __u32 lustre_msg_hdr_size(__u32 magic, __u32 count)
61 {
62         LASSERT(count > 0);
63
64         switch (magic) {
65         case LUSTRE_MSG_MAGIC_V2:
66                 return lustre_msg_hdr_size_v2(count);
67         default:
68                 LASSERTF(0, "incorrect message magic: %08x\n", magic);
69                 return 0;
70         }
71 }
72
73 void ptlrpc_buf_set_swabbed(struct ptlrpc_request *req, const int inout,
74                             __u32 index)
75 {
76         if (inout)
77                 lustre_set_req_swabbed(req, index);
78         else
79                 lustre_set_rep_swabbed(req, index);
80 }
81
82 bool ptlrpc_buf_need_swab(struct ptlrpc_request *req, const int inout,
83                           __u32 index)
84 {
85         if (inout)
86                 return (ptlrpc_req_need_swab(req) &&
87                         !lustre_req_swabbed(req, index));
88
89         return (ptlrpc_rep_need_swab(req) && !lustre_rep_swabbed(req, index));
90 }
91
92 static inline int lustre_msg_check_version_v2(struct lustre_msg_v2 *msg,
93                                               enum lustre_msg_version version)
94 {
95         enum lustre_msg_version ver = lustre_msg_get_version(msg);
96
97         return (ver & LUSTRE_VERSION_MASK) != version;
98 }
99
100 int lustre_msg_check_version(struct lustre_msg *msg,
101                              enum lustre_msg_version version)
102 {
103 #define LUSTRE_MSG_MAGIC_V1 0x0BD00BD0
104         switch (msg->lm_magic) {
105         case LUSTRE_MSG_MAGIC_V1:
106                 CERROR("msg v1 not supported - please upgrade you system\n");
107                 return -EINVAL;
108         case LUSTRE_MSG_MAGIC_V2:
109                 return lustre_msg_check_version_v2(msg, version);
110         default:
111                 CERROR("incorrect message magic: %08x\n", msg->lm_magic);
112                 return -EPROTO;
113         }
114 #undef LUSTRE_MSG_MAGIC_V1
115 }
116
117 /* early reply size */
118 __u32 lustre_msg_early_size()
119 {
120         __u32 pblen = sizeof(struct ptlrpc_body);
121
122         return lustre_msg_size(LUSTRE_MSG_MAGIC_V2, 1, &pblen);
123 }
124 EXPORT_SYMBOL(lustre_msg_early_size);
125
126 __u32 lustre_msg_size_v2(int count, __u32 *lengths)
127 {
128         __u32 size;
129         int i;
130
131         LASSERT(count > 0);
132         size = lustre_msg_hdr_size_v2(count);
133         for (i = 0; i < count; i++)
134                 size += cfs_size_round(lengths[i]);
135
136         return size;
137 }
138 EXPORT_SYMBOL(lustre_msg_size_v2);
139
140 /*
141  * This returns the size of the buffer that is required to hold a lustre_msg
142  * with the given sub-buffer lengths.
143  * NOTE: this should only be used for NEW requests, and should always be
144  *       in the form of a v2 request.  If this is a connection to a v1
145  *       target then the first buffer will be stripped because the ptlrpc
146  *       data is part of the lustre_msg_v1 header. b=14043
147  */
148 __u32 lustre_msg_size(__u32 magic, int count, __u32 *lens)
149 {
150         __u32 size[] = { sizeof(struct ptlrpc_body) };
151
152         if (!lens) {
153                 LASSERT(count == 1);
154                 lens = size;
155         }
156
157         LASSERT(count > 0);
158         LASSERT(lens[MSG_PTLRPC_BODY_OFF] >= sizeof(struct ptlrpc_body_v2));
159
160         switch (magic) {
161         case LUSTRE_MSG_MAGIC_V2:
162                 return lustre_msg_size_v2(count, lens);
163         default:
164                 LASSERTF(0, "incorrect message magic: %08x\n", magic);
165                 return 0;
166         }
167 }
168
169 /*
170  * This is used to determine the size of a buffer that was already packed
171  * and will correctly handle the different message formats.
172  */
173 __u32 lustre_packed_msg_size(struct lustre_msg *msg)
174 {
175         switch (msg->lm_magic) {
176         case LUSTRE_MSG_MAGIC_V2:
177                 return lustre_msg_size_v2(msg->lm_bufcount, msg->lm_buflens);
178         default:
179                 CERROR("incorrect message magic: %08x\n", msg->lm_magic);
180                 return 0;
181         }
182 }
183 EXPORT_SYMBOL(lustre_packed_msg_size);
184
185 void lustre_init_msg_v2(struct lustre_msg_v2 *msg, int count, __u32 *lens,
186                         char **bufs)
187 {
188         char *ptr;
189         int i;
190
191         LASSERT(count > 0);
192
193         msg->lm_bufcount = count;
194         /* XXX: lm_secflvr uninitialized here */
195         msg->lm_magic = LUSTRE_MSG_MAGIC_V2;
196
197         for (i = 0; i < count; i++)
198                 msg->lm_buflens[i] = lens[i];
199
200         if (bufs == NULL)
201                 return;
202
203         ptr = (char *)msg + lustre_msg_hdr_size_v2(count);
204         for (i = 0; i < count; i++) {
205                 char *tmp = bufs[i];
206
207                 if (tmp)
208                         memcpy(ptr, tmp, lens[i]);
209                 ptr += cfs_size_round(lens[i]);
210         }
211 }
212 EXPORT_SYMBOL(lustre_init_msg_v2);
213
214 static int lustre_pack_request_v2(struct ptlrpc_request *req,
215                                   int count, __u32 *lens, char **bufs)
216 {
217         int reqlen, rc;
218
219         reqlen = lustre_msg_size_v2(count, lens);
220
221         rc = sptlrpc_cli_alloc_reqbuf(req, reqlen);
222         if (rc)
223                 return rc;
224
225         req->rq_reqlen = reqlen;
226
227         lustre_init_msg_v2(req->rq_reqmsg, count, lens, bufs);
228         lustre_msg_add_version(req->rq_reqmsg, PTLRPC_MSG_VERSION);
229         return 0;
230 }
231
232 int lustre_pack_request(struct ptlrpc_request *req, __u32 magic, int count,
233                         __u32 *lens, char **bufs)
234 {
235         __u32 size[] = { sizeof(struct ptlrpc_body) };
236
237         if (!lens) {
238                 LASSERT(count == 1);
239                 lens = size;
240         }
241
242         LASSERT(count > 0);
243         LASSERT(lens[MSG_PTLRPC_BODY_OFF] == sizeof(struct ptlrpc_body));
244
245         /* only use new format, we don't need to be compatible with 1.4 */
246         magic = LUSTRE_MSG_MAGIC_V2;
247
248         switch (magic) {
249         case LUSTRE_MSG_MAGIC_V2:
250                 return lustre_pack_request_v2(req, count, lens, bufs);
251         default:
252                 LASSERTF(0, "incorrect message magic: %08x\n", magic);
253                 return -EINVAL;
254         }
255 }
256
257 #if RS_DEBUG
258 struct list_head ptlrpc_rs_debug_lru =
259         LIST_HEAD_INIT(ptlrpc_rs_debug_lru);
260 spinlock_t ptlrpc_rs_debug_lock;
261
262 #define PTLRPC_RS_DEBUG_LRU_ADD(rs)                                     \
263 do {                                                                    \
264         spin_lock(&ptlrpc_rs_debug_lock);                               \
265         list_add_tail(&(rs)->rs_debug_list, &ptlrpc_rs_debug_lru);      \
266         spin_unlock(&ptlrpc_rs_debug_lock);                             \
267 } while (0)
268
269 #define PTLRPC_RS_DEBUG_LRU_DEL(rs)                                     \
270 do {                                                                    \
271         spin_lock(&ptlrpc_rs_debug_lock);                               \
272         list_del(&(rs)->rs_debug_list);                         \
273         spin_unlock(&ptlrpc_rs_debug_lock);                             \
274 } while (0)
275 #else
276 # define PTLRPC_RS_DEBUG_LRU_ADD(rs) do {} while(0)
277 # define PTLRPC_RS_DEBUG_LRU_DEL(rs) do {} while(0)
278 #endif
279
280 struct ptlrpc_reply_state *
281 lustre_get_emerg_rs(struct ptlrpc_service_part *svcpt)
282 {
283         struct ptlrpc_reply_state *rs = NULL;
284
285         spin_lock(&svcpt->scp_rep_lock);
286
287         /* See if we have anything in a pool, and wait if nothing */
288         while (list_empty(&svcpt->scp_rep_idle)) {
289                 int                     rc;
290
291                 spin_unlock(&svcpt->scp_rep_lock);
292                 /* If we cannot get anything for some long time, we better
293                  * bail out instead of waiting infinitely */
294                 rc = wait_event_idle_timeout(svcpt->scp_rep_waitq,
295                                              !list_empty(&svcpt->scp_rep_idle),
296                                              cfs_time_seconds(10));
297                 if (rc <= 0)
298                         goto out;
299                 spin_lock(&svcpt->scp_rep_lock);
300         }
301
302         rs = list_entry(svcpt->scp_rep_idle.next,
303                             struct ptlrpc_reply_state, rs_list);
304         list_del(&rs->rs_list);
305
306         spin_unlock(&svcpt->scp_rep_lock);
307
308         memset(rs, 0, svcpt->scp_service->srv_max_reply_size);
309         rs->rs_size = svcpt->scp_service->srv_max_reply_size;
310         rs->rs_svcpt = svcpt;
311         rs->rs_prealloc = 1;
312 out:
313         return rs;
314 }
315
316 void lustre_put_emerg_rs(struct ptlrpc_reply_state *rs)
317 {
318         struct ptlrpc_service_part *svcpt = rs->rs_svcpt;
319
320         spin_lock(&svcpt->scp_rep_lock);
321         list_add(&rs->rs_list, &svcpt->scp_rep_idle);
322         spin_unlock(&svcpt->scp_rep_lock);
323         wake_up(&svcpt->scp_rep_waitq);
324 }
325
326 int lustre_pack_reply_v2(struct ptlrpc_request *req, int count,
327                          __u32 *lens, char **bufs, int flags)
328 {
329         struct ptlrpc_reply_state *rs;
330         int msg_len, rc;
331         ENTRY;
332
333         LASSERT(req->rq_reply_state == NULL);
334         LASSERT(count > 0);
335
336         if ((flags & LPRFL_EARLY_REPLY) == 0) {
337                 spin_lock(&req->rq_lock);
338                 req->rq_packed_final = 1;
339                 spin_unlock(&req->rq_lock);
340         }
341
342         msg_len = lustre_msg_size_v2(count, lens);
343         rc = sptlrpc_svc_alloc_rs(req, msg_len);
344         if (rc)
345                 RETURN(rc);
346
347         rs = req->rq_reply_state;
348         atomic_set(&rs->rs_refcount, 1); /* 1 ref for rq_reply_state */
349         rs->rs_cb_id.cbid_fn = reply_out_callback;
350         rs->rs_cb_id.cbid_arg = rs;
351         rs->rs_svcpt = req->rq_rqbd->rqbd_svcpt;
352         INIT_LIST_HEAD(&rs->rs_exp_list);
353         INIT_LIST_HEAD(&rs->rs_obd_list);
354         INIT_LIST_HEAD(&rs->rs_list);
355         spin_lock_init(&rs->rs_lock);
356
357         req->rq_replen = msg_len;
358         req->rq_reply_state = rs;
359         req->rq_repmsg = rs->rs_msg;
360
361         lustre_init_msg_v2(rs->rs_msg, count, lens, bufs);
362         lustre_msg_add_version(rs->rs_msg, PTLRPC_MSG_VERSION);
363
364         PTLRPC_RS_DEBUG_LRU_ADD(rs);
365
366         RETURN(0);
367 }
368 EXPORT_SYMBOL(lustre_pack_reply_v2);
369
370 int lustre_pack_reply_flags(struct ptlrpc_request *req, int count, __u32 *lens,
371                             char **bufs, int flags)
372 {
373         int rc = 0;
374         __u32 size[] = { sizeof(struct ptlrpc_body) };
375
376         if (!lens) {
377                 LASSERT(count == 1);
378                 lens = size;
379         }
380
381         LASSERT(count > 0);
382         LASSERT(lens[MSG_PTLRPC_BODY_OFF] == sizeof(struct ptlrpc_body));
383
384         switch (req->rq_reqmsg->lm_magic) {
385         case LUSTRE_MSG_MAGIC_V2:
386                 rc = lustre_pack_reply_v2(req, count, lens, bufs, flags);
387                 break;
388         default:
389                 LASSERTF(0, "incorrect message magic: %08x\n",
390                          req->rq_reqmsg->lm_magic);
391                 rc = -EINVAL;
392         }
393         if (rc != 0)
394                 CERROR("lustre_pack_reply failed: rc=%d size=%d\n", rc,
395                        lustre_msg_size(req->rq_reqmsg->lm_magic, count, lens));
396         return rc;
397 }
398
399 int lustre_pack_reply(struct ptlrpc_request *req, int count, __u32 *lens,
400                       char **bufs)
401 {
402         return lustre_pack_reply_flags(req, count, lens, bufs, 0);
403 }
404 EXPORT_SYMBOL(lustre_pack_reply);
405
406 void *lustre_msg_buf_v2(struct lustre_msg_v2 *m, __u32 n, __u32 min_size)
407 {
408         __u32 i, offset, buflen, bufcount;
409
410         LASSERT(m != NULL);
411         LASSERT(m->lm_bufcount > 0);
412
413         bufcount = m->lm_bufcount;
414         if (unlikely(n >= bufcount)) {
415                 CDEBUG(D_INFO, "msg %p buffer[%d] not present (count %d)\n",
416                        m, n, bufcount);
417                 return NULL;
418         }
419
420         buflen = m->lm_buflens[n];
421         if (unlikely(buflen < min_size)) {
422                 CERROR("msg %p buffer[%d] size %d too small "
423                        "(required %d, opc=%d)\n", m, n, buflen, min_size,
424                        n == MSG_PTLRPC_BODY_OFF ? -1 : lustre_msg_get_opc(m));
425                 return NULL;
426         }
427
428         offset = lustre_msg_hdr_size_v2(bufcount);
429         for (i = 0; i < n; i++)
430                 offset += cfs_size_round(m->lm_buflens[i]);
431
432         return (char *)m + offset;
433 }
434
435 void *lustre_msg_buf(struct lustre_msg *m, __u32 n, __u32 min_size)
436 {
437         switch (m->lm_magic) {
438         case LUSTRE_MSG_MAGIC_V2:
439                 return lustre_msg_buf_v2(m, n, min_size);
440         default:
441                 LASSERTF(0, "incorrect message magic: %08x (msg:%p)\n",
442                          m->lm_magic, m);
443                 return NULL;
444         }
445 }
446 EXPORT_SYMBOL(lustre_msg_buf);
447
448 static int lustre_shrink_msg_v2(struct lustre_msg_v2 *msg, __u32 segment,
449                                 unsigned int newlen, int move_data)
450 {
451         char *tail = NULL, *newpos;
452         int tail_len = 0, n;
453
454         LASSERT(msg);
455         LASSERT(msg->lm_bufcount > segment);
456         LASSERT(msg->lm_buflens[segment] >= newlen);
457
458         if (msg->lm_buflens[segment] == newlen)
459                 goto out;
460
461         if (move_data && msg->lm_bufcount > segment + 1) {
462                 tail = lustre_msg_buf_v2(msg, segment + 1, 0);
463                 for (n = segment + 1; n < msg->lm_bufcount; n++)
464                         tail_len += cfs_size_round(msg->lm_buflens[n]);
465         }
466
467         msg->lm_buflens[segment] = newlen;
468
469         if (tail && tail_len) {
470                 newpos = lustre_msg_buf_v2(msg, segment + 1, 0);
471                 LASSERT(newpos <= tail);
472                 if (newpos != tail)
473                         memmove(newpos, tail, tail_len);
474         }
475 out:
476         return lustre_msg_size_v2(msg->lm_bufcount, msg->lm_buflens);
477 }
478
479 /*
480  * for @msg, shrink @segment to size @newlen. if @move_data is non-zero,
481  * we also move data forward from @segment + 1.
482  *
483  * if @newlen == 0, we remove the segment completely, but we still keep the
484  * totally bufcount the same to save possible data moving. this will leave a
485  * unused segment with size 0 at the tail, but that's ok.
486  *
487  * return new msg size after shrinking.
488  *
489  * CAUTION:
490  * + if any buffers higher than @segment has been filled in, must call shrink
491  *   with non-zero @move_data.
492  * + caller should NOT keep pointers to msg buffers which higher than @segment
493  *   after call shrink.
494  */
495 int lustre_shrink_msg(struct lustre_msg *msg, int segment,
496                       unsigned int newlen, int move_data)
497 {
498         switch (msg->lm_magic) {
499         case LUSTRE_MSG_MAGIC_V2:
500                 return lustre_shrink_msg_v2(msg, segment, newlen, move_data);
501         default:
502                 LASSERTF(0, "incorrect message magic: %08x\n", msg->lm_magic);
503         }
504 }
505 EXPORT_SYMBOL(lustre_shrink_msg);
506
507 static int lustre_grow_msg_v2(struct lustre_msg_v2 *msg, __u32 segment,
508                               unsigned int newlen)
509 {
510         char *tail = NULL, *newpos;
511         int tail_len = 0, n;
512
513         LASSERT(msg);
514         LASSERT(msg->lm_bufcount > segment);
515         LASSERT(msg->lm_buflens[segment] <= newlen);
516
517         if (msg->lm_buflens[segment] == newlen)
518                 goto out;
519
520         if (msg->lm_bufcount > segment + 1) {
521                 tail = lustre_msg_buf_v2(msg, segment + 1, 0);
522                 for (n = segment + 1; n < msg->lm_bufcount; n++)
523                         tail_len += cfs_size_round(msg->lm_buflens[n]);
524         }
525
526         msg->lm_buflens[segment] = newlen;
527
528         if (tail && tail_len) {
529                 newpos = lustre_msg_buf_v2(msg, segment + 1, 0);
530                 memmove(newpos, tail, tail_len);
531         }
532 out:
533         return lustre_msg_size_v2(msg->lm_bufcount, msg->lm_buflens);
534 }
535
536 /*
537  * for @msg, grow @segment to size @newlen.
538  * Always move higher buffer forward.
539  *
540  * return new msg size after growing.
541  *
542  * CAUTION:
543  * - caller must make sure there is enough space in allocated message buffer
544  * - caller should NOT keep pointers to msg buffers which higher than @segment
545  *   after call shrink.
546  */
547 int lustre_grow_msg(struct lustre_msg *msg, int segment, unsigned int newlen)
548 {
549         switch (msg->lm_magic) {
550         case LUSTRE_MSG_MAGIC_V2:
551                 return lustre_grow_msg_v2(msg, segment, newlen);
552         default:
553                 LASSERTF(0, "incorrect message magic: %08x\n", msg->lm_magic);
554         }
555 }
556 EXPORT_SYMBOL(lustre_grow_msg);
557
558 void lustre_free_reply_state(struct ptlrpc_reply_state *rs)
559 {
560         PTLRPC_RS_DEBUG_LRU_DEL(rs);
561
562         LASSERT(atomic_read(&rs->rs_refcount) == 0);
563         LASSERT(!rs->rs_difficult || rs->rs_handled);
564         LASSERT(!rs->rs_on_net);
565         LASSERT(!rs->rs_scheduled);
566         LASSERT(rs->rs_export == NULL);
567         LASSERT(rs->rs_nlocks == 0);
568         LASSERT(list_empty(&rs->rs_exp_list));
569         LASSERT(list_empty(&rs->rs_obd_list));
570
571         sptlrpc_svc_free_rs(rs);
572 }
573
574 static int lustre_unpack_msg_v2(struct lustre_msg_v2 *m, int len)
575 {
576         int swabbed, required_len, i, buflen;
577
578         /* Now we know the sender speaks my language. */
579         required_len = lustre_msg_hdr_size_v2(0);
580         if (len < required_len) {
581                 /* can't even look inside the message */
582                 CERROR("message length %d too small for lustre_msg\n", len);
583                 return -EINVAL;
584         }
585
586         swabbed = (m->lm_magic == LUSTRE_MSG_MAGIC_V2_SWABBED);
587
588         if (swabbed) {
589                 __swab32s(&m->lm_magic);
590                 __swab32s(&m->lm_bufcount);
591                 __swab32s(&m->lm_secflvr);
592                 __swab32s(&m->lm_repsize);
593                 __swab32s(&m->lm_cksum);
594                 __swab32s(&m->lm_flags);
595                 BUILD_BUG_ON(offsetof(typeof(*m), lm_padding_2) == 0);
596                 BUILD_BUG_ON(offsetof(typeof(*m), lm_padding_3) == 0);
597         }
598
599         if (m->lm_bufcount == 0 || m->lm_bufcount > PTLRPC_MAX_BUFCOUNT) {
600                 CERROR("message bufcount %d is not valid\n", m->lm_bufcount);
601                 return -EINVAL;
602         }
603         required_len = lustre_msg_hdr_size_v2(m->lm_bufcount);
604         if (len < required_len) {
605                 /* didn't receive all the buffer lengths */
606                 CERROR("message length %d too small for %d buflens\n",
607                        len, m->lm_bufcount);
608                 return -EINVAL;
609         }
610
611         for (i = 0; i < m->lm_bufcount; i++) {
612                 if (swabbed)
613                         __swab32s(&m->lm_buflens[i]);
614                 buflen = cfs_size_round(m->lm_buflens[i]);
615                 if (buflen < 0 || buflen > PTLRPC_MAX_BUFLEN) {
616                         CERROR("buffer %d length %d is not valid\n", i, buflen);
617                         return -EINVAL;
618                 }
619                 required_len += buflen;
620         }
621         if (len < required_len || required_len > PTLRPC_MAX_BUFLEN) {
622                 CERROR("len: %d, required_len %d, bufcount: %d\n",
623                        len, required_len, m->lm_bufcount);
624                 for (i = 0; i < m->lm_bufcount; i++)
625                         CERROR("buffer %d length %d\n", i, m->lm_buflens[i]);
626                 return -EINVAL;
627         }
628
629         return swabbed;
630 }
631
632 int __lustre_unpack_msg(struct lustre_msg *m, int len)
633 {
634         int required_len, rc;
635
636         ENTRY;
637         /*
638          * We can provide a slightly better error log, if we check the
639          * message magic and version first.  In the future, struct
640          * lustre_msg may grow, and we'd like to log a version mismatch,
641          * rather than a short message.
642          */
643         required_len = offsetof(struct lustre_msg, lm_magic) +
644                                 sizeof(m->lm_magic);
645         if (len < required_len) {
646                 /* can't even look inside the message */
647                 CERROR("message length %d too small for magic/version check\n",
648                        len);
649                 RETURN(-EINVAL);
650         }
651
652         rc = lustre_unpack_msg_v2(m, len);
653
654         RETURN(rc);
655 }
656 EXPORT_SYMBOL(__lustre_unpack_msg);
657
658 int ptlrpc_unpack_req_msg(struct ptlrpc_request *req, int len)
659 {
660         int rc;
661
662         rc = __lustre_unpack_msg(req->rq_reqmsg, len);
663         if (rc == 1) {
664                 lustre_set_req_swabbed(req, MSG_PTLRPC_HEADER_OFF);
665                 rc = 0;
666         }
667         return rc;
668 }
669
670 int ptlrpc_unpack_rep_msg(struct ptlrpc_request *req, int len)
671 {
672         int rc;
673
674         rc = __lustre_unpack_msg(req->rq_repmsg, len);
675         if (rc == 1) {
676                 lustre_set_rep_swabbed(req, MSG_PTLRPC_HEADER_OFF);
677                 rc = 0;
678         }
679         return rc;
680 }
681
682 static inline int lustre_unpack_ptlrpc_body_v2(struct ptlrpc_request *req,
683                                                const int inout, int offset)
684 {
685         struct ptlrpc_body *pb;
686         struct lustre_msg_v2 *m = inout ? req->rq_reqmsg : req->rq_repmsg;
687
688         pb = lustre_msg_buf_v2(m, offset, sizeof(struct ptlrpc_body_v2));
689         if (!pb) {
690                 CERROR("error unpacking ptlrpc body\n");
691                 return -EFAULT;
692         }
693         if (ptlrpc_buf_need_swab(req, inout, offset)) {
694                 lustre_swab_ptlrpc_body(pb);
695                 ptlrpc_buf_set_swabbed(req, inout, offset);
696         }
697
698         if ((pb->pb_version & ~LUSTRE_VERSION_MASK) != PTLRPC_MSG_VERSION) {
699                 CERROR("wrong lustre_msg version %08x\n", pb->pb_version);
700                 return -EINVAL;
701         }
702
703         if (!inout)
704                 pb->pb_status = ptlrpc_status_ntoh(pb->pb_status);
705
706         return 0;
707 }
708
709 int lustre_unpack_req_ptlrpc_body(struct ptlrpc_request *req, int offset)
710 {
711         switch (req->rq_reqmsg->lm_magic) {
712         case LUSTRE_MSG_MAGIC_V2:
713                 return lustre_unpack_ptlrpc_body_v2(req, 1, offset);
714         default:
715                 CERROR("bad lustre msg magic: %08x\n",
716                        req->rq_reqmsg->lm_magic);
717                 return -EINVAL;
718         }
719 }
720
721 int lustre_unpack_rep_ptlrpc_body(struct ptlrpc_request *req, int offset)
722 {
723         switch (req->rq_repmsg->lm_magic) {
724         case LUSTRE_MSG_MAGIC_V2:
725                 return lustre_unpack_ptlrpc_body_v2(req, 0, offset);
726         default:
727                 CERROR("bad lustre msg magic: %08x\n",
728                        req->rq_repmsg->lm_magic);
729                 return -EINVAL;
730         }
731 }
732
733 static inline __u32 lustre_msg_buflen_v2(struct lustre_msg_v2 *m, __u32 n)
734 {
735         if (n >= m->lm_bufcount)
736                 return 0;
737
738         return m->lm_buflens[n];
739 }
740
741 /**
742  * lustre_msg_buflen - return the length of buffer \a n in message \a m
743  * \param m lustre_msg (request or reply) to look at
744  * \param n message index (base 0)
745  *
746  * returns zero for non-existent message indices
747  */
748 __u32 lustre_msg_buflen(struct lustre_msg *m, __u32 n)
749 {
750         switch (m->lm_magic) {
751         case LUSTRE_MSG_MAGIC_V2:
752                 return lustre_msg_buflen_v2(m, n);
753         default:
754                 CERROR("incorrect message magic: %08x\n", m->lm_magic);
755                 return 0;
756         }
757 }
758 EXPORT_SYMBOL(lustre_msg_buflen);
759
760 static inline void
761 lustre_msg_set_buflen_v2(struct lustre_msg_v2 *m, __u32 n, __u32 len)
762 {
763         if (n >= m->lm_bufcount)
764                 LBUG();
765
766         m->lm_buflens[n] = len;
767 }
768
769 void lustre_msg_set_buflen(struct lustre_msg *m, __u32 n, __u32 len)
770 {
771         switch (m->lm_magic) {
772         case LUSTRE_MSG_MAGIC_V2:
773                 lustre_msg_set_buflen_v2(m, n, len);
774                 return;
775         default:
776                 LASSERTF(0, "incorrect message magic: %08x\n", m->lm_magic);
777         }
778 }
779
780 /*
781  * NB return the bufcount for lustre_msg_v2 format, so if message is packed
782  * in V1 format, the result is one bigger. (add struct ptlrpc_body).
783  */
784 __u32 lustre_msg_bufcount(struct lustre_msg *m)
785 {
786         switch (m->lm_magic) {
787         case LUSTRE_MSG_MAGIC_V2:
788                 return m->lm_bufcount;
789         default:
790                 CERROR("incorrect message magic: %08x\n", m->lm_magic);
791                 return 0;
792         }
793 }
794
795 char *lustre_msg_string(struct lustre_msg *m, __u32 index, __u32 max_len)
796 {
797         /* max_len == 0 means the string should fill the buffer */
798         char *str;
799         __u32 slen, blen;
800
801         switch (m->lm_magic) {
802         case LUSTRE_MSG_MAGIC_V2:
803                 str = lustre_msg_buf_v2(m, index, 0);
804                 blen = lustre_msg_buflen_v2(m, index);
805                 break;
806         default:
807                 LASSERTF(0, "incorrect message magic: %08x\n", m->lm_magic);
808         }
809
810         if (str == NULL) {
811                 CERROR("can't unpack string in msg %p buffer[%d]\n", m, index);
812                 return NULL;
813         }
814
815         slen = strnlen(str, blen);
816
817         if (slen == blen) { /* not NULL terminated */
818                 CERROR("can't unpack non-NULL terminated string in msg %p buffer[%d] len %d\n",
819                        m, index, blen);
820                 return NULL;
821         }
822         if (blen > PTLRPC_MAX_BUFLEN) {
823                 CERROR("buffer length of msg %p buffer[%d] is invalid(%d)\n",
824                        m, index, blen);
825                 return NULL;
826         }
827
828         if (max_len == 0) {
829                 if (slen != blen - 1) {
830                         CERROR("can't unpack short string in msg %p buffer[%d] len %d: strlen %d\n",
831                                m, index, blen, slen);
832                         return NULL;
833                 }
834         } else if (slen > max_len) {
835                 CERROR("can't unpack oversized string in msg %p buffer[%d] len %d strlen %d: max %d expected\n",
836                        m, index, blen, slen, max_len);
837                 return NULL;
838         }
839
840         return str;
841 }
842
843 /* Wrap up the normal fixed length cases */
844 static inline void *__lustre_swab_buf(struct lustre_msg *msg, __u32 index,
845                                       __u32 min_size, void *swabber)
846 {
847         void *ptr = NULL;
848
849         LASSERT(msg != NULL);
850         switch (msg->lm_magic) {
851         case LUSTRE_MSG_MAGIC_V2:
852                 ptr = lustre_msg_buf_v2(msg, index, min_size);
853                 break;
854         default:
855                 CERROR("incorrect message magic: %08x\n", msg->lm_magic);
856         }
857
858         if (ptr != NULL && swabber != NULL)
859                 ((void (*)(void *))swabber)(ptr);
860
861         return ptr;
862 }
863
864 static inline struct ptlrpc_body *lustre_msg_ptlrpc_body(struct lustre_msg *msg)
865 {
866         return lustre_msg_buf_v2(msg, MSG_PTLRPC_BODY_OFF,
867                                  sizeof(struct ptlrpc_body_v2));
868 }
869
870 enum lustre_msghdr lustre_msghdr_get_flags(struct lustre_msg *msg)
871 {
872         switch (msg->lm_magic) {
873         case LUSTRE_MSG_MAGIC_V2:
874                 /* already in host endian */
875                 return msg->lm_flags;
876         default:
877                 CERROR("incorrect message magic: %08x\n", msg->lm_magic);
878                 return 0;
879         }
880 }
881 EXPORT_SYMBOL(lustre_msghdr_get_flags);
882
883 void lustre_msghdr_set_flags(struct lustre_msg *msg, __u32 flags)
884 {
885         switch (msg->lm_magic) {
886         case LUSTRE_MSG_MAGIC_V2:
887                 msg->lm_flags = flags;
888                 return;
889         default:
890                 LASSERTF(0, "incorrect message magic: %08x\n", msg->lm_magic);
891         }
892 }
893
894 __u32 lustre_msg_get_flags(struct lustre_msg *msg)
895 {
896         switch (msg->lm_magic) {
897         case LUSTRE_MSG_MAGIC_V2: {
898                 struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg);
899                 if (pb != NULL)
900                         return pb->pb_flags;
901
902                 CERROR("invalid msg %p: no ptlrpc body!\n", msg);
903         }
904         /* fallthrough */
905         default:
906                 /*
907                  * flags might be printed in debug code while message
908                  * uninitialized
909                  */
910                 return 0;
911         }
912 }
913 EXPORT_SYMBOL(lustre_msg_get_flags);
914
915 void lustre_msg_add_flags(struct lustre_msg *msg, __u32 flags)
916 {
917         switch (msg->lm_magic) {
918         case LUSTRE_MSG_MAGIC_V2: {
919                 struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg);
920                 LASSERTF(pb != NULL, "invalid msg %p: no ptlrpc body!\n", msg);
921                 pb->pb_flags |= flags;
922                 return;
923         }
924         default:
925                 LASSERTF(0, "incorrect message magic: %08x\n", msg->lm_magic);
926         }
927 }
928 EXPORT_SYMBOL(lustre_msg_add_flags);
929
930 void lustre_msg_set_flags(struct lustre_msg *msg, __u32 flags)
931 {
932         switch (msg->lm_magic) {
933         case LUSTRE_MSG_MAGIC_V2: {
934                 struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg);
935                 LASSERTF(pb != NULL, "invalid msg %p: no ptlrpc body!\n", msg);
936                 pb->pb_flags = flags;
937                 return;
938         }
939         default:
940                 LASSERTF(0, "incorrect message magic: %08x\n", msg->lm_magic);
941         }
942 }
943
944 void lustre_msg_clear_flags(struct lustre_msg *msg, __u32 flags)
945 {
946         switch (msg->lm_magic) {
947         case LUSTRE_MSG_MAGIC_V2: {
948                 struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg);
949                 LASSERTF(pb != NULL, "invalid msg %p: no ptlrpc body!\n", msg);
950                 pb->pb_flags &= ~flags;
951
952                 return;
953         }
954         default:
955                 LASSERTF(0, "incorrect message magic: %08x\n", msg->lm_magic);
956         }
957 }
958 EXPORT_SYMBOL(lustre_msg_clear_flags);
959
960 __u32 lustre_msg_get_op_flags(struct lustre_msg *msg)
961 {
962         switch (msg->lm_magic) {
963         case LUSTRE_MSG_MAGIC_V2: {
964                 struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg);
965                 if (pb != NULL)
966                         return pb->pb_op_flags;
967
968                 CERROR("invalid msg %p: no ptlrpc body!\n", msg);
969         }
970         /* fallthrough */
971         default:
972                 return 0;
973         }
974 }
975
976 void lustre_msg_add_op_flags(struct lustre_msg *msg, __u32 flags)
977 {
978         switch (msg->lm_magic) {
979         case LUSTRE_MSG_MAGIC_V2: {
980                 struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg);
981                 LASSERTF(pb != NULL, "invalid msg %p: no ptlrpc body!\n", msg);
982                 pb->pb_op_flags |= flags;
983                 return;
984         }
985         default:
986                 LASSERTF(0, "incorrect message magic: %08x\n", msg->lm_magic);
987         }
988 }
989 EXPORT_SYMBOL(lustre_msg_add_op_flags);
990
991 struct lustre_handle *lustre_msg_get_handle(struct lustre_msg *msg)
992 {
993         switch (msg->lm_magic) {
994         case LUSTRE_MSG_MAGIC_V2: {
995                 struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg);
996                 if (pb == NULL) {
997                         CERROR("invalid msg %p: no ptlrpc body!\n", msg);
998                         return NULL;
999                 }
1000                 return &pb->pb_handle;
1001         }
1002         default:
1003                 CERROR("incorrect message magic: %08x\n", msg->lm_magic);
1004                 return NULL;
1005         }
1006 }
1007
1008 __u32 lustre_msg_get_type(struct lustre_msg *msg)
1009 {
1010         switch (msg->lm_magic) {
1011         case LUSTRE_MSG_MAGIC_V2: {
1012                 struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg);
1013                 if (pb == NULL) {
1014                         CERROR("invalid msg %p: no ptlrpc body!\n", msg);
1015                         return PTL_RPC_MSG_ERR;
1016                 }
1017                 return pb->pb_type;
1018         }
1019         default:
1020                 CERROR("incorrect message magic: %08x\n", msg->lm_magic);
1021                 return PTL_RPC_MSG_ERR;
1022         }
1023 }
1024 EXPORT_SYMBOL(lustre_msg_get_type);
1025
1026 enum lustre_msg_version lustre_msg_get_version(struct lustre_msg *msg)
1027 {
1028         switch (msg->lm_magic) {
1029         case LUSTRE_MSG_MAGIC_V2: {
1030                 struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg);
1031                 if (pb == NULL) {
1032                         CERROR("invalid msg %p: no ptlrpc body!\n", msg);
1033                         return 0;
1034                 }
1035                 return pb->pb_version;
1036         }
1037         default:
1038                 CERROR("incorrect message magic: %08x\n", msg->lm_magic);
1039                 return 0;
1040         }
1041 }
1042
1043 void lustre_msg_add_version(struct lustre_msg *msg, __u32 version)
1044 {
1045         switch (msg->lm_magic) {
1046         case LUSTRE_MSG_MAGIC_V2: {
1047                 struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg);
1048                 LASSERTF(pb != NULL, "invalid msg %p: no ptlrpc body!\n", msg);
1049                 pb->pb_version |= version;
1050                 return;
1051         }
1052         default:
1053                 LASSERTF(0, "incorrect message magic: %08x\n", msg->lm_magic);
1054         }
1055 }
1056
1057 __u32 lustre_msg_get_opc(struct lustre_msg *msg)
1058 {
1059         switch (msg->lm_magic) {
1060         case LUSTRE_MSG_MAGIC_V2: {
1061                 struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg);
1062                 if (pb == NULL) {
1063                         CERROR("invalid msg %p: no ptlrpc body!\n", msg);
1064                         return 0;
1065                 }
1066                 return pb->pb_opc;
1067         }
1068         default:
1069                 CERROR("incorrect message magic: %08x (msg:%p)\n",
1070                        msg->lm_magic, msg);
1071                 return 0;
1072         }
1073 }
1074 EXPORT_SYMBOL(lustre_msg_get_opc);
1075
1076 __u64 lustre_msg_get_last_xid(struct lustre_msg *msg)
1077 {
1078         switch (msg->lm_magic) {
1079         case LUSTRE_MSG_MAGIC_V2: {
1080                 struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg);
1081                 if (pb == NULL) {
1082                         CERROR("invalid msg %p: no ptlrpc body!\n", msg);
1083                         return 0;
1084                 }
1085                 return pb->pb_last_xid;
1086         }
1087         default:
1088                 CERROR("incorrect message magic: %08x\n", msg->lm_magic);
1089                 return 0;
1090         }
1091 }
1092 EXPORT_SYMBOL(lustre_msg_get_last_xid);
1093
1094 __u16 lustre_msg_get_tag(struct lustre_msg *msg)
1095 {
1096         switch (msg->lm_magic) {
1097         case LUSTRE_MSG_MAGIC_V2: {
1098                 struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg);
1099                 if (!pb) {
1100                         CERROR("invalid msg %p: no ptlrpc body!\n", msg);
1101                         return 0;
1102                 }
1103                 return pb->pb_tag;
1104         }
1105         default:
1106                 CERROR("incorrect message magic: %08x\n", msg->lm_magic);
1107                 return 0;
1108         }
1109 }
1110 EXPORT_SYMBOL(lustre_msg_get_tag);
1111
1112 __u64 lustre_msg_get_last_committed(struct lustre_msg *msg)
1113 {
1114         switch (msg->lm_magic) {
1115         case LUSTRE_MSG_MAGIC_V2: {
1116                 struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg);
1117                 if (pb == NULL) {
1118                         CERROR("invalid msg %p: no ptlrpc body!\n", msg);
1119                         return 0;
1120                 }
1121                 return pb->pb_last_committed;
1122         }
1123         default:
1124                 CERROR("incorrect message magic: %08x\n", msg->lm_magic);
1125                 return 0;
1126         }
1127 }
1128 EXPORT_SYMBOL(lustre_msg_get_last_committed);
1129
1130 __u64 *lustre_msg_get_versions(struct lustre_msg *msg)
1131 {
1132         switch (msg->lm_magic) {
1133         case LUSTRE_MSG_MAGIC_V2: {
1134                 struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg);
1135                 if (pb == NULL) {
1136                         CERROR("invalid msg %p: no ptlrpc body!\n", msg);
1137                         return NULL;
1138                 }
1139                 return pb->pb_pre_versions;
1140         }
1141         default:
1142                 CERROR("incorrect message magic: %08x\n", msg->lm_magic);
1143                 return NULL;
1144         }
1145 }
1146 EXPORT_SYMBOL(lustre_msg_get_versions);
1147
1148 __u64 lustre_msg_get_transno(struct lustre_msg *msg)
1149 {
1150         switch (msg->lm_magic) {
1151         case LUSTRE_MSG_MAGIC_V2: {
1152                 struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg);
1153                 if (pb == NULL) {
1154                         CERROR("invalid msg %p: no ptlrpc body!\n", msg);
1155                         return 0;
1156                 }
1157                 return pb->pb_transno;
1158         }
1159         default:
1160                 CERROR("incorrect message magic: %08x\n", msg->lm_magic);
1161                 return 0;
1162         }
1163 }
1164 EXPORT_SYMBOL(lustre_msg_get_transno);
1165
1166 int lustre_msg_get_status(struct lustre_msg *msg)
1167 {
1168         switch (msg->lm_magic) {
1169         case LUSTRE_MSG_MAGIC_V2: {
1170                 struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg);
1171                 if (pb != NULL)
1172                         return pb->pb_status;
1173                 CERROR("invalid msg %p: no ptlrpc body!\n", msg);
1174         }
1175         /* fallthrough */
1176         default:
1177                 /*
1178                  * status might be printed in debug code while message
1179                  * uninitialized
1180                  */
1181                 return -EINVAL;
1182         }
1183 }
1184 EXPORT_SYMBOL(lustre_msg_get_status);
1185
1186 __u64 lustre_msg_get_slv(struct lustre_msg *msg)
1187 {
1188         switch (msg->lm_magic) {
1189         case LUSTRE_MSG_MAGIC_V2: {
1190                 struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg);
1191                 if (pb == NULL) {
1192                         CERROR("invalid msg %p: no ptlrpc body!\n", msg);
1193                         return -EINVAL;
1194                 }
1195                 return pb->pb_slv;
1196         }
1197         default:
1198                 CERROR("invalid msg magic %08x\n", msg->lm_magic);
1199                 return -EINVAL;
1200         }
1201 }
1202
1203
1204 void lustre_msg_set_slv(struct lustre_msg *msg, __u64 slv)
1205 {
1206         switch (msg->lm_magic) {
1207         case LUSTRE_MSG_MAGIC_V2: {
1208                 struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg);
1209                 if (pb == NULL) {
1210                         CERROR("invalid msg %p: no ptlrpc body!\n", msg);
1211                         return;
1212                 }
1213                 pb->pb_slv = slv;
1214                 return;
1215         }
1216         default:
1217                 CERROR("invalid msg magic %x\n", msg->lm_magic);
1218                 return;
1219         }
1220 }
1221
1222 __u32 lustre_msg_get_limit(struct lustre_msg *msg)
1223 {
1224         switch (msg->lm_magic) {
1225         case LUSTRE_MSG_MAGIC_V2: {
1226                 struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg);
1227                 if (pb == NULL) {
1228                         CERROR("invalid msg %p: no ptlrpc body!\n", msg);
1229                         return -EINVAL;
1230                 }
1231                 return pb->pb_limit;
1232         }
1233         default:
1234                 CERROR("invalid msg magic %x\n", msg->lm_magic);
1235                 return -EINVAL;
1236         }
1237 }
1238
1239
1240 void lustre_msg_set_limit(struct lustre_msg *msg, __u64 limit)
1241 {
1242         switch (msg->lm_magic) {
1243         case LUSTRE_MSG_MAGIC_V2: {
1244                 struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg);
1245                 if (pb == NULL) {
1246                         CERROR("invalid msg %p: no ptlrpc body!\n", msg);
1247                         return;
1248                 }
1249                 pb->pb_limit = limit;
1250                 return;
1251         }
1252         default:
1253                 CERROR("invalid msg magic %08x\n", msg->lm_magic);
1254                 return;
1255         }
1256 }
1257
1258 __u32 lustre_msg_get_conn_cnt(struct lustre_msg *msg)
1259 {
1260         switch (msg->lm_magic) {
1261         case LUSTRE_MSG_MAGIC_V2: {
1262                 struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg);
1263                 if (pb == NULL) {
1264                         CERROR("invalid msg %p: no ptlrpc body!\n", msg);
1265                         return 0;
1266                 }
1267                 return pb->pb_conn_cnt;
1268         }
1269         default:
1270                 CERROR("incorrect message magic: %08x\n", msg->lm_magic);
1271                 return 0;
1272         }
1273 }
1274 EXPORT_SYMBOL(lustre_msg_get_conn_cnt);
1275
1276 __u32 lustre_msg_get_magic(struct lustre_msg *msg)
1277 {
1278         switch (msg->lm_magic) {
1279         case LUSTRE_MSG_MAGIC_V2:
1280                 return msg->lm_magic;
1281         default:
1282                 CERROR("incorrect message magic: %08x\n", msg->lm_magic);
1283                 return 0;
1284         }
1285 }
1286
1287 timeout_t lustre_msg_get_timeout(struct lustre_msg *msg)
1288 {
1289         switch (msg->lm_magic) {
1290         case LUSTRE_MSG_MAGIC_V2: {
1291                 struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg);
1292
1293                 if (pb == NULL) {
1294                         CERROR("invalid msg %p: no ptlrpc body!\n", msg);
1295                         return 0;
1296                 }
1297                 return pb->pb_timeout;
1298         }
1299         default:
1300                 CERROR("incorrect message magic: %08x\n", msg->lm_magic);
1301                 return 0;
1302         }
1303 }
1304
1305 timeout_t lustre_msg_get_service_timeout(struct lustre_msg *msg)
1306 {
1307         switch (msg->lm_magic) {
1308         case LUSTRE_MSG_MAGIC_V2: {
1309                 struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg);
1310
1311                 if (pb == NULL) {
1312                         CERROR("invalid msg %p: no ptlrpc body!\n", msg);
1313                         return 0;
1314                 }
1315                 return pb->pb_service_time;
1316         }
1317         default:
1318                 CERROR("incorrect message magic: %08x\n", msg->lm_magic);
1319                 return 0;
1320         }
1321 }
1322
1323 char *lustre_msg_get_jobid(struct lustre_msg *msg)
1324 {
1325         switch (msg->lm_magic) {
1326         case LUSTRE_MSG_MAGIC_V2: {
1327                 struct ptlrpc_body *pb;
1328
1329                 /* the old pltrpc_body_v2 is smaller; doesn't include jobid */
1330                 if (msg->lm_buflens[MSG_PTLRPC_BODY_OFF] <
1331                     sizeof(struct ptlrpc_body))
1332                         return NULL;
1333
1334                 pb = lustre_msg_buf_v2(msg, MSG_PTLRPC_BODY_OFF,
1335                                           sizeof(struct ptlrpc_body));
1336                 if (!pb)
1337                         return NULL;
1338
1339                 return pb->pb_jobid;
1340         }
1341         default:
1342                 CERROR("incorrect message magic: %08x\n", msg->lm_magic);
1343                 return NULL;
1344         }
1345 }
1346 EXPORT_SYMBOL(lustre_msg_get_jobid);
1347
1348 __u32 lustre_msg_get_cksum(struct lustre_msg *msg)
1349 {
1350         switch (msg->lm_magic) {
1351         case LUSTRE_MSG_MAGIC_V2:
1352                 return msg->lm_cksum;
1353         default:
1354                 CERROR("incorrect message magic: %08x\n", msg->lm_magic);
1355                 return 0;
1356         }
1357 }
1358
1359 __u64 lustre_msg_get_mbits(struct lustre_msg *msg)
1360 {
1361         switch (msg->lm_magic) {
1362         case LUSTRE_MSG_MAGIC_V2: {
1363                 struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg);
1364                 if (pb == NULL) {
1365                         CERROR("invalid msg %p: no ptlrpc body!\n", msg);
1366                         return 0;
1367                 }
1368                 return pb->pb_mbits;
1369         }
1370         default:
1371                 CERROR("incorrect message magic: %08x\n", msg->lm_magic);
1372                 return 0;
1373         }
1374 }
1375
1376 __u32 lustre_msg_calc_cksum(struct lustre_msg *msg, __u32 buf)
1377 {
1378         switch (msg->lm_magic) {
1379         case LUSTRE_MSG_MAGIC_V2: {
1380                 struct ptlrpc_body *pb = lustre_msg_buf_v2(msg, buf, 0);
1381                 __u32 len = lustre_msg_buflen(msg, buf);
1382                 __u32 crc;
1383
1384 #if IS_ENABLED(CONFIG_CRC32)
1385                 /* about 10x faster than crypto_hash for small buffers */
1386                 crc = crc32_le(~(__u32)0, (unsigned char *)pb, len);
1387 #elif IS_ENABLED(CONFIG_CRYPTO_CRC32)
1388                 unsigned int hsize = 4;
1389
1390                 cfs_crypto_hash_digest(CFS_HASH_ALG_CRC32, (unsigned char *)pb,
1391                                        len, NULL, 0, (unsigned char *)&crc,
1392                                        &hsize);
1393 #else
1394 #error "need either CONFIG_CRC32 or CONFIG_CRYPTO_CRC32 enabled in the kernel"
1395 #endif
1396                 return crc;
1397         }
1398         default:
1399                 CERROR("incorrect message magic: %08x\n", msg->lm_magic);
1400                 return 0;
1401         }
1402 }
1403
1404 void lustre_msg_set_handle(struct lustre_msg *msg, struct lustre_handle *handle)
1405 {
1406         switch (msg->lm_magic) {
1407         case LUSTRE_MSG_MAGIC_V2: {
1408                 struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg);
1409                 LASSERTF(pb, "invalid msg %p: no ptlrpc body!\n", msg);
1410                 pb->pb_handle = *handle;
1411                 return;
1412         }
1413         default:
1414                 LASSERTF(0, "incorrect message magic: %08x\n", msg->lm_magic);
1415         }
1416 }
1417
1418 void lustre_msg_set_type(struct lustre_msg *msg, __u32 type)
1419 {
1420         switch (msg->lm_magic) {
1421         case LUSTRE_MSG_MAGIC_V2: {
1422                 struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg);
1423                 LASSERTF(pb, "invalid msg %p: no ptlrpc body!\n", msg);
1424                 pb->pb_type = type;
1425                 return;
1426                 }
1427         default:
1428                 LASSERTF(0, "incorrect message magic: %08x\n", msg->lm_magic);
1429         }
1430 }
1431
1432 void lustre_msg_set_opc(struct lustre_msg *msg, __u32 opc)
1433 {
1434         switch (msg->lm_magic) {
1435         case LUSTRE_MSG_MAGIC_V2: {
1436                 struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg);
1437                 LASSERTF(pb, "invalid msg %p: no ptlrpc body!\n", msg);
1438                 pb->pb_opc = opc;
1439                 return;
1440         }
1441         default:
1442                 LASSERTF(0, "incorrect message magic: %08x\n", msg->lm_magic);
1443         }
1444 }
1445
1446 void lustre_msg_set_last_xid(struct lustre_msg *msg, __u64 last_xid)
1447 {
1448         switch (msg->lm_magic) {
1449         case LUSTRE_MSG_MAGIC_V2: {
1450                 struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg);
1451                 LASSERTF(pb != NULL, "invalid msg %p: no ptlrpc body!\n", msg);
1452                 pb->pb_last_xid = last_xid;
1453                 return;
1454         }
1455         default:
1456                 LASSERTF(0, "incorrect message magic: %08x\n", msg->lm_magic);
1457         }
1458 }
1459 EXPORT_SYMBOL(lustre_msg_set_last_xid);
1460
1461 void lustre_msg_set_tag(struct lustre_msg *msg, __u16 tag)
1462 {
1463         switch (msg->lm_magic) {
1464         case LUSTRE_MSG_MAGIC_V2: {
1465                 struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg);
1466                 LASSERTF(pb, "invalid msg %p: no ptlrpc body!\n", msg);
1467                 pb->pb_tag = tag;
1468                 return;
1469         }
1470         default:
1471                 LASSERTF(0, "incorrect message magic: %08x\n", msg->lm_magic);
1472         }
1473 }
1474 EXPORT_SYMBOL(lustre_msg_set_tag);
1475
1476 void lustre_msg_set_last_committed(struct lustre_msg *msg, __u64 last_committed)
1477 {
1478         switch (msg->lm_magic) {
1479         case LUSTRE_MSG_MAGIC_V2: {
1480                 struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg);
1481                 LASSERTF(pb != NULL, "invalid msg %p: no ptlrpc body!\n", msg);
1482                 pb->pb_last_committed = last_committed;
1483                 return;
1484         }
1485         default:
1486                 LASSERTF(0, "incorrect message magic: %08x\n", msg->lm_magic);
1487         }
1488 }
1489
1490 void lustre_msg_set_versions(struct lustre_msg *msg, __u64 *versions)
1491 {
1492         switch (msg->lm_magic) {
1493         case LUSTRE_MSG_MAGIC_V2: {
1494                 struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg);
1495                 LASSERTF(pb != NULL, "invalid msg %p: no ptlrpc body!\n", msg);
1496                 pb->pb_pre_versions[0] = versions[0];
1497                 pb->pb_pre_versions[1] = versions[1];
1498                 pb->pb_pre_versions[2] = versions[2];
1499                 pb->pb_pre_versions[3] = versions[3];
1500                 return;
1501         }
1502         default:
1503                 LASSERTF(0, "incorrect message magic: %08x\n", msg->lm_magic);
1504         }
1505 }
1506 EXPORT_SYMBOL(lustre_msg_set_versions);
1507
1508 void lustre_msg_set_transno(struct lustre_msg *msg, __u64 transno)
1509 {
1510         switch (msg->lm_magic) {
1511         case LUSTRE_MSG_MAGIC_V2: {
1512                 struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg);
1513                 LASSERTF(pb != NULL, "invalid msg %p: no ptlrpc body!\n", msg);
1514                 pb->pb_transno = transno;
1515                 return;
1516         }
1517         default:
1518                 LASSERTF(0, "incorrect message magic: %08x\n", msg->lm_magic);
1519         }
1520 }
1521 EXPORT_SYMBOL(lustre_msg_set_transno);
1522
1523 void lustre_msg_set_status(struct lustre_msg *msg, __u32 status)
1524 {
1525         switch (msg->lm_magic) {
1526         case LUSTRE_MSG_MAGIC_V2: {
1527                 struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg);
1528                 LASSERTF(pb != NULL, "invalid msg %p: no ptlrpc body!\n", msg);
1529                 pb->pb_status = status;
1530                 return;
1531         }
1532         default:
1533                 LASSERTF(0, "incorrect message magic: %08x\n", msg->lm_magic);
1534         }
1535 }
1536 EXPORT_SYMBOL(lustre_msg_set_status);
1537
1538 void lustre_msg_set_conn_cnt(struct lustre_msg *msg, __u32 conn_cnt)
1539 {
1540         switch (msg->lm_magic) {
1541         case LUSTRE_MSG_MAGIC_V2: {
1542                 struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg);
1543                 LASSERTF(pb != NULL, "invalid msg %p: no ptlrpc body!\n", msg);
1544                 pb->pb_conn_cnt = conn_cnt;
1545                 return;
1546         }
1547         default:
1548                 LASSERTF(0, "incorrect message magic: %08x\n", msg->lm_magic);
1549         }
1550 }
1551
1552 void lustre_msg_set_timeout(struct lustre_msg *msg, timeout_t timeout)
1553 {
1554         switch (msg->lm_magic) {
1555         case LUSTRE_MSG_MAGIC_V2: {
1556                 struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg);
1557
1558                 LASSERT(timeout >= 0);
1559                 LASSERTF(pb != NULL, "invalid msg %p: no ptlrpc body!\n", msg);
1560                 pb->pb_timeout = timeout;
1561                 return;
1562         }
1563         default:
1564                 LASSERTF(0, "incorrect message magic: %08x\n", msg->lm_magic);
1565         }
1566 }
1567
1568 void lustre_msg_set_service_timeout(struct lustre_msg *msg,
1569                                     timeout_t service_timeout)
1570 {
1571         switch (msg->lm_magic) {
1572         case LUSTRE_MSG_MAGIC_V2: {
1573                 struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg);
1574
1575                 LASSERT(service_timeout >= 0);
1576                 LASSERTF(pb, "invalid msg %p: no ptlrpc body!\n", msg);
1577                 pb->pb_service_time = service_timeout;
1578                 return;
1579         }
1580         default:
1581                 LASSERTF(0, "incorrect message magic: %08x\n", msg->lm_magic);
1582         }
1583 }
1584
1585 void lustre_msg_set_jobid(struct lustre_msg *msg, char *jobid)
1586 {
1587         switch (msg->lm_magic) {
1588         case LUSTRE_MSG_MAGIC_V2: {
1589                 __u32 opc = lustre_msg_get_opc(msg);
1590                 struct ptlrpc_body *pb;
1591
1592                 /* Don't set jobid for ldlm ast RPCs, they've been shrinked.
1593                  * See the comment in ptlrpc_request_pack(). */
1594                 if (!opc || opc == LDLM_BL_CALLBACK ||
1595                     opc == LDLM_CP_CALLBACK || opc == LDLM_GL_CALLBACK)
1596                         return;
1597
1598                 pb = lustre_msg_buf_v2(msg, MSG_PTLRPC_BODY_OFF,
1599                                        sizeof(struct ptlrpc_body));
1600                 LASSERTF(pb, "invalid msg %p: no ptlrpc body!\n", msg);
1601
1602                 if (jobid != NULL)
1603                         memcpy(pb->pb_jobid, jobid, sizeof(pb->pb_jobid));
1604                 else if (pb->pb_jobid[0] == '\0')
1605                         lustre_get_jobid(pb->pb_jobid, sizeof(pb->pb_jobid));
1606                 return;
1607         }
1608         default:
1609                 LASSERTF(0, "incorrect message magic: %08x\n", msg->lm_magic);
1610         }
1611 }
1612 EXPORT_SYMBOL(lustre_msg_set_jobid);
1613
1614 void lustre_msg_set_cksum(struct lustre_msg *msg, __u32 cksum)
1615 {
1616         switch (msg->lm_magic) {
1617         case LUSTRE_MSG_MAGIC_V2:
1618                 msg->lm_cksum = cksum;
1619                 return;
1620         default:
1621                 LASSERTF(0, "incorrect message magic: %08x\n", msg->lm_magic);
1622         }
1623 }
1624
1625 void lustre_msg_set_mbits(struct lustre_msg *msg, __u64 mbits)
1626 {
1627         switch (msg->lm_magic) {
1628         case LUSTRE_MSG_MAGIC_V2: {
1629                 struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg);
1630
1631                 LASSERTF(pb != NULL, "invalid msg %p: no ptlrpc body!\n", msg);
1632                 pb->pb_mbits = mbits;
1633                 return;
1634         }
1635         default:
1636                 LASSERTF(0, "incorrect message magic: %08x\n", msg->lm_magic);
1637         }
1638 }
1639
1640 void ptlrpc_request_set_replen(struct ptlrpc_request *req)
1641 {
1642         int count = req_capsule_filled_sizes(&req->rq_pill, RCL_SERVER);
1643
1644         req->rq_replen = lustre_msg_size(req->rq_reqmsg->lm_magic, count,
1645                                          req->rq_pill.rc_area[RCL_SERVER]);
1646         if (req->rq_reqmsg->lm_magic == LUSTRE_MSG_MAGIC_V2)
1647                 req->rq_reqmsg->lm_repsize = req->rq_replen;
1648 }
1649 EXPORT_SYMBOL(ptlrpc_request_set_replen);
1650
1651 void ptlrpc_req_set_repsize(struct ptlrpc_request *req, int count, __u32 *lens)
1652 {
1653         req->rq_replen = lustre_msg_size(req->rq_reqmsg->lm_magic, count, lens);
1654         if (req->rq_reqmsg->lm_magic == LUSTRE_MSG_MAGIC_V2)
1655                 req->rq_reqmsg->lm_repsize = req->rq_replen;
1656 }
1657
1658 /**
1659  * Send a remote set_info_async.
1660  *
1661  * This may go from client to server or server to client.
1662  */
1663 int do_set_info_async(struct obd_import *imp,
1664                       int opcode, int version,
1665                       size_t keylen, void *key,
1666                       size_t vallen, void *val,
1667                       struct ptlrpc_request_set *set)
1668 {
1669         struct ptlrpc_request *req;
1670         char *tmp;
1671         int rc;
1672
1673         ENTRY;
1674
1675         req = ptlrpc_request_alloc(imp, KEY_IS(KEY_CHANGELOG_CLEAR) ?
1676                                                 &RQF_MDT_SET_INFO :
1677                                                 &RQF_OBD_SET_INFO);
1678         if (req == NULL)
1679                 RETURN(-ENOMEM);
1680
1681         req_capsule_set_size(&req->rq_pill, &RMF_SETINFO_KEY,
1682                              RCL_CLIENT, keylen);
1683         req_capsule_set_size(&req->rq_pill, &RMF_SETINFO_VAL,
1684                              RCL_CLIENT, vallen);
1685         rc = ptlrpc_request_pack(req, version, opcode);
1686         if (rc) {
1687                 ptlrpc_request_free(req);
1688                 RETURN(rc);
1689         }
1690
1691         if (KEY_IS(KEY_CHANGELOG_CLEAR))
1692                 do_pack_body(req);
1693
1694         tmp = req_capsule_client_get(&req->rq_pill, &RMF_SETINFO_KEY);
1695         memcpy(tmp, key, keylen);
1696         tmp = req_capsule_client_get(&req->rq_pill, &RMF_SETINFO_VAL);
1697         memcpy(tmp, val, vallen);
1698
1699         ptlrpc_request_set_replen(req);
1700
1701         if (set) {
1702                 ptlrpc_set_add_req(set, req);
1703                 ptlrpc_check_set(NULL, set);
1704         } else {
1705                 rc = ptlrpc_queue_wait(req);
1706                 ptlrpc_req_finished(req);
1707         }
1708
1709         RETURN(rc);
1710 }
1711 EXPORT_SYMBOL(do_set_info_async);
1712
1713 /* byte flipping routines for all wire types declared in
1714  * lustre_idl.h implemented here.
1715  */
1716 void lustre_swab_ptlrpc_body(struct ptlrpc_body *body)
1717 {
1718         __swab32s(&body->pb_type);
1719         __swab32s(&body->pb_version);
1720         __swab32s(&body->pb_opc);
1721         __swab32s(&body->pb_status);
1722         __swab64s(&body->pb_last_xid);
1723         __swab16s(&body->pb_tag);
1724         BUILD_BUG_ON(offsetof(typeof(*body), pb_padding0) == 0);
1725         BUILD_BUG_ON(offsetof(typeof(*body), pb_padding1) == 0);
1726         __swab64s(&body->pb_last_committed);
1727         __swab64s(&body->pb_transno);
1728         __swab32s(&body->pb_flags);
1729         __swab32s(&body->pb_op_flags);
1730         __swab32s(&body->pb_conn_cnt);
1731         __swab32s(&body->pb_timeout);
1732         __swab32s(&body->pb_service_time);
1733         __swab32s(&body->pb_limit);
1734         __swab64s(&body->pb_slv);
1735         __swab64s(&body->pb_pre_versions[0]);
1736         __swab64s(&body->pb_pre_versions[1]);
1737         __swab64s(&body->pb_pre_versions[2]);
1738         __swab64s(&body->pb_pre_versions[3]);
1739         __swab64s(&body->pb_mbits);
1740         BUILD_BUG_ON(offsetof(typeof(*body), pb_padding64_0) == 0);
1741         BUILD_BUG_ON(offsetof(typeof(*body), pb_padding64_1) == 0);
1742         BUILD_BUG_ON(offsetof(typeof(*body), pb_padding64_2) == 0);
1743         /*
1744          * While we need to maintain compatibility between
1745          * clients and servers without ptlrpc_body_v2 (< 2.3)
1746          * do not swab any fields beyond pb_jobid, as we are
1747          * using this swab function for both ptlrpc_body
1748          * and ptlrpc_body_v2.
1749          */
1750         /* pb_jobid is an ASCII string and should not be swabbed */
1751         BUILD_BUG_ON(offsetof(typeof(*body), pb_jobid) == 0);
1752 }
1753
1754 void lustre_swab_connect(struct obd_connect_data *ocd)
1755 {
1756         __swab64s(&ocd->ocd_connect_flags);
1757         __swab32s(&ocd->ocd_version);
1758         __swab32s(&ocd->ocd_grant);
1759         __swab64s(&ocd->ocd_ibits_known);
1760         __swab32s(&ocd->ocd_index);
1761         __swab32s(&ocd->ocd_brw_size);
1762         /*
1763          * ocd_blocksize and ocd_inodespace don't need to be swabbed because
1764          * they are 8-byte values
1765          */
1766         __swab16s(&ocd->ocd_grant_tax_kb);
1767         __swab32s(&ocd->ocd_grant_max_blks);
1768         __swab64s(&ocd->ocd_transno);
1769         __swab32s(&ocd->ocd_group);
1770         __swab32s(&ocd->ocd_cksum_types);
1771         __swab32s(&ocd->ocd_instance);
1772         /*
1773          * Fields after ocd_cksum_types are only accessible by the receiver
1774          * if the corresponding flag in ocd_connect_flags is set. Accessing
1775          * any field after ocd_maxbytes on the receiver without a valid flag
1776          * may result in out-of-bound memory access and kernel oops.
1777          */
1778         if (ocd->ocd_connect_flags & OBD_CONNECT_MAX_EASIZE)
1779                 __swab32s(&ocd->ocd_max_easize);
1780         if (ocd->ocd_connect_flags & OBD_CONNECT_MAXBYTES)
1781                 __swab64s(&ocd->ocd_maxbytes);
1782         if (ocd->ocd_connect_flags & OBD_CONNECT_MULTIMODRPCS)
1783                 __swab16s(&ocd->ocd_maxmodrpcs);
1784         BUILD_BUG_ON(offsetof(typeof(*ocd), padding0) == 0);
1785         BUILD_BUG_ON(offsetof(typeof(*ocd), padding1) == 0);
1786         if (ocd->ocd_connect_flags & OBD_CONNECT_FLAGS2)
1787                 __swab64s(&ocd->ocd_connect_flags2);
1788         BUILD_BUG_ON(offsetof(typeof(*ocd), padding3) == 0);
1789         BUILD_BUG_ON(offsetof(typeof(*ocd), padding4) == 0);
1790         BUILD_BUG_ON(offsetof(typeof(*ocd), padding5) == 0);
1791         BUILD_BUG_ON(offsetof(typeof(*ocd), padding6) == 0);
1792         BUILD_BUG_ON(offsetof(typeof(*ocd), padding7) == 0);
1793         BUILD_BUG_ON(offsetof(typeof(*ocd), padding8) == 0);
1794         BUILD_BUG_ON(offsetof(typeof(*ocd), padding9) == 0);
1795         BUILD_BUG_ON(offsetof(typeof(*ocd), paddingA) == 0);
1796         BUILD_BUG_ON(offsetof(typeof(*ocd), paddingB) == 0);
1797         BUILD_BUG_ON(offsetof(typeof(*ocd), paddingC) == 0);
1798         BUILD_BUG_ON(offsetof(typeof(*ocd), paddingD) == 0);
1799         BUILD_BUG_ON(offsetof(typeof(*ocd), paddingE) == 0);
1800         BUILD_BUG_ON(offsetof(typeof(*ocd), paddingF) == 0);
1801 }
1802
1803 static void lustre_swab_ost_layout(struct ost_layout *ol)
1804 {
1805         __swab32s(&ol->ol_stripe_size);
1806         __swab32s(&ol->ol_stripe_count);
1807         __swab64s(&ol->ol_comp_start);
1808         __swab64s(&ol->ol_comp_end);
1809         __swab32s(&ol->ol_comp_id);
1810 }
1811
1812 void lustre_swab_obdo(struct obdo *o)
1813 {
1814         __swab64s(&o->o_valid);
1815         lustre_swab_ost_id(&o->o_oi);
1816         __swab64s(&o->o_parent_seq);
1817         __swab64s(&o->o_size);
1818         __swab64s(&o->o_mtime);
1819         __swab64s(&o->o_atime);
1820         __swab64s(&o->o_ctime);
1821         __swab64s(&o->o_blocks);
1822         __swab64s(&o->o_grant);
1823         __swab32s(&o->o_blksize);
1824         __swab32s(&o->o_mode);
1825         __swab32s(&o->o_uid);
1826         __swab32s(&o->o_gid);
1827         __swab32s(&o->o_flags);
1828         __swab32s(&o->o_nlink);
1829         __swab32s(&o->o_parent_oid);
1830         __swab32s(&o->o_misc);
1831         __swab64s(&o->o_ioepoch);
1832         __swab32s(&o->o_stripe_idx);
1833         __swab32s(&o->o_parent_ver);
1834         lustre_swab_ost_layout(&o->o_layout);
1835         __swab32s(&o->o_layout_version);
1836         __swab32s(&o->o_uid_h);
1837         __swab32s(&o->o_gid_h);
1838         __swab64s(&o->o_data_version);
1839         __swab32s(&o->o_projid);
1840         BUILD_BUG_ON(offsetof(typeof(*o), o_padding_4) == 0);
1841         BUILD_BUG_ON(offsetof(typeof(*o), o_padding_5) == 0);
1842         BUILD_BUG_ON(offsetof(typeof(*o), o_padding_6) == 0);
1843
1844 }
1845 EXPORT_SYMBOL(lustre_swab_obdo);
1846
1847 void lustre_swab_obd_statfs(struct obd_statfs *os)
1848 {
1849         __swab64s(&os->os_type);
1850         __swab64s(&os->os_blocks);
1851         __swab64s(&os->os_bfree);
1852         __swab64s(&os->os_bavail);
1853         __swab64s(&os->os_files);
1854         __swab64s(&os->os_ffree);
1855         /* no need to swab os_fsid */
1856         __swab32s(&os->os_bsize);
1857         __swab32s(&os->os_namelen);
1858         __swab64s(&os->os_maxbytes);
1859         __swab32s(&os->os_state);
1860         __swab32s(&os->os_fprecreated);
1861         __swab32s(&os->os_granted);
1862         BUILD_BUG_ON(offsetof(typeof(*os), os_spare3) == 0);
1863         BUILD_BUG_ON(offsetof(typeof(*os), os_spare4) == 0);
1864         BUILD_BUG_ON(offsetof(typeof(*os), os_spare5) == 0);
1865         BUILD_BUG_ON(offsetof(typeof(*os), os_spare6) == 0);
1866         BUILD_BUG_ON(offsetof(typeof(*os), os_spare7) == 0);
1867         BUILD_BUG_ON(offsetof(typeof(*os), os_spare8) == 0);
1868         BUILD_BUG_ON(offsetof(typeof(*os), os_spare9) == 0);
1869 }
1870
1871 void lustre_swab_obd_ioobj(struct obd_ioobj *ioo)
1872 {
1873         lustre_swab_ost_id(&ioo->ioo_oid);
1874         __swab32s(&ioo->ioo_max_brw);
1875         __swab32s(&ioo->ioo_bufcnt);
1876 }
1877
1878 void lustre_swab_niobuf_remote(struct niobuf_remote *nbr)
1879 {
1880         __swab64s(&nbr->rnb_offset);
1881         __swab32s(&nbr->rnb_len);
1882         __swab32s(&nbr->rnb_flags);
1883 }
1884
1885 void lustre_swab_ost_body(struct ost_body *b)
1886 {
1887         lustre_swab_obdo(&b->oa);
1888 }
1889
1890 void lustre_swab_ost_last_id(u64 *id)
1891 {
1892         __swab64s(id);
1893 }
1894
1895 void lustre_swab_generic_32s(__u32 *val)
1896 {
1897         __swab32s(val);
1898 }
1899
1900 void lustre_swab_gl_lquota_desc(struct ldlm_gl_lquota_desc *desc)
1901 {
1902         lustre_swab_lu_fid(&desc->gl_id.qid_fid);
1903         __swab64s(&desc->gl_flags);
1904         __swab64s(&desc->gl_ver);
1905         __swab64s(&desc->gl_hardlimit);
1906         __swab64s(&desc->gl_softlimit);
1907         __swab64s(&desc->gl_time);
1908         BUILD_BUG_ON(offsetof(typeof(*desc), gl_pad2) == 0);
1909 }
1910 EXPORT_SYMBOL(lustre_swab_gl_lquota_desc);
1911
1912 void lustre_swab_gl_barrier_desc(struct ldlm_gl_barrier_desc *desc)
1913 {
1914         __swab32s(&desc->lgbd_status);
1915         __swab32s(&desc->lgbd_timeout);
1916         BUILD_BUG_ON(offsetof(typeof(*desc), lgbd_padding) == 0);
1917 }
1918 EXPORT_SYMBOL(lustre_swab_gl_barrier_desc);
1919
1920 void lustre_swab_ost_lvb_v1(struct ost_lvb_v1 *lvb)
1921 {
1922         __swab64s(&lvb->lvb_size);
1923         __swab64s(&lvb->lvb_mtime);
1924         __swab64s(&lvb->lvb_atime);
1925         __swab64s(&lvb->lvb_ctime);
1926         __swab64s(&lvb->lvb_blocks);
1927 }
1928 EXPORT_SYMBOL(lustre_swab_ost_lvb_v1);
1929
1930 void lustre_swab_ost_lvb(struct ost_lvb *lvb)
1931 {
1932         __swab64s(&lvb->lvb_size);
1933         __swab64s(&lvb->lvb_mtime);
1934         __swab64s(&lvb->lvb_atime);
1935         __swab64s(&lvb->lvb_ctime);
1936         __swab64s(&lvb->lvb_blocks);
1937         __swab32s(&lvb->lvb_mtime_ns);
1938         __swab32s(&lvb->lvb_atime_ns);
1939         __swab32s(&lvb->lvb_ctime_ns);
1940         __swab32s(&lvb->lvb_padding);
1941 }
1942 EXPORT_SYMBOL(lustre_swab_ost_lvb);
1943
1944 void lustre_swab_lquota_lvb(struct lquota_lvb *lvb)
1945 {
1946         __swab64s(&lvb->lvb_flags);
1947         __swab64s(&lvb->lvb_id_may_rel);
1948         __swab64s(&lvb->lvb_id_rel);
1949         __swab64s(&lvb->lvb_id_qunit);
1950         __swab64s(&lvb->lvb_pad1);
1951 }
1952 EXPORT_SYMBOL(lustre_swab_lquota_lvb);
1953
1954 void lustre_swab_barrier_lvb(struct barrier_lvb *lvb)
1955 {
1956         __swab32s(&lvb->lvb_status);
1957         __swab32s(&lvb->lvb_index);
1958         BUILD_BUG_ON(offsetof(typeof(*lvb), lvb_padding) == 0);
1959 }
1960 EXPORT_SYMBOL(lustre_swab_barrier_lvb);
1961
1962 void lustre_swab_mdt_body(struct mdt_body *b)
1963 {
1964         lustre_swab_lu_fid(&b->mbo_fid1);
1965         lustre_swab_lu_fid(&b->mbo_fid2);
1966         /* handle is opaque */
1967         __swab64s(&b->mbo_valid);
1968         __swab64s(&b->mbo_size);
1969         __swab64s(&b->mbo_mtime);
1970         __swab64s(&b->mbo_atime);
1971         __swab64s(&b->mbo_ctime);
1972         __swab64s(&b->mbo_blocks);
1973         __swab64s(&b->mbo_version);
1974         __swab64s(&b->mbo_t_state);
1975         __swab32s(&b->mbo_fsuid);
1976         __swab32s(&b->mbo_fsgid);
1977         __swab32s(&b->mbo_capability);
1978         __swab32s(&b->mbo_mode);
1979         __swab32s(&b->mbo_uid);
1980         __swab32s(&b->mbo_gid);
1981         __swab32s(&b->mbo_flags);
1982         __swab32s(&b->mbo_rdev);
1983         __swab32s(&b->mbo_nlink);
1984         __swab32s(&b->mbo_layout_gen);
1985         __swab32s(&b->mbo_suppgid);
1986         __swab32s(&b->mbo_eadatasize);
1987         __swab32s(&b->mbo_aclsize);
1988         __swab32s(&b->mbo_max_mdsize);
1989         BUILD_BUG_ON(offsetof(typeof(*b), mbo_unused3) == 0);
1990         __swab32s(&b->mbo_uid_h);
1991         __swab32s(&b->mbo_gid_h);
1992         __swab32s(&b->mbo_projid);
1993         __swab64s(&b->mbo_dom_size);
1994         __swab64s(&b->mbo_dom_blocks);
1995         __swab64s(&b->mbo_btime);
1996         BUILD_BUG_ON(offsetof(typeof(*b), mbo_padding_9) == 0);
1997         BUILD_BUG_ON(offsetof(typeof(*b), mbo_padding_10) == 0);
1998 }
1999
2000 void lustre_swab_mdt_ioepoch(struct mdt_ioepoch *b)
2001 {
2002         /* mio_open_handle is opaque */
2003         BUILD_BUG_ON(offsetof(typeof(*b), mio_unused1) == 0);
2004         BUILD_BUG_ON(offsetof(typeof(*b), mio_unused2) == 0);
2005         BUILD_BUG_ON(offsetof(typeof(*b), mio_padding) == 0);
2006 }
2007
2008 void lustre_swab_mgs_target_info(struct mgs_target_info *mti)
2009 {
2010         int i;
2011
2012         __swab32s(&mti->mti_lustre_ver);
2013         __swab32s(&mti->mti_stripe_index);
2014         __swab32s(&mti->mti_config_ver);
2015         __swab32s(&mti->mti_flags);
2016         __swab32s(&mti->mti_instance);
2017         __swab32s(&mti->mti_nid_count);
2018         BUILD_BUG_ON(sizeof(lnet_nid_t) != sizeof(__u64));
2019         for (i = 0; i < MTI_NIDS_MAX; i++)
2020                 __swab64s(&mti->mti_nids[i]);
2021 }
2022
2023 void lustre_swab_mgs_nidtbl_entry(struct mgs_nidtbl_entry *entry)
2024 {
2025         __u8 i;
2026
2027         __swab64s(&entry->mne_version);
2028         __swab32s(&entry->mne_instance);
2029         __swab32s(&entry->mne_index);
2030         __swab32s(&entry->mne_length);
2031
2032         /* mne_nid_(count|type) must be one byte size because we're gonna
2033          * access it w/o swapping. */
2034         BUILD_BUG_ON(sizeof(entry->mne_nid_count) != sizeof(__u8));
2035         BUILD_BUG_ON(sizeof(entry->mne_nid_type) != sizeof(__u8));
2036
2037         /* remove this assertion if ipv6 is supported. */
2038         LASSERT(entry->mne_nid_type == 0);
2039         for (i = 0; i < entry->mne_nid_count; i++) {
2040                 BUILD_BUG_ON(sizeof(lnet_nid_t) != sizeof(__u64));
2041                 __swab64s(&entry->u.nids[i]);
2042         }
2043 }
2044 EXPORT_SYMBOL(lustre_swab_mgs_nidtbl_entry);
2045
2046 void lustre_swab_mgs_config_body(struct mgs_config_body *body)
2047 {
2048         __swab64s(&body->mcb_offset);
2049         __swab32s(&body->mcb_units);
2050         __swab16s(&body->mcb_type);
2051 }
2052
2053 void lustre_swab_mgs_config_res(struct mgs_config_res *body)
2054 {
2055         __swab64s(&body->mcr_offset);
2056         __swab64s(&body->mcr_size);
2057 }
2058
2059 static void lustre_swab_obd_dqinfo(struct obd_dqinfo *i)
2060 {
2061         __swab64s(&i->dqi_bgrace);
2062         __swab64s(&i->dqi_igrace);
2063         __swab32s(&i->dqi_flags);
2064         __swab32s(&i->dqi_valid);
2065 }
2066
2067 static void lustre_swab_obd_dqblk(struct obd_dqblk *b)
2068 {
2069         __swab64s(&b->dqb_ihardlimit);
2070         __swab64s(&b->dqb_isoftlimit);
2071         __swab64s(&b->dqb_curinodes);
2072         __swab64s(&b->dqb_bhardlimit);
2073         __swab64s(&b->dqb_bsoftlimit);
2074         __swab64s(&b->dqb_curspace);
2075         __swab64s(&b->dqb_btime);
2076         __swab64s(&b->dqb_itime);
2077         __swab32s(&b->dqb_valid);
2078         BUILD_BUG_ON(offsetof(typeof(*b), dqb_padding) == 0);
2079 }
2080
2081 int lustre_swab_obd_quotactl(struct obd_quotactl *q, __u32 len)
2082 {
2083         if (unlikely(len <= sizeof(struct obd_quotactl)))
2084                 return -EOVERFLOW;
2085
2086         __swab32s(&q->qc_cmd);
2087         __swab32s(&q->qc_type);
2088         __swab32s(&q->qc_id);
2089         __swab32s(&q->qc_stat);
2090         lustre_swab_obd_dqinfo(&q->qc_dqinfo);
2091         lustre_swab_obd_dqblk(&q->qc_dqblk);
2092
2093         return len;
2094 }
2095
2096 void lustre_swab_fid2path(struct getinfo_fid2path *gf)
2097 {
2098         lustre_swab_lu_fid(&gf->gf_fid);
2099         __swab64s(&gf->gf_recno);
2100         __swab32s(&gf->gf_linkno);
2101         __swab32s(&gf->gf_pathlen);
2102 }
2103 EXPORT_SYMBOL(lustre_swab_fid2path);
2104
2105 static void lustre_swab_fiemap_extent(struct fiemap_extent *fm_extent)
2106 {
2107         __swab64s(&fm_extent->fe_logical);
2108         __swab64s(&fm_extent->fe_physical);
2109         __swab64s(&fm_extent->fe_length);
2110         __swab32s(&fm_extent->fe_flags);
2111         __swab32s(&fm_extent->fe_device);
2112 }
2113
2114 static void lustre_swab_fiemap_hdr(struct fiemap *fiemap)
2115 {
2116         __swab64s(&fiemap->fm_start);
2117         __swab64s(&fiemap->fm_length);
2118         __swab32s(&fiemap->fm_flags);
2119         __swab32s(&fiemap->fm_mapped_extents);
2120         __swab32s(&fiemap->fm_extent_count);
2121         __swab32s(&fiemap->fm_reserved);
2122 }
2123
2124 int lustre_swab_fiemap(struct fiemap *fiemap, __u32 len)
2125 {
2126         __u32 i, size, count;
2127
2128         lustre_swab_fiemap_hdr(fiemap);
2129
2130         size = fiemap_count_to_size(fiemap->fm_mapped_extents);
2131         count = fiemap->fm_mapped_extents;
2132         if (unlikely(size > len)) {
2133                 count = (len - sizeof(struct fiemap)) /
2134                         sizeof(struct fiemap_extent);
2135                 fiemap->fm_mapped_extents = count;
2136                 size = -EOVERFLOW;
2137         }
2138         /* still swab extents as we cannot yet pass rc to callers */
2139         for (i = 0; i < count; i++)
2140                 lustre_swab_fiemap_extent(&fiemap->fm_extents[i]);
2141
2142         return size;
2143 }
2144
2145 void lustre_swab_fiemap_info_key(struct ll_fiemap_info_key *fiemap_info)
2146 {
2147         lustre_swab_obdo(&fiemap_info->lfik_oa);
2148         lustre_swab_fiemap_hdr(&fiemap_info->lfik_fiemap);
2149 }
2150
2151 void lustre_swab_idx_info(struct idx_info *ii)
2152 {
2153         __swab32s(&ii->ii_magic);
2154         __swab32s(&ii->ii_flags);
2155         __swab16s(&ii->ii_count);
2156         __swab32s(&ii->ii_attrs);
2157         lustre_swab_lu_fid(&ii->ii_fid);
2158         __swab64s(&ii->ii_version);
2159         __swab64s(&ii->ii_hash_start);
2160         __swab64s(&ii->ii_hash_end);
2161         __swab16s(&ii->ii_keysize);
2162         __swab16s(&ii->ii_recsize);
2163 }
2164
2165 void lustre_swab_lip_header(struct lu_idxpage *lip)
2166 {
2167         /* swab header */
2168         __swab32s(&lip->lip_magic);
2169         __swab16s(&lip->lip_flags);
2170         __swab16s(&lip->lip_nr);
2171 }
2172 EXPORT_SYMBOL(lustre_swab_lip_header);
2173
2174 void lustre_swab_mdt_rec_reint (struct mdt_rec_reint *rr)
2175 {
2176         __swab32s(&rr->rr_opcode);
2177         __swab32s(&rr->rr_cap);
2178         __swab32s(&rr->rr_fsuid);
2179         /* rr_fsuid_h is unused */
2180         __swab32s(&rr->rr_fsgid);
2181         /* rr_fsgid_h is unused */
2182         __swab32s(&rr->rr_suppgid1);
2183         /* rr_suppgid1_h is unused */
2184         __swab32s(&rr->rr_suppgid2);
2185         /* rr_suppgid2_h is unused */
2186         lustre_swab_lu_fid(&rr->rr_fid1);
2187         lustre_swab_lu_fid(&rr->rr_fid2);
2188         __swab64s(&rr->rr_mtime);
2189         __swab64s(&rr->rr_atime);
2190         __swab64s(&rr->rr_ctime);
2191         __swab64s(&rr->rr_size);
2192         __swab64s(&rr->rr_blocks);
2193         __swab32s(&rr->rr_bias);
2194         __swab32s(&rr->rr_mode);
2195         __swab32s(&rr->rr_flags);
2196         __swab32s(&rr->rr_flags_h);
2197         __swab32s(&rr->rr_umask);
2198         __swab16s(&rr->rr_mirror_id);
2199
2200         BUILD_BUG_ON(offsetof(typeof(*rr), rr_padding_4) == 0);
2201 };
2202
2203 void lustre_swab_lov_desc(struct lov_desc *ld)
2204 {
2205         __swab32s(&ld->ld_tgt_count);
2206         __swab32s(&ld->ld_active_tgt_count);
2207         __swab32s(&ld->ld_default_stripe_count);
2208         __swab32s(&ld->ld_pattern);
2209         __swab64s(&ld->ld_default_stripe_size);
2210         __swab64s(&ld->ld_default_stripe_offset);
2211         __swab32s(&ld->ld_qos_maxage);
2212         /* uuid endian insensitive */
2213 }
2214 EXPORT_SYMBOL(lustre_swab_lov_desc);
2215
2216 void lustre_swab_lmv_desc(struct lmv_desc *ld)
2217 {
2218         __swab32s(&ld->ld_tgt_count);
2219         __swab32s(&ld->ld_active_tgt_count);
2220         __swab32s(&ld->ld_default_stripe_count);
2221         __swab32s(&ld->ld_pattern);
2222         __swab64s(&ld->ld_default_hash_size);
2223         __swab32s(&ld->ld_qos_maxage);
2224         /* uuid endian insensitive */
2225 }
2226
2227 /* This structure is always in little-endian */
2228 static void lustre_swab_lmv_mds_md_v1(struct lmv_mds_md_v1 *lmm1)
2229 {
2230         int i;
2231
2232         __swab32s(&lmm1->lmv_magic);
2233         __swab32s(&lmm1->lmv_stripe_count);
2234         __swab32s(&lmm1->lmv_master_mdt_index);
2235         __swab32s(&lmm1->lmv_hash_type);
2236         __swab32s(&lmm1->lmv_layout_version);
2237         for (i = 0; i < lmm1->lmv_stripe_count; i++)
2238                 lustre_swab_lu_fid(&lmm1->lmv_stripe_fids[i]);
2239 }
2240
2241 void lustre_swab_lmv_mds_md(union lmv_mds_md *lmm)
2242 {
2243         switch (lmm->lmv_magic) {
2244         case LMV_MAGIC_V1:
2245                 lustre_swab_lmv_mds_md_v1(&lmm->lmv_md_v1);
2246                 break;
2247         default:
2248                 break;
2249         }
2250 }
2251 EXPORT_SYMBOL(lustre_swab_lmv_mds_md);
2252
2253 void lustre_swab_lmv_user_md_objects(struct lmv_user_mds_data *lmd,
2254                                      int stripe_count)
2255 {
2256         int i;
2257
2258         for (i = 0; i < stripe_count; i++)
2259                 __swab32s(&(lmd[i].lum_mds));
2260 }
2261 EXPORT_SYMBOL(lustre_swab_lmv_user_md_objects);
2262
2263
2264 void lustre_swab_lmv_user_md(struct lmv_user_md *lum)
2265 {
2266         __u32 count;
2267
2268         if (lum->lum_magic == LMV_MAGIC_FOREIGN) {
2269                 __swab32s(&lum->lum_magic);
2270                 __swab32s(&((struct lmv_foreign_md *)lum)->lfm_length);
2271                 __swab32s(&((struct lmv_foreign_md *)lum)->lfm_type);
2272                 __swab32s(&((struct lmv_foreign_md *)lum)->lfm_flags);
2273                 return;
2274         }
2275
2276         count = lum->lum_stripe_count;
2277         __swab32s(&lum->lum_magic);
2278         __swab32s(&lum->lum_stripe_count);
2279         __swab32s(&lum->lum_stripe_offset);
2280         __swab32s(&lum->lum_hash_type);
2281         __swab32s(&lum->lum_type);
2282         /* lum_max_inherit and lum_max_inherit_rr do not need to be swabbed */
2283         BUILD_BUG_ON(offsetof(typeof(*lum), lum_padding1) == 0);
2284         BUILD_BUG_ON(offsetof(typeof(*lum), lum_padding2) == 0);
2285         BUILD_BUG_ON(offsetof(typeof(*lum), lum_padding3) == 0);
2286         switch (lum->lum_magic) {
2287         case LMV_USER_MAGIC_SPECIFIC:
2288                 count = lum->lum_stripe_count;
2289                 /* fallthrough */
2290         case __swab32(LMV_USER_MAGIC_SPECIFIC):
2291                 lustre_swab_lmv_user_md_objects(lum->lum_objects, count);
2292                 break;
2293         default:
2294                 break;
2295         }
2296 }
2297 EXPORT_SYMBOL(lustre_swab_lmv_user_md);
2298
2299 static void lustre_print_v1v3(unsigned int lvl, struct lov_user_md *lum,
2300                               const char *msg)
2301 {
2302         CDEBUG(lvl, "%s lov_user_md %p:\n", msg, lum);
2303         CDEBUG(lvl, "\tlmm_magic: %#x\n", lum->lmm_magic);
2304         CDEBUG(lvl, "\tlmm_pattern: %#x\n", lum->lmm_pattern);
2305         CDEBUG(lvl, "\tlmm_object_id: %llu\n", lmm_oi_id(&lum->lmm_oi));
2306         CDEBUG(lvl, "\tlmm_object_gr: %llu\n", lmm_oi_seq(&lum->lmm_oi));
2307         CDEBUG(lvl, "\tlmm_stripe_size: %#x\n", lum->lmm_stripe_size);
2308         CDEBUG(lvl, "\tlmm_stripe_count: %#x\n", lum->lmm_stripe_count);
2309         CDEBUG(lvl, "\tlmm_stripe_offset/lmm_layout_gen: %#x\n",
2310                lum->lmm_stripe_offset);
2311         if (lum->lmm_magic == LOV_USER_MAGIC_V3) {
2312                 struct lov_user_md_v3 *v3 = (void *)lum;
2313                 CDEBUG(lvl, "\tlmm_pool_name: %s\n", v3->lmm_pool_name);
2314         }
2315         if (lum->lmm_magic == LOV_USER_MAGIC_SPECIFIC) {
2316                 struct lov_user_md_v3 *v3 = (void *)lum;
2317                 int i;
2318
2319                 if (v3->lmm_pool_name[0] != '\0')
2320                         CDEBUG(lvl, "\tlmm_pool_name: %s\n", v3->lmm_pool_name);
2321
2322                 CDEBUG(lvl, "\ttarget list:\n");
2323                 for (i = 0; i < v3->lmm_stripe_count; i++)
2324                         CDEBUG(lvl, "\t\t%u\n", v3->lmm_objects[i].l_ost_idx);
2325         }
2326 }
2327
2328 void lustre_print_user_md(unsigned int lvl, struct lov_user_md *lum,
2329                           const char *msg)
2330 {
2331         struct lov_comp_md_v1   *comp_v1;
2332         int                      i;
2333
2334         if (likely(!cfs_cdebug_show(lvl, DEBUG_SUBSYSTEM)))
2335                 return;
2336
2337         if (lum->lmm_magic == LOV_USER_MAGIC_V1 ||
2338             lum->lmm_magic == LOV_USER_MAGIC_V3) {
2339                 lustre_print_v1v3(lvl, lum, msg);
2340                 return;
2341         }
2342
2343         if (lum->lmm_magic != LOV_USER_MAGIC_COMP_V1) {
2344                 CDEBUG(lvl, "%s: bad magic: %x\n", msg, lum->lmm_magic);
2345                 return;
2346         }
2347
2348         comp_v1 = (struct lov_comp_md_v1 *)lum;
2349         CDEBUG(lvl, "%s: lov_comp_md_v1 %p:\n", msg, lum);
2350         CDEBUG(lvl, "\tlcm_magic: %#x\n", comp_v1->lcm_magic);
2351         CDEBUG(lvl, "\tlcm_size: %#x\n", comp_v1->lcm_size);
2352         CDEBUG(lvl, "\tlcm_layout_gen: %#x\n", comp_v1->lcm_layout_gen);
2353         CDEBUG(lvl, "\tlcm_flags: %#x\n", comp_v1->lcm_flags);
2354         CDEBUG(lvl, "\tlcm_entry_count: %#x\n\n", comp_v1->lcm_entry_count);
2355         CDEBUG(lvl, "\tlcm_mirror_count: %#x\n\n", comp_v1->lcm_mirror_count);
2356
2357         for (i = 0; i < comp_v1->lcm_entry_count; i++) {
2358                 struct lov_comp_md_entry_v1 *ent = &comp_v1->lcm_entries[i];
2359                 struct lov_user_md *v1;
2360
2361                 CDEBUG(lvl, "\tentry %d:\n", i);
2362                 CDEBUG(lvl, "\tlcme_id: %#x\n", ent->lcme_id);
2363                 CDEBUG(lvl, "\tlcme_flags: %#x\n", ent->lcme_flags);
2364                 if (ent->lcme_flags & LCME_FL_NOSYNC)
2365                         CDEBUG(lvl, "\tlcme_timestamp: %llu\n",
2366                                         ent->lcme_timestamp);
2367                 CDEBUG(lvl, "\tlcme_extent.e_start: %llu\n",
2368                        ent->lcme_extent.e_start);
2369                 CDEBUG(lvl, "\tlcme_extent.e_end: %llu\n",
2370                        ent->lcme_extent.e_end);
2371                 CDEBUG(lvl, "\tlcme_offset: %#x\n", ent->lcme_offset);
2372                 CDEBUG(lvl, "\tlcme_size: %#x\n\n", ent->lcme_size);
2373
2374                 v1 = (struct lov_user_md *)((char *)comp_v1 +
2375                                 comp_v1->lcm_entries[i].lcme_offset);
2376                 lustre_print_v1v3(lvl, v1, msg);
2377         }
2378 }
2379 EXPORT_SYMBOL(lustre_print_user_md);
2380
2381 static void lustre_swab_lmm_oi(struct ost_id *oi)
2382 {
2383         __swab64s(&oi->oi.oi_id);
2384         __swab64s(&oi->oi.oi_seq);
2385 }
2386
2387 static void lustre_swab_lov_user_md_common(struct lov_user_md_v1 *lum)
2388 {
2389         ENTRY;
2390         __swab32s(&lum->lmm_magic);
2391         __swab32s(&lum->lmm_pattern);
2392         lustre_swab_lmm_oi(&lum->lmm_oi);
2393         __swab32s(&lum->lmm_stripe_size);
2394         __swab16s(&lum->lmm_stripe_count);
2395         __swab16s(&lum->lmm_stripe_offset);
2396         EXIT;
2397 }
2398
2399 void lustre_swab_lov_user_md_v1(struct lov_user_md_v1 *lum)
2400 {
2401         ENTRY;
2402         CDEBUG(D_IOCTL, "swabbing lov_user_md v1\n");
2403         lustre_swab_lov_user_md_common(lum);
2404         EXIT;
2405 }
2406 EXPORT_SYMBOL(lustre_swab_lov_user_md_v1);
2407
2408 void lustre_swab_lov_user_md_v3(struct lov_user_md_v3 *lum)
2409 {
2410         ENTRY;
2411         CDEBUG(D_IOCTL, "swabbing lov_user_md v3\n");
2412         lustre_swab_lov_user_md_common((struct lov_user_md_v1 *)lum);
2413         /* lmm_pool_name nothing to do with char */
2414         EXIT;
2415 }
2416 EXPORT_SYMBOL(lustre_swab_lov_user_md_v3);
2417
2418 void lustre_swab_lov_comp_md_v1(struct lov_comp_md_v1 *lum)
2419 {
2420         struct lov_comp_md_entry_v1     *ent;
2421         struct lov_user_md_v1   *v1;
2422         struct lov_user_md_v3   *v3;
2423         int     i;
2424         bool    cpu_endian;
2425         __u32   off, size;
2426         __u16   ent_count, stripe_count;
2427         ENTRY;
2428
2429         cpu_endian = lum->lcm_magic == LOV_USER_MAGIC_COMP_V1;
2430         ent_count = lum->lcm_entry_count;
2431         if (!cpu_endian)
2432                 __swab16s(&ent_count);
2433
2434         CDEBUG(D_IOCTL, "swabbing lov_user_comp_md v1\n");
2435         __swab32s(&lum->lcm_magic);
2436         __swab32s(&lum->lcm_size);
2437         __swab32s(&lum->lcm_layout_gen);
2438         __swab16s(&lum->lcm_flags);
2439         __swab16s(&lum->lcm_entry_count);
2440         __swab16s(&lum->lcm_mirror_count);
2441         BUILD_BUG_ON(offsetof(typeof(*lum), lcm_padding1) == 0);
2442         BUILD_BUG_ON(offsetof(typeof(*lum), lcm_padding2) == 0);
2443
2444         for (i = 0; i < ent_count; i++) {
2445                 ent = &lum->lcm_entries[i];
2446                 off = ent->lcme_offset;
2447                 size = ent->lcme_size;
2448
2449                 if (!cpu_endian) {
2450                         __swab32s(&off);
2451                         __swab32s(&size);
2452                 }
2453                 __swab32s(&ent->lcme_id);
2454                 __swab32s(&ent->lcme_flags);
2455                 __swab64s(&ent->lcme_timestamp);
2456                 __swab64s(&ent->lcme_extent.e_start);
2457                 __swab64s(&ent->lcme_extent.e_end);
2458                 __swab32s(&ent->lcme_offset);
2459                 __swab32s(&ent->lcme_size);
2460                 __swab32s(&ent->lcme_layout_gen);
2461                 BUILD_BUG_ON(offsetof(typeof(*ent), lcme_padding_1) == 0);
2462
2463                 v1 = (struct lov_user_md_v1 *)((char *)lum + off);
2464                 stripe_count = v1->lmm_stripe_count;
2465                 if (!cpu_endian)
2466                         __swab16s(&stripe_count);
2467
2468                 if (v1->lmm_magic == __swab32(LOV_USER_MAGIC_V1) ||
2469                     v1->lmm_magic == LOV_USER_MAGIC_V1) {
2470                         lustre_swab_lov_user_md_v1(v1);
2471                         if (size > sizeof(*v1))
2472                                 lustre_swab_lov_user_md_objects(v1->lmm_objects,
2473                                                                 stripe_count);
2474                 } else if (v1->lmm_magic == __swab32(LOV_USER_MAGIC_V3) ||
2475                            v1->lmm_magic == LOV_USER_MAGIC_V3 ||
2476                            v1->lmm_magic == __swab32(LOV_USER_MAGIC_SPECIFIC) ||
2477                            v1->lmm_magic == LOV_USER_MAGIC_SPECIFIC) {
2478                         v3 = (struct lov_user_md_v3 *)v1;
2479                         lustre_swab_lov_user_md_v3(v3);
2480                         if (size > sizeof(*v3))
2481                                 lustre_swab_lov_user_md_objects(v3->lmm_objects,
2482                                                                 stripe_count);
2483                 } else {
2484                         CERROR("Invalid magic %#x\n", v1->lmm_magic);
2485                 }
2486         }
2487 }
2488 EXPORT_SYMBOL(lustre_swab_lov_comp_md_v1);
2489
2490 void lustre_swab_lov_user_md_objects(struct lov_user_ost_data *lod,
2491                                      int stripe_count)
2492 {
2493         int i;
2494
2495         ENTRY;
2496         for (i = 0; i < stripe_count; i++) {
2497                 lustre_swab_ost_id(&(lod[i].l_ost_oi));
2498                 __swab32s(&(lod[i].l_ost_gen));
2499                 __swab32s(&(lod[i].l_ost_idx));
2500         }
2501         EXIT;
2502 }
2503 EXPORT_SYMBOL(lustre_swab_lov_user_md_objects);
2504
2505 void lustre_swab_lov_user_md(struct lov_user_md *lum, size_t size)
2506 {
2507         struct lov_user_md_v1 *v1;
2508         struct lov_user_md_v3 *v3;
2509         struct lov_foreign_md *lfm;
2510         __u16 stripe_count;
2511         ENTRY;
2512
2513         CDEBUG(D_IOCTL, "swabbing lov_user_md\n");
2514         switch (lum->lmm_magic) {
2515         case __swab32(LOV_MAGIC_V1):
2516         case LOV_USER_MAGIC_V1:
2517         {
2518                 v1 = (struct lov_user_md_v1 *)lum;
2519                 stripe_count = v1->lmm_stripe_count;
2520
2521                 if (lum->lmm_magic != LOV_USER_MAGIC_V1)
2522                         __swab16s(&stripe_count);
2523
2524                 lustre_swab_lov_user_md_v1(v1);
2525                 if (size > sizeof(*v1))
2526                         lustre_swab_lov_user_md_objects(v1->lmm_objects,
2527                                                         stripe_count);
2528
2529                 break;
2530         }
2531         case __swab32(LOV_MAGIC_V3):
2532         case LOV_USER_MAGIC_V3:
2533         {
2534                 v3 = (struct lov_user_md_v3 *)lum;
2535                 stripe_count = v3->lmm_stripe_count;
2536
2537                 if (lum->lmm_magic != LOV_USER_MAGIC_V3)
2538                         __swab16s(&stripe_count);
2539
2540                 lustre_swab_lov_user_md_v3(v3);
2541                 if (size > sizeof(*v3))
2542                         lustre_swab_lov_user_md_objects(v3->lmm_objects,
2543                                                         stripe_count);
2544                 break;
2545         }
2546         case __swab32(LOV_USER_MAGIC_SPECIFIC):
2547         case LOV_USER_MAGIC_SPECIFIC:
2548         {
2549                 v3 = (struct lov_user_md_v3 *)lum;
2550                 stripe_count = v3->lmm_stripe_count;
2551
2552                 if (lum->lmm_magic != LOV_USER_MAGIC_SPECIFIC)
2553                         __swab16s(&stripe_count);
2554
2555                 lustre_swab_lov_user_md_v3(v3);
2556                 lustre_swab_lov_user_md_objects(v3->lmm_objects, stripe_count);
2557                 break;
2558         }
2559         case __swab32(LOV_MAGIC_COMP_V1):
2560         case LOV_USER_MAGIC_COMP_V1:
2561                 lustre_swab_lov_comp_md_v1((struct lov_comp_md_v1 *)lum);
2562                 break;
2563         case __swab32(LOV_MAGIC_FOREIGN):
2564         case LOV_USER_MAGIC_FOREIGN:
2565         {
2566                 lfm = (struct lov_foreign_md *)lum;
2567                 __swab32s(&lfm->lfm_magic);
2568                 __swab32s(&lfm->lfm_length);
2569                 __swab32s(&lfm->lfm_type);
2570                 __swab32s(&lfm->lfm_flags);
2571                 break;
2572         }
2573         default:
2574                 CDEBUG(D_IOCTL, "Invalid LOV magic %08x\n", lum->lmm_magic);
2575         }
2576 }
2577 EXPORT_SYMBOL(lustre_swab_lov_user_md);
2578
2579 void lustre_swab_lov_mds_md(struct lov_mds_md *lmm)
2580 {
2581         ENTRY;
2582         CDEBUG(D_IOCTL, "swabbing lov_mds_md\n");
2583         __swab32s(&lmm->lmm_magic);
2584         __swab32s(&lmm->lmm_pattern);
2585         lustre_swab_lmm_oi(&lmm->lmm_oi);
2586         __swab32s(&lmm->lmm_stripe_size);
2587         __swab16s(&lmm->lmm_stripe_count);
2588         __swab16s(&lmm->lmm_layout_gen);
2589         EXIT;
2590 }
2591 EXPORT_SYMBOL(lustre_swab_lov_mds_md);
2592
2593 void lustre_swab_ldlm_res_id(struct ldlm_res_id *id)
2594 {
2595         int i;
2596
2597         for (i = 0; i < RES_NAME_SIZE; i++)
2598                 __swab64s(&id->name[i]);
2599 }
2600
2601 void lustre_swab_ldlm_policy_data(union ldlm_wire_policy_data *d)
2602 {
2603         /* the lock data is a union and the first two fields are always an
2604          * extent so it's ok to process an LDLM_EXTENT and LDLM_FLOCK lock
2605          * data the same way.
2606          */
2607         __swab64s(&d->l_extent.start);
2608         __swab64s(&d->l_extent.end);
2609         __swab64s(&d->l_extent.gid);
2610         __swab64s(&d->l_flock.lfw_owner);
2611         __swab32s(&d->l_flock.lfw_pid);
2612 }
2613
2614 void lustre_swab_ldlm_intent(struct ldlm_intent *i)
2615 {
2616         __swab64s(&i->opc);
2617 }
2618
2619 void lustre_swab_ldlm_resource_desc(struct ldlm_resource_desc *r)
2620 {
2621         __swab32s(&r->lr_type);
2622         BUILD_BUG_ON(offsetof(typeof(*r), lr_pad) == 0);
2623         lustre_swab_ldlm_res_id(&r->lr_name);
2624 }
2625
2626 void lustre_swab_ldlm_lock_desc(struct ldlm_lock_desc *l)
2627 {
2628         lustre_swab_ldlm_resource_desc(&l->l_resource);
2629         __swab32s(&l->l_req_mode);
2630         __swab32s(&l->l_granted_mode);
2631         lustre_swab_ldlm_policy_data(&l->l_policy_data);
2632 }
2633
2634 void lustre_swab_ldlm_request(struct ldlm_request *rq)
2635 {
2636         __swab32s(&rq->lock_flags);
2637         lustre_swab_ldlm_lock_desc(&rq->lock_desc);
2638         __swab32s(&rq->lock_count);
2639         /* lock_handle[] opaque */
2640 }
2641
2642 void lustre_swab_ldlm_reply(struct ldlm_reply *r)
2643 {
2644         __swab32s(&r->lock_flags);
2645         BUILD_BUG_ON(offsetof(typeof(*r), lock_padding) == 0);
2646         lustre_swab_ldlm_lock_desc(&r->lock_desc);
2647         /* lock_handle opaque */
2648         __swab64s(&r->lock_policy_res1);
2649         __swab64s(&r->lock_policy_res2);
2650 }
2651
2652 void lustre_swab_quota_body(struct quota_body *b)
2653 {
2654         lustre_swab_lu_fid(&b->qb_fid);
2655         lustre_swab_lu_fid((struct lu_fid *)&b->qb_id);
2656         __swab32s(&b->qb_flags);
2657         __swab64s(&b->qb_count);
2658         __swab64s(&b->qb_usage);
2659         __swab64s(&b->qb_slv_ver);
2660 }
2661
2662 /* Dump functions */
2663 void dump_ioo(struct obd_ioobj *ioo)
2664 {
2665         CDEBUG(D_RPCTRACE,
2666                "obd_ioobj: ioo_oid="DOSTID", ioo_max_brw=%#x, "
2667                "ioo_bufct=%d\n", POSTID(&ioo->ioo_oid), ioo->ioo_max_brw,
2668                ioo->ioo_bufcnt);
2669 }
2670
2671 void dump_rniobuf(struct niobuf_remote *nb)
2672 {
2673         CDEBUG(D_RPCTRACE, "niobuf_remote: offset=%llu, len=%d, flags=%x\n",
2674                nb->rnb_offset, nb->rnb_len, nb->rnb_flags);
2675 }
2676
2677 void dump_obdo(struct obdo *oa)
2678 {
2679         u64 valid = oa->o_valid;
2680
2681         CDEBUG(D_RPCTRACE, "obdo: o_valid = %#llx\n", valid);
2682         if (valid & OBD_MD_FLID)
2683                 CDEBUG(D_RPCTRACE, "obdo: id = "DOSTID"\n", POSTID(&oa->o_oi));
2684         if (valid & OBD_MD_FLFID)
2685                 CDEBUG(D_RPCTRACE, "obdo: o_parent_seq = %#llx\n",
2686                        oa->o_parent_seq);
2687         if (valid & OBD_MD_FLSIZE)
2688                 CDEBUG(D_RPCTRACE, "obdo: o_size = %lld\n", oa->o_size);
2689         if (valid & OBD_MD_FLMTIME)
2690                 CDEBUG(D_RPCTRACE, "obdo: o_mtime = %lld\n", oa->o_mtime);
2691         if (valid & OBD_MD_FLATIME)
2692                 CDEBUG(D_RPCTRACE, "obdo: o_atime = %lld\n", oa->o_atime);
2693         if (valid & OBD_MD_FLCTIME)
2694                 CDEBUG(D_RPCTRACE, "obdo: o_ctime = %lld\n", oa->o_ctime);
2695         if (valid & OBD_MD_FLBLOCKS)   /* allocation of space */
2696                 CDEBUG(D_RPCTRACE, "obdo: o_blocks = %lld\n", oa->o_blocks);
2697         if (valid & OBD_MD_FLGRANT)
2698                 CDEBUG(D_RPCTRACE, "obdo: o_grant = %lld\n", oa->o_grant);
2699         if (valid & OBD_MD_FLBLKSZ)
2700                 CDEBUG(D_RPCTRACE, "obdo: o_blksize = %d\n", oa->o_blksize);
2701         if (valid & (OBD_MD_FLTYPE | OBD_MD_FLMODE))
2702                 CDEBUG(D_RPCTRACE, "obdo: o_mode = %o\n",
2703                        oa->o_mode & ((valid & OBD_MD_FLTYPE ?  S_IFMT : 0) |
2704                                      (valid & OBD_MD_FLMODE ? ~S_IFMT : 0)));
2705         if (valid & OBD_MD_FLUID)
2706                 CDEBUG(D_RPCTRACE, "obdo: o_uid = %u\n", oa->o_uid);
2707         if (valid & OBD_MD_FLUID)
2708                 CDEBUG(D_RPCTRACE, "obdo: o_uid_h = %u\n", oa->o_uid_h);
2709         if (valid & OBD_MD_FLGID)
2710                 CDEBUG(D_RPCTRACE, "obdo: o_gid = %u\n", oa->o_gid);
2711         if (valid & OBD_MD_FLGID)
2712                 CDEBUG(D_RPCTRACE, "obdo: o_gid_h = %u\n", oa->o_gid_h);
2713         if (valid & OBD_MD_FLFLAGS)
2714                 CDEBUG(D_RPCTRACE, "obdo: o_flags = %x\n", oa->o_flags);
2715         if (valid & OBD_MD_FLNLINK)
2716                 CDEBUG(D_RPCTRACE, "obdo: o_nlink = %u\n", oa->o_nlink);
2717         else if (valid & OBD_MD_FLCKSUM)
2718                 CDEBUG(D_RPCTRACE, "obdo: o_checksum (o_nlink) = %u\n",
2719                        oa->o_nlink);
2720         if (valid & OBD_MD_FLPARENT)
2721                 CDEBUG(D_RPCTRACE, "obdo: o_parent_oid = %x\n",
2722                        oa->o_parent_oid);
2723         if (valid & OBD_MD_FLFID) {
2724                 CDEBUG(D_RPCTRACE, "obdo: o_stripe_idx = %u\n",
2725                        oa->o_stripe_idx);
2726                 CDEBUG(D_RPCTRACE, "obdo: o_parent_ver = %x\n",
2727                        oa->o_parent_ver);
2728         }
2729         if (valid & OBD_MD_FLHANDLE)
2730                 CDEBUG(D_RPCTRACE, "obdo: o_handle = %lld\n",
2731                        oa->o_handle.cookie);
2732 }
2733
2734 void dump_ost_body(struct ost_body *ob)
2735 {
2736         dump_obdo(&ob->oa);
2737 }
2738
2739 void dump_rcs(__u32 *rc)
2740 {
2741         CDEBUG(D_RPCTRACE, "rmf_rcs: %d\n", *rc);
2742 }
2743
2744 static inline int req_ptlrpc_body_swabbed(struct ptlrpc_request *req)
2745 {
2746         LASSERT(req->rq_reqmsg);
2747
2748         switch (req->rq_reqmsg->lm_magic) {
2749         case LUSTRE_MSG_MAGIC_V2:
2750                 return lustre_req_swabbed(req, MSG_PTLRPC_BODY_OFF);
2751         default:
2752                 CERROR("bad lustre msg magic: %#08X\n",
2753                        req->rq_reqmsg->lm_magic);
2754         }
2755         return 0;
2756 }
2757
2758 static inline int rep_ptlrpc_body_swabbed(struct ptlrpc_request *req)
2759 {
2760         if (unlikely(!req->rq_repmsg))
2761                 return 0;
2762
2763         switch (req->rq_repmsg->lm_magic) {
2764         case LUSTRE_MSG_MAGIC_V2:
2765                 return lustre_rep_swabbed(req, MSG_PTLRPC_BODY_OFF);
2766         default:
2767                 /* uninitialized yet */
2768                 return 0;
2769         }
2770 }
2771
2772 void _debug_req(struct ptlrpc_request *req,
2773                 struct libcfs_debug_msg_data *msgdata, const char *fmt, ...)
2774 {
2775         bool req_ok = req->rq_reqmsg != NULL;
2776         bool rep_ok = false;
2777         lnet_nid_t nid = LNET_NID_ANY;
2778         struct va_format vaf;
2779         va_list args;
2780         int rep_flags = -1;
2781         int rep_status = -1;
2782
2783         spin_lock(&req->rq_early_free_lock);
2784         if (req->rq_repmsg)
2785                 rep_ok = true;
2786
2787         if (ptlrpc_req_need_swab(req)) {
2788                 req_ok = req_ok && req_ptlrpc_body_swabbed(req);
2789                 rep_ok = rep_ok && rep_ptlrpc_body_swabbed(req);
2790         }
2791
2792         if (rep_ok) {
2793                 rep_flags = lustre_msg_get_flags(req->rq_repmsg);
2794                 rep_status = lustre_msg_get_status(req->rq_repmsg);
2795         }
2796         spin_unlock(&req->rq_early_free_lock);
2797
2798         if (req->rq_import && req->rq_import->imp_connection)
2799                 nid = req->rq_import->imp_connection->c_peer.nid;
2800         else if (req->rq_export && req->rq_export->exp_connection)
2801                 nid = req->rq_export->exp_connection->c_peer.nid;
2802
2803         va_start(args, fmt);
2804         vaf.fmt = fmt;
2805         vaf.va = &args;
2806         libcfs_debug_msg(msgdata,
2807                          "%pV req@%p x%llu/t%lld(%lld) o%d->%s@%s:%d/%d lens %d/%d e %d to %lld dl %lld ref %d fl " REQ_FLAGS_FMT "/%x/%x rc %d/%d job:'%s'\n",
2808                          &vaf,
2809                          req, req->rq_xid, req->rq_transno,
2810                          req_ok ? lustre_msg_get_transno(req->rq_reqmsg) : 0,
2811                          req_ok ? lustre_msg_get_opc(req->rq_reqmsg) : -1,
2812                          req->rq_import ?
2813                          req->rq_import->imp_obd->obd_name :
2814                          req->rq_export ?
2815                          req->rq_export->exp_client_uuid.uuid :
2816                          "<?>",
2817                          libcfs_nid2str(nid),
2818                          req->rq_request_portal, req->rq_reply_portal,
2819                          req->rq_reqlen, req->rq_replen,
2820                          req->rq_early_count, (s64)req->rq_timedout,
2821                          (s64)req->rq_deadline,
2822                          atomic_read(&req->rq_refcount),
2823                          DEBUG_REQ_FLAGS(req),
2824                          req_ok ? lustre_msg_get_flags(req->rq_reqmsg) : -1,
2825                          rep_flags, req->rq_status, rep_status,
2826                          req_ok ? lustre_msg_get_jobid(req->rq_reqmsg) ?: ""
2827                                 : "");
2828         va_end(args);
2829 }
2830 EXPORT_SYMBOL(_debug_req);
2831
2832 void lustre_swab_hsm_user_state(struct hsm_user_state *state)
2833 {
2834         __swab32s(&state->hus_states);
2835         __swab32s(&state->hus_archive_id);
2836 }
2837
2838 void lustre_swab_hsm_state_set(struct hsm_state_set *hss)
2839 {
2840         __swab32s(&hss->hss_valid);
2841         __swab64s(&hss->hss_setmask);
2842         __swab64s(&hss->hss_clearmask);
2843         __swab32s(&hss->hss_archive_id);
2844 }
2845
2846 static void lustre_swab_hsm_extent(struct hsm_extent *extent)
2847 {
2848         __swab64s(&extent->offset);
2849         __swab64s(&extent->length);
2850 }
2851
2852 void lustre_swab_hsm_current_action(struct hsm_current_action *action)
2853 {
2854         __swab32s(&action->hca_state);
2855         __swab32s(&action->hca_action);
2856         lustre_swab_hsm_extent(&action->hca_location);
2857 }
2858
2859 void lustre_swab_hsm_user_item(struct hsm_user_item *hui)
2860 {
2861         lustre_swab_lu_fid(&hui->hui_fid);
2862         lustre_swab_hsm_extent(&hui->hui_extent);
2863 }
2864
2865 void lustre_swab_lu_extent(struct lu_extent *le)
2866 {
2867         __swab64s(&le->e_start);
2868         __swab64s(&le->e_end);
2869 }
2870
2871 void lustre_swab_layout_intent(struct layout_intent *li)
2872 {
2873         __swab32s(&li->li_opc);
2874         __swab32s(&li->li_flags);
2875         lustre_swab_lu_extent(&li->li_extent);
2876 }
2877
2878 void lustre_swab_hsm_progress_kernel(struct hsm_progress_kernel *hpk)
2879 {
2880         lustre_swab_lu_fid(&hpk->hpk_fid);
2881         __swab64s(&hpk->hpk_cookie);
2882         __swab64s(&hpk->hpk_extent.offset);
2883         __swab64s(&hpk->hpk_extent.length);
2884         __swab16s(&hpk->hpk_flags);
2885         __swab16s(&hpk->hpk_errval);
2886 }
2887
2888 void lustre_swab_hsm_request(struct hsm_request *hr)
2889 {
2890         __swab32s(&hr->hr_action);
2891         __swab32s(&hr->hr_archive_id);
2892         __swab64s(&hr->hr_flags);
2893         __swab32s(&hr->hr_itemcount);
2894         __swab32s(&hr->hr_data_len);
2895 }
2896
2897 void lustre_swab_swap_layouts(struct mdc_swap_layouts *msl)
2898 {
2899         __swab64s(&msl->msl_flags);
2900 }
2901
2902 void lustre_swab_close_data(struct close_data *cd)
2903 {
2904         lustre_swab_lu_fid(&cd->cd_fid);
2905         __swab64s(&cd->cd_data_version);
2906 }
2907
2908 void lustre_swab_close_data_resync_done(struct close_data_resync_done *resync)
2909 {
2910         int i;
2911
2912         __swab32s(&resync->resync_count);
2913         /* after swab, resync_count must in CPU endian */
2914         if (resync->resync_count <= INLINE_RESYNC_ARRAY_SIZE) {
2915                 for (i = 0; i < resync->resync_count; i++)
2916                         __swab32s(&resync->resync_ids_inline[i]);
2917         }
2918 }
2919 EXPORT_SYMBOL(lustre_swab_close_data_resync_done);
2920
2921 void lustre_swab_lfsck_request(struct lfsck_request *lr)
2922 {
2923         __swab32s(&lr->lr_event);
2924         __swab32s(&lr->lr_index);
2925         __swab32s(&lr->lr_flags);
2926         __swab32s(&lr->lr_valid);
2927         __swab32s(&lr->lr_speed);
2928         __swab16s(&lr->lr_version);
2929         __swab16s(&lr->lr_active);
2930         __swab16s(&lr->lr_param);
2931         __swab16s(&lr->lr_async_windows);
2932         __swab32s(&lr->lr_flags);
2933         lustre_swab_lu_fid(&lr->lr_fid);
2934         lustre_swab_lu_fid(&lr->lr_fid2);
2935         __swab32s(&lr->lr_comp_id);
2936         BUILD_BUG_ON(offsetof(typeof(*lr), lr_padding_0) == 0);
2937         BUILD_BUG_ON(offsetof(typeof(*lr), lr_padding_1) == 0);
2938         BUILD_BUG_ON(offsetof(typeof(*lr), lr_padding_2) == 0);
2939         BUILD_BUG_ON(offsetof(typeof(*lr), lr_padding_3) == 0);
2940 }
2941
2942 void lustre_swab_lfsck_reply(struct lfsck_reply *lr)
2943 {
2944         __swab32s(&lr->lr_status);
2945         BUILD_BUG_ON(offsetof(typeof(*lr), lr_padding_1) == 0);
2946         __swab64s(&lr->lr_repaired);
2947 }
2948
2949 static void lustre_swab_orphan_rec(struct lu_orphan_rec *rec)
2950 {
2951         lustre_swab_lu_fid(&rec->lor_fid);
2952         __swab32s(&rec->lor_uid);
2953         __swab32s(&rec->lor_gid);
2954 }
2955
2956 void lustre_swab_orphan_ent(struct lu_orphan_ent *ent)
2957 {
2958         lustre_swab_lu_fid(&ent->loe_key);
2959         lustre_swab_orphan_rec(&ent->loe_rec);
2960 }
2961 EXPORT_SYMBOL(lustre_swab_orphan_ent);
2962
2963 void lustre_swab_orphan_ent_v2(struct lu_orphan_ent_v2 *ent)
2964 {
2965         lustre_swab_lu_fid(&ent->loe_key);
2966         lustre_swab_orphan_rec(&ent->loe_rec.lor_rec);
2967         lustre_swab_ost_layout(&ent->loe_rec.lor_layout);
2968         BUILD_BUG_ON(offsetof(typeof(ent->loe_rec), lor_padding) == 0);
2969 }
2970 EXPORT_SYMBOL(lustre_swab_orphan_ent_v2);
2971
2972 void lustre_swab_orphan_ent_v3(struct lu_orphan_ent_v3 *ent)
2973 {
2974         lustre_swab_lu_fid(&ent->loe_key);
2975         lustre_swab_orphan_rec(&ent->loe_rec.lor_rec);
2976         lustre_swab_ost_layout(&ent->loe_rec.lor_layout);
2977         __swab32s(&ent->loe_rec.lor_layout_version);
2978         __swab32s(&ent->loe_rec.lor_range);
2979         BUILD_BUG_ON(offsetof(typeof(ent->loe_rec), lor_padding_1) == 0);
2980         BUILD_BUG_ON(offsetof(typeof(ent->loe_rec), lor_padding_2) == 0);
2981 }
2982 EXPORT_SYMBOL(lustre_swab_orphan_ent_v3);
2983
2984 void lustre_swab_ladvise(struct lu_ladvise *ladvise)
2985 {
2986         __swab16s(&ladvise->lla_advice);
2987         __swab16s(&ladvise->lla_value1);
2988         __swab32s(&ladvise->lla_value2);
2989         __swab64s(&ladvise->lla_start);
2990         __swab64s(&ladvise->lla_end);
2991         __swab32s(&ladvise->lla_value3);
2992         __swab32s(&ladvise->lla_value4);
2993 }
2994 EXPORT_SYMBOL(lustre_swab_ladvise);
2995
2996 void lustre_swab_ladvise_hdr(struct ladvise_hdr *ladvise_hdr)
2997 {
2998         __swab32s(&ladvise_hdr->lah_magic);
2999         __swab32s(&ladvise_hdr->lah_count);
3000         __swab64s(&ladvise_hdr->lah_flags);
3001         __swab32s(&ladvise_hdr->lah_value1);
3002         __swab32s(&ladvise_hdr->lah_value2);
3003         __swab64s(&ladvise_hdr->lah_value3);
3004 }
3005 EXPORT_SYMBOL(lustre_swab_ladvise_hdr);