Whamcloud - gitweb
b=16098
[fs/lustre-release.git] / lustre / ptlrpc / layout.c
1 /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
2  * vim:expandtab:shiftwidth=8:tabstop=8:
3  *
4  * GPL HEADER START
5  *
6  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License version 2 only,
10  * as published by the Free Software Foundation.
11  *
12  * This program is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * General Public License version 2 for more details (a copy is included
16  * in the LICENSE file that accompanied this code).
17  *
18  * You should have received a copy of the GNU General Public License
19  * version 2 along with this program; If not, see
20  * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
21  *
22  * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
23  * CA 95054 USA or visit www.sun.com if you need additional information or
24  * have any questions.
25  *
26  * GPL HEADER END
27  */
28 /*
29  * Copyright  2008 Sun Microsystems, Inc. All rights reserved
30  * Use is subject to license terms.
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 #if !defined(__REQ_LAYOUT_USER__)
44
45 #ifndef EXPORT_SYMTAB
46 # define EXPORT_SYMTAB
47 #endif
48 #define DEBUG_SUBSYSTEM S_RPC
49
50 #ifdef __KERNEL__
51 #include <linux/module.h>
52 #else
53 # include <liblustre.h>
54 #endif
55
56 /* LUSTRE_VERSION_CODE */
57 #include <lustre_ver.h>
58
59 #include <obd_support.h>
60 /* lustre_swab_mdt_body */
61 #include <lustre/lustre_idl.h>
62 /* obd2cli_tgt() (required by DEBUG_REQ()) */
63 #include <obd.h>
64
65 /* __REQ_LAYOUT_USER__ */
66 #endif
67 /* struct ptlrpc_request, lustre_msg* */
68 #include <lustre_req_layout.h>
69 #include <linux/lustre_acl.h>
70
71 /*
72  * empty set of fields... for suitable definition of emptiness.
73  */
74 static const struct req_msg_field *empty[] = {
75         &RMF_PTLRPC_BODY
76 };
77
78 static const struct req_msg_field *mgs_target_info_only[] = {
79         &RMF_PTLRPC_BODY,
80         &RMF_MGS_TARGET_INFO
81 };
82
83 static const struct req_msg_field *mgs_set_info[] = {
84         &RMF_PTLRPC_BODY,
85         &RMF_MGS_SEND_PARAM
86 };
87
88 static const struct req_msg_field *log_cancel_client[] = {
89         &RMF_PTLRPC_BODY,
90         &RMF_LOGCOOKIES
91 };
92
93 static const struct req_msg_field *mdt_body_only[] = {
94         &RMF_PTLRPC_BODY,
95         &RMF_MDT_BODY
96 };
97
98 static const struct req_msg_field *mdt_body_capa[] = {
99         &RMF_PTLRPC_BODY,
100         &RMF_MDT_BODY,
101         &RMF_CAPA1
102 };
103
104 static const struct req_msg_field *quotactl_only[] = {
105         &RMF_PTLRPC_BODY,
106         &RMF_OBD_QUOTACTL
107 };
108
109 static const struct req_msg_field *qunit_data_only[] = {
110         &RMF_PTLRPC_BODY,
111         &RMF_QUNIT_DATA
112 };
113
114 static const struct req_msg_field *mdt_close_client[] = {
115         &RMF_PTLRPC_BODY,
116         &RMF_MDT_EPOCH,
117         &RMF_REC_REINT,
118         &RMF_CAPA1
119 };
120
121 static const struct req_msg_field *obd_statfs_server[] = {
122         &RMF_PTLRPC_BODY,
123         &RMF_OBD_STATFS
124 };
125
126 static const struct req_msg_field *seq_query_client[] = {
127         &RMF_PTLRPC_BODY,
128         &RMF_SEQ_OPC,
129         &RMF_SEQ_RANGE
130 };
131
132 static const struct req_msg_field *seq_query_server[] = {
133         &RMF_PTLRPC_BODY,
134         &RMF_SEQ_RANGE
135 };
136
137 static const struct req_msg_field *fld_query_client[] = {
138         &RMF_PTLRPC_BODY,
139         &RMF_FLD_OPC,
140         &RMF_FLD_MDFLD
141 };
142
143 static const struct req_msg_field *fld_query_server[] = {
144         &RMF_PTLRPC_BODY,
145         &RMF_FLD_MDFLD
146 };
147
148 static const struct req_msg_field *mds_getattr_name_client[] = {
149         &RMF_PTLRPC_BODY,
150         &RMF_MDT_BODY,
151         &RMF_CAPA1,
152         &RMF_NAME
153 };
154
155 static const struct req_msg_field *mds_reint_client[] = {
156         &RMF_PTLRPC_BODY,
157         &RMF_REC_REINT
158 };
159
160 static const struct req_msg_field *mds_reint_create_client[] = {
161         &RMF_PTLRPC_BODY,
162         &RMF_REC_REINT,
163         &RMF_CAPA1,
164         &RMF_NAME
165 };
166
167 static const struct req_msg_field *mds_reint_create_slave_client[] = {
168         &RMF_PTLRPC_BODY,
169         &RMF_REC_REINT,
170         &RMF_CAPA1,
171         &RMF_NAME,
172         &RMF_EADATA,
173         &RMF_DLM_REQ
174 };
175
176 static const struct req_msg_field *mds_reint_create_rmt_acl_client[] = {
177         &RMF_PTLRPC_BODY,
178         &RMF_REC_REINT,
179         &RMF_CAPA1,
180         &RMF_NAME,
181         &RMF_EADATA,
182         &RMF_DLM_REQ
183 };
184
185 static const struct req_msg_field *mds_reint_create_sym_client[] = {
186         &RMF_PTLRPC_BODY,
187         &RMF_REC_REINT,
188         &RMF_CAPA1,
189         &RMF_NAME,
190         &RMF_SYMTGT,
191         &RMF_DLM_REQ
192 };
193
194 static const struct req_msg_field *mds_reint_open_client[] = {
195         &RMF_PTLRPC_BODY,
196         &RMF_REC_REINT,
197         &RMF_CAPA1,
198         &RMF_CAPA2,
199         &RMF_NAME,
200         &RMF_EADATA
201 };
202
203 static const struct req_msg_field *mds_reint_open_server[] = {
204         &RMF_PTLRPC_BODY,
205         &RMF_MDT_BODY,
206         &RMF_MDT_MD,
207         &RMF_ACL,
208         &RMF_CAPA1,
209         &RMF_CAPA2
210 };
211
212 static const struct req_msg_field *mds_reint_unlink_client[] = {
213         &RMF_PTLRPC_BODY,
214         &RMF_REC_REINT,
215         &RMF_CAPA1,
216         &RMF_NAME,
217         &RMF_DLM_REQ
218 };
219
220 static const struct req_msg_field *mds_reint_link_client[] = {
221         &RMF_PTLRPC_BODY,
222         &RMF_REC_REINT,
223         &RMF_CAPA1,
224         &RMF_CAPA2,
225         &RMF_NAME,
226         &RMF_DLM_REQ
227 };
228
229 static const struct req_msg_field *mds_reint_rename_client[] = {
230         &RMF_PTLRPC_BODY,
231         &RMF_REC_REINT,
232         &RMF_CAPA1,
233         &RMF_CAPA2,
234         &RMF_NAME,
235         &RMF_SYMTGT,
236         &RMF_DLM_REQ
237 };
238
239 static const struct req_msg_field *mds_last_unlink_server[] = {
240         &RMF_PTLRPC_BODY,
241         &RMF_MDT_BODY,
242         &RMF_MDT_MD,
243         &RMF_LOGCOOKIES
244 };
245
246 static const struct req_msg_field *mds_reint_setattr_client[] = {
247         &RMF_PTLRPC_BODY,
248         &RMF_REC_REINT,
249         &RMF_CAPA1,
250         &RMF_MDT_EPOCH,
251         &RMF_EADATA,
252         &RMF_LOGCOOKIES,
253         &RMF_DLM_REQ
254 };
255
256 static const struct req_msg_field *mds_reint_setxattr_client[] = {
257         &RMF_PTLRPC_BODY,
258         &RMF_REC_REINT,
259         &RMF_CAPA1,
260         &RMF_NAME,
261         &RMF_EADATA
262 };
263
264 static const struct req_msg_field *obd_connect_client[] = {
265         &RMF_PTLRPC_BODY,
266         &RMF_TGTUUID,
267         &RMF_CLUUID,
268         &RMF_CONN,
269         &RMF_CONNECT_DATA
270 };
271
272 static const struct req_msg_field *obd_connect_server[] = {
273         &RMF_PTLRPC_BODY,
274         &RMF_CONNECT_DATA
275 };
276
277 static const struct req_msg_field *mds_set_info_client[] = {
278         &RMF_PTLRPC_BODY,
279         &RMF_SETINFO_KEY,
280         &RMF_SETINFO_VAL
281 };
282
283 static const struct req_msg_field *ldlm_enqueue_client[] = {
284         &RMF_PTLRPC_BODY,
285         &RMF_DLM_REQ
286 };
287
288 static const struct req_msg_field *ldlm_enqueue_server[] = {
289         &RMF_PTLRPC_BODY,
290         &RMF_DLM_REP
291 };
292
293 static const struct req_msg_field *ldlm_enqueue_lvb_server[] = {
294         &RMF_PTLRPC_BODY,
295         &RMF_DLM_REP,
296         &RMF_DLM_LVB
297 };
298
299 static const struct req_msg_field *ldlm_cp_callback_client[] = {
300         &RMF_PTLRPC_BODY,
301         &RMF_DLM_REQ,
302         &RMF_DLM_LVB
303 };
304
305 static const struct req_msg_field *ldlm_gl_callback_server[] = {
306         &RMF_PTLRPC_BODY,
307         &RMF_DLM_LVB
308 };
309
310 static const struct req_msg_field *ldlm_intent_client[] = {
311         &RMF_PTLRPC_BODY,
312         &RMF_DLM_REQ,
313         &RMF_LDLM_INTENT,
314         &RMF_REC_REINT
315 };
316
317 static const struct req_msg_field *ldlm_intent_server[] = {
318         &RMF_PTLRPC_BODY,
319         &RMF_DLM_REP,
320         &RMF_MDT_BODY,
321         &RMF_MDT_MD,
322         &RMF_ACL
323 };
324
325 static const struct req_msg_field *ldlm_intent_open_server[] = {
326         &RMF_PTLRPC_BODY,
327         &RMF_DLM_REP,
328         &RMF_MDT_BODY,
329         &RMF_MDT_MD,
330         &RMF_ACL,
331         &RMF_CAPA1,
332         &RMF_CAPA2
333 };
334
335 static const struct req_msg_field *ldlm_intent_getattr_client[] = {
336         &RMF_PTLRPC_BODY,
337         &RMF_DLM_REQ,
338         &RMF_LDLM_INTENT,
339         &RMF_MDT_BODY,     /* coincides with mds_getattr_name_client[] */
340         &RMF_CAPA1,
341         &RMF_NAME
342 };
343
344 static const struct req_msg_field *ldlm_intent_getattr_server[] = {
345         &RMF_PTLRPC_BODY,
346         &RMF_DLM_REP,
347         &RMF_MDT_BODY,
348         &RMF_MDT_MD,
349         &RMF_ACL,
350         &RMF_CAPA1
351 };
352
353 static const struct req_msg_field *ldlm_intent_create_client[] = {
354         &RMF_PTLRPC_BODY,
355         &RMF_DLM_REQ,
356         &RMF_LDLM_INTENT,
357         &RMF_REC_REINT,    /* coincides with mds_reint_create_client[] */
358         &RMF_CAPA1,
359         &RMF_NAME,
360         &RMF_EADATA
361 };
362
363 static const struct req_msg_field *ldlm_intent_open_client[] = {
364         &RMF_PTLRPC_BODY,
365         &RMF_DLM_REQ,
366         &RMF_LDLM_INTENT,
367         &RMF_REC_REINT,    /* coincides with mds_reint_open_client[] */
368         &RMF_CAPA1,
369         &RMF_CAPA2,
370         &RMF_NAME,
371         &RMF_EADATA,
372         &RMF_REC_JOINFILE
373 };
374
375 static const struct req_msg_field *ldlm_intent_unlink_client[] = {
376         &RMF_PTLRPC_BODY,
377         &RMF_DLM_REQ,
378         &RMF_LDLM_INTENT,
379         &RMF_REC_REINT,    /* coincides with mds_reint_unlink_client[] */
380         &RMF_CAPA1,
381         &RMF_NAME
382 };
383
384 static const struct req_msg_field *mds_getxattr_client[] = {
385         &RMF_PTLRPC_BODY,
386         &RMF_MDT_BODY,
387         &RMF_CAPA1,
388         &RMF_NAME,
389         &RMF_EADATA
390 };
391
392 static const struct req_msg_field *mds_getxattr_server[] = {
393         &RMF_PTLRPC_BODY,
394         &RMF_MDT_BODY,
395         &RMF_EADATA
396 };
397
398 static const struct req_msg_field *mds_getattr_server[] = {
399         &RMF_PTLRPC_BODY,
400         &RMF_MDT_BODY,
401         &RMF_MDT_MD,
402         &RMF_ACL,
403         &RMF_CAPA1,
404         &RMF_CAPA2
405 };
406
407 static const struct req_msg_field *mds_setattr_server[] = {
408         &RMF_PTLRPC_BODY,
409         &RMF_MDT_BODY,
410         &RMF_MDT_MD,
411         &RMF_ACL,
412         &RMF_CAPA1,
413         &RMF_CAPA2
414 };
415
416 static const struct req_msg_field *llog_catinfo_client[] = {
417         &RMF_PTLRPC_BODY,
418         &RMF_NAME,
419         &RMF_STRING
420 };
421
422 static const struct req_msg_field *llog_catinfo_server[] = {
423         &RMF_PTLRPC_BODY,
424         &RMF_STRING
425 };
426
427 static const struct req_msg_field *llog_origin_handle_create_client[] = {
428         &RMF_PTLRPC_BODY,
429         &RMF_LLOGD_BODY,
430         &RMF_NAME
431 };
432
433 static const struct req_msg_field *llogd_body_only[] = {
434         &RMF_PTLRPC_BODY,
435         &RMF_LLOGD_BODY
436 };
437
438 static const struct req_msg_field *llog_log_hdr_only[] = {
439         &RMF_PTLRPC_BODY,
440         &RMF_LLOG_LOG_HDR
441 };
442
443 static const struct req_msg_field *llogd_conn_body_only[] = {
444         &RMF_PTLRPC_BODY,
445         &RMF_LLOGD_CONN_BODY
446 };
447
448 static const struct req_msg_field *llog_origin_handle_next_block_server[] = {
449         &RMF_PTLRPC_BODY,
450         &RMF_LLOGD_BODY,
451         &RMF_EADATA
452 };
453
454 static const struct req_msg_field *ost_body_only[] = {
455         &RMF_PTLRPC_BODY,
456         &RMF_OST_BODY
457 };
458
459 static const struct req_msg_field *ost_body_capa[] = {
460         &RMF_PTLRPC_BODY,
461         &RMF_OST_BODY,
462         &RMF_CAPA1
463 };
464
465 static const struct req_msg_field *ost_destroy_client[] = {
466         &RMF_PTLRPC_BODY,
467         &RMF_OST_BODY,
468         &RMF_DLM_REQ
469 };
470
471
472 static const struct req_msg_field *ost_brw_client[] = {
473         &RMF_PTLRPC_BODY,
474         &RMF_OST_BODY,
475         &RMF_OBD_IOOBJ,
476         &RMF_NIOBUF_REMOTE,
477         &RMF_CAPA1
478 };
479
480 static const struct req_msg_field *ost_brw_server[] = {
481         &RMF_PTLRPC_BODY,
482         &RMF_OST_BODY,
483         &RMF_NIOBUF_REMOTE
484 };
485
486 static const struct req_msg_field *ost_set_info_client[] = {
487         &RMF_PTLRPC_BODY,
488         &RMF_SETINFO_KEY,
489         &RMF_SETINFO_VAL
490 };
491
492 static const struct req_msg_field *ost_get_info_generic_server[] = {
493         &RMF_PTLRPC_BODY,
494         &RMF_GENERIC_DATA,
495 };
496
497 static const struct req_msg_field *ost_get_info_generic_client[] = {
498         &RMF_PTLRPC_BODY,
499         &RMF_SETINFO_KEY
500 };
501
502 static const struct req_msg_field *ost_get_last_id_server[] = {
503         &RMF_PTLRPC_BODY,
504         &RMF_OBD_ID
505 };
506
507 static const struct req_format *req_formats[] = {
508         &RQF_OBD_PING,
509         &RQF_SEC_CTX,
510         &RQF_SEQ_QUERY,
511         &RQF_FLD_QUERY,
512         &RQF_MGS_TARGET_REG,
513         &RQF_MGS_SET_INFO,
514         &RQF_MDS_CONNECT,
515         &RQF_MDS_DISCONNECT,
516         &RQF_MDS_SET_INFO,
517         &RQF_MDS_GETSTATUS,
518         &RQF_MDS_STATFS,
519         &RQF_MDS_GETATTR,
520         &RQF_MDS_GETATTR_NAME,
521         &RQF_MDS_GETXATTR,
522         &RQF_MDS_SYNC,
523         &RQF_MDS_CLOSE,
524         &RQF_MDS_PIN,
525         &RQF_MDS_UNPIN,
526         &RQF_MDS_READPAGE,
527         &RQF_MDS_WRITEPAGE,
528         &RQF_MDS_IS_SUBDIR,
529         &RQF_MDS_DONE_WRITING,
530         &RQF_MDS_REINT,
531         &RQF_MDS_REINT_CREATE,
532         &RQF_MDS_REINT_CREATE_RMT_ACL,
533         &RQF_MDS_REINT_CREATE_SLAVE,
534         &RQF_MDS_REINT_CREATE_SYM,
535         &RQF_MDS_REINT_OPEN,
536         &RQF_MDS_REINT_UNLINK,
537         &RQF_MDS_REINT_LINK,
538         &RQF_MDS_REINT_RENAME,
539         &RQF_MDS_REINT_SETATTR,
540         &RQF_MDS_REINT_SETXATTR,
541         &RQF_MDS_QUOTACHECK,
542         &RQF_MDS_QUOTACTL,
543         &RQF_MDS_QUOTA_DQACQ,
544         &RQF_OST_CONNECT,
545         &RQF_OST_DISCONNECT,
546         &RQF_OST_QUOTACHECK,
547         &RQF_OST_QUOTACTL,
548         &RQF_OST_GETATTR,
549         &RQF_OST_SETATTR,
550         &RQF_OST_CREATE,
551         &RQF_OST_PUNCH,
552         &RQF_OST_SYNC,
553         &RQF_OST_DESTROY,
554         &RQF_OST_BRW,
555         &RQF_OST_STATFS,
556         &RQF_OST_SET_INFO,
557         &RQF_OST_GET_INFO_GENERIC,
558         &RQF_OST_GET_INFO_LAST_ID,
559         &RQF_LDLM_ENQUEUE,
560         &RQF_LDLM_ENQUEUE_LVB,
561         &RQF_LDLM_CONVERT,
562         &RQF_LDLM_CANCEL,
563         &RQF_LDLM_CALLBACK,
564         &RQF_LDLM_CP_CALLBACK,
565         &RQF_LDLM_BL_CALLBACK,
566         &RQF_LDLM_GL_CALLBACK,
567         &RQF_LDLM_INTENT,
568         &RQF_LDLM_INTENT_GETATTR,
569         &RQF_LDLM_INTENT_OPEN,
570         &RQF_LDLM_INTENT_CREATE,
571         &RQF_LDLM_INTENT_UNLINK,
572         &RQF_LOG_CANCEL,
573         &RQF_LLOG_CATINFO,
574         &RQF_LLOG_ORIGIN_HANDLE_CREATE,
575         &RQF_LLOG_ORIGIN_HANDLE_DESTROY,
576         &RQF_LLOG_ORIGIN_HANDLE_NEXT_BLOCK,
577         &RQF_LLOG_ORIGIN_HANDLE_PREV_BLOCK,
578         &RQF_LLOG_ORIGIN_HANDLE_READ_HEADER,
579         &RQF_LLOG_ORIGIN_CONNECT
580 };
581
582 struct req_msg_field {
583         __u32       rmf_flags;
584         const char *rmf_name;
585         /*
586          * Field length. (-1) means "variable length".
587          */
588         int         rmf_size;
589         void      (*rmf_swabber)(void *);
590         int         rmf_offset[ARRAY_SIZE(req_formats)][RCL_NR];
591 };
592
593 enum rmf_flags {
594         RMF_F_STRING = 1 << 0
595 };
596
597 struct req_capsule;
598
599 /*
600  * Request fields.
601  */
602 #define DEFINE_MSGF(name, flags, size, swabber) {       \
603         .rmf_name    = (name),                          \
604         .rmf_flags   = (flags),                         \
605         .rmf_size    = (size),                          \
606         .rmf_swabber = (void (*)(void*))(swabber)       \
607 }
608
609 const struct req_msg_field RMF_GENERIC_DATA =
610         DEFINE_MSGF("generic_data", 0,
611                     -1, NULL);
612 EXPORT_SYMBOL(RMF_GENERIC_DATA);
613
614 const struct req_msg_field RMF_MGS_TARGET_INFO =
615         DEFINE_MSGF("mgs_target_info", 0,
616                     sizeof(struct mgs_target_info),
617                     lustre_swab_mgs_target_info);
618 EXPORT_SYMBOL(RMF_MGS_TARGET_INFO);
619
620 const struct req_msg_field RMF_MGS_SEND_PARAM =
621         DEFINE_MSGF("mgs_send_param", 0,
622                     sizeof(struct mgs_send_param),
623                     NULL);
624 EXPORT_SYMBOL(RMF_MGS_SEND_PARAM);
625
626 const struct req_msg_field RMF_SETINFO_VAL =
627         DEFINE_MSGF("setinfo_val", 0,
628                     sizeof(__u32), lustre_swab_generic_32s);
629 EXPORT_SYMBOL(RMF_SETINFO_VAL);
630
631 const struct req_msg_field RMF_SEQ_OPC =
632         DEFINE_MSGF("seq_query_opc", 0,
633                     sizeof(__u32), lustre_swab_generic_32s);
634 EXPORT_SYMBOL(RMF_SEQ_OPC);
635
636 const struct req_msg_field RMF_SEQ_RANGE =
637         DEFINE_MSGF("seq_query_range", 0,
638                     sizeof(struct lu_range), lustre_swab_lu_range);
639 EXPORT_SYMBOL(RMF_SEQ_RANGE);
640
641 const struct req_msg_field RMF_FLD_OPC =
642         DEFINE_MSGF("fld_query_opc", 0,
643                     sizeof(__u32), lustre_swab_generic_32s);
644 EXPORT_SYMBOL(RMF_FLD_OPC);
645
646 const struct req_msg_field RMF_FLD_MDFLD =
647         DEFINE_MSGF("fld_query_mdfld", 0,
648                     sizeof(struct md_fld), lustre_swab_md_fld);
649 EXPORT_SYMBOL(RMF_FLD_MDFLD);
650
651 const struct req_msg_field RMF_MDT_BODY =
652         DEFINE_MSGF("mdt_body", 0,
653                     sizeof(struct mdt_body), lustre_swab_mdt_body);
654 EXPORT_SYMBOL(RMF_MDT_BODY);
655
656 const struct req_msg_field RMF_OBD_QUOTACTL =
657         DEFINE_MSGF("obd_quotactl", 0,
658                     sizeof(struct obd_quotactl), lustre_swab_obd_quotactl);
659 EXPORT_SYMBOL(RMF_OBD_QUOTACTL);
660
661 const struct req_msg_field RMF_QUNIT_DATA =
662         DEFINE_MSGF("qunit_data", 0,
663                     sizeof(struct qunit_data), NULL);
664 EXPORT_SYMBOL(RMF_QUNIT_DATA);
665
666 const struct req_msg_field RMF_MDT_EPOCH =
667         DEFINE_MSGF("mdt_epoch", 0,
668                     sizeof(struct mdt_epoch), lustre_swab_mdt_epoch);
669 EXPORT_SYMBOL(RMF_MDT_EPOCH);
670
671 const struct req_msg_field RMF_PTLRPC_BODY =
672         DEFINE_MSGF("ptlrpc_body", 0,
673                     sizeof(struct ptlrpc_body), lustre_swab_ptlrpc_body);
674 EXPORT_SYMBOL(RMF_PTLRPC_BODY);
675
676 const struct req_msg_field RMF_OBD_STATFS =
677         DEFINE_MSGF("obd_statfs", 0,
678                     sizeof(struct obd_statfs), lustre_swab_obd_statfs);
679 EXPORT_SYMBOL(RMF_OBD_STATFS);
680
681 const struct req_msg_field RMF_SETINFO_KEY =
682         DEFINE_MSGF("setinfo_key", 0, -1, NULL);
683 EXPORT_SYMBOL(RMF_SETINFO_KEY);
684
685 const struct req_msg_field RMF_NAME =
686         DEFINE_MSGF("name", RMF_F_STRING, -1, NULL);
687 EXPORT_SYMBOL(RMF_NAME);
688
689 const struct req_msg_field RMF_SYMTGT =
690         DEFINE_MSGF("symtgt", RMF_F_STRING, -1, NULL);
691 EXPORT_SYMBOL(RMF_SYMTGT);
692
693 const struct req_msg_field RMF_TGTUUID =
694         DEFINE_MSGF("tgtuuid", RMF_F_STRING, sizeof(struct obd_uuid) - 1, NULL);
695 EXPORT_SYMBOL(RMF_TGTUUID);
696
697 const struct req_msg_field RMF_CLUUID =
698         DEFINE_MSGF("cluuid", RMF_F_STRING, sizeof(struct obd_uuid) - 1, NULL);
699 EXPORT_SYMBOL(RMF_CLUUID);
700
701 const struct req_msg_field RMF_STRING =
702         DEFINE_MSGF("string", RMF_F_STRING, -1, NULL);
703 EXPORT_SYMBOL(RMF_STRING);
704
705 const struct req_msg_field RMF_LLOGD_BODY =
706         DEFINE_MSGF("llogd_body", 0,
707                     sizeof(struct llogd_body), lustre_swab_llogd_body);
708 EXPORT_SYMBOL(RMF_LLOGD_BODY);
709
710 const struct req_msg_field RMF_LLOG_LOG_HDR =
711         DEFINE_MSGF("llog_log_hdr", 0,
712                     sizeof(struct llog_log_hdr), lustre_swab_llog_hdr);
713 EXPORT_SYMBOL(RMF_LLOG_LOG_HDR);
714
715 const struct req_msg_field RMF_LLOGD_CONN_BODY =
716         DEFINE_MSGF("llogd_conn_body", 0,
717                     sizeof(struct llogd_conn_body),
718                     lustre_swab_llogd_conn_body);
719 EXPORT_SYMBOL(RMF_LLOGD_CONN_BODY);
720
721 /*
722  * connection handle received in MDS_CONNECT request.
723  *
724  * XXX no swabbing?
725  */
726 const struct req_msg_field RMF_CONN =
727         DEFINE_MSGF("conn", 0, sizeof(struct lustre_handle), NULL);
728 EXPORT_SYMBOL(RMF_CONN);
729
730 const struct req_msg_field RMF_CONNECT_DATA =
731         DEFINE_MSGF("cdata", 0,
732                     sizeof(struct obd_connect_data), lustre_swab_connect);
733 EXPORT_SYMBOL(RMF_CONNECT_DATA);
734
735 const struct req_msg_field RMF_DLM_REQ =
736         DEFINE_MSGF("dlm_req", 0,
737                     sizeof(struct ldlm_request), lustre_swab_ldlm_request);
738 EXPORT_SYMBOL(RMF_DLM_REQ);
739
740 const struct req_msg_field RMF_DLM_REP =
741         DEFINE_MSGF("dlm_rep", 0,
742                     sizeof(struct ldlm_reply), lustre_swab_ldlm_reply);
743 EXPORT_SYMBOL(RMF_DLM_REP);
744
745 const struct req_msg_field RMF_LDLM_INTENT =
746         DEFINE_MSGF("ldlm_intent", 0,
747                     sizeof(struct ldlm_intent), lustre_swab_ldlm_intent);
748 EXPORT_SYMBOL(RMF_LDLM_INTENT);
749
750 const struct req_msg_field RMF_DLM_LVB =
751         DEFINE_MSGF("dlm_lvb", 0, sizeof(struct ost_lvb), NULL);
752 EXPORT_SYMBOL(RMF_DLM_LVB);
753
754 const struct req_msg_field RMF_MDT_MD =
755         DEFINE_MSGF("mdt_md", 0, MIN_MD_SIZE, NULL);
756 EXPORT_SYMBOL(RMF_MDT_MD);
757
758 const struct req_msg_field RMF_REC_REINT =
759         DEFINE_MSGF("rec_reint", 0, sizeof(struct mdt_rec_reint),
760                     lustre_swab_mdt_rec_reint);
761 EXPORT_SYMBOL(RMF_REC_REINT);
762
763 const struct req_msg_field RMF_REC_JOINFILE =
764         DEFINE_MSGF("rec_joinfile", 0, sizeof(struct mdt_rec_join),
765                     lustre_swab_mdt_rec_join);
766 EXPORT_SYMBOL(RMF_REC_JOINFILE);
767
768 /* FIXME: this length should be defined as a macro */
769 const struct req_msg_field RMF_EADATA = DEFINE_MSGF("eadata", 0, -1, NULL);
770 EXPORT_SYMBOL(RMF_EADATA);
771
772 const struct req_msg_field RMF_ACL = 
773         DEFINE_MSGF("acl", 0, LUSTRE_POSIX_ACL_MAX_SIZE, NULL);
774 EXPORT_SYMBOL(RMF_ACL);
775
776 const struct req_msg_field RMF_LOGCOOKIES =
777         DEFINE_MSGF("logcookies", 0, sizeof(struct llog_cookie), NULL);
778 EXPORT_SYMBOL(RMF_LOGCOOKIES);
779
780 const struct req_msg_field RMF_CAPA1 =
781         DEFINE_MSGF("capa", 0, sizeof(struct lustre_capa),
782                     lustre_swab_lustre_capa);
783 EXPORT_SYMBOL(RMF_CAPA1);
784
785 const struct req_msg_field RMF_CAPA2 =
786         DEFINE_MSGF("capa", 0, sizeof(struct lustre_capa),
787                     lustre_swab_lustre_capa);
788 EXPORT_SYMBOL(RMF_CAPA2);
789
790 /* 
791  * OST request field.
792  */
793 const struct req_msg_field RMF_OST_BODY =
794         DEFINE_MSGF("ost_body", 0,
795                     sizeof(struct ost_body), lustre_swab_ost_body);
796 EXPORT_SYMBOL(RMF_OST_BODY);
797
798 const struct req_msg_field RMF_OBD_IOOBJ =
799         DEFINE_MSGF("obd_ioobj", 0,
800                     sizeof(struct obd_ioobj), lustre_swab_obd_ioobj);
801 EXPORT_SYMBOL(RMF_OBD_IOOBJ);
802
803 const struct req_msg_field RMF_NIOBUF_REMOTE =
804         DEFINE_MSGF("niobuf_remote", 0, -1, lustre_swab_niobuf_remote);
805 EXPORT_SYMBOL(RMF_NIOBUF_REMOTE);
806
807 const struct req_msg_field RMF_OBD_ID =
808         DEFINE_MSGF("obd_id", 0,
809                     sizeof(obd_id), lustre_swab_ost_last_id);
810 EXPORT_SYMBOL(RMF_OBD_ID);
811
812
813 /*
814  * Request formats.
815  */
816
817 struct req_format {
818         const char *rf_name;
819         int         rf_idx;
820         struct {
821                 int                          nr;
822                 const struct req_msg_field **d;
823         } rf_fields[RCL_NR];
824 };
825
826 #define DEFINE_REQ_FMT(name, client, client_nr, server, server_nr) {    \
827         .rf_name   = name,                                              \
828         .rf_fields = {                                                  \
829                 [RCL_CLIENT] = {                                        \
830                         .nr = client_nr,                                \
831                         .d  = client                                    \
832                 },                                                      \
833                 [RCL_SERVER] = {                                        \
834                         .nr = server_nr,                                \
835                         .d  = server                                    \
836                 }                                                       \
837         }                                                               \
838 }
839
840 #define DEFINE_REQ_FMT0(name, client, server)                                  \
841 DEFINE_REQ_FMT(name, client, ARRAY_SIZE(client), server, ARRAY_SIZE(server))
842
843 const struct req_format RQF_OBD_PING =
844         DEFINE_REQ_FMT0("OBD_PING", empty, empty);
845 EXPORT_SYMBOL(RQF_OBD_PING);
846  
847 const struct req_format RQF_SEC_CTX =
848         DEFINE_REQ_FMT0("SEC_CTX", empty, empty);
849 EXPORT_SYMBOL(RQF_SEC_CTX);
850  
851 const struct req_format RQF_MGS_TARGET_REG =
852         DEFINE_REQ_FMT0("MGS_TARGET_REG", mgs_target_info_only,
853                          mgs_target_info_only);
854 EXPORT_SYMBOL(RQF_MGS_TARGET_REG);
855
856 const struct req_format RQF_MGS_SET_INFO =
857         DEFINE_REQ_FMT0("MGS_SET_INTO", mgs_set_info,
858                          mgs_set_info);
859 EXPORT_SYMBOL(RQF_MGS_SET_INFO);
860
861 const struct req_format RQF_LOG_CANCEL =
862         DEFINE_REQ_FMT0("OBD_LOG_CANCEL", log_cancel_client, empty);
863 EXPORT_SYMBOL(RQF_LOG_CANCEL);
864
865 const struct req_format RQF_MDS_QUOTACHECK =
866         DEFINE_REQ_FMT0("MDS_QUOTACHECK", quotactl_only, empty);
867 EXPORT_SYMBOL(RQF_MDS_QUOTACHECK);
868
869 const struct req_format RQF_OST_QUOTACHECK =
870         DEFINE_REQ_FMT0("OST_QUOTACHECK", quotactl_only, empty);
871 EXPORT_SYMBOL(RQF_OST_QUOTACHECK);
872
873 const struct req_format RQF_MDS_QUOTACTL =
874         DEFINE_REQ_FMT0("MDS_QUOTACTL", quotactl_only, quotactl_only);
875 EXPORT_SYMBOL(RQF_MDS_QUOTACTL);
876
877 const struct req_format RQF_OST_QUOTACTL =
878         DEFINE_REQ_FMT0("OST_QUOTACTL", quotactl_only, quotactl_only);
879 EXPORT_SYMBOL(RQF_OST_QUOTACTL);
880
881 const struct req_format RQF_QC_CALLBACK =
882         DEFINE_REQ_FMT0("QC_CALLBACK", quotactl_only, empty);
883 EXPORT_SYMBOL(RQF_QC_CALLBACK);
884
885 const struct req_format RQF_MDS_QUOTA_DQACQ =
886         DEFINE_REQ_FMT0("MDS_QUOTA_DQACQ", qunit_data_only, qunit_data_only);
887 EXPORT_SYMBOL(RQF_MDS_QUOTA_DQACQ);
888
889 const struct req_format RQF_SEQ_QUERY =
890         DEFINE_REQ_FMT0("SEQ_QUERY", seq_query_client, seq_query_server);
891 EXPORT_SYMBOL(RQF_SEQ_QUERY);
892
893 const struct req_format RQF_FLD_QUERY =
894         DEFINE_REQ_FMT0("FLD_QUERY", fld_query_client, fld_query_server);
895 EXPORT_SYMBOL(RQF_FLD_QUERY);
896
897 const struct req_format RQF_MDS_GETSTATUS =
898         DEFINE_REQ_FMT0("MDS_GETSTATUS", mdt_body_only, mdt_body_capa);
899 EXPORT_SYMBOL(RQF_MDS_GETSTATUS);
900
901 const struct req_format RQF_MDS_STATFS =
902         DEFINE_REQ_FMT0("MDS_STATFS", empty, obd_statfs_server);
903 EXPORT_SYMBOL(RQF_MDS_STATFS);
904
905 const struct req_format RQF_MDS_SYNC =
906         DEFINE_REQ_FMT0("MDS_SYNC", mdt_body_capa, mdt_body_only);
907 EXPORT_SYMBOL(RQF_MDS_SYNC);
908
909 const struct req_format RQF_MDS_GETATTR =
910         DEFINE_REQ_FMT0("MDS_GETATTR", mdt_body_capa, mds_getattr_server);
911 EXPORT_SYMBOL(RQF_MDS_GETATTR);
912
913 const struct req_format RQF_MDS_GETXATTR =
914         DEFINE_REQ_FMT0("MDS_GETXATTR",
915                         mds_getxattr_client, mds_getxattr_server);
916 EXPORT_SYMBOL(RQF_MDS_GETXATTR);
917
918 const struct req_format RQF_MDS_GETATTR_NAME =
919         DEFINE_REQ_FMT0("MDS_GETATTR_NAME",
920                         mds_getattr_name_client, mds_getattr_server);
921 EXPORT_SYMBOL(RQF_MDS_GETATTR_NAME);
922
923 const struct req_format RQF_MDS_REINT =
924         DEFINE_REQ_FMT0("MDS_REINT", mds_reint_client, mdt_body_only);
925 EXPORT_SYMBOL(RQF_MDS_REINT);
926
927 const struct req_format RQF_MDS_REINT_CREATE =
928         DEFINE_REQ_FMT0("MDS_REINT_CREATE",
929                         mds_reint_create_client, mdt_body_capa);
930 EXPORT_SYMBOL(RQF_MDS_REINT_CREATE);
931
932 const struct req_format RQF_MDS_REINT_CREATE_RMT_ACL =
933         DEFINE_REQ_FMT0("MDS_REINT_CREATE_RMT_ACL",
934                         mds_reint_create_rmt_acl_client, mdt_body_capa);
935 EXPORT_SYMBOL(RQF_MDS_REINT_CREATE_RMT_ACL);
936
937 const struct req_format RQF_MDS_REINT_CREATE_SLAVE =
938         DEFINE_REQ_FMT0("MDS_REINT_CREATE_EA",
939                         mds_reint_create_slave_client, mdt_body_capa);
940 EXPORT_SYMBOL(RQF_MDS_REINT_CREATE_SLAVE);
941
942 const struct req_format RQF_MDS_REINT_CREATE_SYM =
943         DEFINE_REQ_FMT0("MDS_REINT_CREATE_SYM",
944                         mds_reint_create_sym_client, mdt_body_capa);
945 EXPORT_SYMBOL(RQF_MDS_REINT_CREATE_SYM);
946
947 const struct req_format RQF_MDS_REINT_OPEN =
948         DEFINE_REQ_FMT0("MDS_REINT_OPEN",
949                         mds_reint_open_client, mds_reint_open_server);
950 EXPORT_SYMBOL(RQF_MDS_REINT_OPEN);
951
952 const struct req_format RQF_MDS_REINT_UNLINK =
953         DEFINE_REQ_FMT0("MDS_REINT_UNLINK", mds_reint_unlink_client,
954                         mds_last_unlink_server);
955 EXPORT_SYMBOL(RQF_MDS_REINT_UNLINK);
956
957 const struct req_format RQF_MDS_REINT_LINK =
958         DEFINE_REQ_FMT0("MDS_REINT_LINK",
959                         mds_reint_link_client, mdt_body_only);
960 EXPORT_SYMBOL(RQF_MDS_REINT_LINK);
961
962 const struct req_format RQF_MDS_REINT_RENAME =
963         DEFINE_REQ_FMT0("MDS_REINT_RENAME", mds_reint_rename_client,
964                         mds_last_unlink_server);
965 EXPORT_SYMBOL(RQF_MDS_REINT_RENAME);
966
967 const struct req_format RQF_MDS_REINT_SETATTR =
968         DEFINE_REQ_FMT0("MDS_REINT_SETATTR",
969                         mds_reint_setattr_client, mds_setattr_server);
970 EXPORT_SYMBOL(RQF_MDS_REINT_SETATTR);
971
972 const struct req_format RQF_MDS_REINT_SETXATTR =
973         DEFINE_REQ_FMT0("MDS_REINT_SETXATTR",
974                         mds_reint_setxattr_client, mdt_body_only);
975 EXPORT_SYMBOL(RQF_MDS_REINT_SETXATTR);
976
977 const struct req_format RQF_MDS_CONNECT =
978         DEFINE_REQ_FMT0("MDS_CONNECT",
979                         obd_connect_client, obd_connect_server);
980 EXPORT_SYMBOL(RQF_MDS_CONNECT);
981
982 const struct req_format RQF_MDS_DISCONNECT =
983         DEFINE_REQ_FMT0("MDS_DISCONNECT", empty, empty);
984 EXPORT_SYMBOL(RQF_MDS_DISCONNECT);
985  
986 const struct req_format RQF_MDS_SET_INFO =
987         DEFINE_REQ_FMT0("MDS_SET_INFO", mds_set_info_client, empty);
988 EXPORT_SYMBOL(RQF_MDS_SET_INFO);
989  
990 const struct req_format RQF_LDLM_ENQUEUE =
991         DEFINE_REQ_FMT0("LDLM_ENQUEUE",
992                         ldlm_enqueue_client, ldlm_enqueue_lvb_server);
993 EXPORT_SYMBOL(RQF_LDLM_ENQUEUE);
994
995 const struct req_format RQF_LDLM_ENQUEUE_LVB =
996         DEFINE_REQ_FMT0("LDLM_ENQUEUE_LVB",
997                         ldlm_enqueue_client, ldlm_enqueue_lvb_server);
998 EXPORT_SYMBOL(RQF_LDLM_ENQUEUE_LVB);
999
1000 const struct req_format RQF_LDLM_CONVERT =
1001         DEFINE_REQ_FMT0("LDLM_CONVERT",
1002                         ldlm_enqueue_client, ldlm_enqueue_server);
1003 EXPORT_SYMBOL(RQF_LDLM_CONVERT);
1004
1005 const struct req_format RQF_LDLM_CANCEL =
1006         DEFINE_REQ_FMT0("LDLM_CANCEL", ldlm_enqueue_client, empty);
1007 EXPORT_SYMBOL(RQF_LDLM_CANCEL);
1008
1009 const struct req_format RQF_LDLM_CALLBACK =
1010         DEFINE_REQ_FMT0("LDLM_CALLBACK", ldlm_enqueue_client, empty);
1011 EXPORT_SYMBOL(RQF_LDLM_CALLBACK);
1012
1013 const struct req_format RQF_LDLM_CP_CALLBACK =
1014         DEFINE_REQ_FMT0("LDLM_CP_CALLBACK", ldlm_cp_callback_client, empty);
1015 EXPORT_SYMBOL(RQF_LDLM_CP_CALLBACK);
1016
1017 const struct req_format RQF_LDLM_BL_CALLBACK =
1018         DEFINE_REQ_FMT0("LDLM_BL_CALLBACK", ldlm_enqueue_client, empty);
1019 EXPORT_SYMBOL(RQF_LDLM_BL_CALLBACK);
1020
1021 const struct req_format RQF_LDLM_GL_CALLBACK =
1022         DEFINE_REQ_FMT0("LDLM_GL_CALLBACK", ldlm_enqueue_client,
1023                         ldlm_gl_callback_server);
1024 EXPORT_SYMBOL(RQF_LDLM_GL_CALLBACK);
1025
1026 const struct req_format RQF_LDLM_INTENT =
1027         DEFINE_REQ_FMT0("LDLM_INTENT",
1028                         ldlm_intent_client, ldlm_intent_server);
1029 EXPORT_SYMBOL(RQF_LDLM_INTENT);
1030
1031 const struct req_format RQF_LDLM_INTENT_GETATTR =
1032         DEFINE_REQ_FMT0("LDLM_INTENT_GETATTR",
1033                         ldlm_intent_getattr_client, ldlm_intent_getattr_server);
1034 EXPORT_SYMBOL(RQF_LDLM_INTENT_GETATTR);
1035
1036 const struct req_format RQF_LDLM_INTENT_OPEN =
1037         DEFINE_REQ_FMT0("LDLM_INTENT_OPEN",
1038                         ldlm_intent_open_client, ldlm_intent_open_server);
1039 EXPORT_SYMBOL(RQF_LDLM_INTENT_OPEN);
1040
1041 const struct req_format RQF_LDLM_INTENT_CREATE =
1042         DEFINE_REQ_FMT0("LDLM_INTENT_CREATE",
1043                         ldlm_intent_create_client, ldlm_intent_getattr_server);
1044 EXPORT_SYMBOL(RQF_LDLM_INTENT_CREATE);
1045
1046 const struct req_format RQF_LDLM_INTENT_UNLINK =
1047         DEFINE_REQ_FMT0("LDLM_INTENT_UNLINK",
1048                         ldlm_intent_unlink_client, ldlm_intent_server);
1049 EXPORT_SYMBOL(RQF_LDLM_INTENT_UNLINK);
1050
1051 const struct req_format RQF_MDS_CLOSE =
1052         DEFINE_REQ_FMT0("MDS_CLOSE",
1053                         mdt_close_client, mds_last_unlink_server);
1054 EXPORT_SYMBOL(RQF_MDS_CLOSE);
1055
1056 const struct req_format RQF_MDS_PIN =
1057         DEFINE_REQ_FMT0("MDS_PIN",
1058                         mdt_body_capa, mdt_body_only);
1059 EXPORT_SYMBOL(RQF_MDS_PIN);
1060
1061 const struct req_format RQF_MDS_UNPIN =
1062         DEFINE_REQ_FMT0("MDS_UNPIN", mdt_body_only, empty);
1063 EXPORT_SYMBOL(RQF_MDS_UNPIN);
1064
1065 const struct req_format RQF_MDS_DONE_WRITING =
1066         DEFINE_REQ_FMT0("MDS_DONE_WRITING",
1067                         mdt_close_client, mdt_body_only);
1068 EXPORT_SYMBOL(RQF_MDS_DONE_WRITING);
1069
1070 const struct req_format RQF_MDS_READPAGE =
1071         DEFINE_REQ_FMT0("MDS_READPAGE",
1072                         mdt_body_capa, mdt_body_only);
1073 EXPORT_SYMBOL(RQF_MDS_READPAGE);
1074
1075 /* This is for split */
1076 const struct req_format RQF_MDS_WRITEPAGE =
1077         DEFINE_REQ_FMT0("MDS_WRITEPAGE",
1078                         mdt_body_capa, mdt_body_only);
1079 EXPORT_SYMBOL(RQF_MDS_WRITEPAGE);
1080
1081 const struct req_format RQF_MDS_IS_SUBDIR =
1082         DEFINE_REQ_FMT0("MDS_IS_SUBDIR",
1083                         mdt_body_only, mdt_body_only);
1084 EXPORT_SYMBOL(RQF_MDS_IS_SUBDIR);
1085
1086 const struct req_format RQF_LLOG_CATINFO =
1087         DEFINE_REQ_FMT0("LLOG_CATINFO",
1088                         llog_catinfo_client, llog_catinfo_server);
1089 EXPORT_SYMBOL(RQF_LLOG_CATINFO);
1090
1091 const struct req_format RQF_LLOG_ORIGIN_HANDLE_CREATE =
1092         DEFINE_REQ_FMT0("LLOG_ORIGIN_HANDLE_CREATE",
1093                         llog_origin_handle_create_client, llogd_body_only);
1094 EXPORT_SYMBOL(RQF_LLOG_ORIGIN_HANDLE_CREATE);
1095
1096 const struct req_format RQF_LLOG_ORIGIN_HANDLE_DESTROY =
1097         DEFINE_REQ_FMT0("LLOG_ORIGIN_HANDLE_DESTROY",
1098                         llogd_body_only, llogd_body_only);
1099 EXPORT_SYMBOL(RQF_LLOG_ORIGIN_HANDLE_DESTROY);
1100
1101 const struct req_format RQF_LLOG_ORIGIN_HANDLE_NEXT_BLOCK =
1102         DEFINE_REQ_FMT0("LLOG_ORIGIN_HANDLE_NEXT_BLOCK",
1103                         llogd_body_only, llog_origin_handle_next_block_server);
1104 EXPORT_SYMBOL(RQF_LLOG_ORIGIN_HANDLE_NEXT_BLOCK);
1105
1106 const struct req_format RQF_LLOG_ORIGIN_HANDLE_PREV_BLOCK =
1107         DEFINE_REQ_FMT0("LLOG_ORIGIN_HANDLE_PREV_BLOCK",
1108                         llogd_body_only, llog_origin_handle_next_block_server);
1109 EXPORT_SYMBOL(RQF_LLOG_ORIGIN_HANDLE_PREV_BLOCK);
1110
1111 const struct req_format RQF_LLOG_ORIGIN_HANDLE_READ_HEADER =
1112         DEFINE_REQ_FMT0("LLOG_ORIGIN_HANDLE_READ_HEADER",
1113                         llogd_body_only, llog_log_hdr_only);
1114 EXPORT_SYMBOL(RQF_LLOG_ORIGIN_HANDLE_READ_HEADER);
1115
1116 const struct req_format RQF_LLOG_ORIGIN_CONNECT =
1117         DEFINE_REQ_FMT0("LLOG_ORIGIN_CONNECT", llogd_conn_body_only, empty);
1118 EXPORT_SYMBOL(RQF_LLOG_ORIGIN_CONNECT);
1119
1120 const struct req_format RQF_OST_CONNECT =
1121         DEFINE_REQ_FMT0("OST_CONNECT",
1122                         obd_connect_client, obd_connect_server);
1123 EXPORT_SYMBOL(RQF_OST_CONNECT);
1124
1125 const struct req_format RQF_OST_DISCONNECT =
1126         DEFINE_REQ_FMT0("OST_DISCONNECT", empty, empty);
1127 EXPORT_SYMBOL(RQF_OST_DISCONNECT);
1128
1129 const struct req_format RQF_OST_GETATTR =
1130         DEFINE_REQ_FMT0("OST_GETATTR", ost_body_capa, ost_body_only);
1131 EXPORT_SYMBOL(RQF_OST_GETATTR);
1132
1133 const struct req_format RQF_OST_SETATTR =
1134         DEFINE_REQ_FMT0("OST_SETATTR", ost_body_capa, ost_body_only);
1135 EXPORT_SYMBOL(RQF_OST_SETATTR);
1136
1137 const struct req_format RQF_OST_CREATE =
1138         DEFINE_REQ_FMT0("OST_CREATE", ost_body_only, ost_body_only);
1139 EXPORT_SYMBOL(RQF_OST_CREATE);
1140
1141 const struct req_format RQF_OST_PUNCH =
1142         DEFINE_REQ_FMT0("OST_PUNCH", ost_body_capa, ost_body_only);
1143 EXPORT_SYMBOL(RQF_OST_PUNCH);
1144
1145 const struct req_format RQF_OST_SYNC =
1146         DEFINE_REQ_FMT0("OST_SYNC", ost_body_capa, ost_body_only);
1147 EXPORT_SYMBOL(RQF_OST_SYNC);
1148
1149 const struct req_format RQF_OST_DESTROY =
1150         DEFINE_REQ_FMT0("OST_DESTROY", ost_destroy_client, ost_body_only);
1151 EXPORT_SYMBOL(RQF_OST_DESTROY);
1152
1153 const struct req_format RQF_OST_BRW =
1154         DEFINE_REQ_FMT0("OST_BRW", ost_brw_client, ost_brw_server);
1155 EXPORT_SYMBOL(RQF_OST_BRW);
1156
1157 const struct req_format RQF_OST_STATFS =
1158         DEFINE_REQ_FMT0("OST_STATFS", empty, obd_statfs_server);
1159 EXPORT_SYMBOL(RQF_OST_STATFS);
1160
1161 const struct req_format RQF_OST_SET_INFO =
1162         DEFINE_REQ_FMT0("OST_SET_INFO", ost_set_info_client, empty);
1163 EXPORT_SYMBOL(RQF_OST_SET_INFO);
1164
1165 const struct req_format RQF_OST_GET_INFO_GENERIC =
1166         DEFINE_REQ_FMT0("OST_GET_INFO", ost_get_info_generic_client,
1167                                         ost_get_info_generic_server);
1168 EXPORT_SYMBOL(RQF_OST_GET_INFO_GENERIC);
1169
1170 const struct req_format RQF_OST_GET_INFO_LAST_ID =
1171         DEFINE_REQ_FMT0("OST_GET_INFO_LAST_ID", ost_get_info_generic_client,
1172                                                 ost_get_last_id_server);
1173 EXPORT_SYMBOL(RQF_OST_GET_INFO_LAST_ID);
1174
1175
1176 #if !defined(__REQ_LAYOUT_USER__)
1177
1178 int req_layout_init(void)
1179 {
1180         int i;
1181         int j;
1182         int k;
1183
1184         for (i = 0; i < ARRAY_SIZE(req_formats); ++i) {
1185                 struct req_format *rf;
1186
1187                 rf = (struct req_format *)req_formats[i];
1188                 rf->rf_idx = i;
1189                 for (j = 0; j < RCL_NR; ++j) {
1190                         LASSERT(rf->rf_fields[j].nr <= REQ_MAX_FIELD_NR);
1191                         for (k = 0; k < rf->rf_fields[j].nr; ++k) {
1192                                 struct req_msg_field *field;
1193
1194                                 field = (typeof(field))rf->rf_fields[j].d[k];
1195                                 LASSERT(field->rmf_offset[i][j] == 0);
1196                                 /*
1197                                  * k + 1 to detect unused format/field
1198                                  * combinations.
1199                                  */
1200                                 field->rmf_offset[i][j] = k + 1;
1201                         }
1202                 }
1203         }
1204         return 0;
1205 }
1206 EXPORT_SYMBOL(req_layout_init);
1207
1208 void req_layout_fini(void)
1209 {
1210 }
1211 EXPORT_SYMBOL(req_layout_fini);
1212
1213 void req_capsule_init_area(struct req_capsule *pill)
1214 {
1215         int i;
1216
1217         for (i = 0; i < ARRAY_SIZE(pill->rc_area[RCL_CLIENT]); i++) {
1218                 pill->rc_area[RCL_CLIENT][i] = -1;
1219                 pill->rc_area[RCL_SERVER][i] = -1;
1220         }
1221 }
1222 EXPORT_SYMBOL(req_capsule_init_area);
1223
1224 /*
1225  * Initialize capsule.
1226  *
1227  * @area is an array of REQ_MAX_FIELD_NR elements, used to store sizes of
1228  * variable-sized fields.
1229  */
1230 void req_capsule_init(struct req_capsule *pill,
1231                       struct ptlrpc_request *req,
1232                       enum req_location location)
1233 {
1234         LASSERT(location == RCL_SERVER || location == RCL_CLIENT);
1235
1236         memset(pill, 0, sizeof *pill);
1237         pill->rc_req = req;
1238         pill->rc_loc = location;
1239         req_capsule_init_area(pill);
1240 }
1241 EXPORT_SYMBOL(req_capsule_init);
1242
1243 void req_capsule_fini(struct req_capsule *pill)
1244 {
1245 }
1246 EXPORT_SYMBOL(req_capsule_fini);
1247
1248 static int __req_format_is_sane(const struct req_format *fmt)
1249 {
1250         return
1251                 0 <= fmt->rf_idx && fmt->rf_idx < ARRAY_SIZE(req_formats) &&
1252                 req_formats[fmt->rf_idx] == fmt;
1253 }
1254
1255 static struct lustre_msg *__req_msg(const struct req_capsule *pill,
1256                                     enum req_location loc)
1257 {
1258         struct ptlrpc_request *req;
1259
1260         req = pill->rc_req;
1261         return loc == RCL_CLIENT ? req->rq_reqmsg : req->rq_repmsg;
1262 }
1263
1264 void req_capsule_set(struct req_capsule *pill, const struct req_format *fmt)
1265 {
1266         LASSERT(pill->rc_fmt == NULL);
1267         LASSERT(__req_format_is_sane(fmt));
1268
1269         pill->rc_fmt = fmt;
1270 }
1271 EXPORT_SYMBOL(req_capsule_set);
1272
1273 int req_capsule_filled_sizes(struct req_capsule *pill,
1274                            enum req_location loc)
1275 {
1276         const struct req_format *fmt = pill->rc_fmt;
1277         int                      i;
1278
1279         LASSERT(fmt != NULL);
1280
1281         for (i = 0; i < fmt->rf_fields[loc].nr; ++i) {
1282                 if (pill->rc_area[loc][i] == -1) {
1283                         pill->rc_area[loc][i] = 
1284                                             fmt->rf_fields[loc].d[i]->rmf_size;
1285                         if (pill->rc_area[loc][i] == -1) {
1286                                 /* skip the following fields */
1287                                 LASSERT(loc != RCL_SERVER);
1288                                 break;
1289                         }
1290                 }
1291         }
1292         return i;
1293 }
1294 EXPORT_SYMBOL(req_capsule_filled_sizes);
1295
1296 int req_capsule_server_pack(struct req_capsule *pill)
1297 {
1298         const struct req_format *fmt;
1299         int                      count;
1300         int                      rc;
1301
1302         LASSERT(pill->rc_loc == RCL_SERVER);
1303         fmt = pill->rc_fmt;
1304         LASSERT(fmt != NULL);
1305
1306         count = req_capsule_filled_sizes(pill, RCL_SERVER);
1307         rc = lustre_pack_reply(pill->rc_req, count,
1308                                pill->rc_area[RCL_SERVER], NULL);
1309         if (rc != 0) {
1310                 DEBUG_REQ(D_ERROR, pill->rc_req,
1311                           "Cannot pack %d fields in format `%s': ",
1312                           count, fmt->rf_name);
1313         }
1314         return rc;
1315 }
1316 EXPORT_SYMBOL(req_capsule_server_pack);
1317
1318 static int __req_capsule_offset(const struct req_capsule *pill,
1319                                 const struct req_msg_field *field,
1320                                 enum req_location loc)
1321 {
1322         int offset;
1323
1324         offset = field->rmf_offset[pill->rc_fmt->rf_idx][loc];
1325         LASSERTF(offset > 0, "%s:%s, off=%d, loc=%d\n",
1326                             pill->rc_fmt->rf_name,
1327                             field->rmf_name, offset, loc);
1328         offset --;
1329         LASSERT(0 <= offset && offset < (sizeof(pill->rc_swabbed) << 3));
1330         return offset;
1331 }
1332
1333 static void *__req_capsule_get(struct req_capsule *pill,
1334                                const struct req_msg_field *field,
1335                                enum req_location loc,
1336                                void (*swabber)( void *))
1337 {
1338         const struct req_format *fmt;
1339         struct lustre_msg       *msg;
1340         void                    *value;
1341         int                      len;
1342         int                      offset;
1343
1344         void *(*getter)(struct lustre_msg *m, int n, int minlen);
1345
1346         static const char *rcl_names[RCL_NR] = {
1347                 [RCL_CLIENT] = "client",
1348                 [RCL_SERVER] = "server"
1349         };
1350
1351         fmt = pill->rc_fmt;
1352         LASSERT(fmt != NULL);
1353         LASSERT(__req_format_is_sane(fmt));
1354
1355         offset = __req_capsule_offset(pill, field, loc);
1356
1357         msg = __req_msg(pill, loc);
1358         LASSERT(msg != NULL);
1359
1360         getter = (field->rmf_flags & RMF_F_STRING) ?
1361                 (typeof(getter))lustre_msg_string : lustre_msg_buf;
1362
1363         if (pill->rc_area[loc][offset] != -1)
1364                 len = pill->rc_area[loc][offset];
1365         else
1366                 len = max(field->rmf_size, 0);
1367         value = getter(msg, offset, len);
1368
1369         swabber = swabber ?: field->rmf_swabber;
1370         if (!(pill->rc_swabbed & (1 << offset)) && loc != pill->rc_loc &&
1371             swabber != NULL && value != NULL &&
1372             lustre_msg_swabbed(msg)) {
1373                 swabber(value);
1374                 pill->rc_swabbed |= (1 << offset);
1375         }
1376         if (value == NULL) {
1377                 DEBUG_REQ(D_ERROR, pill->rc_req,
1378                           "Wrong buffer for field `%s' (%d of %d) "
1379                           "in format `%s': %d vs. %d (%s)\n",
1380                           field->rmf_name, offset, lustre_msg_bufcount(msg), fmt->rf_name,
1381                           lustre_msg_buflen(msg, offset), len,
1382                           rcl_names[loc]);
1383         }
1384
1385         return value;
1386 }
1387
1388 void *req_capsule_client_get(struct req_capsule *pill,
1389                              const struct req_msg_field *field)
1390 {
1391         return __req_capsule_get(pill, field, RCL_CLIENT, NULL);
1392 }
1393 EXPORT_SYMBOL(req_capsule_client_get);
1394
1395 void *req_capsule_client_swab_get(struct req_capsule *pill,
1396                                   const struct req_msg_field *field,
1397                                   void (*swabber)(void* ))
1398 {
1399         return __req_capsule_get(pill, field, RCL_CLIENT, swabber);
1400 }
1401 EXPORT_SYMBOL(req_capsule_client_swab_get);
1402
1403 void *req_capsule_client_sized_get(struct req_capsule *pill,
1404                                    const struct req_msg_field *field,
1405                                    int len)
1406 {
1407         req_capsule_set_size(pill, field, RCL_CLIENT, len);
1408         return __req_capsule_get(pill, field, RCL_CLIENT, NULL);
1409 }
1410 EXPORT_SYMBOL(req_capsule_client_sized_get);
1411
1412 void *req_capsule_server_get(struct req_capsule *pill,
1413                              const struct req_msg_field *field)
1414 {
1415         return __req_capsule_get(pill, field, RCL_SERVER, NULL);
1416 }
1417 EXPORT_SYMBOL(req_capsule_server_get);
1418
1419 void *req_capsule_server_swab_get(struct req_capsule *pill,
1420                                   const struct req_msg_field *field,
1421                                   void *swabber)
1422 {
1423         return __req_capsule_get(pill, field, RCL_SERVER, swabber);
1424 }
1425 EXPORT_SYMBOL(req_capsule_server_swab_get);
1426
1427
1428 void *req_capsule_server_sized_get(struct req_capsule *pill,
1429                                    const struct req_msg_field *field,
1430                                    int len)
1431 {
1432         req_capsule_set_size(pill, field, RCL_SERVER, len);
1433         return __req_capsule_get(pill, field, RCL_SERVER, NULL);
1434 }
1435 EXPORT_SYMBOL(req_capsule_server_sized_get);
1436
1437 const void *req_capsule_other_get(struct req_capsule *pill,
1438                                   const struct req_msg_field *field)
1439 {
1440         return __req_capsule_get(pill, field, pill->rc_loc ^ 1, NULL);
1441 }
1442 EXPORT_SYMBOL(req_capsule_other_get);
1443
1444 void req_capsule_set_size(struct req_capsule *pill,
1445                           const struct req_msg_field *field,
1446                           enum req_location loc, int size)
1447 {
1448         LASSERT(loc == RCL_SERVER || loc == RCL_CLIENT);
1449
1450         pill->rc_area[loc][__req_capsule_offset(pill, field, loc)] = size;
1451 }
1452 EXPORT_SYMBOL(req_capsule_set_size);
1453
1454 /* NB: this function doesn't correspond with req_capsule_set_size(), which
1455  * actually sets the size in pill.rc_area[loc][offset], but this function
1456  * returns the message buflen[offset], maybe we should use another name.
1457  */
1458 int req_capsule_get_size(const struct req_capsule *pill,
1459                          const struct req_msg_field *field,
1460                          enum req_location loc)
1461 {
1462         LASSERT(loc == RCL_SERVER || loc == RCL_CLIENT);
1463
1464         return lustre_msg_buflen(__req_msg(pill, loc),
1465                                  __req_capsule_offset(pill, field, loc));
1466 }
1467 EXPORT_SYMBOL(req_capsule_get_size);
1468
1469 int req_capsule_msg_size(struct req_capsule *pill, enum req_location loc)
1470 {
1471         return lustre_msg_size(pill->rc_req->rq_import->imp_msg_magic,
1472                                pill->rc_fmt->rf_fields[loc].nr,
1473                                pill->rc_area[loc]);
1474 }
1475
1476 int req_capsule_fmt_size(__u32 magic, const struct req_format *fmt,
1477                          enum req_location loc)
1478 {
1479         int size, i = 0;
1480
1481         size = lustre_msg_hdr_size(magic, fmt->rf_fields[loc].nr);
1482         if (size < 0)
1483                 return size;
1484
1485         for (; i < fmt->rf_fields[loc].nr; ++i)
1486                 if (fmt->rf_fields[loc].d[i]->rmf_size != -1)
1487                         size += size_round(fmt->rf_fields[loc].d[i]->rmf_size);
1488         return size;
1489 }
1490
1491 #define FMT_FIELD(fmt, i, j) (fmt)->rf_fields[(i)].d[(j)]
1492
1493 void req_capsule_extend(struct req_capsule *pill, const struct req_format *fmt)
1494 {
1495         int i;
1496         int j;
1497
1498         const struct req_format *old;
1499
1500         LASSERT(pill->rc_fmt != NULL);
1501         LASSERT(__req_format_is_sane(fmt));
1502
1503         old = pill->rc_fmt;
1504         /*
1505          * Sanity checking...
1506          */
1507         for (i = 0; i < RCL_NR; ++i) {
1508                 LASSERT(fmt->rf_fields[i].nr >= old->rf_fields[i].nr);
1509                 for (j = 0; j < old->rf_fields[i].nr - 1; ++j) {
1510                         LASSERT(FMT_FIELD(fmt, i, j) == FMT_FIELD(old, i, j));
1511                 }
1512                 /*
1513                  * Last field in old format can be shorter than in new.
1514                  */
1515                 LASSERT(FMT_FIELD(fmt, i, j)->rmf_size >=
1516                         FMT_FIELD(old, i, j)->rmf_size);
1517         }
1518         /* last field should be returned to the unswabbed state */
1519         pill->rc_swabbed &= ~(__u32)(1 << j);
1520         pill->rc_fmt = fmt;
1521 }
1522 EXPORT_SYMBOL(req_capsule_extend);
1523
1524 int req_capsule_has_field(const struct req_capsule *pill,
1525                           const struct req_msg_field *field,
1526                           enum req_location loc)
1527 {
1528         LASSERT(loc == RCL_SERVER || loc == RCL_CLIENT);
1529
1530         return field->rmf_offset[pill->rc_fmt->rf_idx][loc];
1531 }
1532 EXPORT_SYMBOL(req_capsule_has_field);
1533
1534 int req_capsule_field_present(const struct req_capsule *pill,
1535                               const struct req_msg_field *field,
1536                               enum req_location loc)
1537 {
1538         int offset;
1539
1540         LASSERT(loc == RCL_SERVER || loc == RCL_CLIENT);
1541         LASSERT(req_capsule_has_field(pill, field, loc));
1542
1543         offset = __req_capsule_offset(pill, field, loc);
1544         return lustre_msg_bufcount(__req_msg(pill, loc)) > offset;
1545 }
1546 EXPORT_SYMBOL(req_capsule_field_present);
1547
1548 void req_capsule_shrink(struct req_capsule *pill,
1549                         const struct req_msg_field *field,
1550                         unsigned int newlen,
1551                         enum req_location loc)
1552 {
1553         const struct req_format *fmt;
1554         struct lustre_msg       *msg;
1555         int                      len;
1556         int                      offset;
1557
1558         fmt = pill->rc_fmt;
1559         LASSERT(fmt != NULL);
1560         LASSERT(__req_format_is_sane(fmt));
1561         LASSERT(req_capsule_has_field(pill, field, loc));
1562         LASSERT(req_capsule_field_present(pill, field, loc));
1563
1564         offset = __req_capsule_offset(pill, field, loc);
1565
1566         msg = __req_msg(pill, loc);
1567         len = lustre_msg_buflen(msg, offset);
1568         LASSERTF(newlen <= len, "%s:%s, oldlen=%d, newlen=%d\n",
1569                                 fmt->rf_name, field->rmf_name, len, newlen);
1570
1571         if (loc == RCL_CLIENT)
1572                 pill->rc_req->rq_reqlen = lustre_shrink_msg(msg, offset, newlen,
1573                                                             1);
1574         else
1575                 pill->rc_req->rq_replen = lustre_shrink_msg(msg, offset, newlen,
1576                                                             1);
1577 }
1578 EXPORT_SYMBOL(req_capsule_shrink);
1579
1580 /* __REQ_LAYOUT_USER__ */
1581 #endif