Whamcloud - gitweb
LU-1842 protocol: add support for OBD_IDX_READ
[fs/lustre-release.git] / lustre / ptlrpc / layout.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.sun.com/software/products/lustre/docs/GPLv2.pdf
19  *
20  * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
21  * CA 95054 USA or visit www.sun.com if you need additional information or
22  * have any questions.
23  *
24  * GPL HEADER END
25  */
26 /*
27  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
28  * Use is subject to license terms.
29  *
30  * Copyright (c) 2011, Whamcloud, Inc.
31  */
32 /*
33  * This file is part of Lustre, http://www.lustre.org/
34  * Lustre is a trademark of Sun Microsystems, Inc.
35  *
36  * lustre/ptlrpc/layout.c
37  *
38  * Lustre Metadata Target (mdt) request handler
39  *
40  * Author: Nikita Danilov <nikita@clusterfs.com>
41  */
42 /*
43  * This file contains the "capsule/pill" abstraction layered above PTLRPC.
44  *
45  * Every struct ptlrpc_request contains a "pill", which points to a description
46  * of the format that the request conforms to.
47  */
48
49 #if !defined(__REQ_LAYOUT_USER__)
50
51 #define DEBUG_SUBSYSTEM S_RPC
52
53 #ifdef __KERNEL__
54 #include <linux/module.h>
55 #else
56 # include <liblustre.h>
57 #endif
58
59 /* LUSTRE_VERSION_CODE */
60 #include <lustre_ver.h>
61
62 #include <obd_support.h>
63 /* lustre_swab_mdt_body */
64 #include <lustre/lustre_idl.h>
65 /* obd2cli_tgt() (required by DEBUG_REQ()) */
66 #include <obd.h>
67
68 /* __REQ_LAYOUT_USER__ */
69 #endif
70 /* struct ptlrpc_request, lustre_msg* */
71 #include <lustre_req_layout.h>
72 #include <lustre_acl.h>
73 #include <lustre_debug.h>
74
75 /*
76  * RQFs (see below) refer to two struct req_msg_field arrays describing the
77  * client request and server reply, respectively.
78  */
79 /* empty set of fields... for suitable definition of emptiness. */
80 static const struct req_msg_field *empty[] = {
81         &RMF_PTLRPC_BODY
82 };
83
84 static const struct req_msg_field *mgs_target_info_only[] = {
85         &RMF_PTLRPC_BODY,
86         &RMF_MGS_TARGET_INFO
87 };
88
89 static const struct req_msg_field *mgs_set_info[] = {
90         &RMF_PTLRPC_BODY,
91         &RMF_MGS_SEND_PARAM
92 };
93
94 static const struct req_msg_field *mgs_config_read_client[] = {
95         &RMF_PTLRPC_BODY,
96         &RMF_MGS_CONFIG_BODY
97 };
98
99 static const struct req_msg_field *mgs_config_read_server[] = {
100         &RMF_PTLRPC_BODY,
101         &RMF_MGS_CONFIG_RES
102 };
103
104 static const struct req_msg_field *log_cancel_client[] = {
105         &RMF_PTLRPC_BODY,
106         &RMF_LOGCOOKIES
107 };
108
109 static const struct req_msg_field *mdt_body_only[] = {
110         &RMF_PTLRPC_BODY,
111         &RMF_MDT_BODY
112 };
113
114 static const struct req_msg_field *mdt_body_capa[] = {
115         &RMF_PTLRPC_BODY,
116         &RMF_MDT_BODY,
117         &RMF_CAPA1
118 };
119
120 static const struct req_msg_field *quotactl_only[] = {
121         &RMF_PTLRPC_BODY,
122         &RMF_OBD_QUOTACTL
123 };
124 static const struct req_msg_field *quota_adjust_qunit_only[] = {
125         &RMF_PTLRPC_BODY,
126         &RMF_QUOTA_ADJUST_QUNIT
127 };
128
129 static const struct req_msg_field *qunit_data_only[] = {
130         &RMF_PTLRPC_BODY,
131         &RMF_QUNIT_DATA
132 };
133
134 static const struct req_msg_field *quota_body_only[] = {
135         &RMF_PTLRPC_BODY,
136         &RMF_QUOTA_BODY
137 };
138
139 static const struct req_msg_field *ldlm_intent_quota_client[] = {
140         &RMF_PTLRPC_BODY,
141         &RMF_DLM_REQ,
142         &RMF_LDLM_INTENT,
143         &RMF_QUOTA_BODY
144 };
145
146 static const struct req_msg_field *ldlm_intent_quota_server[] = {
147         &RMF_PTLRPC_BODY,
148         &RMF_DLM_REP,
149         &RMF_DLM_LVB,
150         &RMF_QUOTA_BODY
151 };
152
153 static const struct req_msg_field *mdt_close_client[] = {
154         &RMF_PTLRPC_BODY,
155         &RMF_MDT_EPOCH,
156         &RMF_REC_REINT,
157         &RMF_CAPA1
158 };
159
160 static const struct req_msg_field *obd_statfs_server[] = {
161         &RMF_PTLRPC_BODY,
162         &RMF_OBD_STATFS
163 };
164
165 static const struct req_msg_field *seq_query_client[] = {
166         &RMF_PTLRPC_BODY,
167         &RMF_SEQ_OPC,
168         &RMF_SEQ_RANGE
169 };
170
171 static const struct req_msg_field *seq_query_server[] = {
172         &RMF_PTLRPC_BODY,
173         &RMF_SEQ_RANGE
174 };
175
176 static const struct req_msg_field *fld_query_client[] = {
177         &RMF_PTLRPC_BODY,
178         &RMF_FLD_OPC,
179         &RMF_FLD_MDFLD
180 };
181
182 static const struct req_msg_field *fld_query_server[] = {
183         &RMF_PTLRPC_BODY,
184         &RMF_FLD_MDFLD
185 };
186
187 static const struct req_msg_field *mds_getattr_name_client[] = {
188         &RMF_PTLRPC_BODY,
189         &RMF_MDT_BODY,
190         &RMF_CAPA1,
191         &RMF_NAME
192 };
193
194 static const struct req_msg_field *mds_reint_client[] = {
195         &RMF_PTLRPC_BODY,
196         &RMF_REC_REINT
197 };
198
199 static const struct req_msg_field *mds_reint_create_client[] = {
200         &RMF_PTLRPC_BODY,
201         &RMF_REC_REINT,
202         &RMF_CAPA1,
203         &RMF_NAME
204 };
205
206 static const struct req_msg_field *mds_reint_create_slave_client[] = {
207         &RMF_PTLRPC_BODY,
208         &RMF_REC_REINT,
209         &RMF_CAPA1,
210         &RMF_NAME,
211         &RMF_EADATA,
212         &RMF_DLM_REQ
213 };
214
215 static const struct req_msg_field *mds_reint_create_rmt_acl_client[] = {
216         &RMF_PTLRPC_BODY,
217         &RMF_REC_REINT,
218         &RMF_CAPA1,
219         &RMF_NAME,
220         &RMF_EADATA,
221         &RMF_DLM_REQ
222 };
223
224 static const struct req_msg_field *mds_reint_create_sym_client[] = {
225         &RMF_PTLRPC_BODY,
226         &RMF_REC_REINT,
227         &RMF_CAPA1,
228         &RMF_NAME,
229         &RMF_SYMTGT,
230         &RMF_DLM_REQ
231 };
232
233 static const struct req_msg_field *mds_reint_open_client[] = {
234         &RMF_PTLRPC_BODY,
235         &RMF_REC_REINT,
236         &RMF_CAPA1,
237         &RMF_CAPA2,
238         &RMF_NAME,
239         &RMF_EADATA
240 };
241
242 static const struct req_msg_field *mds_reint_open_server[] = {
243         &RMF_PTLRPC_BODY,
244         &RMF_MDT_BODY,
245         &RMF_MDT_MD,
246         &RMF_ACL,
247         &RMF_CAPA1,
248         &RMF_CAPA2
249 };
250
251 static const struct req_msg_field *mds_reint_unlink_client[] = {
252         &RMF_PTLRPC_BODY,
253         &RMF_REC_REINT,
254         &RMF_CAPA1,
255         &RMF_NAME,
256         &RMF_DLM_REQ
257 };
258
259 static const struct req_msg_field *mds_reint_link_client[] = {
260         &RMF_PTLRPC_BODY,
261         &RMF_REC_REINT,
262         &RMF_CAPA1,
263         &RMF_CAPA2,
264         &RMF_NAME,
265         &RMF_DLM_REQ
266 };
267
268 static const struct req_msg_field *mds_reint_rename_client[] = {
269         &RMF_PTLRPC_BODY,
270         &RMF_REC_REINT,
271         &RMF_CAPA1,
272         &RMF_CAPA2,
273         &RMF_NAME,
274         &RMF_SYMTGT,
275         &RMF_DLM_REQ
276 };
277
278 static const struct req_msg_field *mds_last_unlink_server[] = {
279         &RMF_PTLRPC_BODY,
280         &RMF_MDT_BODY,
281         &RMF_MDT_MD,
282         &RMF_LOGCOOKIES,
283         &RMF_CAPA1,
284         &RMF_CAPA2
285 };
286
287 static const struct req_msg_field *mds_reint_setattr_client[] = {
288         &RMF_PTLRPC_BODY,
289         &RMF_REC_REINT,
290         &RMF_CAPA1,
291         &RMF_MDT_EPOCH,
292         &RMF_EADATA,
293         &RMF_LOGCOOKIES,
294         &RMF_DLM_REQ
295 };
296
297 static const struct req_msg_field *mds_reint_setxattr_client[] = {
298         &RMF_PTLRPC_BODY,
299         &RMF_REC_REINT,
300         &RMF_CAPA1,
301         &RMF_NAME,
302         &RMF_EADATA
303 };
304
305 static const struct req_msg_field *obd_connect_client[] = {
306         &RMF_PTLRPC_BODY,
307         &RMF_TGTUUID,
308         &RMF_CLUUID,
309         &RMF_CONN,
310         &RMF_CONNECT_DATA
311 };
312
313 static const struct req_msg_field *obd_connect_server[] = {
314         &RMF_PTLRPC_BODY,
315         &RMF_CONNECT_DATA
316 };
317
318 static const struct req_msg_field *obd_set_info_client[] = {
319         &RMF_PTLRPC_BODY,
320         &RMF_SETINFO_KEY,
321         &RMF_SETINFO_VAL
322 };
323
324 static const struct req_msg_field *ost_grant_shrink_client[] = {
325         &RMF_PTLRPC_BODY,
326         &RMF_SETINFO_KEY,
327         &RMF_OST_BODY
328 };
329
330 static const struct req_msg_field *mds_getinfo_client[] = {
331         &RMF_PTLRPC_BODY,
332         &RMF_GETINFO_KEY,
333         &RMF_GETINFO_VALLEN
334 };
335
336 static const struct req_msg_field *mds_getinfo_server[] = {
337         &RMF_PTLRPC_BODY,
338         &RMF_GETINFO_VAL,
339 };
340
341 static const struct req_msg_field *ldlm_enqueue_client[] = {
342         &RMF_PTLRPC_BODY,
343         &RMF_DLM_REQ
344 };
345
346 static const struct req_msg_field *ldlm_enqueue_server[] = {
347         &RMF_PTLRPC_BODY,
348         &RMF_DLM_REP
349 };
350
351 static const struct req_msg_field *ldlm_enqueue_lvb_server[] = {
352         &RMF_PTLRPC_BODY,
353         &RMF_DLM_REP,
354         &RMF_DLM_LVB
355 };
356
357 static const struct req_msg_field *ldlm_cp_callback_client[] = {
358         &RMF_PTLRPC_BODY,
359         &RMF_DLM_REQ,
360         &RMF_DLM_LVB
361 };
362
363 static const struct req_msg_field *ldlm_gl_callback_server[] = {
364         &RMF_PTLRPC_BODY,
365         &RMF_DLM_LVB
366 };
367
368 static const struct req_msg_field *ldlm_intent_client[] = {
369         &RMF_PTLRPC_BODY,
370         &RMF_DLM_REQ,
371         &RMF_LDLM_INTENT,
372         &RMF_REC_REINT
373 };
374
375 static const struct req_msg_field *ldlm_intent_server[] = {
376         &RMF_PTLRPC_BODY,
377         &RMF_DLM_REP,
378         &RMF_MDT_BODY,
379         &RMF_MDT_MD,
380         &RMF_ACL
381 };
382
383 static const struct req_msg_field *ldlm_intent_open_server[] = {
384         &RMF_PTLRPC_BODY,
385         &RMF_DLM_REP,
386         &RMF_MDT_BODY,
387         &RMF_MDT_MD,
388         &RMF_ACL,
389         &RMF_CAPA1,
390         &RMF_CAPA2
391 };
392
393 static const struct req_msg_field *ldlm_intent_getattr_client[] = {
394         &RMF_PTLRPC_BODY,
395         &RMF_DLM_REQ,
396         &RMF_LDLM_INTENT,
397         &RMF_MDT_BODY,     /* coincides with mds_getattr_name_client[] */
398         &RMF_CAPA1,
399         &RMF_NAME
400 };
401
402 static const struct req_msg_field *ldlm_intent_getattr_server[] = {
403         &RMF_PTLRPC_BODY,
404         &RMF_DLM_REP,
405         &RMF_MDT_BODY,
406         &RMF_MDT_MD,
407         &RMF_ACL,
408         &RMF_CAPA1
409 };
410
411 static const struct req_msg_field *ldlm_intent_create_client[] = {
412         &RMF_PTLRPC_BODY,
413         &RMF_DLM_REQ,
414         &RMF_LDLM_INTENT,
415         &RMF_REC_REINT,    /* coincides with mds_reint_create_client[] */
416         &RMF_CAPA1,
417         &RMF_NAME,
418         &RMF_EADATA
419 };
420
421 static const struct req_msg_field *ldlm_intent_open_client[] = {
422         &RMF_PTLRPC_BODY,
423         &RMF_DLM_REQ,
424         &RMF_LDLM_INTENT,
425         &RMF_REC_REINT,    /* coincides with mds_reint_open_client[] */
426         &RMF_CAPA1,
427         &RMF_CAPA2,
428         &RMF_NAME,
429         &RMF_EADATA
430 };
431
432 static const struct req_msg_field *ldlm_intent_unlink_client[] = {
433         &RMF_PTLRPC_BODY,
434         &RMF_DLM_REQ,
435         &RMF_LDLM_INTENT,
436         &RMF_REC_REINT,    /* coincides with mds_reint_unlink_client[] */
437         &RMF_CAPA1,
438         &RMF_NAME
439 };
440
441 static const struct req_msg_field *mds_getxattr_client[] = {
442         &RMF_PTLRPC_BODY,
443         &RMF_MDT_BODY,
444         &RMF_CAPA1,
445         &RMF_NAME,
446         &RMF_EADATA
447 };
448
449 static const struct req_msg_field *mds_getxattr_server[] = {
450         &RMF_PTLRPC_BODY,
451         &RMF_MDT_BODY,
452         &RMF_EADATA
453 };
454
455 static const struct req_msg_field *mds_getattr_server[] = {
456         &RMF_PTLRPC_BODY,
457         &RMF_MDT_BODY,
458         &RMF_MDT_MD,
459         &RMF_ACL,
460         &RMF_CAPA1,
461         &RMF_CAPA2
462 };
463
464 static const struct req_msg_field *mds_setattr_server[] = {
465         &RMF_PTLRPC_BODY,
466         &RMF_MDT_BODY,
467         &RMF_MDT_MD,
468         &RMF_ACL,
469         &RMF_CAPA1,
470         &RMF_CAPA2
471 };
472
473 static const struct req_msg_field *llog_origin_handle_create_client[] = {
474         &RMF_PTLRPC_BODY,
475         &RMF_LLOGD_BODY,
476         &RMF_NAME
477 };
478
479 static const struct req_msg_field *llogd_body_only[] = {
480         &RMF_PTLRPC_BODY,
481         &RMF_LLOGD_BODY
482 };
483
484 static const struct req_msg_field *llog_log_hdr_only[] = {
485         &RMF_PTLRPC_BODY,
486         &RMF_LLOG_LOG_HDR
487 };
488
489 static const struct req_msg_field *llogd_conn_body_only[] = {
490         &RMF_PTLRPC_BODY,
491         &RMF_LLOGD_CONN_BODY
492 };
493
494 static const struct req_msg_field *llog_origin_handle_next_block_server[] = {
495         &RMF_PTLRPC_BODY,
496         &RMF_LLOGD_BODY,
497         &RMF_EADATA
498 };
499
500 static const struct req_msg_field *obd_idx_read_client[] = {
501         &RMF_PTLRPC_BODY,
502         &RMF_IDX_INFO
503 };
504
505 static const struct req_msg_field *obd_idx_read_server[] = {
506         &RMF_PTLRPC_BODY,
507         &RMF_IDX_INFO
508 };
509
510 static const struct req_msg_field *ost_body_only[] = {
511         &RMF_PTLRPC_BODY,
512         &RMF_OST_BODY
513 };
514
515 static const struct req_msg_field *ost_body_capa[] = {
516         &RMF_PTLRPC_BODY,
517         &RMF_OST_BODY,
518         &RMF_CAPA1
519 };
520
521 static const struct req_msg_field *ost_destroy_client[] = {
522         &RMF_PTLRPC_BODY,
523         &RMF_OST_BODY,
524         &RMF_DLM_REQ,
525         &RMF_CAPA1
526 };
527
528
529 static const struct req_msg_field *ost_brw_client[] = {
530         &RMF_PTLRPC_BODY,
531         &RMF_OST_BODY,
532         &RMF_OBD_IOOBJ,
533         &RMF_NIOBUF_REMOTE,
534         &RMF_CAPA1
535 };
536
537 static const struct req_msg_field *ost_brw_read_server[] = {
538         &RMF_PTLRPC_BODY,
539         &RMF_OST_BODY
540 };
541
542 static const struct req_msg_field *ost_brw_write_server[] = {
543         &RMF_PTLRPC_BODY,
544         &RMF_OST_BODY,
545         &RMF_RCS
546 };
547
548 static const struct req_msg_field *ost_get_info_generic_server[] = {
549         &RMF_PTLRPC_BODY,
550         &RMF_GENERIC_DATA,
551 };
552
553 static const struct req_msg_field *ost_get_info_generic_client[] = {
554         &RMF_PTLRPC_BODY,
555         &RMF_SETINFO_KEY
556 };
557
558 static const struct req_msg_field *ost_get_last_id_server[] = {
559         &RMF_PTLRPC_BODY,
560         &RMF_OBD_ID
561 };
562
563 static const struct req_msg_field *ost_get_fiemap_client[] = {
564         &RMF_PTLRPC_BODY,
565         &RMF_FIEMAP_KEY,
566         &RMF_FIEMAP_VAL
567 };
568
569 static const struct req_msg_field *ost_get_fiemap_server[] = {
570         &RMF_PTLRPC_BODY,
571         &RMF_FIEMAP_VAL
572 };
573
574 static struct req_format *req_formats[] = {
575         &RQF_OBD_PING,
576         &RQF_OBD_SET_INFO,
577         &RQF_OBD_IDX_READ,
578         &RQF_SEC_CTX,
579         &RQF_MGS_TARGET_REG,
580         &RQF_MGS_SET_INFO,
581         &RQF_MGS_CONFIG_READ,
582         &RQF_SEQ_QUERY,
583         &RQF_FLD_QUERY,
584         &RQF_MDS_CONNECT,
585         &RQF_MDS_DISCONNECT,
586         &RQF_MDS_GET_INFO,
587         &RQF_MDS_GETSTATUS,
588         &RQF_MDS_STATFS,
589         &RQF_MDS_GETATTR,
590         &RQF_MDS_GETATTR_NAME,
591         &RQF_MDS_GETXATTR,
592         &RQF_MDS_SYNC,
593         &RQF_MDS_CLOSE,
594         &RQF_MDS_PIN,
595         &RQF_MDS_UNPIN,
596         &RQF_MDS_READPAGE,
597         &RQF_MDS_WRITEPAGE,
598         &RQF_MDS_IS_SUBDIR,
599         &RQF_MDS_DONE_WRITING,
600         &RQF_MDS_REINT,
601         &RQF_MDS_REINT_CREATE,
602         &RQF_MDS_REINT_CREATE_RMT_ACL,
603         &RQF_MDS_REINT_CREATE_SLAVE,
604         &RQF_MDS_REINT_CREATE_SYM,
605         &RQF_MDS_REINT_OPEN,
606         &RQF_MDS_REINT_UNLINK,
607         &RQF_MDS_REINT_LINK,
608         &RQF_MDS_REINT_RENAME,
609         &RQF_MDS_REINT_SETATTR,
610         &RQF_MDS_REINT_SETXATTR,
611         &RQF_MDS_QUOTACHECK,
612         &RQF_MDS_QUOTACTL,
613         &RQF_MDS_QUOTA_DQACQ,
614         &RQF_QC_CALLBACK,
615         &RQF_OST_CONNECT,
616         &RQF_OST_DISCONNECT,
617         &RQF_OST_QUOTACHECK,
618         &RQF_OST_QUOTACTL,
619         &RQF_OST_QUOTA_ADJUST_QUNIT,
620         &RQF_OST_GETATTR,
621         &RQF_OST_SETATTR,
622         &RQF_OST_CREATE,
623         &RQF_OST_PUNCH,
624         &RQF_OST_SYNC,
625         &RQF_OST_DESTROY,
626         &RQF_OST_BRW_READ,
627         &RQF_OST_BRW_WRITE,
628         &RQF_OST_STATFS,
629         &RQF_OST_SET_GRANT_INFO,
630         &RQF_OST_GET_INFO_GENERIC,
631         &RQF_OST_GET_INFO_LAST_ID,
632         &RQF_OST_GET_INFO_FIEMAP,
633         &RQF_LDLM_ENQUEUE,
634         &RQF_LDLM_ENQUEUE_LVB,
635         &RQF_LDLM_CONVERT,
636         &RQF_LDLM_CANCEL,
637         &RQF_LDLM_CALLBACK,
638         &RQF_LDLM_CP_CALLBACK,
639         &RQF_LDLM_BL_CALLBACK,
640         &RQF_LDLM_GL_CALLBACK,
641         &RQF_LDLM_INTENT,
642         &RQF_LDLM_INTENT_GETATTR,
643         &RQF_LDLM_INTENT_OPEN,
644         &RQF_LDLM_INTENT_CREATE,
645         &RQF_LDLM_INTENT_UNLINK,
646         &RQF_LDLM_INTENT_QUOTA,
647         &RQF_QUOTA_DQACQ,
648         &RQF_LOG_CANCEL,
649         &RQF_LLOG_ORIGIN_HANDLE_CREATE,
650         &RQF_LLOG_ORIGIN_HANDLE_DESTROY,
651         &RQF_LLOG_ORIGIN_HANDLE_NEXT_BLOCK,
652         &RQF_LLOG_ORIGIN_HANDLE_PREV_BLOCK,
653         &RQF_LLOG_ORIGIN_HANDLE_READ_HEADER,
654         &RQF_LLOG_ORIGIN_CONNECT
655 };
656
657 struct req_msg_field {
658         const __u32 rmf_flags;
659         const char  *rmf_name;
660         /**
661          * Field length. (-1) means "variable length".  If the
662          * \a RMF_F_STRUCT_ARRAY flag is set the field is also variable-length,
663          * but the actual size must be a whole multiple of \a rmf_size.
664          */
665         const int   rmf_size;
666         void        (*rmf_swabber)(void *);
667         void        (*rmf_dumper)(void *);
668         int         rmf_offset[ARRAY_SIZE(req_formats)][RCL_NR];
669 };
670
671 enum rmf_flags {
672         /**
673          * The field is a string, must be NUL-terminated.
674          */
675         RMF_F_STRING = 1 << 0,
676         /**
677          * The field's buffer size need not match the declared \a rmf_size.
678          */
679         RMF_F_NO_SIZE_CHECK = 1 << 1,
680         /**
681          * The field's buffer size must be a whole multiple of the declared \a
682          * rmf_size and the \a rmf_swabber function must work on the declared \a
683          * rmf_size worth of bytes.
684          */
685         RMF_F_STRUCT_ARRAY = 1 << 2
686 };
687
688 struct req_capsule;
689
690 /*
691  * Request fields.
692  */
693 #define DEFINE_MSGF(name, flags, size, swabber, dumper) {       \
694         .rmf_name    = (name),                                  \
695         .rmf_flags   = (flags),                                 \
696         .rmf_size    = (size),                                  \
697         .rmf_swabber = (void (*)(void*))(swabber),              \
698         .rmf_dumper  = (void (*)(void*))(dumper)                \
699 }
700
701 struct req_msg_field RMF_GENERIC_DATA =
702         DEFINE_MSGF("generic_data", 0,
703                     -1, NULL, NULL);
704 EXPORT_SYMBOL(RMF_GENERIC_DATA);
705
706 struct req_msg_field RMF_MGS_TARGET_INFO =
707         DEFINE_MSGF("mgs_target_info", 0,
708                     sizeof(struct mgs_target_info),
709                     lustre_swab_mgs_target_info, NULL);
710 EXPORT_SYMBOL(RMF_MGS_TARGET_INFO);
711
712 struct req_msg_field RMF_MGS_SEND_PARAM =
713         DEFINE_MSGF("mgs_send_param", 0,
714                     sizeof(struct mgs_send_param),
715                     NULL, NULL);
716 EXPORT_SYMBOL(RMF_MGS_SEND_PARAM);
717
718 struct req_msg_field RMF_MGS_CONFIG_BODY =
719         DEFINE_MSGF("mgs_config_read request", 0,
720                     sizeof(struct mgs_config_body),
721                     lustre_swab_mgs_config_body, NULL);
722 EXPORT_SYMBOL(RMF_MGS_CONFIG_BODY);
723
724 struct req_msg_field RMF_MGS_CONFIG_RES =
725         DEFINE_MSGF("mgs_config_read reply ", 0,
726                     sizeof(struct mgs_config_res),
727                     lustre_swab_mgs_config_res, NULL);
728 EXPORT_SYMBOL(RMF_MGS_CONFIG_RES);
729
730 struct req_msg_field RMF_U32 =
731         DEFINE_MSGF("generic u32", 0,
732                     sizeof(__u32), lustre_swab_generic_32s, NULL);
733 EXPORT_SYMBOL(RMF_U32);
734
735 struct req_msg_field RMF_SETINFO_VAL =
736         DEFINE_MSGF("setinfo_val", 0, -1, NULL, NULL);
737 EXPORT_SYMBOL(RMF_SETINFO_VAL);
738
739 struct req_msg_field RMF_GETINFO_KEY =
740         DEFINE_MSGF("getinfo_key", 0, -1, NULL, NULL);
741 EXPORT_SYMBOL(RMF_GETINFO_KEY);
742
743 struct req_msg_field RMF_GETINFO_VALLEN =
744         DEFINE_MSGF("getinfo_vallen", 0,
745                     sizeof(__u32), lustre_swab_generic_32s, NULL);
746 EXPORT_SYMBOL(RMF_GETINFO_VALLEN);
747
748 struct req_msg_field RMF_GETINFO_VAL =
749         DEFINE_MSGF("getinfo_val", 0, -1, NULL, NULL);
750 EXPORT_SYMBOL(RMF_GETINFO_VAL);
751
752 struct req_msg_field RMF_SEQ_OPC =
753         DEFINE_MSGF("seq_query_opc", 0,
754                     sizeof(__u32), lustre_swab_generic_32s, NULL);
755 EXPORT_SYMBOL(RMF_SEQ_OPC);
756
757 struct req_msg_field RMF_SEQ_RANGE =
758         DEFINE_MSGF("seq_query_range", 0,
759                     sizeof(struct lu_seq_range),
760                     lustre_swab_lu_seq_range, NULL);
761 EXPORT_SYMBOL(RMF_SEQ_RANGE);
762
763 struct req_msg_field RMF_FLD_OPC =
764         DEFINE_MSGF("fld_query_opc", 0,
765                     sizeof(__u32), lustre_swab_generic_32s, NULL);
766 EXPORT_SYMBOL(RMF_FLD_OPC);
767
768 struct req_msg_field RMF_FLD_MDFLD =
769         DEFINE_MSGF("fld_query_mdfld", 0,
770                     sizeof(struct lu_seq_range),
771                     lustre_swab_lu_seq_range, NULL);
772 EXPORT_SYMBOL(RMF_FLD_MDFLD);
773
774 struct req_msg_field RMF_MDT_BODY =
775         DEFINE_MSGF("mdt_body", 0,
776                     sizeof(struct mdt_body), lustre_swab_mdt_body, NULL);
777 EXPORT_SYMBOL(RMF_MDT_BODY);
778
779 struct req_msg_field RMF_OBD_QUOTACTL =
780         DEFINE_MSGF("obd_quotactl", 0,
781                     sizeof(struct obd_quotactl),
782                     lustre_swab_obd_quotactl, NULL);
783 EXPORT_SYMBOL(RMF_OBD_QUOTACTL);
784
785 struct req_msg_field RMF_QUOTA_ADJUST_QUNIT =
786         DEFINE_MSGF("quota_adjust_qunit", 0,
787                     sizeof(struct quota_adjust_qunit),
788                     lustre_swab_quota_adjust_qunit, NULL);
789 EXPORT_SYMBOL(RMF_QUOTA_ADJUST_QUNIT);
790
791 struct req_msg_field RMF_QUNIT_DATA =
792         DEFINE_MSGF("qunit_data", 0,
793                     sizeof(struct qunit_data), lustre_swab_qdata, NULL);
794 EXPORT_SYMBOL(RMF_QUNIT_DATA);
795
796 struct req_msg_field RMF_QUOTA_BODY =
797         DEFINE_MSGF("quota_body", 0,
798                     sizeof(struct quota_body), lustre_swab_quota_body, NULL);
799 EXPORT_SYMBOL(RMF_QUOTA_BODY);
800
801 struct req_msg_field RMF_MDT_EPOCH =
802         DEFINE_MSGF("mdt_ioepoch", 0,
803                     sizeof(struct mdt_ioepoch), lustre_swab_mdt_ioepoch, NULL);
804 EXPORT_SYMBOL(RMF_MDT_EPOCH);
805
806 struct req_msg_field RMF_PTLRPC_BODY =
807         DEFINE_MSGF("ptlrpc_body", 0,
808                     sizeof(struct ptlrpc_body), lustre_swab_ptlrpc_body, NULL);
809 EXPORT_SYMBOL(RMF_PTLRPC_BODY);
810
811 struct req_msg_field RMF_OBD_STATFS =
812         DEFINE_MSGF("obd_statfs", 0,
813                     sizeof(struct obd_statfs), lustre_swab_obd_statfs, NULL);
814 EXPORT_SYMBOL(RMF_OBD_STATFS);
815
816 struct req_msg_field RMF_SETINFO_KEY =
817         DEFINE_MSGF("setinfo_key", 0, -1, NULL, NULL);
818 EXPORT_SYMBOL(RMF_SETINFO_KEY);
819
820 struct req_msg_field RMF_NAME =
821         DEFINE_MSGF("name", RMF_F_STRING, -1, NULL, NULL);
822 EXPORT_SYMBOL(RMF_NAME);
823
824 struct req_msg_field RMF_SYMTGT =
825         DEFINE_MSGF("symtgt", RMF_F_STRING, -1, NULL, NULL);
826 EXPORT_SYMBOL(RMF_SYMTGT);
827
828 struct req_msg_field RMF_TGTUUID =
829         DEFINE_MSGF("tgtuuid", RMF_F_STRING, sizeof(struct obd_uuid) - 1, NULL,
830         NULL);
831 EXPORT_SYMBOL(RMF_TGTUUID);
832
833 struct req_msg_field RMF_CLUUID =
834         DEFINE_MSGF("cluuid", RMF_F_STRING, sizeof(struct obd_uuid) - 1, NULL,
835         NULL);
836 EXPORT_SYMBOL(RMF_CLUUID);
837
838 struct req_msg_field RMF_STRING =
839         DEFINE_MSGF("string", RMF_F_STRING, -1, NULL, NULL);
840 EXPORT_SYMBOL(RMF_STRING);
841
842 struct req_msg_field RMF_LLOGD_BODY =
843         DEFINE_MSGF("llogd_body", 0,
844                     sizeof(struct llogd_body), lustre_swab_llogd_body, NULL);
845 EXPORT_SYMBOL(RMF_LLOGD_BODY);
846
847 struct req_msg_field RMF_LLOG_LOG_HDR =
848         DEFINE_MSGF("llog_log_hdr", 0,
849                     sizeof(struct llog_log_hdr), lustre_swab_llog_hdr, NULL);
850 EXPORT_SYMBOL(RMF_LLOG_LOG_HDR);
851
852 struct req_msg_field RMF_LLOGD_CONN_BODY =
853         DEFINE_MSGF("llogd_conn_body", 0,
854                     sizeof(struct llogd_conn_body),
855                     lustre_swab_llogd_conn_body, NULL);
856 EXPORT_SYMBOL(RMF_LLOGD_CONN_BODY);
857
858 /*
859  * connection handle received in MDS_CONNECT request.
860  *
861  * No swabbing needed because struct lustre_handle contains only a 64-bit cookie
862  * that the client does not interpret at all.
863  */
864 struct req_msg_field RMF_CONN =
865         DEFINE_MSGF("conn", 0, sizeof(struct lustre_handle), NULL, NULL);
866 EXPORT_SYMBOL(RMF_CONN);
867
868 struct req_msg_field RMF_CONNECT_DATA =
869         DEFINE_MSGF("cdata",
870                     RMF_F_NO_SIZE_CHECK /* we allow extra space for interop */,
871 #if LUSTRE_VERSION_CODE > OBD_OCD_VERSION(2, 7, 50, 0)
872                     sizeof(struct obd_connect_data),
873 #else
874 /* For interoperability with 1.8 and 2.0 clients/servers.
875  * The RPC verification code allows larger RPC buffers, but not
876  * smaller buffers.  Until we no longer need to keep compatibility
877  * with older servers/clients we can only check that the buffer
878  * size is at least as large as obd_connect_data_v1.  That is not
879  * not in itself harmful, since the chance of just corrupting this
880  * field is low.  See JIRA LU-16 for details. */
881                     sizeof(struct obd_connect_data_v1),
882 #endif
883                     lustre_swab_connect, NULL);
884 EXPORT_SYMBOL(RMF_CONNECT_DATA);
885
886 struct req_msg_field RMF_DLM_REQ =
887         DEFINE_MSGF("dlm_req", RMF_F_NO_SIZE_CHECK /* ldlm_request_bufsize */,
888                     sizeof(struct ldlm_request),
889                     lustre_swab_ldlm_request, NULL);
890 EXPORT_SYMBOL(RMF_DLM_REQ);
891
892 struct req_msg_field RMF_DLM_REP =
893         DEFINE_MSGF("dlm_rep", 0,
894                     sizeof(struct ldlm_reply), lustre_swab_ldlm_reply, NULL);
895 EXPORT_SYMBOL(RMF_DLM_REP);
896
897 struct req_msg_field RMF_LDLM_INTENT =
898         DEFINE_MSGF("ldlm_intent", 0,
899                     sizeof(struct ldlm_intent), lustre_swab_ldlm_intent, NULL);
900 EXPORT_SYMBOL(RMF_LDLM_INTENT);
901
902 struct req_msg_field RMF_DLM_LVB =
903         DEFINE_MSGF("dlm_lvb", 0, sizeof(union ldlm_wire_lvb), lustre_swab_lvb,
904         NULL);
905 EXPORT_SYMBOL(RMF_DLM_LVB);
906
907 struct req_msg_field RMF_MDT_MD =
908         DEFINE_MSGF("mdt_md", RMF_F_NO_SIZE_CHECK, MIN_MD_SIZE, NULL, NULL);
909 EXPORT_SYMBOL(RMF_MDT_MD);
910
911 struct req_msg_field RMF_REC_REINT =
912         DEFINE_MSGF("rec_reint", 0, sizeof(struct mdt_rec_reint),
913                     lustre_swab_mdt_rec_reint, NULL);
914 EXPORT_SYMBOL(RMF_REC_REINT);
915
916 /* FIXME: this length should be defined as a macro */
917 struct req_msg_field RMF_EADATA = DEFINE_MSGF("eadata", 0, -1,
918                                                     NULL, NULL);
919 EXPORT_SYMBOL(RMF_EADATA);
920
921 struct req_msg_field RMF_ACL =
922         DEFINE_MSGF("acl", RMF_F_NO_SIZE_CHECK,
923                     LUSTRE_POSIX_ACL_MAX_SIZE, NULL, NULL);
924 EXPORT_SYMBOL(RMF_ACL);
925
926 /* FIXME: this should be made to use RMF_F_STRUCT_ARRAY */
927 struct req_msg_field RMF_LOGCOOKIES =
928         DEFINE_MSGF("logcookies", RMF_F_NO_SIZE_CHECK /* multiple cookies */,
929                     sizeof(struct llog_cookie), NULL, NULL);
930 EXPORT_SYMBOL(RMF_LOGCOOKIES);
931
932 struct req_msg_field RMF_CAPA1 =
933         DEFINE_MSGF("capa", 0, sizeof(struct lustre_capa),
934                     lustre_swab_lustre_capa, NULL);
935 EXPORT_SYMBOL(RMF_CAPA1);
936
937 struct req_msg_field RMF_CAPA2 =
938         DEFINE_MSGF("capa", 0, sizeof(struct lustre_capa),
939                     lustre_swab_lustre_capa, NULL);
940 EXPORT_SYMBOL(RMF_CAPA2);
941
942 /*
943  * OST request field.
944  */
945 struct req_msg_field RMF_OST_BODY =
946         DEFINE_MSGF("ost_body", 0,
947                     sizeof(struct ost_body), lustre_swab_ost_body, dump_ost_body);
948 EXPORT_SYMBOL(RMF_OST_BODY);
949
950 struct req_msg_field RMF_OBD_IOOBJ =
951         DEFINE_MSGF("obd_ioobj", RMF_F_STRUCT_ARRAY,
952                     sizeof(struct obd_ioobj), lustre_swab_obd_ioobj, dump_ioo);
953 EXPORT_SYMBOL(RMF_OBD_IOOBJ);
954
955 struct req_msg_field RMF_NIOBUF_REMOTE =
956         DEFINE_MSGF("niobuf_remote", RMF_F_STRUCT_ARRAY,
957                     sizeof(struct niobuf_remote), lustre_swab_niobuf_remote,
958                     dump_rniobuf);
959 EXPORT_SYMBOL(RMF_NIOBUF_REMOTE);
960
961 struct req_msg_field RMF_RCS =
962         DEFINE_MSGF("niobuf_remote", RMF_F_STRUCT_ARRAY, sizeof(__u32),
963                     lustre_swab_generic_32s, dump_rcs);
964 EXPORT_SYMBOL(RMF_RCS);
965
966 struct req_msg_field RMF_OBD_ID =
967         DEFINE_MSGF("obd_id", 0,
968                     sizeof(obd_id), lustre_swab_ost_last_id, NULL);
969 EXPORT_SYMBOL(RMF_OBD_ID);
970
971 struct req_msg_field RMF_FIEMAP_KEY =
972         DEFINE_MSGF("fiemap", 0, sizeof(struct ll_fiemap_info_key),
973                     lustre_swab_fiemap, NULL);
974 EXPORT_SYMBOL(RMF_FIEMAP_KEY);
975
976 struct req_msg_field RMF_FIEMAP_VAL =
977         DEFINE_MSGF("fiemap", 0, -1, lustre_swab_fiemap, NULL);
978 EXPORT_SYMBOL(RMF_FIEMAP_VAL);
979
980 struct req_msg_field RMF_IDX_INFO =
981         DEFINE_MSGF("idx_info", 0, sizeof(struct idx_info),
982                     lustre_swab_idx_info, NULL);
983 EXPORT_SYMBOL(RMF_IDX_INFO);
984
985 /*
986  * Request formats.
987  */
988
989 struct req_format {
990         const char *rf_name;
991         int         rf_idx;
992         struct {
993                 int                          nr;
994                 const struct req_msg_field **d;
995         } rf_fields[RCL_NR];
996 };
997
998 #define DEFINE_REQ_FMT(name, client, client_nr, server, server_nr) {    \
999         .rf_name   = name,                                              \
1000         .rf_fields = {                                                  \
1001                 [RCL_CLIENT] = {                                        \
1002                         .nr = client_nr,                                \
1003                         .d  = client                                    \
1004                 },                                                      \
1005                 [RCL_SERVER] = {                                        \
1006                         .nr = server_nr,                                \
1007                         .d  = server                                    \
1008                 }                                                       \
1009         }                                                               \
1010 }
1011
1012 #define DEFINE_REQ_FMT0(name, client, server)                                  \
1013 DEFINE_REQ_FMT(name, client, ARRAY_SIZE(client), server, ARRAY_SIZE(server))
1014
1015 struct req_format RQF_OBD_PING =
1016         DEFINE_REQ_FMT0("OBD_PING", empty, empty);
1017 EXPORT_SYMBOL(RQF_OBD_PING);
1018
1019 struct req_format RQF_OBD_SET_INFO =
1020         DEFINE_REQ_FMT0("OBD_SET_INFO", obd_set_info_client, empty);
1021 EXPORT_SYMBOL(RQF_OBD_SET_INFO);
1022
1023 /* Read index file through the network */
1024 struct req_format RQF_OBD_IDX_READ =
1025         DEFINE_REQ_FMT0("OBD_IDX_READ",
1026                         obd_idx_read_client, obd_idx_read_server);
1027 EXPORT_SYMBOL(RQF_OBD_IDX_READ);
1028
1029 struct req_format RQF_SEC_CTX =
1030         DEFINE_REQ_FMT0("SEC_CTX", empty, empty);
1031 EXPORT_SYMBOL(RQF_SEC_CTX);
1032
1033 struct req_format RQF_MGS_TARGET_REG =
1034         DEFINE_REQ_FMT0("MGS_TARGET_REG", mgs_target_info_only,
1035                          mgs_target_info_only);
1036 EXPORT_SYMBOL(RQF_MGS_TARGET_REG);
1037
1038 struct req_format RQF_MGS_SET_INFO =
1039         DEFINE_REQ_FMT0("MGS_SET_INFO", mgs_set_info,
1040                          mgs_set_info);
1041 EXPORT_SYMBOL(RQF_MGS_SET_INFO);
1042
1043 struct req_format RQF_MGS_CONFIG_READ =
1044         DEFINE_REQ_FMT0("MGS_CONFIG_READ", mgs_config_read_client,
1045                          mgs_config_read_server);
1046 EXPORT_SYMBOL(RQF_MGS_CONFIG_READ);
1047
1048 struct req_format RQF_SEQ_QUERY =
1049         DEFINE_REQ_FMT0("SEQ_QUERY", seq_query_client, seq_query_server);
1050 EXPORT_SYMBOL(RQF_SEQ_QUERY);
1051
1052 struct req_format RQF_FLD_QUERY =
1053         DEFINE_REQ_FMT0("FLD_QUERY", fld_query_client, fld_query_server);
1054 EXPORT_SYMBOL(RQF_FLD_QUERY);
1055
1056 struct req_format RQF_LOG_CANCEL =
1057         DEFINE_REQ_FMT0("OBD_LOG_CANCEL", log_cancel_client, empty);
1058 EXPORT_SYMBOL(RQF_LOG_CANCEL);
1059
1060 struct req_format RQF_MDS_QUOTACHECK =
1061         DEFINE_REQ_FMT0("MDS_QUOTACHECK", quotactl_only, empty);
1062 EXPORT_SYMBOL(RQF_MDS_QUOTACHECK);
1063
1064 struct req_format RQF_OST_QUOTACHECK =
1065         DEFINE_REQ_FMT0("OST_QUOTACHECK", quotactl_only, empty);
1066 EXPORT_SYMBOL(RQF_OST_QUOTACHECK);
1067
1068 struct req_format RQF_MDS_QUOTACTL =
1069         DEFINE_REQ_FMT0("MDS_QUOTACTL", quotactl_only, quotactl_only);
1070 EXPORT_SYMBOL(RQF_MDS_QUOTACTL);
1071
1072 struct req_format RQF_OST_QUOTACTL =
1073         DEFINE_REQ_FMT0("OST_QUOTACTL", quotactl_only, quotactl_only);
1074 EXPORT_SYMBOL(RQF_OST_QUOTACTL);
1075
1076 struct req_format RQF_OST_QUOTA_ADJUST_QUNIT =
1077         DEFINE_REQ_FMT0("OST_QUOTA_ADJUST_QUNIT", quota_adjust_qunit_only,
1078                         quota_adjust_qunit_only);
1079 EXPORT_SYMBOL(RQF_OST_QUOTA_ADJUST_QUNIT);
1080
1081 struct req_format RQF_QC_CALLBACK =
1082         DEFINE_REQ_FMT0("QC_CALLBACK", quotactl_only, empty);
1083 EXPORT_SYMBOL(RQF_QC_CALLBACK);
1084
1085 struct req_format RQF_MDS_QUOTA_DQACQ =
1086         DEFINE_REQ_FMT0("MDS_QUOTA_DQACQ", qunit_data_only, qunit_data_only);
1087 EXPORT_SYMBOL(RQF_MDS_QUOTA_DQACQ);
1088
1089 struct req_format RQF_QUOTA_DQACQ =
1090         DEFINE_REQ_FMT0("QUOTA_DQACQ", quota_body_only, quota_body_only);
1091 EXPORT_SYMBOL(RQF_QUOTA_DQACQ);
1092
1093 struct req_format RQF_LDLM_INTENT_QUOTA =
1094         DEFINE_REQ_FMT0("LDLM_INTENT_QUOTA",
1095                         ldlm_intent_quota_client,
1096                         ldlm_intent_quota_server);
1097 EXPORT_SYMBOL(RQF_LDLM_INTENT_QUOTA);
1098
1099 struct req_format RQF_MDS_GETSTATUS =
1100         DEFINE_REQ_FMT0("MDS_GETSTATUS", mdt_body_only, mdt_body_capa);
1101 EXPORT_SYMBOL(RQF_MDS_GETSTATUS);
1102
1103 struct req_format RQF_MDS_STATFS =
1104         DEFINE_REQ_FMT0("MDS_STATFS", empty, obd_statfs_server);
1105 EXPORT_SYMBOL(RQF_MDS_STATFS);
1106
1107 struct req_format RQF_MDS_SYNC =
1108         DEFINE_REQ_FMT0("MDS_SYNC", mdt_body_capa, mdt_body_only);
1109 EXPORT_SYMBOL(RQF_MDS_SYNC);
1110
1111 struct req_format RQF_MDS_GETATTR =
1112         DEFINE_REQ_FMT0("MDS_GETATTR", mdt_body_capa, mds_getattr_server);
1113 EXPORT_SYMBOL(RQF_MDS_GETATTR);
1114
1115 struct req_format RQF_MDS_GETXATTR =
1116         DEFINE_REQ_FMT0("MDS_GETXATTR",
1117                         mds_getxattr_client, mds_getxattr_server);
1118 EXPORT_SYMBOL(RQF_MDS_GETXATTR);
1119
1120 struct req_format RQF_MDS_GETATTR_NAME =
1121         DEFINE_REQ_FMT0("MDS_GETATTR_NAME",
1122                         mds_getattr_name_client, mds_getattr_server);
1123 EXPORT_SYMBOL(RQF_MDS_GETATTR_NAME);
1124
1125 struct req_format RQF_MDS_REINT =
1126         DEFINE_REQ_FMT0("MDS_REINT", mds_reint_client, mdt_body_only);
1127 EXPORT_SYMBOL(RQF_MDS_REINT);
1128
1129 struct req_format RQF_MDS_REINT_CREATE =
1130         DEFINE_REQ_FMT0("MDS_REINT_CREATE",
1131                         mds_reint_create_client, mdt_body_capa);
1132 EXPORT_SYMBOL(RQF_MDS_REINT_CREATE);
1133
1134 struct req_format RQF_MDS_REINT_CREATE_RMT_ACL =
1135         DEFINE_REQ_FMT0("MDS_REINT_CREATE_RMT_ACL",
1136                         mds_reint_create_rmt_acl_client, mdt_body_capa);
1137 EXPORT_SYMBOL(RQF_MDS_REINT_CREATE_RMT_ACL);
1138
1139 struct req_format RQF_MDS_REINT_CREATE_SLAVE =
1140         DEFINE_REQ_FMT0("MDS_REINT_CREATE_EA",
1141                         mds_reint_create_slave_client, mdt_body_capa);
1142 EXPORT_SYMBOL(RQF_MDS_REINT_CREATE_SLAVE);
1143
1144 struct req_format RQF_MDS_REINT_CREATE_SYM =
1145         DEFINE_REQ_FMT0("MDS_REINT_CREATE_SYM",
1146                         mds_reint_create_sym_client, mdt_body_capa);
1147 EXPORT_SYMBOL(RQF_MDS_REINT_CREATE_SYM);
1148
1149 struct req_format RQF_MDS_REINT_OPEN =
1150         DEFINE_REQ_FMT0("MDS_REINT_OPEN",
1151                         mds_reint_open_client, mds_reint_open_server);
1152 EXPORT_SYMBOL(RQF_MDS_REINT_OPEN);
1153
1154 struct req_format RQF_MDS_REINT_UNLINK =
1155         DEFINE_REQ_FMT0("MDS_REINT_UNLINK", mds_reint_unlink_client,
1156                         mds_last_unlink_server);
1157 EXPORT_SYMBOL(RQF_MDS_REINT_UNLINK);
1158
1159 struct req_format RQF_MDS_REINT_LINK =
1160         DEFINE_REQ_FMT0("MDS_REINT_LINK",
1161                         mds_reint_link_client, mdt_body_only);
1162 EXPORT_SYMBOL(RQF_MDS_REINT_LINK);
1163
1164 struct req_format RQF_MDS_REINT_RENAME =
1165         DEFINE_REQ_FMT0("MDS_REINT_RENAME", mds_reint_rename_client,
1166                         mds_last_unlink_server);
1167 EXPORT_SYMBOL(RQF_MDS_REINT_RENAME);
1168
1169 struct req_format RQF_MDS_REINT_SETATTR =
1170         DEFINE_REQ_FMT0("MDS_REINT_SETATTR",
1171                         mds_reint_setattr_client, mds_setattr_server);
1172 EXPORT_SYMBOL(RQF_MDS_REINT_SETATTR);
1173
1174 struct req_format RQF_MDS_REINT_SETXATTR =
1175         DEFINE_REQ_FMT0("MDS_REINT_SETXATTR",
1176                         mds_reint_setxattr_client, mdt_body_only);
1177 EXPORT_SYMBOL(RQF_MDS_REINT_SETXATTR);
1178
1179 struct req_format RQF_MDS_CONNECT =
1180         DEFINE_REQ_FMT0("MDS_CONNECT",
1181                         obd_connect_client, obd_connect_server);
1182 EXPORT_SYMBOL(RQF_MDS_CONNECT);
1183
1184 struct req_format RQF_MDS_DISCONNECT =
1185         DEFINE_REQ_FMT0("MDS_DISCONNECT", empty, empty);
1186 EXPORT_SYMBOL(RQF_MDS_DISCONNECT);
1187
1188 struct req_format RQF_MDS_GET_INFO =
1189         DEFINE_REQ_FMT0("MDS_GET_INFO", mds_getinfo_client,
1190                         mds_getinfo_server);
1191 EXPORT_SYMBOL(RQF_MDS_GET_INFO);
1192
1193 struct req_format RQF_LDLM_ENQUEUE =
1194         DEFINE_REQ_FMT0("LDLM_ENQUEUE",
1195                         ldlm_enqueue_client, ldlm_enqueue_lvb_server);
1196 EXPORT_SYMBOL(RQF_LDLM_ENQUEUE);
1197
1198 struct req_format RQF_LDLM_ENQUEUE_LVB =
1199         DEFINE_REQ_FMT0("LDLM_ENQUEUE_LVB",
1200                         ldlm_enqueue_client, ldlm_enqueue_lvb_server);
1201 EXPORT_SYMBOL(RQF_LDLM_ENQUEUE_LVB);
1202
1203 struct req_format RQF_LDLM_CONVERT =
1204         DEFINE_REQ_FMT0("LDLM_CONVERT",
1205                         ldlm_enqueue_client, ldlm_enqueue_server);
1206 EXPORT_SYMBOL(RQF_LDLM_CONVERT);
1207
1208 struct req_format RQF_LDLM_CANCEL =
1209         DEFINE_REQ_FMT0("LDLM_CANCEL", ldlm_enqueue_client, empty);
1210 EXPORT_SYMBOL(RQF_LDLM_CANCEL);
1211
1212 struct req_format RQF_LDLM_CALLBACK =
1213         DEFINE_REQ_FMT0("LDLM_CALLBACK", ldlm_enqueue_client, empty);
1214 EXPORT_SYMBOL(RQF_LDLM_CALLBACK);
1215
1216 struct req_format RQF_LDLM_CP_CALLBACK =
1217         DEFINE_REQ_FMT0("LDLM_CP_CALLBACK", ldlm_cp_callback_client, empty);
1218 EXPORT_SYMBOL(RQF_LDLM_CP_CALLBACK);
1219
1220 struct req_format RQF_LDLM_BL_CALLBACK =
1221         DEFINE_REQ_FMT0("LDLM_BL_CALLBACK", ldlm_enqueue_client, empty);
1222 EXPORT_SYMBOL(RQF_LDLM_BL_CALLBACK);
1223
1224 struct req_format RQF_LDLM_GL_CALLBACK =
1225         DEFINE_REQ_FMT0("LDLM_GL_CALLBACK", ldlm_enqueue_client,
1226                         ldlm_gl_callback_server);
1227 EXPORT_SYMBOL(RQF_LDLM_GL_CALLBACK);
1228
1229 struct req_format RQF_LDLM_INTENT =
1230         DEFINE_REQ_FMT0("LDLM_INTENT",
1231                         ldlm_intent_client, ldlm_intent_server);
1232 EXPORT_SYMBOL(RQF_LDLM_INTENT);
1233
1234 struct req_format RQF_LDLM_INTENT_GETATTR =
1235         DEFINE_REQ_FMT0("LDLM_INTENT_GETATTR",
1236                         ldlm_intent_getattr_client, ldlm_intent_getattr_server);
1237 EXPORT_SYMBOL(RQF_LDLM_INTENT_GETATTR);
1238
1239 struct req_format RQF_LDLM_INTENT_OPEN =
1240         DEFINE_REQ_FMT0("LDLM_INTENT_OPEN",
1241                         ldlm_intent_open_client, ldlm_intent_open_server);
1242 EXPORT_SYMBOL(RQF_LDLM_INTENT_OPEN);
1243
1244 struct req_format RQF_LDLM_INTENT_CREATE =
1245         DEFINE_REQ_FMT0("LDLM_INTENT_CREATE",
1246                         ldlm_intent_create_client, ldlm_intent_getattr_server);
1247 EXPORT_SYMBOL(RQF_LDLM_INTENT_CREATE);
1248
1249 struct req_format RQF_LDLM_INTENT_UNLINK =
1250         DEFINE_REQ_FMT0("LDLM_INTENT_UNLINK",
1251                         ldlm_intent_unlink_client, ldlm_intent_server);
1252 EXPORT_SYMBOL(RQF_LDLM_INTENT_UNLINK);
1253
1254 struct req_format RQF_MDS_CLOSE =
1255         DEFINE_REQ_FMT0("MDS_CLOSE",
1256                         mdt_close_client, mds_last_unlink_server);
1257 EXPORT_SYMBOL(RQF_MDS_CLOSE);
1258
1259 struct req_format RQF_MDS_PIN =
1260         DEFINE_REQ_FMT0("MDS_PIN",
1261                         mdt_body_capa, mdt_body_only);
1262 EXPORT_SYMBOL(RQF_MDS_PIN);
1263
1264 struct req_format RQF_MDS_UNPIN =
1265         DEFINE_REQ_FMT0("MDS_UNPIN", mdt_body_only, empty);
1266 EXPORT_SYMBOL(RQF_MDS_UNPIN);
1267
1268 struct req_format RQF_MDS_DONE_WRITING =
1269         DEFINE_REQ_FMT0("MDS_DONE_WRITING",
1270                         mdt_close_client, mdt_body_only);
1271 EXPORT_SYMBOL(RQF_MDS_DONE_WRITING);
1272
1273 struct req_format RQF_MDS_READPAGE =
1274         DEFINE_REQ_FMT0("MDS_READPAGE",
1275                         mdt_body_capa, mdt_body_only);
1276 EXPORT_SYMBOL(RQF_MDS_READPAGE);
1277
1278 /* This is for split */
1279 struct req_format RQF_MDS_WRITEPAGE =
1280         DEFINE_REQ_FMT0("MDS_WRITEPAGE",
1281                         mdt_body_capa, mdt_body_only);
1282 EXPORT_SYMBOL(RQF_MDS_WRITEPAGE);
1283
1284 struct req_format RQF_MDS_IS_SUBDIR =
1285         DEFINE_REQ_FMT0("MDS_IS_SUBDIR",
1286                         mdt_body_only, mdt_body_only);
1287 EXPORT_SYMBOL(RQF_MDS_IS_SUBDIR);
1288
1289 struct req_format RQF_LLOG_ORIGIN_HANDLE_CREATE =
1290         DEFINE_REQ_FMT0("LLOG_ORIGIN_HANDLE_CREATE",
1291                         llog_origin_handle_create_client, llogd_body_only);
1292 EXPORT_SYMBOL(RQF_LLOG_ORIGIN_HANDLE_CREATE);
1293
1294 struct req_format RQF_LLOG_ORIGIN_HANDLE_DESTROY =
1295         DEFINE_REQ_FMT0("LLOG_ORIGIN_HANDLE_DESTROY",
1296                         llogd_body_only, llogd_body_only);
1297 EXPORT_SYMBOL(RQF_LLOG_ORIGIN_HANDLE_DESTROY);
1298
1299 struct req_format RQF_LLOG_ORIGIN_HANDLE_NEXT_BLOCK =
1300         DEFINE_REQ_FMT0("LLOG_ORIGIN_HANDLE_NEXT_BLOCK",
1301                         llogd_body_only, llog_origin_handle_next_block_server);
1302 EXPORT_SYMBOL(RQF_LLOG_ORIGIN_HANDLE_NEXT_BLOCK);
1303
1304 struct req_format RQF_LLOG_ORIGIN_HANDLE_PREV_BLOCK =
1305         DEFINE_REQ_FMT0("LLOG_ORIGIN_HANDLE_PREV_BLOCK",
1306                         llogd_body_only, llog_origin_handle_next_block_server);
1307 EXPORT_SYMBOL(RQF_LLOG_ORIGIN_HANDLE_PREV_BLOCK);
1308
1309 struct req_format RQF_LLOG_ORIGIN_HANDLE_READ_HEADER =
1310         DEFINE_REQ_FMT0("LLOG_ORIGIN_HANDLE_READ_HEADER",
1311                         llogd_body_only, llog_log_hdr_only);
1312 EXPORT_SYMBOL(RQF_LLOG_ORIGIN_HANDLE_READ_HEADER);
1313
1314 struct req_format RQF_LLOG_ORIGIN_CONNECT =
1315         DEFINE_REQ_FMT0("LLOG_ORIGIN_CONNECT", llogd_conn_body_only, empty);
1316 EXPORT_SYMBOL(RQF_LLOG_ORIGIN_CONNECT);
1317
1318 struct req_format RQF_OST_CONNECT =
1319         DEFINE_REQ_FMT0("OST_CONNECT",
1320                         obd_connect_client, obd_connect_server);
1321 EXPORT_SYMBOL(RQF_OST_CONNECT);
1322
1323 struct req_format RQF_OST_DISCONNECT =
1324         DEFINE_REQ_FMT0("OST_DISCONNECT", empty, empty);
1325 EXPORT_SYMBOL(RQF_OST_DISCONNECT);
1326
1327 struct req_format RQF_OST_GETATTR =
1328         DEFINE_REQ_FMT0("OST_GETATTR", ost_body_capa, ost_body_only);
1329 EXPORT_SYMBOL(RQF_OST_GETATTR);
1330
1331 struct req_format RQF_OST_SETATTR =
1332         DEFINE_REQ_FMT0("OST_SETATTR", ost_body_capa, ost_body_only);
1333 EXPORT_SYMBOL(RQF_OST_SETATTR);
1334
1335 struct req_format RQF_OST_CREATE =
1336         DEFINE_REQ_FMT0("OST_CREATE", ost_body_only, ost_body_only);
1337 EXPORT_SYMBOL(RQF_OST_CREATE);
1338
1339 struct req_format RQF_OST_PUNCH =
1340         DEFINE_REQ_FMT0("OST_PUNCH", ost_body_capa, ost_body_only);
1341 EXPORT_SYMBOL(RQF_OST_PUNCH);
1342
1343 struct req_format RQF_OST_SYNC =
1344         DEFINE_REQ_FMT0("OST_SYNC", ost_body_capa, ost_body_only);
1345 EXPORT_SYMBOL(RQF_OST_SYNC);
1346
1347 struct req_format RQF_OST_DESTROY =
1348         DEFINE_REQ_FMT0("OST_DESTROY", ost_destroy_client, ost_body_only);
1349 EXPORT_SYMBOL(RQF_OST_DESTROY);
1350
1351 struct req_format RQF_OST_BRW_READ =
1352         DEFINE_REQ_FMT0("OST_BRW_READ", ost_brw_client, ost_brw_read_server);
1353 EXPORT_SYMBOL(RQF_OST_BRW_READ);
1354
1355 struct req_format RQF_OST_BRW_WRITE =
1356         DEFINE_REQ_FMT0("OST_BRW_WRITE", ost_brw_client, ost_brw_write_server);
1357 EXPORT_SYMBOL(RQF_OST_BRW_WRITE);
1358
1359 struct req_format RQF_OST_STATFS =
1360         DEFINE_REQ_FMT0("OST_STATFS", empty, obd_statfs_server);
1361 EXPORT_SYMBOL(RQF_OST_STATFS);
1362
1363 struct req_format RQF_OST_SET_GRANT_INFO =
1364         DEFINE_REQ_FMT0("OST_SET_GRANT_INFO", ost_grant_shrink_client,
1365                          ost_body_only);
1366 EXPORT_SYMBOL(RQF_OST_SET_GRANT_INFO);
1367
1368 struct req_format RQF_OST_GET_INFO_GENERIC =
1369         DEFINE_REQ_FMT0("OST_GET_INFO", ost_get_info_generic_client,
1370                                         ost_get_info_generic_server);
1371 EXPORT_SYMBOL(RQF_OST_GET_INFO_GENERIC);
1372
1373 struct req_format RQF_OST_GET_INFO_LAST_ID =
1374         DEFINE_REQ_FMT0("OST_GET_INFO_LAST_ID", ost_get_info_generic_client,
1375                                                 ost_get_last_id_server);
1376 EXPORT_SYMBOL(RQF_OST_GET_INFO_LAST_ID);
1377
1378 struct req_format RQF_OST_GET_INFO_FIEMAP =
1379         DEFINE_REQ_FMT0("OST_GET_INFO_FIEMAP", ost_get_fiemap_client,
1380                                                ost_get_fiemap_server);
1381 EXPORT_SYMBOL(RQF_OST_GET_INFO_FIEMAP);
1382
1383
1384 #if !defined(__REQ_LAYOUT_USER__)
1385
1386 /* Convenience macro */
1387 #define FMT_FIELD(fmt, i, j) (fmt)->rf_fields[(i)].d[(j)]
1388
1389 /**
1390  * Initializes the capsule abstraction by computing and setting the \a rf_idx
1391  * field of RQFs and the \a rmf_offset field of RMFs.
1392  */
1393 int req_layout_init(void)
1394 {
1395         int i;
1396         int j;
1397         int k;
1398         struct req_format *rf = NULL;
1399
1400         for (i = 0; i < ARRAY_SIZE(req_formats); ++i) {
1401                 rf = req_formats[i];
1402                 rf->rf_idx = i;
1403                 for (j = 0; j < RCL_NR; ++j) {
1404                         LASSERT(rf->rf_fields[j].nr <= REQ_MAX_FIELD_NR);
1405                         for (k = 0; k < rf->rf_fields[j].nr; ++k) {
1406                                 struct req_msg_field *field;
1407
1408                                 field = (typeof(field))rf->rf_fields[j].d[k];
1409                                 LASSERT(!(field->rmf_flags & RMF_F_STRUCT_ARRAY)
1410                                         || field->rmf_size > 0);
1411                                 LASSERT(field->rmf_offset[i][j] == 0);
1412                                 /*
1413                                  * k + 1 to detect unused format/field
1414                                  * combinations.
1415                                  */
1416                                 field->rmf_offset[i][j] = k + 1;
1417                         }
1418                 }
1419         }
1420         return 0;
1421 }
1422 EXPORT_SYMBOL(req_layout_init);
1423
1424 void req_layout_fini(void)
1425 {
1426 }
1427 EXPORT_SYMBOL(req_layout_fini);
1428
1429 /**
1430  * Initializes the expected sizes of each RMF in a \a pill (\a rc_area) to -1.
1431  *
1432  * Actual/expected field sizes are set elsewhere in functions in this file:
1433  * req_capsule_init(), req_capsule_server_pack(), req_capsule_set_size() and
1434  * req_capsule_msg_size().  The \a rc_area information is used by.
1435  * ptlrpc_request_set_replen().
1436  */
1437 void req_capsule_init_area(struct req_capsule *pill)
1438 {
1439         int i;
1440
1441         for (i = 0; i < ARRAY_SIZE(pill->rc_area[RCL_CLIENT]); i++) {
1442                 pill->rc_area[RCL_CLIENT][i] = -1;
1443                 pill->rc_area[RCL_SERVER][i] = -1;
1444         }
1445 }
1446 EXPORT_SYMBOL(req_capsule_init_area);
1447
1448 /**
1449  * Initialize a pill.
1450  *
1451  * The \a location indicates whether the caller is executing on the client side
1452  * (RCL_CLIENT) or server side (RCL_SERVER)..
1453  */
1454 void req_capsule_init(struct req_capsule *pill,
1455                       struct ptlrpc_request *req,
1456                       enum req_location location)
1457 {
1458         LASSERT(location == RCL_SERVER || location == RCL_CLIENT);
1459
1460         /*
1461          * Today all capsules are embedded in ptlrpc_request structs,
1462          * but just in case that ever isn't the case, we don't reach
1463          * into req unless req != NULL and pill is the one embedded in
1464          * the req.
1465          *
1466          * The req->rq_pill_init flag makes it safe to initialize a pill
1467          * twice, which might happen in the OST paths as a result of the
1468          * high-priority RPC queue getting peeked at before ost_handle()
1469          * handles an OST RPC.
1470          */
1471         if (req != NULL && pill == &req->rq_pill && req->rq_pill_init)
1472                 return;
1473
1474         memset(pill, 0, sizeof *pill);
1475         pill->rc_req = req;
1476         pill->rc_loc = location;
1477         req_capsule_init_area(pill);
1478
1479         if (req != NULL && pill == &req->rq_pill)
1480                 req->rq_pill_init = 1;
1481 }
1482 EXPORT_SYMBOL(req_capsule_init);
1483
1484 void req_capsule_fini(struct req_capsule *pill)
1485 {
1486 }
1487 EXPORT_SYMBOL(req_capsule_fini);
1488
1489 static int __req_format_is_sane(const struct req_format *fmt)
1490 {
1491         return
1492                 0 <= fmt->rf_idx && fmt->rf_idx < ARRAY_SIZE(req_formats) &&
1493                 req_formats[fmt->rf_idx] == fmt;
1494 }
1495
1496 static struct lustre_msg *__req_msg(const struct req_capsule *pill,
1497                                     enum req_location loc)
1498 {
1499         struct ptlrpc_request *req;
1500
1501         req = pill->rc_req;
1502         return loc == RCL_CLIENT ? req->rq_reqmsg : req->rq_repmsg;
1503 }
1504
1505 /**
1506  * Set the format (\a fmt) of a \a pill; format changes are not allowed here
1507  * (see req_capsule_extend()).
1508  */
1509 void req_capsule_set(struct req_capsule *pill, const struct req_format *fmt)
1510 {
1511         LASSERT(pill->rc_fmt == NULL || pill->rc_fmt == fmt);
1512         LASSERT(__req_format_is_sane(fmt));
1513
1514         pill->rc_fmt = fmt;
1515 }
1516 EXPORT_SYMBOL(req_capsule_set);
1517
1518 /**
1519  * Fills in any parts of the \a rc_area of a \a pill that haven't been filled in
1520  * yet.
1521
1522  * \a rc_area is an array of REQ_MAX_FIELD_NR elements, used to store sizes of
1523  * variable-sized fields.  The field sizes come from the declared \a rmf_size
1524  * field of a \a pill's \a rc_fmt's RMF's.
1525  */
1526 int req_capsule_filled_sizes(struct req_capsule *pill,
1527                            enum req_location loc)
1528 {
1529         const struct req_format *fmt = pill->rc_fmt;
1530         int                      i;
1531
1532         LASSERT(fmt != NULL);
1533
1534         for (i = 0; i < fmt->rf_fields[loc].nr; ++i) {
1535                 if (pill->rc_area[loc][i] == -1) {
1536                         pill->rc_area[loc][i] =
1537                                             fmt->rf_fields[loc].d[i]->rmf_size;
1538                         if (pill->rc_area[loc][i] == -1) {
1539                                 /*
1540                                  * Skip the following fields.
1541                                  *
1542                                  * If this LASSERT() trips then you're missing a
1543                                  * call to req_capsule_set_size().
1544                                  */
1545                                 LASSERT(loc != RCL_SERVER);
1546                                 break;
1547                         }
1548                 }
1549         }
1550         return i;
1551 }
1552 EXPORT_SYMBOL(req_capsule_filled_sizes);
1553
1554 /**
1555  * Capsule equivalent of lustre_pack_request() and lustre_pack_reply().
1556  *
1557  * This function uses the \a pill's \a rc_area as filled in by
1558  * req_capsule_set_size() or req_capsule_filled_sizes() (the latter is called by
1559  * this function).
1560  */
1561 int req_capsule_server_pack(struct req_capsule *pill)
1562 {
1563         const struct req_format *fmt;
1564         int                      count;
1565         int                      rc;
1566
1567         LASSERT(pill->rc_loc == RCL_SERVER);
1568         fmt = pill->rc_fmt;
1569         LASSERT(fmt != NULL);
1570
1571         count = req_capsule_filled_sizes(pill, RCL_SERVER);
1572         rc = lustre_pack_reply(pill->rc_req, count,
1573                                pill->rc_area[RCL_SERVER], NULL);
1574         if (rc != 0) {
1575                 DEBUG_REQ(D_ERROR, pill->rc_req,
1576                        "Cannot pack %d fields in format `%s': ",
1577                        count, fmt->rf_name);
1578         }
1579         return rc;
1580 }
1581 EXPORT_SYMBOL(req_capsule_server_pack);
1582
1583 /**
1584  * Returns the PTLRPC request or reply (\a loc) buffer offset of a \a pill
1585  * corresponding to the given RMF (\a field).
1586  */
1587 static int __req_capsule_offset(const struct req_capsule *pill,
1588                                 const struct req_msg_field *field,
1589                                 enum req_location loc)
1590 {
1591         int offset;
1592
1593         offset = field->rmf_offset[pill->rc_fmt->rf_idx][loc];
1594         LASSERTF(offset > 0, "%s:%s, off=%d, loc=%d\n",
1595                             pill->rc_fmt->rf_name,
1596                             field->rmf_name, offset, loc);
1597         offset --;
1598
1599         LASSERT(0 <= offset && offset < REQ_MAX_FIELD_NR);
1600         return offset;
1601 }
1602
1603 /**
1604  * Helper for __req_capsule_get(); swabs value / array of values and/or dumps
1605  * them if desired.
1606  */
1607 static
1608 void
1609 swabber_dumper_helper(struct req_capsule *pill,
1610                       const struct req_msg_field *field,
1611                       enum req_location loc,
1612                       int offset,
1613                       void *value, int len, int dump, void (*swabber)( void *))
1614 {
1615         void    *p;
1616         int     i;
1617         int     n;
1618         int     do_swab;
1619         int     inout = loc == RCL_CLIENT;
1620
1621         swabber = swabber ?: field->rmf_swabber;
1622
1623         if (ptlrpc_buf_need_swab(pill->rc_req, inout, offset) &&
1624             swabber != NULL && value != NULL)
1625                 do_swab = 1;
1626         else
1627                 do_swab = 0;
1628
1629         if (!(field->rmf_flags & RMF_F_STRUCT_ARRAY)) {
1630                 if (dump && field->rmf_dumper) {
1631                         CDEBUG(D_RPCTRACE, "Dump of %sfield %s follows\n",
1632                                do_swab ? "unswabbed " : "", field->rmf_name);
1633                         field->rmf_dumper(value);
1634                 }
1635                 if (!do_swab)
1636                         return;
1637                 swabber(value);
1638                 ptlrpc_buf_set_swabbed(pill->rc_req, inout, offset);
1639                 if (dump) {
1640                         CDEBUG(D_RPCTRACE, "Dump of swabbed field %s "
1641                                "follows\n", field->rmf_name);
1642                         field->rmf_dumper(value);
1643                 }
1644
1645                 return;
1646         }
1647
1648         /*
1649          * We're swabbing an array; swabber() swabs a single array element, so
1650          * swab every element.
1651          */
1652         LASSERT((len % field->rmf_size) == 0);
1653         for (p = value, i = 0, n = len / field->rmf_size;
1654              i < n;
1655              i++, p += field->rmf_size) {
1656                 if (dump && field->rmf_dumper) {
1657                         CDEBUG(D_RPCTRACE, "Dump of %sarray field %s, "
1658                                "element %d follows\n",
1659                                do_swab ? "unswabbed " : "", field->rmf_name, i);
1660                         field->rmf_dumper(p);
1661                 }
1662                 if (!do_swab)
1663                         continue;
1664                 swabber(p);
1665                 if (dump && field->rmf_dumper) {
1666                         CDEBUG(D_RPCTRACE, "Dump of swabbed array field %s, "
1667                                "element %d follows\n", field->rmf_name, i);
1668                         field->rmf_dumper(value);
1669                 }
1670         }
1671         if (do_swab)
1672                 ptlrpc_buf_set_swabbed(pill->rc_req, inout, offset);
1673 }
1674
1675 /**
1676  * Returns the pointer to a PTLRPC request or reply (\a loc) buffer of a \a pill
1677  * corresponding to the given RMF (\a field).
1678  *
1679  * The buffer will be swabbed using the given \a swabber.  If \a swabber == NULL
1680  * then the \a rmf_swabber from the RMF will be used.  Soon there will be no
1681  * calls to __req_capsule_get() with a non-NULL \a swabber; \a swabber will then
1682  * be removed.  Fields with the \a RMF_F_STRUCT_ARRAY flag set will have each
1683  * element of the array swabbed.
1684  */
1685 static void *__req_capsule_get(struct req_capsule *pill,
1686                                const struct req_msg_field *field,
1687                                enum req_location loc,
1688                                void (*swabber)( void *),
1689                                int dump)
1690 {
1691         const struct req_format *fmt;
1692         struct lustre_msg       *msg;
1693         void                    *value;
1694         int                      len;
1695         int                      offset;
1696
1697         void *(*getter)(struct lustre_msg *m, int n, int minlen);
1698
1699         static const char *rcl_names[RCL_NR] = {
1700                 [RCL_CLIENT] = "client",
1701                 [RCL_SERVER] = "server"
1702         };
1703
1704         LASSERT(pill != NULL);
1705         LASSERT(pill != LP_POISON);
1706         fmt = pill->rc_fmt;
1707         LASSERT(fmt != NULL);
1708         LASSERT(fmt != LP_POISON);
1709         LASSERT(__req_format_is_sane(fmt));
1710
1711         offset = __req_capsule_offset(pill, field, loc);
1712
1713         msg = __req_msg(pill, loc);
1714         LASSERT(msg != NULL);
1715
1716         getter = (field->rmf_flags & RMF_F_STRING) ?
1717                 (typeof(getter))lustre_msg_string : lustre_msg_buf;
1718
1719         if (field->rmf_flags & RMF_F_STRUCT_ARRAY) {
1720                 /*
1721                  * We've already asserted that field->rmf_size > 0 in
1722                  * req_layout_init().
1723                  */
1724                 len = lustre_msg_buflen(msg, offset);
1725                 if ((len % field->rmf_size) != 0) {
1726                         CERROR("%s: array field size mismatch "
1727                                "%d modulo %d != 0 (%d)\n",
1728                                field->rmf_name, len, field->rmf_size, loc);
1729                         return NULL;
1730                 }
1731         } else if (pill->rc_area[loc][offset] != -1) {
1732                 len = pill->rc_area[loc][offset];
1733         } else {
1734                 len = max(field->rmf_size, 0);
1735         }
1736         value = getter(msg, offset, len);
1737
1738         if (value == NULL) {
1739                 DEBUG_REQ(D_ERROR, pill->rc_req,
1740                           "Wrong buffer for field `%s' (%d of %d) "
1741                           "in format `%s': %d vs. %d (%s)\n",
1742                           field->rmf_name, offset, lustre_msg_bufcount(msg),
1743                           fmt->rf_name, lustre_msg_buflen(msg, offset), len,
1744                           rcl_names[loc]);
1745         } else {
1746                 swabber_dumper_helper(pill, field, loc, offset, value, len,
1747                                       dump, swabber);
1748         }
1749
1750         return value;
1751 }
1752
1753 /**
1754  * Dump a request and/or reply
1755  */
1756 void __req_capsule_dump(struct req_capsule *pill, enum req_location loc)
1757 {
1758         const struct    req_format *fmt;
1759         const struct    req_msg_field *field;
1760         int             len;
1761         int             i;
1762
1763         fmt = pill->rc_fmt;
1764
1765         DEBUG_REQ(D_RPCTRACE, pill->rc_req, "BEGIN REQ CAPSULE DUMP\n");
1766         for (i = 0; i < fmt->rf_fields[loc].nr; ++i) {
1767                 field = FMT_FIELD(fmt, loc, i);
1768                 if (field->rmf_dumper == NULL) {
1769                         /*
1770                          * FIXME Add a default hex dumper for fields that don't
1771                          * have a specific dumper
1772                          */
1773                         len = req_capsule_get_size(pill, field, loc);
1774                         CDEBUG(D_RPCTRACE, "Field %s has no dumper function;"
1775                                "field size is %d\n", field->rmf_name, len);
1776                 } else {
1777                         /* It's the dumping side-effect that we're interested in */
1778                         (void) __req_capsule_get(pill, field, loc, NULL, 1);
1779                 }
1780         }
1781         CDEBUG(D_RPCTRACE, "END REQ CAPSULE DUMP\n");
1782 }
1783
1784 /**
1785  * Dump a request.
1786  */
1787 void req_capsule_client_dump(struct req_capsule *pill)
1788 {
1789         __req_capsule_dump(pill, RCL_CLIENT);
1790 }
1791 EXPORT_SYMBOL(req_capsule_client_dump);
1792
1793 /**
1794  * Dump a reply
1795  */
1796 void req_capsule_server_dump(struct req_capsule *pill)
1797 {
1798         __req_capsule_dump(pill, RCL_SERVER);
1799 }
1800 EXPORT_SYMBOL(req_capsule_server_dump);
1801
1802 /**
1803  * Trivial wrapper around __req_capsule_get(), that returns the PTLRPC request
1804  * buffer corresponding to the given RMF (\a field) of a \a pill.
1805  */
1806 void *req_capsule_client_get(struct req_capsule *pill,
1807                              const struct req_msg_field *field)
1808 {
1809         return __req_capsule_get(pill, field, RCL_CLIENT, NULL, 0);
1810 }
1811 EXPORT_SYMBOL(req_capsule_client_get);
1812
1813 /**
1814  * Same as req_capsule_client_get(), but with a \a swabber argument.
1815  *
1816  * Currently unused; will be removed when req_capsule_server_swab_get() is
1817  * unused too.
1818  */
1819 void *req_capsule_client_swab_get(struct req_capsule *pill,
1820                                   const struct req_msg_field *field,
1821                                   void (*swabber)(void* ))
1822 {
1823         return __req_capsule_get(pill, field, RCL_CLIENT, swabber, 0);
1824 }
1825 EXPORT_SYMBOL(req_capsule_client_swab_get);
1826
1827 /**
1828  * Utility that combines req_capsule_set_size() and req_capsule_client_get().
1829  *
1830  * First the \a pill's request \a field's size is set (\a rc_area) using
1831  * req_capsule_set_size() with the given \a len.  Then the actual buffer is
1832  * returned.
1833  */
1834 void *req_capsule_client_sized_get(struct req_capsule *pill,
1835                                    const struct req_msg_field *field,
1836                                    int len)
1837 {
1838         req_capsule_set_size(pill, field, RCL_CLIENT, len);
1839         return __req_capsule_get(pill, field, RCL_CLIENT, NULL, 0);
1840 }
1841 EXPORT_SYMBOL(req_capsule_client_sized_get);
1842
1843 /**
1844  * Trivial wrapper around __req_capsule_get(), that returns the PTLRPC reply
1845  * buffer corresponding to the given RMF (\a field) of a \a pill.
1846  */
1847 void *req_capsule_server_get(struct req_capsule *pill,
1848                              const struct req_msg_field *field)
1849 {
1850         return __req_capsule_get(pill, field, RCL_SERVER, NULL, 0);
1851 }
1852 EXPORT_SYMBOL(req_capsule_server_get);
1853
1854 /**
1855  * Same as req_capsule_server_get(), but with a \a swabber argument.
1856  *
1857  * Ideally all swabbing should be done pursuant to RMF definitions, with no
1858  * swabbing done outside this capsule abstraction.
1859  */
1860 void *req_capsule_server_swab_get(struct req_capsule *pill,
1861                                   const struct req_msg_field *field,
1862                                   void *swabber)
1863 {
1864         return __req_capsule_get(pill, field, RCL_SERVER, swabber, 0);
1865 }
1866 EXPORT_SYMBOL(req_capsule_server_swab_get);
1867
1868 /**
1869  * Utility that combines req_capsule_set_size() and req_capsule_server_get().
1870  *
1871  * First the \a pill's request \a field's size is set (\a rc_area) using
1872  * req_capsule_set_size() with the given \a len.  Then the actual buffer is
1873  * returned.
1874  */
1875 void *req_capsule_server_sized_get(struct req_capsule *pill,
1876                                    const struct req_msg_field *field,
1877                                    int len)
1878 {
1879         req_capsule_set_size(pill, field, RCL_SERVER, len);
1880         return __req_capsule_get(pill, field, RCL_SERVER, NULL, 0);
1881 }
1882 EXPORT_SYMBOL(req_capsule_server_sized_get);
1883
1884 /**
1885  * Returns the buffer of a \a pill corresponding to the given \a field from the
1886  * request (if the caller is executing on the server-side) or reply (if the
1887  * caller is executing on the client-side).
1888  *
1889  * This function convienient for use is code that could be executed on the
1890  * client and server alike.
1891  */
1892 const void *req_capsule_other_get(struct req_capsule *pill,
1893                                   const struct req_msg_field *field)
1894 {
1895         return __req_capsule_get(pill, field, pill->rc_loc ^ 1, NULL, 0);
1896 }
1897 EXPORT_SYMBOL(req_capsule_other_get);
1898
1899 /**
1900  * Set the size of the PTLRPC request/reply (\a loc) buffer for the given \a
1901  * field of the given \a pill.
1902  *
1903  * This function must be used when constructing variable sized fields of a
1904  * request or reply.
1905  */
1906 void req_capsule_set_size(struct req_capsule *pill,
1907                           const struct req_msg_field *field,
1908                           enum req_location loc, int size)
1909 {
1910         LASSERT(loc == RCL_SERVER || loc == RCL_CLIENT);
1911
1912         if ((size != field->rmf_size) &&
1913             (field->rmf_size != -1) &&
1914             !(field->rmf_flags & RMF_F_NO_SIZE_CHECK) &&
1915             (size > 0)) {
1916                 if ((field->rmf_flags & RMF_F_STRUCT_ARRAY) &&
1917                     (size % field->rmf_size != 0)) {
1918                         CERROR("%s: array field size mismatch "
1919                                "%d %% %d != 0 (%d)\n",
1920                                field->rmf_name, size, field->rmf_size, loc);
1921                         LBUG();
1922                 } else if (!(field->rmf_flags & RMF_F_STRUCT_ARRAY) &&
1923                     size < field->rmf_size) {
1924                         CERROR("%s: field size mismatch %d != %d (%d)\n",
1925                                field->rmf_name, size, field->rmf_size, loc);
1926                         LBUG();
1927                 }
1928         }
1929
1930         pill->rc_area[loc][__req_capsule_offset(pill, field, loc)] = size;
1931 }
1932 EXPORT_SYMBOL(req_capsule_set_size);
1933
1934 /**
1935  * Return the actual PTLRPC buffer length of a request or reply (\a loc)
1936  * for the given \a pill's given \a field.
1937  *
1938  * NB: this function doesn't correspond with req_capsule_set_size(), which
1939  * actually sets the size in pill.rc_area[loc][offset], but this function
1940  * returns the message buflen[offset], maybe we should use another name.
1941  */
1942 int req_capsule_get_size(const struct req_capsule *pill,
1943                          const struct req_msg_field *field,
1944                          enum req_location loc)
1945 {
1946         LASSERT(loc == RCL_SERVER || loc == RCL_CLIENT);
1947
1948         return lustre_msg_buflen(__req_msg(pill, loc),
1949                                  __req_capsule_offset(pill, field, loc));
1950 }
1951 EXPORT_SYMBOL(req_capsule_get_size);
1952
1953 /**
1954  * Wrapper around lustre_msg_size() that returns the PTLRPC size needed for the
1955  * given \a pill's request or reply (\a loc) given the field size recorded in
1956  * the \a pill's rc_area.
1957  *
1958  * See also req_capsule_set_size().
1959  */
1960 int req_capsule_msg_size(struct req_capsule *pill, enum req_location loc)
1961 {
1962         return lustre_msg_size(pill->rc_req->rq_import->imp_msg_magic,
1963                                pill->rc_fmt->rf_fields[loc].nr,
1964                                pill->rc_area[loc]);
1965 }
1966
1967 /**
1968  * While req_capsule_msg_size() computes the size of a PTLRPC request or reply
1969  * (\a loc) given a \a pill's \a rc_area, this function computes the size of a
1970  * PTLRPC request or reply given only an RQF (\a fmt).
1971  *
1972  * This function should not be used for formats which contain variable size
1973  * fields.
1974  */
1975 int req_capsule_fmt_size(__u32 magic, const struct req_format *fmt,
1976                          enum req_location loc)
1977 {
1978         int size, i = 0;
1979
1980         /*
1981          * This function should probably LASSERT() that fmt has no fields with
1982          * RMF_F_STRUCT_ARRAY in rmf_flags, since we can't know here how many
1983          * elements in the array there will ultimately be, but then, we could
1984          * assume that there will be at least one element, and that's just what
1985          * we do.
1986          */
1987         size = lustre_msg_hdr_size(magic, fmt->rf_fields[loc].nr);
1988         if (size < 0)
1989                 return size;
1990
1991         for (; i < fmt->rf_fields[loc].nr; ++i)
1992                 if (fmt->rf_fields[loc].d[i]->rmf_size != -1)
1993                         size += cfs_size_round(fmt->rf_fields[loc].d[i]->
1994                                                rmf_size);
1995         return size;
1996 }
1997
1998 /**
1999  * Changes the format of an RPC.
2000  *
2001  * The pill must already have been initialized, which means that it already has
2002  * a request format.  The new format \a fmt must be an extension of the pill's
2003  * old format.  Specifically: the new format must have as many request and reply
2004  * fields as the old one, and all fields shared by the old and new format must
2005  * be at least as large in the new format.
2006  *
2007  * The new format's fields may be of different "type" than the old format, but
2008  * only for fields that are "opaque" blobs: fields which have a) have no
2009  * \a rmf_swabber, b) \a rmf_flags == 0 or RMF_F_NO_SIZE_CHECK, and c) \a
2010  * rmf_size == -1 or \a rmf_flags == RMF_F_NO_SIZE_CHECK.  For example,
2011  * OBD_SET_INFO has a key field and an opaque value field that gets interpreted
2012  * according to the key field.  When the value, according to the key, contains a
2013  * structure (or array thereof) to be swabbed, the format should be changed to
2014  * one where the value field has \a rmf_size/rmf_flags/rmf_swabber set
2015  * accordingly.
2016  */
2017 void req_capsule_extend(struct req_capsule *pill, const struct req_format *fmt)
2018 {
2019         int i;
2020         int j;
2021
2022         const struct req_format *old;
2023
2024         LASSERT(pill->rc_fmt != NULL);
2025         LASSERT(__req_format_is_sane(fmt));
2026
2027         old = pill->rc_fmt;
2028         /*
2029          * Sanity checking...
2030          */
2031         for (i = 0; i < RCL_NR; ++i) {
2032                 LASSERT(fmt->rf_fields[i].nr >= old->rf_fields[i].nr);
2033                 for (j = 0; j < old->rf_fields[i].nr - 1; ++j) {
2034                         const struct req_msg_field *ofield = FMT_FIELD(old, i, j);
2035
2036                         /* "opaque" fields can be transmogrified */
2037                         if (ofield->rmf_swabber == NULL &&
2038                             (ofield->rmf_flags & ~RMF_F_NO_SIZE_CHECK) == 0 &&
2039                             (ofield->rmf_size == -1 ||
2040                             ofield->rmf_flags == RMF_F_NO_SIZE_CHECK))
2041                                 continue;
2042                         LASSERT(FMT_FIELD(fmt, i, j) == FMT_FIELD(old, i, j));
2043                 }
2044                 /*
2045                  * Last field in old format can be shorter than in new.
2046                  */
2047                 LASSERT(FMT_FIELD(fmt, i, j)->rmf_size >=
2048                         FMT_FIELD(old, i, j)->rmf_size);
2049         }
2050
2051         pill->rc_fmt = fmt;
2052 }
2053 EXPORT_SYMBOL(req_capsule_extend);
2054
2055 /**
2056  * This function returns a non-zero value if the given \a field is present in
2057  * the format (\a rc_fmt) of \a pill's PTLRPC request or reply (\a loc), else it
2058  * returns 0.
2059  */
2060 int req_capsule_has_field(const struct req_capsule *pill,
2061                           const struct req_msg_field *field,
2062                           enum req_location loc)
2063 {
2064         LASSERT(loc == RCL_SERVER || loc == RCL_CLIENT);
2065
2066         return field->rmf_offset[pill->rc_fmt->rf_idx][loc];
2067 }
2068 EXPORT_SYMBOL(req_capsule_has_field);
2069
2070 /**
2071  * Returns a non-zero value if the given \a field is present in the given \a
2072  * pill's PTLRPC request or reply (\a loc), else it returns 0.
2073  */
2074 int req_capsule_field_present(const struct req_capsule *pill,
2075                               const struct req_msg_field *field,
2076                               enum req_location loc)
2077 {
2078         int offset;
2079
2080         LASSERT(loc == RCL_SERVER || loc == RCL_CLIENT);
2081         LASSERT(req_capsule_has_field(pill, field, loc));
2082
2083         offset = __req_capsule_offset(pill, field, loc);
2084         return lustre_msg_bufcount(__req_msg(pill, loc)) > offset;
2085 }
2086 EXPORT_SYMBOL(req_capsule_field_present);
2087
2088 /**
2089  * This function shrinks the size of the _buffer_ of the \a pill's PTLRPC
2090  * request or reply (\a loc).
2091  *
2092  * This is not the opposite of req_capsule_extend().
2093  */
2094 void req_capsule_shrink(struct req_capsule *pill,
2095                         const struct req_msg_field *field,
2096                         unsigned int newlen,
2097                         enum req_location loc)
2098 {
2099         const struct req_format *fmt;
2100         struct lustre_msg       *msg;
2101         int                      len;
2102         int                      offset;
2103
2104         fmt = pill->rc_fmt;
2105         LASSERT(fmt != NULL);
2106         LASSERT(__req_format_is_sane(fmt));
2107         LASSERT(req_capsule_has_field(pill, field, loc));
2108         LASSERT(req_capsule_field_present(pill, field, loc));
2109
2110         offset = __req_capsule_offset(pill, field, loc);
2111
2112         msg = __req_msg(pill, loc);
2113         len = lustre_msg_buflen(msg, offset);
2114         LASSERTF(newlen <= len, "%s:%s, oldlen=%d, newlen=%d\n",
2115                                 fmt->rf_name, field->rmf_name, len, newlen);
2116
2117         if (loc == RCL_CLIENT)
2118                 pill->rc_req->rq_reqlen = lustre_shrink_msg(msg, offset, newlen,
2119                                                             1);
2120         else
2121                 pill->rc_req->rq_replen = lustre_shrink_msg(msg, offset, newlen,
2122                                                             1);
2123 }
2124 EXPORT_SYMBOL(req_capsule_shrink);
2125
2126 int req_capsule_server_grow(struct req_capsule *pill,
2127                             const struct req_msg_field *field,
2128                             unsigned int newlen)
2129 {
2130         struct ptlrpc_reply_state *rs = pill->rc_req->rq_reply_state, *nrs;
2131         char *from, *to;
2132         int offset, len, rc;
2133
2134         LASSERT(pill->rc_fmt != NULL);
2135         LASSERT(__req_format_is_sane(pill->rc_fmt));
2136         LASSERT(req_capsule_has_field(pill, field, RCL_SERVER));
2137         LASSERT(req_capsule_field_present(pill, field, RCL_SERVER));
2138
2139         len = req_capsule_get_size(pill, field, RCL_SERVER);
2140         offset = __req_capsule_offset(pill, field, RCL_SERVER);
2141         if (pill->rc_req->rq_repbuf_len >=
2142             lustre_packed_msg_size(pill->rc_req->rq_repmsg) - len + newlen)
2143                 CERROR("Inplace repack might be done\n");
2144
2145         pill->rc_req->rq_reply_state = NULL;
2146         req_capsule_set_size(pill, field, RCL_SERVER, newlen);
2147         rc = req_capsule_server_pack(pill);
2148         if (rc) {
2149                 /* put old rs back, the caller will decide what to do */
2150                 pill->rc_req->rq_reply_state = rs;
2151                 return rc;
2152         }
2153         nrs = pill->rc_req->rq_reply_state;
2154         /* Now we need only buffers, copy first chunk */
2155         to = lustre_msg_buf(nrs->rs_msg, 0, 0);
2156         from = lustre_msg_buf(rs->rs_msg, 0, 0);
2157         len = (char *)lustre_msg_buf(rs->rs_msg, offset, 0) - from;
2158         memcpy(to, from, len);
2159         /* check if we have tail and copy it too */
2160         if (rs->rs_msg->lm_bufcount > offset + 1) {
2161                 to = lustre_msg_buf(nrs->rs_msg, offset + 1, 0);
2162                 from = lustre_msg_buf(rs->rs_msg, offset + 1, 0);
2163                 offset = rs->rs_msg->lm_bufcount - 1;
2164                 len = (char *)lustre_msg_buf(rs->rs_msg, offset, 0) +
2165                       cfs_size_round(rs->rs_msg->lm_buflens[offset]) - from;
2166                 memcpy(to, from, len);
2167         }
2168         /* drop old reply if everything is fine */
2169         if (rs->rs_difficult) {
2170                 /* copy rs data */
2171                 int i;
2172
2173                 nrs->rs_difficult = 1;
2174                 nrs->rs_no_ack = rs->rs_no_ack;
2175                 for (i = 0; i < rs->rs_nlocks; i++) {
2176                         nrs->rs_locks[i] = rs->rs_locks[i];
2177                         nrs->rs_modes[i] = rs->rs_modes[i];
2178                         nrs->rs_nlocks++;
2179                 }
2180                 rs->rs_nlocks = 0;
2181                 rs->rs_difficult = 0;
2182                 rs->rs_no_ack = 0;
2183         }
2184         ptlrpc_rs_decref(rs);
2185         return 0;
2186 }
2187 EXPORT_SYMBOL(req_capsule_server_grow);
2188 /* __REQ_LAYOUT_USER__ */
2189 #endif