blob: ab5d8517424530bae3be1847e60958b5453b63f1 [file] [log] [blame]
Peng Taod7e09d02013-05-02 16:46:55 +08001/*
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
Oleg Drokin6a5b99a2016-06-14 23:33:40 -040018 * http://www.gnu.org/licenses/gpl-2.0.html
Peng Taod7e09d02013-05-02 16:46:55 +080019 *
Peng Taod7e09d02013-05-02 16:46:55 +080020 * GPL HEADER END
21 */
22/*
23 * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
24 * Use is subject to license terms.
25 *
Andreas Dilger1dc563a2015-11-08 18:09:37 -050026 * Copyright (c) 2011, 2015, Intel Corporation.
Peng Taod7e09d02013-05-02 16:46:55 +080027 */
28/*
29 * This file is part of Lustre, http://www.lustre.org/
30 * Lustre is a trademark of Sun Microsystems, Inc.
31 *
32 * lustre/ptlrpc/layout.c
33 *
34 * Lustre Metadata Target (mdt) request handler
35 *
36 * Author: Nikita Danilov <nikita@clusterfs.com>
37 */
38/*
39 * This file contains the "capsule/pill" abstraction layered above PTLRPC.
40 *
41 * Every struct ptlrpc_request contains a "pill", which points to a description
42 * of the format that the request conforms to.
43 */
44
45#if !defined(__REQ_LAYOUT_USER__)
46
47#define DEBUG_SUBSYSTEM S_RPC
48
49#include <linux/module.h>
50
51/* LUSTRE_VERSION_CODE */
Greg Kroah-Hartmane27db142014-07-11 22:29:36 -070052#include "../include/lustre_ver.h"
Peng Taod7e09d02013-05-02 16:46:55 +080053
Greg Kroah-Hartmane27db142014-07-11 22:29:36 -070054#include "../include/obd_support.h"
Peng Taod7e09d02013-05-02 16:46:55 +080055/* lustre_swab_mdt_body */
Greg Kroah-Hartmane27db142014-07-11 22:29:36 -070056#include "../include/lustre/lustre_idl.h"
Peng Taod7e09d02013-05-02 16:46:55 +080057/* obd2cli_tgt() (required by DEBUG_REQ()) */
Greg Kroah-Hartmane27db142014-07-11 22:29:36 -070058#include "../include/obd.h"
Peng Taod7e09d02013-05-02 16:46:55 +080059
60/* __REQ_LAYOUT_USER__ */
61#endif
62/* struct ptlrpc_request, lustre_msg* */
Greg Kroah-Hartmane27db142014-07-11 22:29:36 -070063#include "../include/lustre_req_layout.h"
Greg Kroah-Hartmane27db142014-07-11 22:29:36 -070064#include "../include/lustre_acl.h"
65#include "../include/lustre_debug.h"
Peng Taod7e09d02013-05-02 16:46:55 +080066
67/*
68 * RQFs (see below) refer to two struct req_msg_field arrays describing the
69 * client request and server reply, respectively.
70 */
71/* empty set of fields... for suitable definition of emptiness. */
72static const struct req_msg_field *empty[] = {
73 &RMF_PTLRPC_BODY
74};
75
76static const struct req_msg_field *mgs_target_info_only[] = {
77 &RMF_PTLRPC_BODY,
78 &RMF_MGS_TARGET_INFO
79};
80
81static const struct req_msg_field *mgs_set_info[] = {
82 &RMF_PTLRPC_BODY,
83 &RMF_MGS_SEND_PARAM
84};
85
86static const struct req_msg_field *mgs_config_read_client[] = {
87 &RMF_PTLRPC_BODY,
88 &RMF_MGS_CONFIG_BODY
89};
90
91static const struct req_msg_field *mgs_config_read_server[] = {
92 &RMF_PTLRPC_BODY,
93 &RMF_MGS_CONFIG_RES
94};
95
96static const struct req_msg_field *log_cancel_client[] = {
97 &RMF_PTLRPC_BODY,
98 &RMF_LOGCOOKIES
99};
100
101static const struct req_msg_field *mdt_body_only[] = {
102 &RMF_PTLRPC_BODY,
103 &RMF_MDT_BODY
104};
105
106static const struct req_msg_field *mdt_body_capa[] = {
107 &RMF_PTLRPC_BODY,
108 &RMF_MDT_BODY,
109 &RMF_CAPA1
110};
111
112static const struct req_msg_field *quotactl_only[] = {
113 &RMF_PTLRPC_BODY,
114 &RMF_OBD_QUOTACTL
115};
116
Peng Taod7e09d02013-05-02 16:46:55 +0800117static const struct req_msg_field *mdt_close_client[] = {
118 &RMF_PTLRPC_BODY,
119 &RMF_MDT_EPOCH,
120 &RMF_REC_REINT,
121 &RMF_CAPA1
122};
123
Jinshan Xiong48d23e62013-12-03 21:58:48 +0800124static const struct req_msg_field *mdt_release_close_client[] = {
125 &RMF_PTLRPC_BODY,
126 &RMF_MDT_EPOCH,
127 &RMF_REC_REINT,
128 &RMF_CAPA1,
129 &RMF_CLOSE_DATA
130};
131
Peng Taod7e09d02013-05-02 16:46:55 +0800132static const struct req_msg_field *obd_statfs_server[] = {
133 &RMF_PTLRPC_BODY,
134 &RMF_OBD_STATFS
135};
136
137static const struct req_msg_field *seq_query_client[] = {
138 &RMF_PTLRPC_BODY,
139 &RMF_SEQ_OPC,
140 &RMF_SEQ_RANGE
141};
142
143static const struct req_msg_field *seq_query_server[] = {
144 &RMF_PTLRPC_BODY,
145 &RMF_SEQ_RANGE
146};
147
148static const struct req_msg_field *fld_query_client[] = {
149 &RMF_PTLRPC_BODY,
150 &RMF_FLD_OPC,
151 &RMF_FLD_MDFLD
152};
153
154static const struct req_msg_field *fld_query_server[] = {
155 &RMF_PTLRPC_BODY,
156 &RMF_FLD_MDFLD
157};
158
wang dib78c2b9b2016-04-28 12:07:34 -0400159static const struct req_msg_field *fld_read_client[] = {
160 &RMF_PTLRPC_BODY,
161 &RMF_FLD_MDFLD
162};
163
164static const struct req_msg_field *fld_read_server[] = {
165 &RMF_PTLRPC_BODY,
166 &RMF_GENERIC_DATA
167};
168
Peng Taod7e09d02013-05-02 16:46:55 +0800169static const struct req_msg_field *mds_getattr_name_client[] = {
170 &RMF_PTLRPC_BODY,
171 &RMF_MDT_BODY,
172 &RMF_CAPA1,
173 &RMF_NAME
174};
175
176static const struct req_msg_field *mds_reint_client[] = {
177 &RMF_PTLRPC_BODY,
178 &RMF_REC_REINT
179};
180
181static const struct req_msg_field *mds_reint_create_client[] = {
182 &RMF_PTLRPC_BODY,
183 &RMF_REC_REINT,
184 &RMF_CAPA1,
185 &RMF_NAME
186};
187
188static const struct req_msg_field *mds_reint_create_slave_client[] = {
189 &RMF_PTLRPC_BODY,
190 &RMF_REC_REINT,
191 &RMF_CAPA1,
192 &RMF_NAME,
193 &RMF_EADATA,
194 &RMF_DLM_REQ
195};
196
Fan Yong341f1f02016-06-19 22:53:53 -0400197static const struct req_msg_field *mds_reint_create_acl_client[] = {
Peng Taod7e09d02013-05-02 16:46:55 +0800198 &RMF_PTLRPC_BODY,
199 &RMF_REC_REINT,
200 &RMF_CAPA1,
201 &RMF_NAME,
202 &RMF_EADATA,
203 &RMF_DLM_REQ
204};
205
206static const struct req_msg_field *mds_reint_create_sym_client[] = {
207 &RMF_PTLRPC_BODY,
208 &RMF_REC_REINT,
209 &RMF_CAPA1,
210 &RMF_NAME,
211 &RMF_SYMTGT,
212 &RMF_DLM_REQ
213};
214
215static const struct req_msg_field *mds_reint_open_client[] = {
216 &RMF_PTLRPC_BODY,
217 &RMF_REC_REINT,
218 &RMF_CAPA1,
219 &RMF_CAPA2,
220 &RMF_NAME,
221 &RMF_EADATA
222};
223
224static const struct req_msg_field *mds_reint_open_server[] = {
225 &RMF_PTLRPC_BODY,
226 &RMF_MDT_BODY,
227 &RMF_MDT_MD,
228 &RMF_ACL,
229 &RMF_CAPA1,
230 &RMF_CAPA2
231};
232
233static const struct req_msg_field *mds_reint_unlink_client[] = {
234 &RMF_PTLRPC_BODY,
235 &RMF_REC_REINT,
236 &RMF_CAPA1,
237 &RMF_NAME,
238 &RMF_DLM_REQ
239};
240
241static const struct req_msg_field *mds_reint_link_client[] = {
242 &RMF_PTLRPC_BODY,
243 &RMF_REC_REINT,
244 &RMF_CAPA1,
245 &RMF_CAPA2,
246 &RMF_NAME,
247 &RMF_DLM_REQ
248};
249
250static const struct req_msg_field *mds_reint_rename_client[] = {
251 &RMF_PTLRPC_BODY,
252 &RMF_REC_REINT,
253 &RMF_CAPA1,
254 &RMF_CAPA2,
255 &RMF_NAME,
256 &RMF_SYMTGT,
257 &RMF_DLM_REQ
258};
259
260static const struct req_msg_field *mds_last_unlink_server[] = {
261 &RMF_PTLRPC_BODY,
262 &RMF_MDT_BODY,
263 &RMF_MDT_MD,
264 &RMF_LOGCOOKIES,
265 &RMF_CAPA1,
266 &RMF_CAPA2
267};
268
269static const struct req_msg_field *mds_reint_setattr_client[] = {
270 &RMF_PTLRPC_BODY,
271 &RMF_REC_REINT,
272 &RMF_CAPA1,
273 &RMF_MDT_EPOCH,
274 &RMF_EADATA,
275 &RMF_LOGCOOKIES,
276 &RMF_DLM_REQ
277};
278
279static const struct req_msg_field *mds_reint_setxattr_client[] = {
280 &RMF_PTLRPC_BODY,
281 &RMF_REC_REINT,
282 &RMF_CAPA1,
283 &RMF_NAME,
Andrew Perepechkoe93a3082014-02-09 02:51:48 -0500284 &RMF_EADATA,
285 &RMF_DLM_REQ
Peng Taod7e09d02013-05-02 16:46:55 +0800286};
287
288static const struct req_msg_field *mdt_swap_layouts[] = {
289 &RMF_PTLRPC_BODY,
290 &RMF_MDT_BODY,
291 &RMF_SWAP_LAYOUTS,
292 &RMF_CAPA1,
293 &RMF_CAPA2,
294 &RMF_DLM_REQ
295};
296
297static const struct req_msg_field *obd_connect_client[] = {
298 &RMF_PTLRPC_BODY,
299 &RMF_TGTUUID,
300 &RMF_CLUUID,
301 &RMF_CONN,
302 &RMF_CONNECT_DATA
303};
304
305static const struct req_msg_field *obd_connect_server[] = {
306 &RMF_PTLRPC_BODY,
307 &RMF_CONNECT_DATA
308};
309
310static const struct req_msg_field *obd_set_info_client[] = {
311 &RMF_PTLRPC_BODY,
312 &RMF_SETINFO_KEY,
313 &RMF_SETINFO_VAL
314};
315
316static const struct req_msg_field *ost_grant_shrink_client[] = {
317 &RMF_PTLRPC_BODY,
318 &RMF_SETINFO_KEY,
319 &RMF_OST_BODY
320};
321
322static const struct req_msg_field *mds_getinfo_client[] = {
323 &RMF_PTLRPC_BODY,
324 &RMF_GETINFO_KEY,
325 &RMF_GETINFO_VALLEN
326};
327
328static const struct req_msg_field *mds_getinfo_server[] = {
329 &RMF_PTLRPC_BODY,
330 &RMF_GETINFO_VAL,
331};
332
333static const struct req_msg_field *ldlm_enqueue_client[] = {
334 &RMF_PTLRPC_BODY,
335 &RMF_DLM_REQ
336};
337
338static const struct req_msg_field *ldlm_enqueue_server[] = {
339 &RMF_PTLRPC_BODY,
340 &RMF_DLM_REP
341};
342
343static const struct req_msg_field *ldlm_enqueue_lvb_server[] = {
344 &RMF_PTLRPC_BODY,
345 &RMF_DLM_REP,
346 &RMF_DLM_LVB
347};
348
349static const struct req_msg_field *ldlm_cp_callback_client[] = {
350 &RMF_PTLRPC_BODY,
351 &RMF_DLM_REQ,
352 &RMF_DLM_LVB
353};
354
355static const struct req_msg_field *ldlm_gl_callback_desc_client[] = {
356 &RMF_PTLRPC_BODY,
357 &RMF_DLM_REQ,
358 &RMF_DLM_GL_DESC
359};
360
361static const struct req_msg_field *ldlm_gl_callback_server[] = {
362 &RMF_PTLRPC_BODY,
363 &RMF_DLM_LVB
364};
365
366static const struct req_msg_field *ldlm_intent_basic_client[] = {
367 &RMF_PTLRPC_BODY,
368 &RMF_DLM_REQ,
369 &RMF_LDLM_INTENT,
370};
371
372static const struct req_msg_field *ldlm_intent_client[] = {
373 &RMF_PTLRPC_BODY,
374 &RMF_DLM_REQ,
375 &RMF_LDLM_INTENT,
376 &RMF_REC_REINT
377};
378
379static const struct req_msg_field *ldlm_intent_server[] = {
380 &RMF_PTLRPC_BODY,
381 &RMF_DLM_REP,
382 &RMF_MDT_BODY,
383 &RMF_MDT_MD,
384 &RMF_ACL
385};
386
387static const struct req_msg_field *ldlm_intent_layout_client[] = {
388 &RMF_PTLRPC_BODY,
389 &RMF_DLM_REQ,
390 &RMF_LDLM_INTENT,
391 &RMF_LAYOUT_INTENT,
392 &RMF_EADATA /* for new layout to be set up */
393};
Mike Rapoportc9f6bb92015-10-13 16:03:42 +0300394
Peng Taod7e09d02013-05-02 16:46:55 +0800395static const struct req_msg_field *ldlm_intent_open_server[] = {
396 &RMF_PTLRPC_BODY,
397 &RMF_DLM_REP,
398 &RMF_MDT_BODY,
399 &RMF_MDT_MD,
400 &RMF_ACL,
401 &RMF_CAPA1,
402 &RMF_CAPA2
403};
404
405static const struct req_msg_field *ldlm_intent_getattr_client[] = {
406 &RMF_PTLRPC_BODY,
407 &RMF_DLM_REQ,
408 &RMF_LDLM_INTENT,
409 &RMF_MDT_BODY, /* coincides with mds_getattr_name_client[] */
410 &RMF_CAPA1,
411 &RMF_NAME
412};
413
414static const struct req_msg_field *ldlm_intent_getattr_server[] = {
415 &RMF_PTLRPC_BODY,
416 &RMF_DLM_REP,
417 &RMF_MDT_BODY,
418 &RMF_MDT_MD,
419 &RMF_ACL,
420 &RMF_CAPA1
421};
422
423static const struct req_msg_field *ldlm_intent_create_client[] = {
424 &RMF_PTLRPC_BODY,
425 &RMF_DLM_REQ,
426 &RMF_LDLM_INTENT,
427 &RMF_REC_REINT, /* coincides with mds_reint_create_client[] */
428 &RMF_CAPA1,
429 &RMF_NAME,
430 &RMF_EADATA
431};
432
433static const struct req_msg_field *ldlm_intent_open_client[] = {
434 &RMF_PTLRPC_BODY,
435 &RMF_DLM_REQ,
436 &RMF_LDLM_INTENT,
437 &RMF_REC_REINT, /* coincides with mds_reint_open_client[] */
438 &RMF_CAPA1,
439 &RMF_CAPA2,
440 &RMF_NAME,
441 &RMF_EADATA
442};
443
444static const struct req_msg_field *ldlm_intent_unlink_client[] = {
445 &RMF_PTLRPC_BODY,
446 &RMF_DLM_REQ,
447 &RMF_LDLM_INTENT,
448 &RMF_REC_REINT, /* coincides with mds_reint_unlink_client[] */
449 &RMF_CAPA1,
450 &RMF_NAME
451};
452
Andrew Perepechko7fc1f832013-12-03 21:58:49 +0800453static const struct req_msg_field *ldlm_intent_getxattr_client[] = {
454 &RMF_PTLRPC_BODY,
455 &RMF_DLM_REQ,
456 &RMF_LDLM_INTENT,
457 &RMF_MDT_BODY,
458 &RMF_CAPA1,
459};
460
461static const struct req_msg_field *ldlm_intent_getxattr_server[] = {
462 &RMF_PTLRPC_BODY,
463 &RMF_DLM_REP,
464 &RMF_MDT_BODY,
465 &RMF_MDT_MD,
466 &RMF_ACL, /* for req_capsule_extend/mdt_intent_policy */
467 &RMF_EADATA,
468 &RMF_EAVALS,
469 &RMF_EAVALS_LENS
470};
471
Peng Taod7e09d02013-05-02 16:46:55 +0800472static const struct req_msg_field *mds_getxattr_client[] = {
473 &RMF_PTLRPC_BODY,
474 &RMF_MDT_BODY,
475 &RMF_CAPA1,
476 &RMF_NAME,
477 &RMF_EADATA
478};
479
480static const struct req_msg_field *mds_getxattr_server[] = {
481 &RMF_PTLRPC_BODY,
482 &RMF_MDT_BODY,
483 &RMF_EADATA
484};
485
486static const struct req_msg_field *mds_getattr_server[] = {
487 &RMF_PTLRPC_BODY,
488 &RMF_MDT_BODY,
489 &RMF_MDT_MD,
490 &RMF_ACL,
491 &RMF_CAPA1,
492 &RMF_CAPA2
493};
494
495static const struct req_msg_field *mds_setattr_server[] = {
496 &RMF_PTLRPC_BODY,
497 &RMF_MDT_BODY,
498 &RMF_MDT_MD,
499 &RMF_ACL,
500 &RMF_CAPA1,
501 &RMF_CAPA2
502};
503
Peng Taod7e09d02013-05-02 16:46:55 +0800504static const struct req_msg_field *llog_origin_handle_create_client[] = {
505 &RMF_PTLRPC_BODY,
506 &RMF_LLOGD_BODY,
507 &RMF_NAME
508};
509
510static const struct req_msg_field *llogd_body_only[] = {
511 &RMF_PTLRPC_BODY,
512 &RMF_LLOGD_BODY
513};
514
515static const struct req_msg_field *llog_log_hdr_only[] = {
516 &RMF_PTLRPC_BODY,
517 &RMF_LLOG_LOG_HDR
518};
519
520static const struct req_msg_field *llogd_conn_body_only[] = {
521 &RMF_PTLRPC_BODY,
522 &RMF_LLOGD_CONN_BODY
523};
524
525static const struct req_msg_field *llog_origin_handle_next_block_server[] = {
526 &RMF_PTLRPC_BODY,
527 &RMF_LLOGD_BODY,
528 &RMF_EADATA
529};
530
Peng Taod7e09d02013-05-02 16:46:55 +0800531static const struct req_msg_field *ost_body_only[] = {
532 &RMF_PTLRPC_BODY,
533 &RMF_OST_BODY
534};
535
536static const struct req_msg_field *ost_body_capa[] = {
537 &RMF_PTLRPC_BODY,
538 &RMF_OST_BODY,
539 &RMF_CAPA1
540};
541
542static const struct req_msg_field *ost_destroy_client[] = {
543 &RMF_PTLRPC_BODY,
544 &RMF_OST_BODY,
545 &RMF_DLM_REQ,
546 &RMF_CAPA1
547};
548
Peng Taod7e09d02013-05-02 16:46:55 +0800549static const struct req_msg_field *ost_brw_client[] = {
550 &RMF_PTLRPC_BODY,
551 &RMF_OST_BODY,
552 &RMF_OBD_IOOBJ,
553 &RMF_NIOBUF_REMOTE,
554 &RMF_CAPA1
555};
556
557static const struct req_msg_field *ost_brw_read_server[] = {
558 &RMF_PTLRPC_BODY,
559 &RMF_OST_BODY
560};
561
562static const struct req_msg_field *ost_brw_write_server[] = {
563 &RMF_PTLRPC_BODY,
564 &RMF_OST_BODY,
565 &RMF_RCS
566};
567
568static const struct req_msg_field *ost_get_info_generic_server[] = {
569 &RMF_PTLRPC_BODY,
570 &RMF_GENERIC_DATA,
571};
572
573static const struct req_msg_field *ost_get_info_generic_client[] = {
574 &RMF_PTLRPC_BODY,
Mikhail Pershin45fe5b12016-04-27 21:37:12 -0400575 &RMF_GETINFO_KEY
Peng Taod7e09d02013-05-02 16:46:55 +0800576};
577
578static const struct req_msg_field *ost_get_last_id_server[] = {
579 &RMF_PTLRPC_BODY,
580 &RMF_OBD_ID
581};
582
Mikhail Pershin45fe5b12016-04-27 21:37:12 -0400583static const struct req_msg_field *ost_get_last_fid_client[] = {
584 &RMF_PTLRPC_BODY,
585 &RMF_GETINFO_KEY,
586 &RMF_FID,
587};
588
Peng Taod7e09d02013-05-02 16:46:55 +0800589static const struct req_msg_field *ost_get_last_fid_server[] = {
590 &RMF_PTLRPC_BODY,
591 &RMF_FID,
592};
593
594static const struct req_msg_field *ost_get_fiemap_client[] = {
595 &RMF_PTLRPC_BODY,
596 &RMF_FIEMAP_KEY,
597 &RMF_FIEMAP_VAL
598};
599
600static const struct req_msg_field *ost_get_fiemap_server[] = {
601 &RMF_PTLRPC_BODY,
602 &RMF_FIEMAP_VAL
603};
604
605static const struct req_msg_field *mdt_hsm_progress[] = {
606 &RMF_PTLRPC_BODY,
607 &RMF_MDT_BODY,
608 &RMF_MDS_HSM_PROGRESS,
609};
610
611static const struct req_msg_field *mdt_hsm_ct_register[] = {
612 &RMF_PTLRPC_BODY,
613 &RMF_MDT_BODY,
614 &RMF_MDS_HSM_ARCHIVE,
615};
616
617static const struct req_msg_field *mdt_hsm_ct_unregister[] = {
618 &RMF_PTLRPC_BODY,
619 &RMF_MDT_BODY,
620};
621
622static const struct req_msg_field *mdt_hsm_action_server[] = {
623 &RMF_PTLRPC_BODY,
624 &RMF_MDT_BODY,
625 &RMF_MDS_HSM_CURRENT_ACTION,
626};
627
628static const struct req_msg_field *mdt_hsm_state_get_server[] = {
629 &RMF_PTLRPC_BODY,
630 &RMF_MDT_BODY,
631 &RMF_HSM_USER_STATE,
632};
633
634static const struct req_msg_field *mdt_hsm_state_set[] = {
635 &RMF_PTLRPC_BODY,
636 &RMF_MDT_BODY,
637 &RMF_CAPA1,
638 &RMF_HSM_STATE_SET,
639};
640
641static const struct req_msg_field *mdt_hsm_request[] = {
642 &RMF_PTLRPC_BODY,
643 &RMF_MDT_BODY,
644 &RMF_MDS_HSM_REQUEST,
645 &RMF_MDS_HSM_USER_ITEM,
646 &RMF_GENERIC_DATA,
647};
648
649static struct req_format *req_formats[] = {
650 &RQF_OBD_PING,
651 &RQF_OBD_SET_INFO,
Peng Taod7e09d02013-05-02 16:46:55 +0800652 &RQF_SEC_CTX,
653 &RQF_MGS_TARGET_REG,
654 &RQF_MGS_SET_INFO,
655 &RQF_MGS_CONFIG_READ,
656 &RQF_SEQ_QUERY,
657 &RQF_FLD_QUERY,
wang dib78c2b9b2016-04-28 12:07:34 -0400658 &RQF_FLD_READ,
Peng Taod7e09d02013-05-02 16:46:55 +0800659 &RQF_MDS_CONNECT,
660 &RQF_MDS_DISCONNECT,
661 &RQF_MDS_GET_INFO,
662 &RQF_MDS_GETSTATUS,
663 &RQF_MDS_STATFS,
664 &RQF_MDS_GETATTR,
665 &RQF_MDS_GETATTR_NAME,
666 &RQF_MDS_GETXATTR,
667 &RQF_MDS_SYNC,
668 &RQF_MDS_CLOSE,
Jinshan Xiong48d23e62013-12-03 21:58:48 +0800669 &RQF_MDS_RELEASE_CLOSE,
Peng Taod7e09d02013-05-02 16:46:55 +0800670 &RQF_MDS_PIN,
671 &RQF_MDS_UNPIN,
672 &RQF_MDS_READPAGE,
673 &RQF_MDS_WRITEPAGE,
674 &RQF_MDS_IS_SUBDIR,
675 &RQF_MDS_DONE_WRITING,
676 &RQF_MDS_REINT,
677 &RQF_MDS_REINT_CREATE,
Fan Yong341f1f02016-06-19 22:53:53 -0400678 &RQF_MDS_REINT_CREATE_ACL,
Peng Taod7e09d02013-05-02 16:46:55 +0800679 &RQF_MDS_REINT_CREATE_SLAVE,
680 &RQF_MDS_REINT_CREATE_SYM,
681 &RQF_MDS_REINT_OPEN,
682 &RQF_MDS_REINT_UNLINK,
683 &RQF_MDS_REINT_LINK,
684 &RQF_MDS_REINT_RENAME,
685 &RQF_MDS_REINT_SETATTR,
686 &RQF_MDS_REINT_SETXATTR,
687 &RQF_MDS_QUOTACHECK,
688 &RQF_MDS_QUOTACTL,
689 &RQF_MDS_HSM_PROGRESS,
690 &RQF_MDS_HSM_CT_REGISTER,
691 &RQF_MDS_HSM_CT_UNREGISTER,
692 &RQF_MDS_HSM_STATE_GET,
693 &RQF_MDS_HSM_STATE_SET,
694 &RQF_MDS_HSM_ACTION,
695 &RQF_MDS_HSM_REQUEST,
696 &RQF_MDS_SWAP_LAYOUTS,
Peng Taod7e09d02013-05-02 16:46:55 +0800697 &RQF_QC_CALLBACK,
698 &RQF_OST_CONNECT,
699 &RQF_OST_DISCONNECT,
700 &RQF_OST_QUOTACHECK,
701 &RQF_OST_QUOTACTL,
702 &RQF_OST_GETATTR,
703 &RQF_OST_SETATTR,
704 &RQF_OST_CREATE,
705 &RQF_OST_PUNCH,
706 &RQF_OST_SYNC,
707 &RQF_OST_DESTROY,
708 &RQF_OST_BRW_READ,
709 &RQF_OST_BRW_WRITE,
710 &RQF_OST_STATFS,
711 &RQF_OST_SET_GRANT_INFO,
Mikhail Pershin45fe5b12016-04-27 21:37:12 -0400712 &RQF_OST_GET_INFO,
Peng Taod7e09d02013-05-02 16:46:55 +0800713 &RQF_OST_GET_INFO_LAST_ID,
714 &RQF_OST_GET_INFO_LAST_FID,
715 &RQF_OST_SET_INFO_LAST_FID,
716 &RQF_OST_GET_INFO_FIEMAP,
717 &RQF_LDLM_ENQUEUE,
718 &RQF_LDLM_ENQUEUE_LVB,
719 &RQF_LDLM_CONVERT,
720 &RQF_LDLM_CANCEL,
721 &RQF_LDLM_CALLBACK,
722 &RQF_LDLM_CP_CALLBACK,
723 &RQF_LDLM_BL_CALLBACK,
724 &RQF_LDLM_GL_CALLBACK,
725 &RQF_LDLM_GL_DESC_CALLBACK,
726 &RQF_LDLM_INTENT,
727 &RQF_LDLM_INTENT_BASIC,
728 &RQF_LDLM_INTENT_LAYOUT,
729 &RQF_LDLM_INTENT_GETATTR,
730 &RQF_LDLM_INTENT_OPEN,
731 &RQF_LDLM_INTENT_CREATE,
732 &RQF_LDLM_INTENT_UNLINK,
Andrew Perepechko7fc1f832013-12-03 21:58:49 +0800733 &RQF_LDLM_INTENT_GETXATTR,
Peng Taod7e09d02013-05-02 16:46:55 +0800734 &RQF_LOG_CANCEL,
735 &RQF_LLOG_ORIGIN_HANDLE_CREATE,
736 &RQF_LLOG_ORIGIN_HANDLE_DESTROY,
737 &RQF_LLOG_ORIGIN_HANDLE_NEXT_BLOCK,
738 &RQF_LLOG_ORIGIN_HANDLE_PREV_BLOCK,
739 &RQF_LLOG_ORIGIN_HANDLE_READ_HEADER,
Mikhail Pershin65f1c782013-11-26 10:04:55 +0800740 &RQF_LLOG_ORIGIN_CONNECT,
741 &RQF_CONNECT,
Peng Taod7e09d02013-05-02 16:46:55 +0800742};
743
744struct req_msg_field {
745 const __u32 rmf_flags;
746 const char *rmf_name;
747 /**
748 * Field length. (-1) means "variable length". If the
749 * \a RMF_F_STRUCT_ARRAY flag is set the field is also variable-length,
750 * but the actual size must be a whole multiple of \a rmf_size.
751 */
752 const int rmf_size;
753 void (*rmf_swabber)(void *);
754 void (*rmf_dumper)(void *);
755 int rmf_offset[ARRAY_SIZE(req_formats)][RCL_NR];
756};
757
758enum rmf_flags {
759 /**
760 * The field is a string, must be NUL-terminated.
761 */
Shraddha Barke6876a142015-09-10 22:02:40 +0530762 RMF_F_STRING = BIT(0),
Peng Taod7e09d02013-05-02 16:46:55 +0800763 /**
764 * The field's buffer size need not match the declared \a rmf_size.
765 */
Shraddha Barke6876a142015-09-10 22:02:40 +0530766 RMF_F_NO_SIZE_CHECK = BIT(1),
Peng Taod7e09d02013-05-02 16:46:55 +0800767 /**
768 * The field's buffer size must be a whole multiple of the declared \a
769 * rmf_size and the \a rmf_swabber function must work on the declared \a
770 * rmf_size worth of bytes.
771 */
Shraddha Barke6876a142015-09-10 22:02:40 +0530772 RMF_F_STRUCT_ARRAY = BIT(2)
Peng Taod7e09d02013-05-02 16:46:55 +0800773};
774
775struct req_capsule;
776
777/*
778 * Request fields.
779 */
Chris Hannad0bfef32015-06-03 10:28:26 -0400780#define DEFINE_MSGF(name, flags, size, swabber, dumper) { \
781 .rmf_name = (name), \
782 .rmf_flags = (flags), \
783 .rmf_size = (size), \
784 .rmf_swabber = (void (*)(void *))(swabber), \
Hatice ERTÃœRKcf9cac22015-02-27 21:54:22 +0200785 .rmf_dumper = (void (*)(void *))(dumper) \
Peng Taod7e09d02013-05-02 16:46:55 +0800786}
787
788struct req_msg_field RMF_GENERIC_DATA =
789 DEFINE_MSGF("generic_data", 0,
790 -1, NULL, NULL);
791EXPORT_SYMBOL(RMF_GENERIC_DATA);
792
793struct req_msg_field RMF_MGS_TARGET_INFO =
794 DEFINE_MSGF("mgs_target_info", 0,
795 sizeof(struct mgs_target_info),
796 lustre_swab_mgs_target_info, NULL);
797EXPORT_SYMBOL(RMF_MGS_TARGET_INFO);
798
799struct req_msg_field RMF_MGS_SEND_PARAM =
800 DEFINE_MSGF("mgs_send_param", 0,
801 sizeof(struct mgs_send_param),
802 NULL, NULL);
803EXPORT_SYMBOL(RMF_MGS_SEND_PARAM);
804
805struct req_msg_field RMF_MGS_CONFIG_BODY =
806 DEFINE_MSGF("mgs_config_read request", 0,
807 sizeof(struct mgs_config_body),
808 lustre_swab_mgs_config_body, NULL);
809EXPORT_SYMBOL(RMF_MGS_CONFIG_BODY);
810
811struct req_msg_field RMF_MGS_CONFIG_RES =
812 DEFINE_MSGF("mgs_config_read reply ", 0,
813 sizeof(struct mgs_config_res),
814 lustre_swab_mgs_config_res, NULL);
815EXPORT_SYMBOL(RMF_MGS_CONFIG_RES);
816
817struct req_msg_field RMF_U32 =
818 DEFINE_MSGF("generic u32", 0,
819 sizeof(__u32), lustre_swab_generic_32s, NULL);
820EXPORT_SYMBOL(RMF_U32);
821
822struct req_msg_field RMF_SETINFO_VAL =
823 DEFINE_MSGF("setinfo_val", 0, -1, NULL, NULL);
824EXPORT_SYMBOL(RMF_SETINFO_VAL);
825
826struct req_msg_field RMF_GETINFO_KEY =
827 DEFINE_MSGF("getinfo_key", 0, -1, NULL, NULL);
828EXPORT_SYMBOL(RMF_GETINFO_KEY);
829
830struct req_msg_field RMF_GETINFO_VALLEN =
831 DEFINE_MSGF("getinfo_vallen", 0,
832 sizeof(__u32), lustre_swab_generic_32s, NULL);
833EXPORT_SYMBOL(RMF_GETINFO_VALLEN);
834
835struct req_msg_field RMF_GETINFO_VAL =
836 DEFINE_MSGF("getinfo_val", 0, -1, NULL, NULL);
837EXPORT_SYMBOL(RMF_GETINFO_VAL);
838
839struct req_msg_field RMF_SEQ_OPC =
840 DEFINE_MSGF("seq_query_opc", 0,
841 sizeof(__u32), lustre_swab_generic_32s, NULL);
842EXPORT_SYMBOL(RMF_SEQ_OPC);
843
844struct req_msg_field RMF_SEQ_RANGE =
845 DEFINE_MSGF("seq_query_range", 0,
846 sizeof(struct lu_seq_range),
847 lustre_swab_lu_seq_range, NULL);
848EXPORT_SYMBOL(RMF_SEQ_RANGE);
849
850struct req_msg_field RMF_FLD_OPC =
851 DEFINE_MSGF("fld_query_opc", 0,
852 sizeof(__u32), lustre_swab_generic_32s, NULL);
853EXPORT_SYMBOL(RMF_FLD_OPC);
854
855struct req_msg_field RMF_FLD_MDFLD =
856 DEFINE_MSGF("fld_query_mdfld", 0,
857 sizeof(struct lu_seq_range),
858 lustre_swab_lu_seq_range, NULL);
859EXPORT_SYMBOL(RMF_FLD_MDFLD);
860
861struct req_msg_field RMF_MDT_BODY =
862 DEFINE_MSGF("mdt_body", 0,
863 sizeof(struct mdt_body), lustre_swab_mdt_body, NULL);
864EXPORT_SYMBOL(RMF_MDT_BODY);
865
866struct req_msg_field RMF_OBD_QUOTACTL =
867 DEFINE_MSGF("obd_quotactl", 0,
868 sizeof(struct obd_quotactl),
869 lustre_swab_obd_quotactl, NULL);
870EXPORT_SYMBOL(RMF_OBD_QUOTACTL);
871
Peng Taod7e09d02013-05-02 16:46:55 +0800872struct req_msg_field RMF_MDT_EPOCH =
873 DEFINE_MSGF("mdt_ioepoch", 0,
874 sizeof(struct mdt_ioepoch), lustre_swab_mdt_ioepoch, NULL);
875EXPORT_SYMBOL(RMF_MDT_EPOCH);
876
877struct req_msg_field RMF_PTLRPC_BODY =
878 DEFINE_MSGF("ptlrpc_body", 0,
879 sizeof(struct ptlrpc_body), lustre_swab_ptlrpc_body, NULL);
880EXPORT_SYMBOL(RMF_PTLRPC_BODY);
881
Jinshan Xiong48d23e62013-12-03 21:58:48 +0800882struct req_msg_field RMF_CLOSE_DATA =
883 DEFINE_MSGF("data_version", 0,
884 sizeof(struct close_data), lustre_swab_close_data, NULL);
885EXPORT_SYMBOL(RMF_CLOSE_DATA);
886
Peng Taod7e09d02013-05-02 16:46:55 +0800887struct req_msg_field RMF_OBD_STATFS =
888 DEFINE_MSGF("obd_statfs", 0,
889 sizeof(struct obd_statfs), lustre_swab_obd_statfs, NULL);
890EXPORT_SYMBOL(RMF_OBD_STATFS);
891
892struct req_msg_field RMF_SETINFO_KEY =
893 DEFINE_MSGF("setinfo_key", 0, -1, NULL, NULL);
894EXPORT_SYMBOL(RMF_SETINFO_KEY);
895
896struct req_msg_field RMF_NAME =
897 DEFINE_MSGF("name", RMF_F_STRING, -1, NULL, NULL);
898EXPORT_SYMBOL(RMF_NAME);
899
900struct req_msg_field RMF_SYMTGT =
901 DEFINE_MSGF("symtgt", RMF_F_STRING, -1, NULL, NULL);
902EXPORT_SYMBOL(RMF_SYMTGT);
903
904struct req_msg_field RMF_TGTUUID =
905 DEFINE_MSGF("tgtuuid", RMF_F_STRING, sizeof(struct obd_uuid) - 1, NULL,
Oleg Drokin30c0aa32016-02-26 01:50:02 -0500906 NULL);
Peng Taod7e09d02013-05-02 16:46:55 +0800907EXPORT_SYMBOL(RMF_TGTUUID);
908
909struct req_msg_field RMF_CLUUID =
910 DEFINE_MSGF("cluuid", RMF_F_STRING, sizeof(struct obd_uuid) - 1, NULL,
Oleg Drokin30c0aa32016-02-26 01:50:02 -0500911 NULL);
Peng Taod7e09d02013-05-02 16:46:55 +0800912EXPORT_SYMBOL(RMF_CLUUID);
913
914struct req_msg_field RMF_STRING =
915 DEFINE_MSGF("string", RMF_F_STRING, -1, NULL, NULL);
916EXPORT_SYMBOL(RMF_STRING);
917
918struct req_msg_field RMF_LLOGD_BODY =
919 DEFINE_MSGF("llogd_body", 0,
920 sizeof(struct llogd_body), lustre_swab_llogd_body, NULL);
921EXPORT_SYMBOL(RMF_LLOGD_BODY);
922
923struct req_msg_field RMF_LLOG_LOG_HDR =
924 DEFINE_MSGF("llog_log_hdr", 0,
925 sizeof(struct llog_log_hdr), lustre_swab_llog_hdr, NULL);
926EXPORT_SYMBOL(RMF_LLOG_LOG_HDR);
927
928struct req_msg_field RMF_LLOGD_CONN_BODY =
929 DEFINE_MSGF("llogd_conn_body", 0,
930 sizeof(struct llogd_conn_body),
931 lustre_swab_llogd_conn_body, NULL);
932EXPORT_SYMBOL(RMF_LLOGD_CONN_BODY);
933
934/*
935 * connection handle received in MDS_CONNECT request.
936 *
937 * No swabbing needed because struct lustre_handle contains only a 64-bit cookie
938 * that the client does not interpret at all.
939 */
940struct req_msg_field RMF_CONN =
941 DEFINE_MSGF("conn", 0, sizeof(struct lustre_handle), NULL, NULL);
942EXPORT_SYMBOL(RMF_CONN);
943
944struct req_msg_field RMF_CONNECT_DATA =
945 DEFINE_MSGF("cdata",
946 RMF_F_NO_SIZE_CHECK /* we allow extra space for interop */,
Peng Taod7e09d02013-05-02 16:46:55 +0800947 sizeof(struct obd_connect_data),
Peng Taod7e09d02013-05-02 16:46:55 +0800948 lustre_swab_connect, NULL);
949EXPORT_SYMBOL(RMF_CONNECT_DATA);
950
951struct req_msg_field RMF_DLM_REQ =
952 DEFINE_MSGF("dlm_req", RMF_F_NO_SIZE_CHECK /* ldlm_request_bufsize */,
953 sizeof(struct ldlm_request),
954 lustre_swab_ldlm_request, NULL);
955EXPORT_SYMBOL(RMF_DLM_REQ);
956
957struct req_msg_field RMF_DLM_REP =
958 DEFINE_MSGF("dlm_rep", 0,
959 sizeof(struct ldlm_reply), lustre_swab_ldlm_reply, NULL);
960EXPORT_SYMBOL(RMF_DLM_REP);
961
962struct req_msg_field RMF_LDLM_INTENT =
963 DEFINE_MSGF("ldlm_intent", 0,
964 sizeof(struct ldlm_intent), lustre_swab_ldlm_intent, NULL);
965EXPORT_SYMBOL(RMF_LDLM_INTENT);
966
967struct req_msg_field RMF_DLM_LVB =
968 DEFINE_MSGF("dlm_lvb", 0, -1, NULL, NULL);
969EXPORT_SYMBOL(RMF_DLM_LVB);
970
971struct req_msg_field RMF_DLM_GL_DESC =
972 DEFINE_MSGF("dlm_gl_desc", 0, sizeof(union ldlm_gl_desc),
973 lustre_swab_gl_desc, NULL);
974EXPORT_SYMBOL(RMF_DLM_GL_DESC);
975
976struct req_msg_field RMF_MDT_MD =
977 DEFINE_MSGF("mdt_md", RMF_F_NO_SIZE_CHECK, MIN_MD_SIZE, NULL, NULL);
978EXPORT_SYMBOL(RMF_MDT_MD);
979
980struct req_msg_field RMF_REC_REINT =
981 DEFINE_MSGF("rec_reint", 0, sizeof(struct mdt_rec_reint),
982 lustre_swab_mdt_rec_reint, NULL);
983EXPORT_SYMBOL(RMF_REC_REINT);
984
985/* FIXME: this length should be defined as a macro */
986struct req_msg_field RMF_EADATA = DEFINE_MSGF("eadata", 0, -1,
987 NULL, NULL);
988EXPORT_SYMBOL(RMF_EADATA);
989
Andrew Perepechko7fc1f832013-12-03 21:58:49 +0800990struct req_msg_field RMF_EAVALS = DEFINE_MSGF("eavals", 0, -1, NULL, NULL);
991EXPORT_SYMBOL(RMF_EAVALS);
992
Peng Taod7e09d02013-05-02 16:46:55 +0800993struct req_msg_field RMF_ACL =
994 DEFINE_MSGF("acl", RMF_F_NO_SIZE_CHECK,
995 LUSTRE_POSIX_ACL_MAX_SIZE, NULL, NULL);
996EXPORT_SYMBOL(RMF_ACL);
997
998/* FIXME: this should be made to use RMF_F_STRUCT_ARRAY */
999struct req_msg_field RMF_LOGCOOKIES =
1000 DEFINE_MSGF("logcookies", RMF_F_NO_SIZE_CHECK /* multiple cookies */,
1001 sizeof(struct llog_cookie), NULL, NULL);
1002EXPORT_SYMBOL(RMF_LOGCOOKIES);
1003
1004struct req_msg_field RMF_CAPA1 =
1005 DEFINE_MSGF("capa", 0, sizeof(struct lustre_capa),
1006 lustre_swab_lustre_capa, NULL);
1007EXPORT_SYMBOL(RMF_CAPA1);
1008
1009struct req_msg_field RMF_CAPA2 =
1010 DEFINE_MSGF("capa", 0, sizeof(struct lustre_capa),
1011 lustre_swab_lustre_capa, NULL);
1012EXPORT_SYMBOL(RMF_CAPA2);
1013
1014struct req_msg_field RMF_LAYOUT_INTENT =
1015 DEFINE_MSGF("layout_intent", 0,
1016 sizeof(struct layout_intent), lustre_swab_layout_intent,
1017 NULL);
1018EXPORT_SYMBOL(RMF_LAYOUT_INTENT);
1019
1020/*
1021 * OST request field.
1022 */
1023struct req_msg_field RMF_OST_BODY =
1024 DEFINE_MSGF("ost_body", 0,
1025 sizeof(struct ost_body), lustre_swab_ost_body, dump_ost_body);
1026EXPORT_SYMBOL(RMF_OST_BODY);
1027
1028struct req_msg_field RMF_OBD_IOOBJ =
1029 DEFINE_MSGF("obd_ioobj", RMF_F_STRUCT_ARRAY,
1030 sizeof(struct obd_ioobj), lustre_swab_obd_ioobj, dump_ioo);
1031EXPORT_SYMBOL(RMF_OBD_IOOBJ);
1032
1033struct req_msg_field RMF_NIOBUF_REMOTE =
1034 DEFINE_MSGF("niobuf_remote", RMF_F_STRUCT_ARRAY,
1035 sizeof(struct niobuf_remote), lustre_swab_niobuf_remote,
1036 dump_rniobuf);
1037EXPORT_SYMBOL(RMF_NIOBUF_REMOTE);
1038
1039struct req_msg_field RMF_RCS =
1040 DEFINE_MSGF("niobuf_remote", RMF_F_STRUCT_ARRAY, sizeof(__u32),
1041 lustre_swab_generic_32s, dump_rcs);
1042EXPORT_SYMBOL(RMF_RCS);
1043
Andrew Perepechko7fc1f832013-12-03 21:58:49 +08001044struct req_msg_field RMF_EAVALS_LENS =
1045 DEFINE_MSGF("eavals_lens", RMF_F_STRUCT_ARRAY, sizeof(__u32),
Oleg Drokin30c0aa32016-02-26 01:50:02 -05001046 lustre_swab_generic_32s, NULL);
Andrew Perepechko7fc1f832013-12-03 21:58:49 +08001047EXPORT_SYMBOL(RMF_EAVALS_LENS);
1048
Peng Taod7e09d02013-05-02 16:46:55 +08001049struct req_msg_field RMF_OBD_ID =
Oleg Drokin21aef7d2014-08-15 12:55:56 -04001050 DEFINE_MSGF("u64", 0,
1051 sizeof(u64), lustre_swab_ost_last_id, NULL);
Peng Taod7e09d02013-05-02 16:46:55 +08001052EXPORT_SYMBOL(RMF_OBD_ID);
1053
1054struct req_msg_field RMF_FID =
1055 DEFINE_MSGF("fid", 0,
1056 sizeof(struct lu_fid), lustre_swab_lu_fid, NULL);
1057EXPORT_SYMBOL(RMF_FID);
1058
1059struct req_msg_field RMF_OST_ID =
1060 DEFINE_MSGF("ost_id", 0,
1061 sizeof(struct ost_id), lustre_swab_ost_id, NULL);
1062EXPORT_SYMBOL(RMF_OST_ID);
1063
1064struct req_msg_field RMF_FIEMAP_KEY =
1065 DEFINE_MSGF("fiemap", 0, sizeof(struct ll_fiemap_info_key),
1066 lustre_swab_fiemap, NULL);
1067EXPORT_SYMBOL(RMF_FIEMAP_KEY);
1068
1069struct req_msg_field RMF_FIEMAP_VAL =
1070 DEFINE_MSGF("fiemap", 0, -1, lustre_swab_fiemap, NULL);
1071EXPORT_SYMBOL(RMF_FIEMAP_VAL);
1072
Peng Taod7e09d02013-05-02 16:46:55 +08001073struct req_msg_field RMF_HSM_USER_STATE =
1074 DEFINE_MSGF("hsm_user_state", 0, sizeof(struct hsm_user_state),
1075 lustre_swab_hsm_user_state, NULL);
1076EXPORT_SYMBOL(RMF_HSM_USER_STATE);
1077
1078struct req_msg_field RMF_HSM_STATE_SET =
1079 DEFINE_MSGF("hsm_state_set", 0, sizeof(struct hsm_state_set),
1080 lustre_swab_hsm_state_set, NULL);
1081EXPORT_SYMBOL(RMF_HSM_STATE_SET);
1082
1083struct req_msg_field RMF_MDS_HSM_PROGRESS =
1084 DEFINE_MSGF("hsm_progress", 0, sizeof(struct hsm_progress_kernel),
1085 lustre_swab_hsm_progress_kernel, NULL);
1086EXPORT_SYMBOL(RMF_MDS_HSM_PROGRESS);
1087
1088struct req_msg_field RMF_MDS_HSM_CURRENT_ACTION =
1089 DEFINE_MSGF("hsm_current_action", 0, sizeof(struct hsm_current_action),
1090 lustre_swab_hsm_current_action, NULL);
1091EXPORT_SYMBOL(RMF_MDS_HSM_CURRENT_ACTION);
1092
1093struct req_msg_field RMF_MDS_HSM_USER_ITEM =
1094 DEFINE_MSGF("hsm_user_item", RMF_F_STRUCT_ARRAY,
1095 sizeof(struct hsm_user_item), lustre_swab_hsm_user_item,
1096 NULL);
1097EXPORT_SYMBOL(RMF_MDS_HSM_USER_ITEM);
1098
1099struct req_msg_field RMF_MDS_HSM_ARCHIVE =
1100 DEFINE_MSGF("hsm_archive", 0,
1101 sizeof(__u32), lustre_swab_generic_32s, NULL);
1102EXPORT_SYMBOL(RMF_MDS_HSM_ARCHIVE);
1103
1104struct req_msg_field RMF_MDS_HSM_REQUEST =
1105 DEFINE_MSGF("hsm_request", 0, sizeof(struct hsm_request),
1106 lustre_swab_hsm_request, NULL);
1107EXPORT_SYMBOL(RMF_MDS_HSM_REQUEST);
1108
Peng Taod7e09d02013-05-02 16:46:55 +08001109struct req_msg_field RMF_SWAP_LAYOUTS =
1110 DEFINE_MSGF("swap_layouts", 0, sizeof(struct mdc_swap_layouts),
1111 lustre_swab_swap_layouts, NULL);
1112EXPORT_SYMBOL(RMF_SWAP_LAYOUTS);
1113/*
1114 * Request formats.
1115 */
1116
1117struct req_format {
1118 const char *rf_name;
Chris Hannad0bfef32015-06-03 10:28:26 -04001119 int rf_idx;
Peng Taod7e09d02013-05-02 16:46:55 +08001120 struct {
Chris Hannad0bfef32015-06-03 10:28:26 -04001121 int nr;
Peng Taod7e09d02013-05-02 16:46:55 +08001122 const struct req_msg_field **d;
1123 } rf_fields[RCL_NR];
1124};
1125
Chris Hannad0bfef32015-06-03 10:28:26 -04001126#define DEFINE_REQ_FMT(name, client, client_nr, server, server_nr) { \
1127 .rf_name = name, \
1128 .rf_fields = { \
Peng Taod7e09d02013-05-02 16:46:55 +08001129 [RCL_CLIENT] = { \
1130 .nr = client_nr, \
Chris Hannad0bfef32015-06-03 10:28:26 -04001131 .d = client \
1132 }, \
Peng Taod7e09d02013-05-02 16:46:55 +08001133 [RCL_SERVER] = { \
1134 .nr = server_nr, \
Chris Hannad0bfef32015-06-03 10:28:26 -04001135 .d = server \
1136 } \
1137 } \
Peng Taod7e09d02013-05-02 16:46:55 +08001138}
1139
1140#define DEFINE_REQ_FMT0(name, client, server) \
1141DEFINE_REQ_FMT(name, client, ARRAY_SIZE(client), server, ARRAY_SIZE(server))
1142
1143struct req_format RQF_OBD_PING =
1144 DEFINE_REQ_FMT0("OBD_PING", empty, empty);
1145EXPORT_SYMBOL(RQF_OBD_PING);
1146
1147struct req_format RQF_OBD_SET_INFO =
1148 DEFINE_REQ_FMT0("OBD_SET_INFO", obd_set_info_client, empty);
1149EXPORT_SYMBOL(RQF_OBD_SET_INFO);
1150
Peng Taod7e09d02013-05-02 16:46:55 +08001151struct req_format RQF_SEC_CTX =
1152 DEFINE_REQ_FMT0("SEC_CTX", empty, empty);
1153EXPORT_SYMBOL(RQF_SEC_CTX);
1154
1155struct req_format RQF_MGS_TARGET_REG =
1156 DEFINE_REQ_FMT0("MGS_TARGET_REG", mgs_target_info_only,
Oleg Drokin30c0aa32016-02-26 01:50:02 -05001157 mgs_target_info_only);
Peng Taod7e09d02013-05-02 16:46:55 +08001158EXPORT_SYMBOL(RQF_MGS_TARGET_REG);
1159
1160struct req_format RQF_MGS_SET_INFO =
1161 DEFINE_REQ_FMT0("MGS_SET_INFO", mgs_set_info,
Oleg Drokin30c0aa32016-02-26 01:50:02 -05001162 mgs_set_info);
Peng Taod7e09d02013-05-02 16:46:55 +08001163EXPORT_SYMBOL(RQF_MGS_SET_INFO);
1164
1165struct req_format RQF_MGS_CONFIG_READ =
1166 DEFINE_REQ_FMT0("MGS_CONFIG_READ", mgs_config_read_client,
Oleg Drokin30c0aa32016-02-26 01:50:02 -05001167 mgs_config_read_server);
Peng Taod7e09d02013-05-02 16:46:55 +08001168EXPORT_SYMBOL(RQF_MGS_CONFIG_READ);
1169
1170struct req_format RQF_SEQ_QUERY =
1171 DEFINE_REQ_FMT0("SEQ_QUERY", seq_query_client, seq_query_server);
1172EXPORT_SYMBOL(RQF_SEQ_QUERY);
1173
1174struct req_format RQF_FLD_QUERY =
1175 DEFINE_REQ_FMT0("FLD_QUERY", fld_query_client, fld_query_server);
1176EXPORT_SYMBOL(RQF_FLD_QUERY);
1177
wang dib78c2b9b2016-04-28 12:07:34 -04001178struct req_format RQF_FLD_READ =
1179 DEFINE_REQ_FMT0("FLD_READ", fld_read_client, fld_read_server);
1180EXPORT_SYMBOL(RQF_FLD_READ);
1181
Peng Taod7e09d02013-05-02 16:46:55 +08001182struct req_format RQF_LOG_CANCEL =
1183 DEFINE_REQ_FMT0("OBD_LOG_CANCEL", log_cancel_client, empty);
1184EXPORT_SYMBOL(RQF_LOG_CANCEL);
1185
1186struct req_format RQF_MDS_QUOTACHECK =
1187 DEFINE_REQ_FMT0("MDS_QUOTACHECK", quotactl_only, empty);
1188EXPORT_SYMBOL(RQF_MDS_QUOTACHECK);
1189
1190struct req_format RQF_OST_QUOTACHECK =
1191 DEFINE_REQ_FMT0("OST_QUOTACHECK", quotactl_only, empty);
1192EXPORT_SYMBOL(RQF_OST_QUOTACHECK);
1193
1194struct req_format RQF_MDS_QUOTACTL =
1195 DEFINE_REQ_FMT0("MDS_QUOTACTL", quotactl_only, quotactl_only);
1196EXPORT_SYMBOL(RQF_MDS_QUOTACTL);
1197
1198struct req_format RQF_OST_QUOTACTL =
1199 DEFINE_REQ_FMT0("OST_QUOTACTL", quotactl_only, quotactl_only);
1200EXPORT_SYMBOL(RQF_OST_QUOTACTL);
1201
1202struct req_format RQF_QC_CALLBACK =
1203 DEFINE_REQ_FMT0("QC_CALLBACK", quotactl_only, empty);
1204EXPORT_SYMBOL(RQF_QC_CALLBACK);
1205
Peng Taod7e09d02013-05-02 16:46:55 +08001206struct req_format RQF_MDS_GETSTATUS =
1207 DEFINE_REQ_FMT0("MDS_GETSTATUS", mdt_body_only, mdt_body_capa);
1208EXPORT_SYMBOL(RQF_MDS_GETSTATUS);
1209
1210struct req_format RQF_MDS_STATFS =
1211 DEFINE_REQ_FMT0("MDS_STATFS", empty, obd_statfs_server);
1212EXPORT_SYMBOL(RQF_MDS_STATFS);
1213
1214struct req_format RQF_MDS_SYNC =
1215 DEFINE_REQ_FMT0("MDS_SYNC", mdt_body_capa, mdt_body_only);
1216EXPORT_SYMBOL(RQF_MDS_SYNC);
1217
1218struct req_format RQF_MDS_GETATTR =
1219 DEFINE_REQ_FMT0("MDS_GETATTR", mdt_body_capa, mds_getattr_server);
1220EXPORT_SYMBOL(RQF_MDS_GETATTR);
1221
1222struct req_format RQF_MDS_GETXATTR =
1223 DEFINE_REQ_FMT0("MDS_GETXATTR",
1224 mds_getxattr_client, mds_getxattr_server);
1225EXPORT_SYMBOL(RQF_MDS_GETXATTR);
1226
1227struct req_format RQF_MDS_GETATTR_NAME =
1228 DEFINE_REQ_FMT0("MDS_GETATTR_NAME",
1229 mds_getattr_name_client, mds_getattr_server);
1230EXPORT_SYMBOL(RQF_MDS_GETATTR_NAME);
1231
1232struct req_format RQF_MDS_REINT =
1233 DEFINE_REQ_FMT0("MDS_REINT", mds_reint_client, mdt_body_only);
1234EXPORT_SYMBOL(RQF_MDS_REINT);
1235
1236struct req_format RQF_MDS_REINT_CREATE =
1237 DEFINE_REQ_FMT0("MDS_REINT_CREATE",
1238 mds_reint_create_client, mdt_body_capa);
1239EXPORT_SYMBOL(RQF_MDS_REINT_CREATE);
1240
Fan Yong341f1f02016-06-19 22:53:53 -04001241struct req_format RQF_MDS_REINT_CREATE_ACL =
1242 DEFINE_REQ_FMT0("MDS_REINT_CREATE_ACL",
1243 mds_reint_create_acl_client, mdt_body_capa);
1244EXPORT_SYMBOL(RQF_MDS_REINT_CREATE_ACL);
Peng Taod7e09d02013-05-02 16:46:55 +08001245
1246struct req_format RQF_MDS_REINT_CREATE_SLAVE =
1247 DEFINE_REQ_FMT0("MDS_REINT_CREATE_EA",
1248 mds_reint_create_slave_client, mdt_body_capa);
1249EXPORT_SYMBOL(RQF_MDS_REINT_CREATE_SLAVE);
1250
1251struct req_format RQF_MDS_REINT_CREATE_SYM =
1252 DEFINE_REQ_FMT0("MDS_REINT_CREATE_SYM",
1253 mds_reint_create_sym_client, mdt_body_capa);
1254EXPORT_SYMBOL(RQF_MDS_REINT_CREATE_SYM);
1255
1256struct req_format RQF_MDS_REINT_OPEN =
1257 DEFINE_REQ_FMT0("MDS_REINT_OPEN",
1258 mds_reint_open_client, mds_reint_open_server);
1259EXPORT_SYMBOL(RQF_MDS_REINT_OPEN);
1260
1261struct req_format RQF_MDS_REINT_UNLINK =
1262 DEFINE_REQ_FMT0("MDS_REINT_UNLINK", mds_reint_unlink_client,
1263 mds_last_unlink_server);
1264EXPORT_SYMBOL(RQF_MDS_REINT_UNLINK);
1265
1266struct req_format RQF_MDS_REINT_LINK =
1267 DEFINE_REQ_FMT0("MDS_REINT_LINK",
1268 mds_reint_link_client, mdt_body_only);
1269EXPORT_SYMBOL(RQF_MDS_REINT_LINK);
1270
1271struct req_format RQF_MDS_REINT_RENAME =
1272 DEFINE_REQ_FMT0("MDS_REINT_RENAME", mds_reint_rename_client,
1273 mds_last_unlink_server);
1274EXPORT_SYMBOL(RQF_MDS_REINT_RENAME);
1275
1276struct req_format RQF_MDS_REINT_SETATTR =
1277 DEFINE_REQ_FMT0("MDS_REINT_SETATTR",
1278 mds_reint_setattr_client, mds_setattr_server);
1279EXPORT_SYMBOL(RQF_MDS_REINT_SETATTR);
1280
1281struct req_format RQF_MDS_REINT_SETXATTR =
1282 DEFINE_REQ_FMT0("MDS_REINT_SETXATTR",
1283 mds_reint_setxattr_client, mdt_body_only);
1284EXPORT_SYMBOL(RQF_MDS_REINT_SETXATTR);
1285
1286struct req_format RQF_MDS_CONNECT =
1287 DEFINE_REQ_FMT0("MDS_CONNECT",
1288 obd_connect_client, obd_connect_server);
1289EXPORT_SYMBOL(RQF_MDS_CONNECT);
1290
1291struct req_format RQF_MDS_DISCONNECT =
1292 DEFINE_REQ_FMT0("MDS_DISCONNECT", empty, empty);
1293EXPORT_SYMBOL(RQF_MDS_DISCONNECT);
1294
1295struct req_format RQF_MDS_GET_INFO =
1296 DEFINE_REQ_FMT0("MDS_GET_INFO", mds_getinfo_client,
1297 mds_getinfo_server);
1298EXPORT_SYMBOL(RQF_MDS_GET_INFO);
1299
Peng Taod7e09d02013-05-02 16:46:55 +08001300struct req_format RQF_LDLM_ENQUEUE =
1301 DEFINE_REQ_FMT0("LDLM_ENQUEUE",
1302 ldlm_enqueue_client, ldlm_enqueue_lvb_server);
1303EXPORT_SYMBOL(RQF_LDLM_ENQUEUE);
1304
1305struct req_format RQF_LDLM_ENQUEUE_LVB =
1306 DEFINE_REQ_FMT0("LDLM_ENQUEUE_LVB",
1307 ldlm_enqueue_client, ldlm_enqueue_lvb_server);
1308EXPORT_SYMBOL(RQF_LDLM_ENQUEUE_LVB);
1309
1310struct req_format RQF_LDLM_CONVERT =
1311 DEFINE_REQ_FMT0("LDLM_CONVERT",
1312 ldlm_enqueue_client, ldlm_enqueue_server);
1313EXPORT_SYMBOL(RQF_LDLM_CONVERT);
1314
1315struct req_format RQF_LDLM_CANCEL =
1316 DEFINE_REQ_FMT0("LDLM_CANCEL", ldlm_enqueue_client, empty);
1317EXPORT_SYMBOL(RQF_LDLM_CANCEL);
1318
1319struct req_format RQF_LDLM_CALLBACK =
1320 DEFINE_REQ_FMT0("LDLM_CALLBACK", ldlm_enqueue_client, empty);
1321EXPORT_SYMBOL(RQF_LDLM_CALLBACK);
1322
1323struct req_format RQF_LDLM_CP_CALLBACK =
1324 DEFINE_REQ_FMT0("LDLM_CP_CALLBACK", ldlm_cp_callback_client, empty);
1325EXPORT_SYMBOL(RQF_LDLM_CP_CALLBACK);
1326
1327struct req_format RQF_LDLM_BL_CALLBACK =
1328 DEFINE_REQ_FMT0("LDLM_BL_CALLBACK", ldlm_enqueue_client, empty);
1329EXPORT_SYMBOL(RQF_LDLM_BL_CALLBACK);
1330
1331struct req_format RQF_LDLM_GL_CALLBACK =
1332 DEFINE_REQ_FMT0("LDLM_GL_CALLBACK", ldlm_enqueue_client,
1333 ldlm_gl_callback_server);
1334EXPORT_SYMBOL(RQF_LDLM_GL_CALLBACK);
1335
1336struct req_format RQF_LDLM_GL_DESC_CALLBACK =
1337 DEFINE_REQ_FMT0("LDLM_GL_CALLBACK", ldlm_gl_callback_desc_client,
1338 ldlm_gl_callback_server);
1339EXPORT_SYMBOL(RQF_LDLM_GL_DESC_CALLBACK);
1340
1341struct req_format RQF_LDLM_INTENT_BASIC =
1342 DEFINE_REQ_FMT0("LDLM_INTENT_BASIC",
1343 ldlm_intent_basic_client, ldlm_enqueue_lvb_server);
1344EXPORT_SYMBOL(RQF_LDLM_INTENT_BASIC);
1345
1346struct req_format RQF_LDLM_INTENT =
1347 DEFINE_REQ_FMT0("LDLM_INTENT",
1348 ldlm_intent_client, ldlm_intent_server);
1349EXPORT_SYMBOL(RQF_LDLM_INTENT);
1350
1351struct req_format RQF_LDLM_INTENT_LAYOUT =
1352 DEFINE_REQ_FMT0("LDLM_INTENT_LAYOUT ",
1353 ldlm_intent_layout_client, ldlm_enqueue_lvb_server);
1354EXPORT_SYMBOL(RQF_LDLM_INTENT_LAYOUT);
1355
1356struct req_format RQF_LDLM_INTENT_GETATTR =
1357 DEFINE_REQ_FMT0("LDLM_INTENT_GETATTR",
1358 ldlm_intent_getattr_client, ldlm_intent_getattr_server);
1359EXPORT_SYMBOL(RQF_LDLM_INTENT_GETATTR);
1360
1361struct req_format RQF_LDLM_INTENT_OPEN =
1362 DEFINE_REQ_FMT0("LDLM_INTENT_OPEN",
1363 ldlm_intent_open_client, ldlm_intent_open_server);
1364EXPORT_SYMBOL(RQF_LDLM_INTENT_OPEN);
1365
1366struct req_format RQF_LDLM_INTENT_CREATE =
1367 DEFINE_REQ_FMT0("LDLM_INTENT_CREATE",
1368 ldlm_intent_create_client, ldlm_intent_getattr_server);
1369EXPORT_SYMBOL(RQF_LDLM_INTENT_CREATE);
1370
1371struct req_format RQF_LDLM_INTENT_UNLINK =
1372 DEFINE_REQ_FMT0("LDLM_INTENT_UNLINK",
1373 ldlm_intent_unlink_client, ldlm_intent_server);
1374EXPORT_SYMBOL(RQF_LDLM_INTENT_UNLINK);
1375
Andrew Perepechko7fc1f832013-12-03 21:58:49 +08001376struct req_format RQF_LDLM_INTENT_GETXATTR =
1377 DEFINE_REQ_FMT0("LDLM_INTENT_GETXATTR",
1378 ldlm_intent_getxattr_client,
1379 ldlm_intent_getxattr_server);
1380EXPORT_SYMBOL(RQF_LDLM_INTENT_GETXATTR);
1381
Peng Taod7e09d02013-05-02 16:46:55 +08001382struct req_format RQF_MDS_CLOSE =
1383 DEFINE_REQ_FMT0("MDS_CLOSE",
1384 mdt_close_client, mds_last_unlink_server);
1385EXPORT_SYMBOL(RQF_MDS_CLOSE);
1386
Jinshan Xiong48d23e62013-12-03 21:58:48 +08001387struct req_format RQF_MDS_RELEASE_CLOSE =
1388 DEFINE_REQ_FMT0("MDS_CLOSE",
1389 mdt_release_close_client, mds_last_unlink_server);
1390EXPORT_SYMBOL(RQF_MDS_RELEASE_CLOSE);
1391
Peng Taod7e09d02013-05-02 16:46:55 +08001392struct req_format RQF_MDS_PIN =
1393 DEFINE_REQ_FMT0("MDS_PIN",
1394 mdt_body_capa, mdt_body_only);
1395EXPORT_SYMBOL(RQF_MDS_PIN);
1396
1397struct req_format RQF_MDS_UNPIN =
1398 DEFINE_REQ_FMT0("MDS_UNPIN", mdt_body_only, empty);
1399EXPORT_SYMBOL(RQF_MDS_UNPIN);
1400
1401struct req_format RQF_MDS_DONE_WRITING =
1402 DEFINE_REQ_FMT0("MDS_DONE_WRITING",
1403 mdt_close_client, mdt_body_only);
1404EXPORT_SYMBOL(RQF_MDS_DONE_WRITING);
1405
1406struct req_format RQF_MDS_READPAGE =
1407 DEFINE_REQ_FMT0("MDS_READPAGE",
1408 mdt_body_capa, mdt_body_only);
1409EXPORT_SYMBOL(RQF_MDS_READPAGE);
1410
1411struct req_format RQF_MDS_HSM_ACTION =
1412 DEFINE_REQ_FMT0("MDS_HSM_ACTION", mdt_body_capa, mdt_hsm_action_server);
1413EXPORT_SYMBOL(RQF_MDS_HSM_ACTION);
1414
1415struct req_format RQF_MDS_HSM_PROGRESS =
1416 DEFINE_REQ_FMT0("MDS_HSM_PROGRESS", mdt_hsm_progress, empty);
1417EXPORT_SYMBOL(RQF_MDS_HSM_PROGRESS);
1418
1419struct req_format RQF_MDS_HSM_CT_REGISTER =
1420 DEFINE_REQ_FMT0("MDS_HSM_CT_REGISTER", mdt_hsm_ct_register, empty);
1421EXPORT_SYMBOL(RQF_MDS_HSM_CT_REGISTER);
1422
1423struct req_format RQF_MDS_HSM_CT_UNREGISTER =
1424 DEFINE_REQ_FMT0("MDS_HSM_CT_UNREGISTER", mdt_hsm_ct_unregister, empty);
1425EXPORT_SYMBOL(RQF_MDS_HSM_CT_UNREGISTER);
1426
1427struct req_format RQF_MDS_HSM_STATE_GET =
1428 DEFINE_REQ_FMT0("MDS_HSM_STATE_GET",
1429 mdt_body_capa, mdt_hsm_state_get_server);
1430EXPORT_SYMBOL(RQF_MDS_HSM_STATE_GET);
1431
1432struct req_format RQF_MDS_HSM_STATE_SET =
1433 DEFINE_REQ_FMT0("MDS_HSM_STATE_SET", mdt_hsm_state_set, empty);
1434EXPORT_SYMBOL(RQF_MDS_HSM_STATE_SET);
1435
1436struct req_format RQF_MDS_HSM_REQUEST =
1437 DEFINE_REQ_FMT0("MDS_HSM_REQUEST", mdt_hsm_request, empty);
1438EXPORT_SYMBOL(RQF_MDS_HSM_REQUEST);
1439
1440struct req_format RQF_MDS_SWAP_LAYOUTS =
1441 DEFINE_REQ_FMT0("MDS_SWAP_LAYOUTS",
1442 mdt_swap_layouts, empty);
1443EXPORT_SYMBOL(RQF_MDS_SWAP_LAYOUTS);
1444
1445/* This is for split */
1446struct req_format RQF_MDS_WRITEPAGE =
1447 DEFINE_REQ_FMT0("MDS_WRITEPAGE",
1448 mdt_body_capa, mdt_body_only);
1449EXPORT_SYMBOL(RQF_MDS_WRITEPAGE);
1450
1451struct req_format RQF_MDS_IS_SUBDIR =
1452 DEFINE_REQ_FMT0("MDS_IS_SUBDIR",
1453 mdt_body_only, mdt_body_only);
1454EXPORT_SYMBOL(RQF_MDS_IS_SUBDIR);
1455
1456struct req_format RQF_LLOG_ORIGIN_HANDLE_CREATE =
1457 DEFINE_REQ_FMT0("LLOG_ORIGIN_HANDLE_CREATE",
1458 llog_origin_handle_create_client, llogd_body_only);
1459EXPORT_SYMBOL(RQF_LLOG_ORIGIN_HANDLE_CREATE);
1460
1461struct req_format RQF_LLOG_ORIGIN_HANDLE_DESTROY =
1462 DEFINE_REQ_FMT0("LLOG_ORIGIN_HANDLE_DESTROY",
1463 llogd_body_only, llogd_body_only);
1464EXPORT_SYMBOL(RQF_LLOG_ORIGIN_HANDLE_DESTROY);
1465
1466struct req_format RQF_LLOG_ORIGIN_HANDLE_NEXT_BLOCK =
1467 DEFINE_REQ_FMT0("LLOG_ORIGIN_HANDLE_NEXT_BLOCK",
1468 llogd_body_only, llog_origin_handle_next_block_server);
1469EXPORT_SYMBOL(RQF_LLOG_ORIGIN_HANDLE_NEXT_BLOCK);
1470
1471struct req_format RQF_LLOG_ORIGIN_HANDLE_PREV_BLOCK =
1472 DEFINE_REQ_FMT0("LLOG_ORIGIN_HANDLE_PREV_BLOCK",
1473 llogd_body_only, llog_origin_handle_next_block_server);
1474EXPORT_SYMBOL(RQF_LLOG_ORIGIN_HANDLE_PREV_BLOCK);
1475
1476struct req_format RQF_LLOG_ORIGIN_HANDLE_READ_HEADER =
1477 DEFINE_REQ_FMT0("LLOG_ORIGIN_HANDLE_READ_HEADER",
1478 llogd_body_only, llog_log_hdr_only);
1479EXPORT_SYMBOL(RQF_LLOG_ORIGIN_HANDLE_READ_HEADER);
1480
1481struct req_format RQF_LLOG_ORIGIN_CONNECT =
1482 DEFINE_REQ_FMT0("LLOG_ORIGIN_CONNECT", llogd_conn_body_only, empty);
1483EXPORT_SYMBOL(RQF_LLOG_ORIGIN_CONNECT);
1484
Mikhail Pershin65f1c782013-11-26 10:04:55 +08001485struct req_format RQF_CONNECT =
1486 DEFINE_REQ_FMT0("CONNECT", obd_connect_client, obd_connect_server);
1487EXPORT_SYMBOL(RQF_CONNECT);
1488
Peng Taod7e09d02013-05-02 16:46:55 +08001489struct req_format RQF_OST_CONNECT =
1490 DEFINE_REQ_FMT0("OST_CONNECT",
1491 obd_connect_client, obd_connect_server);
1492EXPORT_SYMBOL(RQF_OST_CONNECT);
1493
1494struct req_format RQF_OST_DISCONNECT =
1495 DEFINE_REQ_FMT0("OST_DISCONNECT", empty, empty);
1496EXPORT_SYMBOL(RQF_OST_DISCONNECT);
1497
1498struct req_format RQF_OST_GETATTR =
1499 DEFINE_REQ_FMT0("OST_GETATTR", ost_body_capa, ost_body_only);
1500EXPORT_SYMBOL(RQF_OST_GETATTR);
1501
1502struct req_format RQF_OST_SETATTR =
1503 DEFINE_REQ_FMT0("OST_SETATTR", ost_body_capa, ost_body_only);
1504EXPORT_SYMBOL(RQF_OST_SETATTR);
1505
1506struct req_format RQF_OST_CREATE =
1507 DEFINE_REQ_FMT0("OST_CREATE", ost_body_only, ost_body_only);
1508EXPORT_SYMBOL(RQF_OST_CREATE);
1509
1510struct req_format RQF_OST_PUNCH =
1511 DEFINE_REQ_FMT0("OST_PUNCH", ost_body_capa, ost_body_only);
1512EXPORT_SYMBOL(RQF_OST_PUNCH);
1513
1514struct req_format RQF_OST_SYNC =
1515 DEFINE_REQ_FMT0("OST_SYNC", ost_body_capa, ost_body_only);
1516EXPORT_SYMBOL(RQF_OST_SYNC);
1517
1518struct req_format RQF_OST_DESTROY =
1519 DEFINE_REQ_FMT0("OST_DESTROY", ost_destroy_client, ost_body_only);
1520EXPORT_SYMBOL(RQF_OST_DESTROY);
1521
1522struct req_format RQF_OST_BRW_READ =
1523 DEFINE_REQ_FMT0("OST_BRW_READ", ost_brw_client, ost_brw_read_server);
1524EXPORT_SYMBOL(RQF_OST_BRW_READ);
1525
1526struct req_format RQF_OST_BRW_WRITE =
1527 DEFINE_REQ_FMT0("OST_BRW_WRITE", ost_brw_client, ost_brw_write_server);
1528EXPORT_SYMBOL(RQF_OST_BRW_WRITE);
1529
1530struct req_format RQF_OST_STATFS =
1531 DEFINE_REQ_FMT0("OST_STATFS", empty, obd_statfs_server);
1532EXPORT_SYMBOL(RQF_OST_STATFS);
1533
1534struct req_format RQF_OST_SET_GRANT_INFO =
1535 DEFINE_REQ_FMT0("OST_SET_GRANT_INFO", ost_grant_shrink_client,
Oleg Drokin30c0aa32016-02-26 01:50:02 -05001536 ost_body_only);
Peng Taod7e09d02013-05-02 16:46:55 +08001537EXPORT_SYMBOL(RQF_OST_SET_GRANT_INFO);
1538
Mikhail Pershin45fe5b12016-04-27 21:37:12 -04001539struct req_format RQF_OST_GET_INFO =
Peng Taod7e09d02013-05-02 16:46:55 +08001540 DEFINE_REQ_FMT0("OST_GET_INFO", ost_get_info_generic_client,
Oleg Drokin30c0aa32016-02-26 01:50:02 -05001541 ost_get_info_generic_server);
Mikhail Pershin45fe5b12016-04-27 21:37:12 -04001542EXPORT_SYMBOL(RQF_OST_GET_INFO);
Peng Taod7e09d02013-05-02 16:46:55 +08001543
1544struct req_format RQF_OST_GET_INFO_LAST_ID =
1545 DEFINE_REQ_FMT0("OST_GET_INFO_LAST_ID", ost_get_info_generic_client,
Oleg Drokin30c0aa32016-02-26 01:50:02 -05001546 ost_get_last_id_server);
Peng Taod7e09d02013-05-02 16:46:55 +08001547EXPORT_SYMBOL(RQF_OST_GET_INFO_LAST_ID);
1548
1549struct req_format RQF_OST_GET_INFO_LAST_FID =
Mikhail Pershin45fe5b12016-04-27 21:37:12 -04001550 DEFINE_REQ_FMT0("OST_GET_INFO_LAST_FID", ost_get_last_fid_client,
Oleg Drokin30c0aa32016-02-26 01:50:02 -05001551 ost_get_last_fid_server);
Peng Taod7e09d02013-05-02 16:46:55 +08001552EXPORT_SYMBOL(RQF_OST_GET_INFO_LAST_FID);
1553
1554struct req_format RQF_OST_SET_INFO_LAST_FID =
1555 DEFINE_REQ_FMT0("OST_SET_INFO_LAST_FID", obd_set_info_client,
Oleg Drokin30c0aa32016-02-26 01:50:02 -05001556 empty);
Peng Taod7e09d02013-05-02 16:46:55 +08001557EXPORT_SYMBOL(RQF_OST_SET_INFO_LAST_FID);
1558
1559struct req_format RQF_OST_GET_INFO_FIEMAP =
1560 DEFINE_REQ_FMT0("OST_GET_INFO_FIEMAP", ost_get_fiemap_client,
Oleg Drokin30c0aa32016-02-26 01:50:02 -05001561 ost_get_fiemap_server);
Peng Taod7e09d02013-05-02 16:46:55 +08001562EXPORT_SYMBOL(RQF_OST_GET_INFO_FIEMAP);
1563
1564#if !defined(__REQ_LAYOUT_USER__)
1565
1566/* Convenience macro */
1567#define FMT_FIELD(fmt, i, j) (fmt)->rf_fields[(i)].d[(j)]
1568
1569/**
1570 * Initializes the capsule abstraction by computing and setting the \a rf_idx
1571 * field of RQFs and the \a rmf_offset field of RMFs.
1572 */
1573int req_layout_init(void)
1574{
1575 int i;
1576 int j;
1577 int k;
1578 struct req_format *rf = NULL;
1579
1580 for (i = 0; i < ARRAY_SIZE(req_formats); ++i) {
1581 rf = req_formats[i];
1582 rf->rf_idx = i;
1583 for (j = 0; j < RCL_NR; ++j) {
1584 LASSERT(rf->rf_fields[j].nr <= REQ_MAX_FIELD_NR);
1585 for (k = 0; k < rf->rf_fields[j].nr; ++k) {
1586 struct req_msg_field *field;
1587
1588 field = (typeof(field))rf->rf_fields[j].d[k];
1589 LASSERT(!(field->rmf_flags & RMF_F_STRUCT_ARRAY)
1590 || field->rmf_size > 0);
1591 LASSERT(field->rmf_offset[i][j] == 0);
1592 /*
1593 * k + 1 to detect unused format/field
1594 * combinations.
1595 */
1596 field->rmf_offset[i][j] = k + 1;
1597 }
1598 }
1599 }
1600 return 0;
1601}
1602EXPORT_SYMBOL(req_layout_init);
1603
1604void req_layout_fini(void)
1605{
1606}
1607EXPORT_SYMBOL(req_layout_fini);
1608
1609/**
1610 * Initializes the expected sizes of each RMF in a \a pill (\a rc_area) to -1.
1611 *
1612 * Actual/expected field sizes are set elsewhere in functions in this file:
1613 * req_capsule_init(), req_capsule_server_pack(), req_capsule_set_size() and
1614 * req_capsule_msg_size(). The \a rc_area information is used by.
1615 * ptlrpc_request_set_replen().
1616 */
Shraddha Barke98e0a282015-10-04 13:00:12 +05301617static void req_capsule_init_area(struct req_capsule *pill)
Peng Taod7e09d02013-05-02 16:46:55 +08001618{
1619 int i;
1620
1621 for (i = 0; i < ARRAY_SIZE(pill->rc_area[RCL_CLIENT]); i++) {
1622 pill->rc_area[RCL_CLIENT][i] = -1;
1623 pill->rc_area[RCL_SERVER][i] = -1;
1624 }
1625}
Peng Taod7e09d02013-05-02 16:46:55 +08001626
1627/**
1628 * Initialize a pill.
1629 *
1630 * The \a location indicates whether the caller is executing on the client side
1631 * (RCL_CLIENT) or server side (RCL_SERVER)..
1632 */
1633void req_capsule_init(struct req_capsule *pill,
1634 struct ptlrpc_request *req,
1635 enum req_location location)
1636{
1637 LASSERT(location == RCL_SERVER || location == RCL_CLIENT);
1638
1639 /*
1640 * Today all capsules are embedded in ptlrpc_request structs,
1641 * but just in case that ever isn't the case, we don't reach
1642 * into req unless req != NULL and pill is the one embedded in
1643 * the req.
1644 *
1645 * The req->rq_pill_init flag makes it safe to initialize a pill
1646 * twice, which might happen in the OST paths as a result of the
1647 * high-priority RPC queue getting peeked at before ost_handle()
1648 * handles an OST RPC.
1649 */
Oleg Drokin8b382082016-02-16 00:46:58 -05001650 if (req && pill == &req->rq_pill && req->rq_pill_init)
Peng Taod7e09d02013-05-02 16:46:55 +08001651 return;
1652
Joe Perchesec83e612013-10-13 20:22:03 -07001653 memset(pill, 0, sizeof(*pill));
Peng Taod7e09d02013-05-02 16:46:55 +08001654 pill->rc_req = req;
1655 pill->rc_loc = location;
1656 req_capsule_init_area(pill);
1657
Oleg Drokin8b382082016-02-16 00:46:58 -05001658 if (req && pill == &req->rq_pill)
Peng Taod7e09d02013-05-02 16:46:55 +08001659 req->rq_pill_init = 1;
1660}
1661EXPORT_SYMBOL(req_capsule_init);
1662
1663void req_capsule_fini(struct req_capsule *pill)
1664{
1665}
1666EXPORT_SYMBOL(req_capsule_fini);
1667
1668static int __req_format_is_sane(const struct req_format *fmt)
1669{
1670 return
1671 0 <= fmt->rf_idx && fmt->rf_idx < ARRAY_SIZE(req_formats) &&
1672 req_formats[fmt->rf_idx] == fmt;
1673}
1674
1675static struct lustre_msg *__req_msg(const struct req_capsule *pill,
1676 enum req_location loc)
1677{
1678 struct ptlrpc_request *req;
1679
1680 req = pill->rc_req;
1681 return loc == RCL_CLIENT ? req->rq_reqmsg : req->rq_repmsg;
1682}
1683
1684/**
1685 * Set the format (\a fmt) of a \a pill; format changes are not allowed here
1686 * (see req_capsule_extend()).
1687 */
1688void req_capsule_set(struct req_capsule *pill, const struct req_format *fmt)
1689{
Oleg Drokin8b382082016-02-16 00:46:58 -05001690 LASSERT(!pill->rc_fmt || pill->rc_fmt == fmt);
Peng Taod7e09d02013-05-02 16:46:55 +08001691 LASSERT(__req_format_is_sane(fmt));
1692
1693 pill->rc_fmt = fmt;
1694}
1695EXPORT_SYMBOL(req_capsule_set);
1696
1697/**
1698 * Fills in any parts of the \a rc_area of a \a pill that haven't been filled in
1699 * yet.
1700
1701 * \a rc_area is an array of REQ_MAX_FIELD_NR elements, used to store sizes of
1702 * variable-sized fields. The field sizes come from the declared \a rmf_size
1703 * field of a \a pill's \a rc_fmt's RMF's.
1704 */
1705int req_capsule_filled_sizes(struct req_capsule *pill,
Chris Hannad0bfef32015-06-03 10:28:26 -04001706 enum req_location loc)
Peng Taod7e09d02013-05-02 16:46:55 +08001707{
1708 const struct req_format *fmt = pill->rc_fmt;
Chris Hannad0bfef32015-06-03 10:28:26 -04001709 int i;
Peng Taod7e09d02013-05-02 16:46:55 +08001710
Peng Taod7e09d02013-05-02 16:46:55 +08001711 for (i = 0; i < fmt->rf_fields[loc].nr; ++i) {
1712 if (pill->rc_area[loc][i] == -1) {
1713 pill->rc_area[loc][i] =
1714 fmt->rf_fields[loc].d[i]->rmf_size;
1715 if (pill->rc_area[loc][i] == -1) {
1716 /*
1717 * Skip the following fields.
1718 *
1719 * If this LASSERT() trips then you're missing a
1720 * call to req_capsule_set_size().
1721 */
1722 LASSERT(loc != RCL_SERVER);
1723 break;
1724 }
1725 }
1726 }
1727 return i;
1728}
1729EXPORT_SYMBOL(req_capsule_filled_sizes);
1730
1731/**
1732 * Capsule equivalent of lustre_pack_request() and lustre_pack_reply().
1733 *
1734 * This function uses the \a pill's \a rc_area as filled in by
1735 * req_capsule_set_size() or req_capsule_filled_sizes() (the latter is called by
1736 * this function).
1737 */
1738int req_capsule_server_pack(struct req_capsule *pill)
1739{
1740 const struct req_format *fmt;
Chris Hannad0bfef32015-06-03 10:28:26 -04001741 int count;
1742 int rc;
Peng Taod7e09d02013-05-02 16:46:55 +08001743
1744 LASSERT(pill->rc_loc == RCL_SERVER);
1745 fmt = pill->rc_fmt;
Oleg Drokin8b382082016-02-16 00:46:58 -05001746 LASSERT(fmt);
Peng Taod7e09d02013-05-02 16:46:55 +08001747
1748 count = req_capsule_filled_sizes(pill, RCL_SERVER);
1749 rc = lustre_pack_reply(pill->rc_req, count,
1750 pill->rc_area[RCL_SERVER], NULL);
1751 if (rc != 0) {
1752 DEBUG_REQ(D_ERROR, pill->rc_req,
Oleg Drokin30c0aa32016-02-26 01:50:02 -05001753 "Cannot pack %d fields in format `%s': ",
1754 count, fmt->rf_name);
Peng Taod7e09d02013-05-02 16:46:55 +08001755 }
1756 return rc;
1757}
1758EXPORT_SYMBOL(req_capsule_server_pack);
1759
1760/**
1761 * Returns the PTLRPC request or reply (\a loc) buffer offset of a \a pill
1762 * corresponding to the given RMF (\a field).
1763 */
1764static int __req_capsule_offset(const struct req_capsule *pill,
1765 const struct req_msg_field *field,
1766 enum req_location loc)
1767{
1768 int offset;
1769
1770 offset = field->rmf_offset[pill->rc_fmt->rf_idx][loc];
Oleg Drokin30c0aa32016-02-26 01:50:02 -05001771 LASSERTF(offset > 0, "%s:%s, off=%d, loc=%d\n", pill->rc_fmt->rf_name,
1772 field->rmf_name, offset, loc);
Melike Yurtoglu5dd70702015-02-27 22:15:12 +02001773 offset--;
Peng Taod7e09d02013-05-02 16:46:55 +08001774
1775 LASSERT(0 <= offset && offset < REQ_MAX_FIELD_NR);
1776 return offset;
1777}
1778
1779/**
1780 * Helper for __req_capsule_get(); swabs value / array of values and/or dumps
1781 * them if desired.
1782 */
1783static
1784void
1785swabber_dumper_helper(struct req_capsule *pill,
1786 const struct req_msg_field *field,
1787 enum req_location loc,
1788 int offset,
Kristina Martsenko3949015e2013-11-11 21:34:58 +02001789 void *value, int len, int dump, void (*swabber)(void *))
Peng Taod7e09d02013-05-02 16:46:55 +08001790{
Chris Hannad0bfef32015-06-03 10:28:26 -04001791 void *p;
1792 int i;
1793 int n;
1794 int do_swab;
1795 int inout = loc == RCL_CLIENT;
Peng Taod7e09d02013-05-02 16:46:55 +08001796
1797 swabber = swabber ?: field->rmf_swabber;
1798
1799 if (ptlrpc_buf_need_swab(pill->rc_req, inout, offset) &&
Oleg Drokin8b382082016-02-16 00:46:58 -05001800 swabber && value)
Peng Taod7e09d02013-05-02 16:46:55 +08001801 do_swab = 1;
1802 else
1803 do_swab = 0;
1804
Michal Nazarewicz358bd682013-11-29 18:10:59 +01001805 if (!field->rmf_dumper)
1806 dump = 0;
1807
Peng Taod7e09d02013-05-02 16:46:55 +08001808 if (!(field->rmf_flags & RMF_F_STRUCT_ARRAY)) {
Michal Nazarewicz358bd682013-11-29 18:10:59 +01001809 if (dump) {
Peng Taod7e09d02013-05-02 16:46:55 +08001810 CDEBUG(D_RPCTRACE, "Dump of %sfield %s follows\n",
1811 do_swab ? "unswabbed " : "", field->rmf_name);
1812 field->rmf_dumper(value);
1813 }
1814 if (!do_swab)
1815 return;
1816 swabber(value);
1817 ptlrpc_buf_set_swabbed(pill->rc_req, inout, offset);
Sebastien Buissona7397352016-03-07 18:10:19 -05001818 if (dump && field->rmf_dumper) {
Joe Perches2d00bd12014-11-23 11:28:50 -08001819 CDEBUG(D_RPCTRACE, "Dump of swabbed field %s follows\n",
1820 field->rmf_name);
Peng Taod7e09d02013-05-02 16:46:55 +08001821 field->rmf_dumper(value);
1822 }
1823
1824 return;
1825 }
1826
1827 /*
1828 * We're swabbing an array; swabber() swabs a single array element, so
1829 * swab every element.
1830 */
1831 LASSERT((len % field->rmf_size) == 0);
1832 for (p = value, i = 0, n = len / field->rmf_size;
1833 i < n;
1834 i++, p += field->rmf_size) {
Michal Nazarewicz358bd682013-11-29 18:10:59 +01001835 if (dump) {
Joe Perches2d00bd12014-11-23 11:28:50 -08001836 CDEBUG(D_RPCTRACE, "Dump of %sarray field %s, element %d follows\n",
Peng Taod7e09d02013-05-02 16:46:55 +08001837 do_swab ? "unswabbed " : "", field->rmf_name, i);
1838 field->rmf_dumper(p);
1839 }
1840 if (!do_swab)
1841 continue;
1842 swabber(p);
Michal Nazarewicz358bd682013-11-29 18:10:59 +01001843 if (dump) {
Joe Perches2d00bd12014-11-23 11:28:50 -08001844 CDEBUG(D_RPCTRACE, "Dump of swabbed array field %s, element %d follows\n",
1845 field->rmf_name, i);
Peng Taod7e09d02013-05-02 16:46:55 +08001846 field->rmf_dumper(value);
1847 }
1848 }
1849 if (do_swab)
1850 ptlrpc_buf_set_swabbed(pill->rc_req, inout, offset);
1851}
1852
1853/**
1854 * Returns the pointer to a PTLRPC request or reply (\a loc) buffer of a \a pill
1855 * corresponding to the given RMF (\a field).
1856 *
1857 * The buffer will be swabbed using the given \a swabber. If \a swabber == NULL
1858 * then the \a rmf_swabber from the RMF will be used. Soon there will be no
1859 * calls to __req_capsule_get() with a non-NULL \a swabber; \a swabber will then
1860 * be removed. Fields with the \a RMF_F_STRUCT_ARRAY flag set will have each
1861 * element of the array swabbed.
1862 */
1863static void *__req_capsule_get(struct req_capsule *pill,
1864 const struct req_msg_field *field,
1865 enum req_location loc,
Kristina Martsenko3949015e2013-11-11 21:34:58 +02001866 void (*swabber)(void *),
Peng Taod7e09d02013-05-02 16:46:55 +08001867 int dump)
1868{
1869 const struct req_format *fmt;
Chris Hannad0bfef32015-06-03 10:28:26 -04001870 struct lustre_msg *msg;
1871 void *value;
1872 int len;
1873 int offset;
Peng Taod7e09d02013-05-02 16:46:55 +08001874
1875 void *(*getter)(struct lustre_msg *m, int n, int minlen);
1876
1877 static const char *rcl_names[RCL_NR] = {
1878 [RCL_CLIENT] = "client",
1879 [RCL_SERVER] = "server"
1880 };
1881
Peng Taod7e09d02013-05-02 16:46:55 +08001882 fmt = pill->rc_fmt;
Oleg Drokin8b382082016-02-16 00:46:58 -05001883 LASSERT(fmt);
Peng Taod7e09d02013-05-02 16:46:55 +08001884 LASSERT(fmt != LP_POISON);
1885 LASSERT(__req_format_is_sane(fmt));
1886
1887 offset = __req_capsule_offset(pill, field, loc);
1888
1889 msg = __req_msg(pill, loc);
Oleg Drokin8b382082016-02-16 00:46:58 -05001890 LASSERT(msg);
Peng Taod7e09d02013-05-02 16:46:55 +08001891
1892 getter = (field->rmf_flags & RMF_F_STRING) ?
1893 (typeof(getter))lustre_msg_string : lustre_msg_buf;
1894
1895 if (field->rmf_flags & RMF_F_STRUCT_ARRAY) {
1896 /*
1897 * We've already asserted that field->rmf_size > 0 in
1898 * req_layout_init().
1899 */
1900 len = lustre_msg_buflen(msg, offset);
1901 if ((len % field->rmf_size) != 0) {
Joe Perches2d00bd12014-11-23 11:28:50 -08001902 CERROR("%s: array field size mismatch %d modulo %d != 0 (%d)\n",
Peng Taod7e09d02013-05-02 16:46:55 +08001903 field->rmf_name, len, field->rmf_size, loc);
1904 return NULL;
1905 }
1906 } else if (pill->rc_area[loc][offset] != -1) {
1907 len = pill->rc_area[loc][offset];
1908 } else {
1909 len = max(field->rmf_size, 0);
1910 }
1911 value = getter(msg, offset, len);
1912
Oleg Drokin8b382082016-02-16 00:46:58 -05001913 if (!value) {
Peng Taod7e09d02013-05-02 16:46:55 +08001914 DEBUG_REQ(D_ERROR, pill->rc_req,
Joe Perches2d00bd12014-11-23 11:28:50 -08001915 "Wrong buffer for field `%s' (%d of %d) in format `%s': %d vs. %d (%s)\n",
Peng Taod7e09d02013-05-02 16:46:55 +08001916 field->rmf_name, offset, lustre_msg_bufcount(msg),
1917 fmt->rf_name, lustre_msg_buflen(msg, offset), len,
1918 rcl_names[loc]);
1919 } else {
1920 swabber_dumper_helper(pill, field, loc, offset, value, len,
1921 dump, swabber);
1922 }
1923
1924 return value;
1925}
1926
1927/**
Peng Taod7e09d02013-05-02 16:46:55 +08001928 * Trivial wrapper around __req_capsule_get(), that returns the PTLRPC request
1929 * buffer corresponding to the given RMF (\a field) of a \a pill.
1930 */
1931void *req_capsule_client_get(struct req_capsule *pill,
1932 const struct req_msg_field *field)
1933{
1934 return __req_capsule_get(pill, field, RCL_CLIENT, NULL, 0);
1935}
1936EXPORT_SYMBOL(req_capsule_client_get);
1937
1938/**
1939 * Same as req_capsule_client_get(), but with a \a swabber argument.
1940 *
1941 * Currently unused; will be removed when req_capsule_server_swab_get() is
1942 * unused too.
1943 */
1944void *req_capsule_client_swab_get(struct req_capsule *pill,
1945 const struct req_msg_field *field,
1946 void *swabber)
1947{
1948 return __req_capsule_get(pill, field, RCL_CLIENT, swabber, 0);
1949}
1950EXPORT_SYMBOL(req_capsule_client_swab_get);
1951
1952/**
1953 * Utility that combines req_capsule_set_size() and req_capsule_client_get().
1954 *
1955 * First the \a pill's request \a field's size is set (\a rc_area) using
1956 * req_capsule_set_size() with the given \a len. Then the actual buffer is
1957 * returned.
1958 */
1959void *req_capsule_client_sized_get(struct req_capsule *pill,
1960 const struct req_msg_field *field,
1961 int len)
1962{
1963 req_capsule_set_size(pill, field, RCL_CLIENT, len);
1964 return __req_capsule_get(pill, field, RCL_CLIENT, NULL, 0);
1965}
1966EXPORT_SYMBOL(req_capsule_client_sized_get);
1967
1968/**
1969 * Trivial wrapper around __req_capsule_get(), that returns the PTLRPC reply
1970 * buffer corresponding to the given RMF (\a field) of a \a pill.
1971 */
1972void *req_capsule_server_get(struct req_capsule *pill,
1973 const struct req_msg_field *field)
1974{
1975 return __req_capsule_get(pill, field, RCL_SERVER, NULL, 0);
1976}
1977EXPORT_SYMBOL(req_capsule_server_get);
1978
1979/**
1980 * Same as req_capsule_server_get(), but with a \a swabber argument.
1981 *
1982 * Ideally all swabbing should be done pursuant to RMF definitions, with no
1983 * swabbing done outside this capsule abstraction.
1984 */
1985void *req_capsule_server_swab_get(struct req_capsule *pill,
1986 const struct req_msg_field *field,
1987 void *swabber)
1988{
1989 return __req_capsule_get(pill, field, RCL_SERVER, swabber, 0);
1990}
1991EXPORT_SYMBOL(req_capsule_server_swab_get);
1992
1993/**
1994 * Utility that combines req_capsule_set_size() and req_capsule_server_get().
1995 *
1996 * First the \a pill's request \a field's size is set (\a rc_area) using
1997 * req_capsule_set_size() with the given \a len. Then the actual buffer is
1998 * returned.
1999 */
2000void *req_capsule_server_sized_get(struct req_capsule *pill,
2001 const struct req_msg_field *field,
2002 int len)
2003{
2004 req_capsule_set_size(pill, field, RCL_SERVER, len);
2005 return __req_capsule_get(pill, field, RCL_SERVER, NULL, 0);
2006}
2007EXPORT_SYMBOL(req_capsule_server_sized_get);
2008
2009void *req_capsule_server_sized_swab_get(struct req_capsule *pill,
2010 const struct req_msg_field *field,
2011 int len, void *swabber)
2012{
2013 req_capsule_set_size(pill, field, RCL_SERVER, len);
2014 return __req_capsule_get(pill, field, RCL_SERVER, swabber, 0);
2015}
2016EXPORT_SYMBOL(req_capsule_server_sized_swab_get);
2017
2018/**
Peng Taod7e09d02013-05-02 16:46:55 +08002019 * Set the size of the PTLRPC request/reply (\a loc) buffer for the given \a
2020 * field of the given \a pill.
2021 *
2022 * This function must be used when constructing variable sized fields of a
2023 * request or reply.
2024 */
2025void req_capsule_set_size(struct req_capsule *pill,
2026 const struct req_msg_field *field,
2027 enum req_location loc, int size)
2028{
2029 LASSERT(loc == RCL_SERVER || loc == RCL_CLIENT);
2030
2031 if ((size != field->rmf_size) &&
2032 (field->rmf_size != -1) &&
2033 !(field->rmf_flags & RMF_F_NO_SIZE_CHECK) &&
2034 (size > 0)) {
2035 if ((field->rmf_flags & RMF_F_STRUCT_ARRAY) &&
2036 (size % field->rmf_size != 0)) {
Joe Perches2d00bd12014-11-23 11:28:50 -08002037 CERROR("%s: array field size mismatch %d %% %d != 0 (%d)\n",
Peng Taod7e09d02013-05-02 16:46:55 +08002038 field->rmf_name, size, field->rmf_size, loc);
2039 LBUG();
2040 } else if (!(field->rmf_flags & RMF_F_STRUCT_ARRAY) &&
2041 size < field->rmf_size) {
2042 CERROR("%s: field size mismatch %d != %d (%d)\n",
2043 field->rmf_name, size, field->rmf_size, loc);
2044 LBUG();
2045 }
2046 }
2047
2048 pill->rc_area[loc][__req_capsule_offset(pill, field, loc)] = size;
2049}
2050EXPORT_SYMBOL(req_capsule_set_size);
2051
2052/**
2053 * Return the actual PTLRPC buffer length of a request or reply (\a loc)
2054 * for the given \a pill's given \a field.
2055 *
2056 * NB: this function doesn't correspond with req_capsule_set_size(), which
2057 * actually sets the size in pill.rc_area[loc][offset], but this function
2058 * returns the message buflen[offset], maybe we should use another name.
2059 */
2060int req_capsule_get_size(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 lustre_msg_buflen(__req_msg(pill, loc),
2067 __req_capsule_offset(pill, field, loc));
2068}
2069EXPORT_SYMBOL(req_capsule_get_size);
2070
2071/**
2072 * Wrapper around lustre_msg_size() that returns the PTLRPC size needed for the
2073 * given \a pill's request or reply (\a loc) given the field size recorded in
2074 * the \a pill's rc_area.
2075 *
2076 * See also req_capsule_set_size().
2077 */
2078int req_capsule_msg_size(struct req_capsule *pill, enum req_location loc)
2079{
2080 return lustre_msg_size(pill->rc_req->rq_import->imp_msg_magic,
2081 pill->rc_fmt->rf_fields[loc].nr,
2082 pill->rc_area[loc]);
2083}
2084
2085/**
2086 * While req_capsule_msg_size() computes the size of a PTLRPC request or reply
2087 * (\a loc) given a \a pill's \a rc_area, this function computes the size of a
2088 * PTLRPC request or reply given only an RQF (\a fmt).
2089 *
2090 * This function should not be used for formats which contain variable size
2091 * fields.
2092 */
2093int req_capsule_fmt_size(__u32 magic, const struct req_format *fmt,
2094 enum req_location loc)
2095{
2096 int size, i = 0;
2097
2098 /*
2099 * This function should probably LASSERT() that fmt has no fields with
2100 * RMF_F_STRUCT_ARRAY in rmf_flags, since we can't know here how many
2101 * elements in the array there will ultimately be, but then, we could
2102 * assume that there will be at least one element, and that's just what
2103 * we do.
2104 */
2105 size = lustre_msg_hdr_size(magic, fmt->rf_fields[loc].nr);
2106 if (size < 0)
2107 return size;
2108
2109 for (; i < fmt->rf_fields[loc].nr; ++i)
2110 if (fmt->rf_fields[loc].d[i]->rmf_size != -1)
2111 size += cfs_size_round(fmt->rf_fields[loc].d[i]->
2112 rmf_size);
2113 return size;
2114}
2115
2116/**
2117 * Changes the format of an RPC.
2118 *
2119 * The pill must already have been initialized, which means that it already has
2120 * a request format. The new format \a fmt must be an extension of the pill's
2121 * old format. Specifically: the new format must have as many request and reply
2122 * fields as the old one, and all fields shared by the old and new format must
2123 * be at least as large in the new format.
2124 *
2125 * The new format's fields may be of different "type" than the old format, but
2126 * only for fields that are "opaque" blobs: fields which have a) have no
2127 * \a rmf_swabber, b) \a rmf_flags == 0 or RMF_F_NO_SIZE_CHECK, and c) \a
2128 * rmf_size == -1 or \a rmf_flags == RMF_F_NO_SIZE_CHECK. For example,
2129 * OBD_SET_INFO has a key field and an opaque value field that gets interpreted
2130 * according to the key field. When the value, according to the key, contains a
2131 * structure (or array thereof) to be swabbed, the format should be changed to
2132 * one where the value field has \a rmf_size/rmf_flags/rmf_swabber set
2133 * accordingly.
2134 */
2135void req_capsule_extend(struct req_capsule *pill, const struct req_format *fmt)
2136{
2137 int i;
2138 int j;
2139
2140 const struct req_format *old;
2141
Oleg Drokin8b382082016-02-16 00:46:58 -05002142 LASSERT(pill->rc_fmt);
Peng Taod7e09d02013-05-02 16:46:55 +08002143 LASSERT(__req_format_is_sane(fmt));
2144
2145 old = pill->rc_fmt;
2146 /*
2147 * Sanity checking...
2148 */
2149 for (i = 0; i < RCL_NR; ++i) {
2150 LASSERT(fmt->rf_fields[i].nr >= old->rf_fields[i].nr);
2151 for (j = 0; j < old->rf_fields[i].nr - 1; ++j) {
2152 const struct req_msg_field *ofield = FMT_FIELD(old, i, j);
2153
2154 /* "opaque" fields can be transmogrified */
Oleg Drokin8b382082016-02-16 00:46:58 -05002155 if (!ofield->rmf_swabber &&
Peng Taod7e09d02013-05-02 16:46:55 +08002156 (ofield->rmf_flags & ~RMF_F_NO_SIZE_CHECK) == 0 &&
2157 (ofield->rmf_size == -1 ||
2158 ofield->rmf_flags == RMF_F_NO_SIZE_CHECK))
2159 continue;
2160 LASSERT(FMT_FIELD(fmt, i, j) == FMT_FIELD(old, i, j));
2161 }
2162 /*
2163 * Last field in old format can be shorter than in new.
2164 */
2165 LASSERT(FMT_FIELD(fmt, i, j)->rmf_size >=
2166 FMT_FIELD(old, i, j)->rmf_size);
2167 }
2168
2169 pill->rc_fmt = fmt;
2170}
2171EXPORT_SYMBOL(req_capsule_extend);
2172
2173/**
2174 * This function returns a non-zero value if the given \a field is present in
2175 * the format (\a rc_fmt) of \a pill's PTLRPC request or reply (\a loc), else it
2176 * returns 0.
2177 */
2178int req_capsule_has_field(const struct req_capsule *pill,
2179 const struct req_msg_field *field,
2180 enum req_location loc)
2181{
2182 LASSERT(loc == RCL_SERVER || loc == RCL_CLIENT);
2183
2184 return field->rmf_offset[pill->rc_fmt->rf_idx][loc];
2185}
2186EXPORT_SYMBOL(req_capsule_has_field);
2187
2188/**
2189 * Returns a non-zero value if the given \a field is present in the given \a
2190 * pill's PTLRPC request or reply (\a loc), else it returns 0.
2191 */
Shraddha Barke98e0a282015-10-04 13:00:12 +05302192static int req_capsule_field_present(const struct req_capsule *pill,
2193 const struct req_msg_field *field,
2194 enum req_location loc)
Peng Taod7e09d02013-05-02 16:46:55 +08002195{
2196 int offset;
2197
2198 LASSERT(loc == RCL_SERVER || loc == RCL_CLIENT);
2199 LASSERT(req_capsule_has_field(pill, field, loc));
2200
2201 offset = __req_capsule_offset(pill, field, loc);
2202 return lustre_msg_bufcount(__req_msg(pill, loc)) > offset;
2203}
Peng Taod7e09d02013-05-02 16:46:55 +08002204
2205/**
2206 * This function shrinks the size of the _buffer_ of the \a pill's PTLRPC
2207 * request or reply (\a loc).
2208 *
2209 * This is not the opposite of req_capsule_extend().
2210 */
2211void req_capsule_shrink(struct req_capsule *pill,
2212 const struct req_msg_field *field,
2213 unsigned int newlen,
2214 enum req_location loc)
2215{
2216 const struct req_format *fmt;
Chris Hannad0bfef32015-06-03 10:28:26 -04002217 struct lustre_msg *msg;
2218 int len;
2219 int offset;
Peng Taod7e09d02013-05-02 16:46:55 +08002220
2221 fmt = pill->rc_fmt;
Oleg Drokin8b382082016-02-16 00:46:58 -05002222 LASSERT(fmt);
Peng Taod7e09d02013-05-02 16:46:55 +08002223 LASSERT(__req_format_is_sane(fmt));
2224 LASSERT(req_capsule_has_field(pill, field, loc));
2225 LASSERT(req_capsule_field_present(pill, field, loc));
2226
2227 offset = __req_capsule_offset(pill, field, loc);
2228
2229 msg = __req_msg(pill, loc);
2230 len = lustre_msg_buflen(msg, offset);
2231 LASSERTF(newlen <= len, "%s:%s, oldlen=%d, newlen=%d\n",
Oleg Drokin30c0aa32016-02-26 01:50:02 -05002232 fmt->rf_name, field->rmf_name, len, newlen);
Peng Taod7e09d02013-05-02 16:46:55 +08002233
2234 if (loc == RCL_CLIENT)
2235 pill->rc_req->rq_reqlen = lustre_shrink_msg(msg, offset, newlen,
2236 1);
2237 else
2238 pill->rc_req->rq_replen = lustre_shrink_msg(msg, offset, newlen,
2239 1);
2240}
2241EXPORT_SYMBOL(req_capsule_shrink);
2242
Peng Taod7e09d02013-05-02 16:46:55 +08002243/* __REQ_LAYOUT_USER__ */
2244#endif