1 /* 2 * GPL HEADER START 3 * 4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License version 2 only, 8 * as published by the Free Software Foundation. 9 * 10 * This program is distributed in the hope that it will be useful, but 11 * WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 * General Public License version 2 for more details (a copy is included 14 * in the LICENSE file that accompanied this code). 15 * 16 * You should have received a copy of the GNU General Public License 17 * version 2 along with this program; If not, see 18 * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf 19 * 20 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, 21 * CA 95054 USA or visit www.sun.com if you need additional information or 22 * have any questions. 23 * 24 * GPL HEADER END 25 */ 26 /* 27 * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. 28 * Use is subject to license terms. 29 * 30 * Copyright (c) 2011, 2012, Intel Corporation. 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/include/lustre_req_layout.h 37 * 38 * Lustre Metadata Target (mdt) request handler 39 * 40 * Author: Nikita Danilov <nikita@clusterfs.com> 41 */ 42 43 #ifndef _LUSTRE_REQ_LAYOUT_H__ 44 #define _LUSTRE_REQ_LAYOUT_H__ 45 46 /** \defgroup req_layout req_layout 47 * 48 * @{ 49 */ 50 51 struct req_msg_field; 52 struct req_format; 53 struct req_capsule; 54 55 struct ptlrpc_request; 56 57 enum req_location { 58 RCL_CLIENT, 59 RCL_SERVER, 60 RCL_NR 61 }; 62 63 /* Maximal number of fields (buffers) in a request message. */ 64 #define REQ_MAX_FIELD_NR 9 65 66 struct req_capsule { 67 struct ptlrpc_request *rc_req; 68 const struct req_format *rc_fmt; 69 enum req_location rc_loc; 70 __u32 rc_area[RCL_NR][REQ_MAX_FIELD_NR]; 71 }; 72 73 #if !defined(__REQ_LAYOUT_USER__) 74 75 /* struct ptlrpc_request, lustre_msg* */ 76 #include "lustre_net.h" 77 78 void req_capsule_init(struct req_capsule *pill, struct ptlrpc_request *req, 79 enum req_location location); 80 void req_capsule_fini(struct req_capsule *pill); 81 82 void req_capsule_set(struct req_capsule *pill, const struct req_format *fmt); 83 void req_capsule_client_dump(struct req_capsule *pill); 84 void req_capsule_server_dump(struct req_capsule *pill); 85 void req_capsule_init_area(struct req_capsule *pill); 86 int req_capsule_filled_sizes(struct req_capsule *pill, enum req_location loc); 87 int req_capsule_server_pack(struct req_capsule *pill); 88 89 void *req_capsule_client_get(struct req_capsule *pill, 90 const struct req_msg_field *field); 91 void *req_capsule_client_swab_get(struct req_capsule *pill, 92 const struct req_msg_field *field, 93 void *swabber); 94 void *req_capsule_client_sized_get(struct req_capsule *pill, 95 const struct req_msg_field *field, 96 int len); 97 void *req_capsule_server_get(struct req_capsule *pill, 98 const struct req_msg_field *field); 99 void *req_capsule_server_sized_get(struct req_capsule *pill, 100 const struct req_msg_field *field, 101 int len); 102 void *req_capsule_server_swab_get(struct req_capsule *pill, 103 const struct req_msg_field *field, 104 void *swabber); 105 void *req_capsule_server_sized_swab_get(struct req_capsule *pill, 106 const struct req_msg_field *field, 107 int len, void *swabber); 108 const void *req_capsule_other_get(struct req_capsule *pill, 109 const struct req_msg_field *field); 110 111 void req_capsule_set_size(struct req_capsule *pill, 112 const struct req_msg_field *field, 113 enum req_location loc, int size); 114 int req_capsule_get_size(const struct req_capsule *pill, 115 const struct req_msg_field *field, 116 enum req_location loc); 117 int req_capsule_msg_size(struct req_capsule *pill, enum req_location loc); 118 int req_capsule_fmt_size(__u32 magic, const struct req_format *fmt, 119 enum req_location loc); 120 void req_capsule_extend(struct req_capsule *pill, const struct req_format *fmt); 121 122 int req_capsule_has_field(const struct req_capsule *pill, 123 const struct req_msg_field *field, 124 enum req_location loc); 125 int req_capsule_field_present(const struct req_capsule *pill, 126 const struct req_msg_field *field, 127 enum req_location loc); 128 void req_capsule_shrink(struct req_capsule *pill, 129 const struct req_msg_field *field, 130 unsigned int newlen, 131 enum req_location loc); 132 int req_capsule_server_grow(struct req_capsule *pill, 133 const struct req_msg_field *field, 134 unsigned int newlen); 135 int req_layout_init(void); 136 void req_layout_fini(void); 137 138 /* __REQ_LAYOUT_USER__ */ 139 #endif 140 141 extern struct req_format RQF_OBD_PING; 142 extern struct req_format RQF_OBD_SET_INFO; 143 extern struct req_format RQF_SEC_CTX; 144 extern struct req_format RQF_OBD_IDX_READ; 145 /* MGS req_format */ 146 extern struct req_format RQF_MGS_TARGET_REG; 147 extern struct req_format RQF_MGS_SET_INFO; 148 extern struct req_format RQF_MGS_CONFIG_READ; 149 /* fid/fld req_format */ 150 extern struct req_format RQF_SEQ_QUERY; 151 extern struct req_format RQF_FLD_QUERY; 152 /* MDS req_format */ 153 extern struct req_format RQF_MDS_CONNECT; 154 extern struct req_format RQF_MDS_DISCONNECT; 155 extern struct req_format RQF_MDS_STATFS; 156 extern struct req_format RQF_MDS_GETSTATUS; 157 extern struct req_format RQF_MDS_SYNC; 158 extern struct req_format RQF_MDS_GETXATTR; 159 extern struct req_format RQF_MDS_GETATTR; 160 extern struct req_format RQF_UPDATE_OBJ; 161 162 /* 163 * This is format of direct (non-intent) MDS_GETATTR_NAME request. 164 */ 165 extern struct req_format RQF_MDS_GETATTR_NAME; 166 extern struct req_format RQF_MDS_CLOSE; 167 extern struct req_format RQF_MDS_RELEASE_CLOSE; 168 extern struct req_format RQF_MDS_PIN; 169 extern struct req_format RQF_MDS_UNPIN; 170 extern struct req_format RQF_MDS_CONNECT; 171 extern struct req_format RQF_MDS_DISCONNECT; 172 extern struct req_format RQF_MDS_GET_INFO; 173 extern struct req_format RQF_MDS_READPAGE; 174 extern struct req_format RQF_MDS_WRITEPAGE; 175 extern struct req_format RQF_MDS_IS_SUBDIR; 176 extern struct req_format RQF_MDS_DONE_WRITING; 177 extern struct req_format RQF_MDS_REINT; 178 extern struct req_format RQF_MDS_REINT_CREATE; 179 extern struct req_format RQF_MDS_REINT_CREATE_RMT_ACL; 180 extern struct req_format RQF_MDS_REINT_CREATE_SLAVE; 181 extern struct req_format RQF_MDS_REINT_CREATE_SYM; 182 extern struct req_format RQF_MDS_REINT_OPEN; 183 extern struct req_format RQF_MDS_REINT_UNLINK; 184 extern struct req_format RQF_MDS_REINT_LINK; 185 extern struct req_format RQF_MDS_REINT_RENAME; 186 extern struct req_format RQF_MDS_REINT_SETATTR; 187 extern struct req_format RQF_MDS_REINT_SETXATTR; 188 extern struct req_format RQF_MDS_QUOTACHECK; 189 extern struct req_format RQF_MDS_QUOTACTL; 190 extern struct req_format RQF_QC_CALLBACK; 191 extern struct req_format RQF_QUOTA_DQACQ; 192 extern struct req_format RQF_MDS_SWAP_LAYOUTS; 193 /* MDS hsm formats */ 194 extern struct req_format RQF_MDS_HSM_STATE_GET; 195 extern struct req_format RQF_MDS_HSM_STATE_SET; 196 extern struct req_format RQF_MDS_HSM_ACTION; 197 extern struct req_format RQF_MDS_HSM_PROGRESS; 198 extern struct req_format RQF_MDS_HSM_CT_REGISTER; 199 extern struct req_format RQF_MDS_HSM_CT_UNREGISTER; 200 extern struct req_format RQF_MDS_HSM_REQUEST; 201 /* OST req_format */ 202 extern struct req_format RQF_OST_CONNECT; 203 extern struct req_format RQF_OST_DISCONNECT; 204 extern struct req_format RQF_OST_QUOTACHECK; 205 extern struct req_format RQF_OST_QUOTACTL; 206 extern struct req_format RQF_OST_GETATTR; 207 extern struct req_format RQF_OST_SETATTR; 208 extern struct req_format RQF_OST_CREATE; 209 extern struct req_format RQF_OST_PUNCH; 210 extern struct req_format RQF_OST_SYNC; 211 extern struct req_format RQF_OST_DESTROY; 212 extern struct req_format RQF_OST_BRW_READ; 213 extern struct req_format RQF_OST_BRW_WRITE; 214 extern struct req_format RQF_OST_STATFS; 215 extern struct req_format RQF_OST_SET_GRANT_INFO; 216 extern struct req_format RQF_OST_GET_INFO_GENERIC; 217 extern struct req_format RQF_OST_GET_INFO_LAST_ID; 218 extern struct req_format RQF_OST_GET_INFO_LAST_FID; 219 extern struct req_format RQF_OST_SET_INFO_LAST_FID; 220 extern struct req_format RQF_OST_GET_INFO_FIEMAP; 221 222 /* LDLM req_format */ 223 extern struct req_format RQF_LDLM_ENQUEUE; 224 extern struct req_format RQF_LDLM_ENQUEUE_LVB; 225 extern struct req_format RQF_LDLM_CONVERT; 226 extern struct req_format RQF_LDLM_INTENT; 227 extern struct req_format RQF_LDLM_INTENT_BASIC; 228 extern struct req_format RQF_LDLM_INTENT_LAYOUT; 229 extern struct req_format RQF_LDLM_INTENT_GETATTR; 230 extern struct req_format RQF_LDLM_INTENT_OPEN; 231 extern struct req_format RQF_LDLM_INTENT_CREATE; 232 extern struct req_format RQF_LDLM_INTENT_UNLINK; 233 extern struct req_format RQF_LDLM_INTENT_GETXATTR; 234 extern struct req_format RQF_LDLM_INTENT_QUOTA; 235 extern struct req_format RQF_LDLM_CANCEL; 236 extern struct req_format RQF_LDLM_CALLBACK; 237 extern struct req_format RQF_LDLM_CP_CALLBACK; 238 extern struct req_format RQF_LDLM_BL_CALLBACK; 239 extern struct req_format RQF_LDLM_GL_CALLBACK; 240 extern struct req_format RQF_LDLM_GL_DESC_CALLBACK; 241 /* LOG req_format */ 242 extern struct req_format RQF_LOG_CANCEL; 243 extern struct req_format RQF_LLOG_ORIGIN_HANDLE_CREATE; 244 extern struct req_format RQF_LLOG_ORIGIN_HANDLE_DESTROY; 245 extern struct req_format RQF_LLOG_ORIGIN_HANDLE_NEXT_BLOCK; 246 extern struct req_format RQF_LLOG_ORIGIN_HANDLE_PREV_BLOCK; 247 extern struct req_format RQF_LLOG_ORIGIN_HANDLE_READ_HEADER; 248 extern struct req_format RQF_LLOG_ORIGIN_CONNECT; 249 250 extern struct req_format RQF_CONNECT; 251 252 extern struct req_msg_field RMF_GENERIC_DATA; 253 extern struct req_msg_field RMF_PTLRPC_BODY; 254 extern struct req_msg_field RMF_MDT_BODY; 255 extern struct req_msg_field RMF_MDT_EPOCH; 256 extern struct req_msg_field RMF_OBD_STATFS; 257 extern struct req_msg_field RMF_NAME; 258 extern struct req_msg_field RMF_SYMTGT; 259 extern struct req_msg_field RMF_TGTUUID; 260 extern struct req_msg_field RMF_CLUUID; 261 extern struct req_msg_field RMF_SETINFO_VAL; 262 extern struct req_msg_field RMF_SETINFO_KEY; 263 extern struct req_msg_field RMF_GETINFO_VAL; 264 extern struct req_msg_field RMF_GETINFO_VALLEN; 265 extern struct req_msg_field RMF_GETINFO_KEY; 266 extern struct req_msg_field RMF_IDX_INFO; 267 extern struct req_msg_field RMF_CLOSE_DATA; 268 269 /* 270 * connection handle received in MDS_CONNECT request. 271 */ 272 extern struct req_msg_field RMF_CONN; 273 extern struct req_msg_field RMF_CONNECT_DATA; 274 extern struct req_msg_field RMF_DLM_REQ; 275 extern struct req_msg_field RMF_DLM_REP; 276 extern struct req_msg_field RMF_DLM_LVB; 277 extern struct req_msg_field RMF_DLM_GL_DESC; 278 extern struct req_msg_field RMF_LDLM_INTENT; 279 extern struct req_msg_field RMF_LAYOUT_INTENT; 280 extern struct req_msg_field RMF_MDT_MD; 281 extern struct req_msg_field RMF_REC_REINT; 282 extern struct req_msg_field RMF_EADATA; 283 extern struct req_msg_field RMF_EAVALS; 284 extern struct req_msg_field RMF_EAVALS_LENS; 285 extern struct req_msg_field RMF_ACL; 286 extern struct req_msg_field RMF_LOGCOOKIES; 287 extern struct req_msg_field RMF_CAPA1; 288 extern struct req_msg_field RMF_CAPA2; 289 extern struct req_msg_field RMF_OBD_QUOTACHECK; 290 extern struct req_msg_field RMF_OBD_QUOTACTL; 291 extern struct req_msg_field RMF_QUOTA_BODY; 292 extern struct req_msg_field RMF_STRING; 293 extern struct req_msg_field RMF_SWAP_LAYOUTS; 294 extern struct req_msg_field RMF_MDS_HSM_PROGRESS; 295 extern struct req_msg_field RMF_MDS_HSM_REQUEST; 296 extern struct req_msg_field RMF_MDS_HSM_USER_ITEM; 297 extern struct req_msg_field RMF_MDS_HSM_ARCHIVE; 298 extern struct req_msg_field RMF_HSM_USER_STATE; 299 extern struct req_msg_field RMF_HSM_STATE_SET; 300 extern struct req_msg_field RMF_MDS_HSM_CURRENT_ACTION; 301 extern struct req_msg_field RMF_MDS_HSM_REQUEST; 302 303 /* seq-mgr fields */ 304 extern struct req_msg_field RMF_SEQ_OPC; 305 extern struct req_msg_field RMF_SEQ_RANGE; 306 extern struct req_msg_field RMF_FID_SPACE; 307 308 /* FLD fields */ 309 extern struct req_msg_field RMF_FLD_OPC; 310 extern struct req_msg_field RMF_FLD_MDFLD; 311 312 extern struct req_msg_field RMF_LLOGD_BODY; 313 extern struct req_msg_field RMF_LLOG_LOG_HDR; 314 extern struct req_msg_field RMF_LLOGD_CONN_BODY; 315 316 extern struct req_msg_field RMF_MGS_TARGET_INFO; 317 extern struct req_msg_field RMF_MGS_SEND_PARAM; 318 319 extern struct req_msg_field RMF_OST_BODY; 320 extern struct req_msg_field RMF_OBD_IOOBJ; 321 extern struct req_msg_field RMF_OBD_ID; 322 extern struct req_msg_field RMF_FID; 323 extern struct req_msg_field RMF_NIOBUF_REMOTE; 324 extern struct req_msg_field RMF_RCS; 325 extern struct req_msg_field RMF_FIEMAP_KEY; 326 extern struct req_msg_field RMF_FIEMAP_VAL; 327 extern struct req_msg_field RMF_OST_ID; 328 329 /* MGS config read message format */ 330 extern struct req_msg_field RMF_MGS_CONFIG_BODY; 331 extern struct req_msg_field RMF_MGS_CONFIG_RES; 332 333 /* generic uint32 */ 334 extern struct req_msg_field RMF_U32; 335 336 /* OBJ update format */ 337 extern struct req_msg_field RMF_UPDATE; 338 extern struct req_msg_field RMF_UPDATE_REPLY; 339 /** @} req_layout */ 340 341 #endif /* _LUSTRE_REQ_LAYOUT_H__ */ 342