nfs-ganesha 1.4
|
00001 /* 00002 * 00003 * 00004 * Copyright CEA/DAM/DIF (2008) 00005 * contributeur : Philippe DENIEL philippe.deniel@cea.fr 00006 * Thomas LEIBOVICI thomas.leibovici@cea.fr 00007 * 00008 * 00009 * This program is free software; you can redistribute it and/or 00010 * modify it under the terms of the GNU Lesser General Public 00011 * License as published by the Free Software Foundation; either 00012 * version 3 of the License, or (at your option) any later version. 00013 * 00014 * This program is distributed in the hope that it will be useful, 00015 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00016 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00017 * Lesser General Public License for more details. 00018 * 00019 * You should have received a copy of the GNU Lesser General Public 00020 * License along with this library; if not, write to the Free Software 00021 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 00022 * 00023 * --------------------------------------- 00024 */ 00025 00037 #ifndef _NFS_CORE_H 00038 #define _NFS_CORE_H 00039 00040 #include <pthread.h> 00041 #include <sys/types.h> 00042 #include <sys/param.h> 00043 #include <time.h> 00044 #include <sys/time.h> 00045 00046 #include "ganesha_rpc.h" 00047 #include "LRU_List.h" 00048 #include "fsal.h" 00049 #include "cache_inode.h" 00050 #include "nfs_stat.h" 00051 #include "external_tools.h" 00052 00053 #include "nfs23.h" 00054 #include "nfs4.h" 00055 #include "mount.h" 00056 #include "nfs_proto_functions.h" 00057 #include "nfs_dupreq.h" 00058 #include "err_LRU_List.h" 00059 #include "err_HashTable.h" 00060 00061 #include "cache_inode.h" 00062 #include "fsal_up.h" 00063 00064 #ifdef _USE_9P 00065 #include "9p.h" 00066 #endif 00067 00068 #ifdef _ERROR_INJECTION 00069 #include "err_inject.h" 00070 #endif 00071 00072 /* Maximum thread count */ 00073 #define NB_MAX_WORKER_THREAD 4096 00074 #define NB_MAX_FLUSHER_THREAD 100 00075 00076 /* NFS daemon behavior default values */ 00077 #define NB_WORKER_THREAD_DEFAULT 16 00078 #define NB_FLUSHER_THREAD_DEFAULT 16 00079 #define NB_REQUEST_BEFORE_QUEUE_AVG 1000 00080 #define NB_MAX_CONCURRENT_GC 3 00081 #define NB_MAX_PENDING_REQUEST 30 00082 #define NB_REQUEST_BEFORE_GC 50 00083 #define PRIME_DUPREQ 17 /* has to be a prime number */ 00084 #define PRIME_ID_MAPPER 17 /* has to be a prime number */ 00085 #define DUPREQ_EXPIRATION 180 00086 00087 #define PRIME_CACHE_INODE 37 /* has to be a prime number */ 00088 00089 #define PRIME_IP_NAME 17 00090 #define IP_NAME_EXPIRATION 36000 00091 00092 #define PRIME_IP_STATS 17 00093 00094 #define PRIME_CLIENT_ID 17 00095 00096 #define PRIME_STATE_ID 17 00097 00098 #define DEFAULT_NFS_PRINCIPAL "nfs" /* GSSAPI will expand this to nfs/host@DOMAIN */ 00099 #define DEFAULT_NFS_KEYTAB "" /* let GSSAPI use keytab specified in /etc/krb5.conf */ 00100 #define DEFAULT_NFS_CCACHE_DIR "/var/run/ganesha" 00101 00102 /* Config labels */ 00103 #define CONF_LABEL_NFS_CORE "NFS_Core_Param" 00104 #define CONF_LABEL_NFS_WORKER "NFS_Worker_Param" 00105 #define CONF_LABEL_NFS_DUPREQ "NFS_DupReq_Hash" 00106 #define CONF_LABEL_NFS_IP_NAME "NFS_IP_Name" 00107 #define CONF_LABEL_NFS_KRB5 "NFS_KRB5" 00108 #define CONF_LABEL_PNFS "pNFS" 00109 #define CONF_LABEL_NFS_VERSION4 "NFSv4" 00110 #define CONF_LABEL_CLIENT_ID "NFSv4_ClientId_Cache" 00111 #define CONF_LABEL_STATE_ID "NFSv4_StateId_Cache" 00112 #define CONF_LABEL_SESSION_ID "NFSv4_Session_Cache" 00113 #define CONF_LABEL_UID_MAPPER "UidMapper_Cache" 00114 #define CONF_LABEL_GID_MAPPER "GidMapper_Cache" 00115 #define CONF_LABEL_UID_MAPPER_TABLE "Users" 00116 #define CONF_LABEL_GID_MAPPER_TABLE "Groups" 00117 #define CONF_LABEL_IP_NAME_HOSTS "Hosts" 00118 #define CONF_LABEL_NFSV4_REFERRALS "NFSv4_Referrals" 00119 00120 /* Worker and sidpatcher stack size */ 00121 #define THREAD_STACK_SIZE 2116488 00122 00123 /* NFS/RPC specific values */ 00124 #define NFS_PORT 2049 00125 #define RQUOTA_PORT 875 00126 #define RQCRED_SIZE 400 /* this size is excessive */ 00127 #define NFS_DEFAULT_SEND_BUFFER_SIZE 32768 00128 #define NFS_DEFAULT_RECV_BUFFER_SIZE 32768 00129 00130 /* Default 'Raw Dev' values */ 00131 #define GANESHA_RAW_DEV_MAJOR 168 00132 #define GANESHA_RAW_DEV_MINOR 168 00133 00134 /* Other #define */ 00135 #define TMP_STR_LEN 256 00136 #define AUTH_STR_LEN 30 00137 #define PWENT_MAX_LEN 81 /* MUST be a multiple of 9 */ 00138 00139 /* Id Mapper cache error */ 00140 #define ID_MAPPER_SUCCESS 0 00141 #define ID_MAPPER_INSERT_MALLOC_ERROR 1 00142 #define ID_MAPPER_NOT_FOUND 2 00143 #define ID_MAPPER_INVALID_ARGUMENT 3 00144 #define ID_MAPPER_FAIL 4 00145 00146 /* Hard and soft limit for nfsv4 quotas */ 00147 #define NFS_V4_MAX_QUOTA_SOFT 4294967296LL /* 4 GB */ 00148 #define NFS_V4_MAX_QUOTA_HARD 17179869184LL /* 16 GB */ 00149 #define NFS_V4_MAX_QUOTA 34359738368LL /* 32 GB */ 00150 00151 /* protocol flags */ 00152 #define CORE_OPTION_NFSV2 0x00000002 /* NFSv2 operations are supported */ 00153 #define CORE_OPTION_NFSV3 0x00000004 /* NFSv3 operations are supported */ 00154 #define CORE_OPTION_NFSV4 0x00000008 /* NFSv4 operations are supported */ 00155 #define CORE_OPTION_ALL_VERS 0x0000000E 00156 00157 /* Things related to xattr ghost directory */ 00158 #define XATTRD_NAME ".xattr.d." 00159 #define XATTRD_NAME_LEN 9 /* MUST be equal to strlen( XATTRD_NAME ) */ 00160 #define XATTR_BUFFERSIZE 4096 00161 00162 typedef char path_str_t[MAXPATHLEN] ; 00163 00164 /* The default attribute mask for NFSv2/NFSv3 */ 00165 #define FSAL_ATTR_MASK_V2_V3 ( FSAL_ATTRS_MANDATORY | FSAL_ATTR_MODE | FSAL_ATTR_FILEID | \ 00166 FSAL_ATTR_FSID | FSAL_ATTR_NUMLINKS | FSAL_ATTR_OWNER | \ 00167 FSAL_ATTR_GROUP | FSAL_ATTR_SIZE | FSAL_ATTR_ATIME | \ 00168 FSAL_ATTR_MTIME | FSAL_ATTR_CTIME | FSAL_ATTR_SPACEUSED | \ 00169 FSAL_ATTR_RAWDEV ) 00170 00171 /* The default attribute mask for NFSv4 */ 00172 #define FSAL_ATTR_MASK_V4 ( FSAL_ATTRS_MANDATORY | FSAL_ATTR_MODE | FSAL_ATTR_FILEID | \ 00173 FSAL_ATTR_FSID | FSAL_ATTR_NUMLINKS | FSAL_ATTR_OWNER | \ 00174 FSAL_ATTR_GROUP | FSAL_ATTR_SIZE | FSAL_ATTR_ATIME | \ 00175 FSAL_ATTR_MTIME | FSAL_ATTR_CTIME | FSAL_ATTR_SPACEUSED | \ 00176 FSAL_ATTR_RAWDEV | FSAL_ATTR_ACL ) 00177 00178 typedef struct nfs_worker_param__ 00179 { 00180 LRU_parameter_t lru_dupreq; 00181 unsigned int nb_before_gc; 00182 } nfs_worker_parameter_t; 00183 00184 typedef struct nfs_rpc_dupreq_param__ 00185 { 00186 hash_parameter_t hash_param; 00187 } nfs_rpc_dupreq_parameter_t; 00188 00189 typedef enum protos 00190 { 00191 P_NFS, 00192 P_MNT, 00193 #ifdef _USE_NLM 00194 P_NLM, 00195 #endif 00196 #ifdef _USE_RQUOTA 00197 P_RQUOTA, 00198 #endif 00199 P_COUNT 00200 } protos; 00201 00202 typedef struct nfs_core_param__ 00203 { 00204 unsigned short port[P_COUNT]; 00205 struct sockaddr_in bind_addr; // IPv4 only for now... 00206 unsigned int program[P_COUNT]; 00207 unsigned int nb_worker; 00208 unsigned int nb_call_before_queue_avg; 00209 unsigned int nb_max_concurrent_gc; 00210 long core_dump_size; 00211 int nb_max_fd; 00212 unsigned int drop_io_errors; 00213 unsigned int drop_inval_errors; 00214 unsigned int drop_delay_errors; 00215 unsigned int use_nfs_commit; 00216 time_t expiration_dupreq; 00217 unsigned int dispatch_multi_xprt_max; 00218 unsigned int dispatch_multi_worker_hiwat; 00219 unsigned int stats_update_delay; 00220 unsigned int long_processing_threshold; 00221 unsigned int dump_stats_per_client; 00222 char stats_file_path[MAXPATHLEN]; 00223 char stats_per_client_directory[MAXPATHLEN]; 00224 char fsal_shared_library[MAXPATHLEN]; 00225 int tcp_fridge_expiration_delay ; 00226 unsigned int core_options; 00227 unsigned int max_send_buffer_size; /* Size of RPC send buffer */ 00228 unsigned int max_recv_buffer_size; /* Size of RPC recv buffer */ 00229 #ifdef _USE_NLM 00230 bool_t nsm_use_caller_name; 00231 #endif 00232 bool_t clustered; 00233 } nfs_core_parameter_t; 00234 00235 typedef struct nfs_ip_name_param__ 00236 { 00237 hash_parameter_t hash_param; 00238 unsigned int expiration_time; 00239 char mapfile[MAXPATHLEN]; 00240 } nfs_ip_name_parameter_t; 00241 00242 typedef struct nfs_ip_stats_param__ 00243 { 00244 hash_parameter_t hash_param; 00245 } nfs_ip_stats_parameter_t; 00246 00247 typedef struct nfs_client_id_param__ 00248 { 00249 hash_parameter_t cid_confirmed_hash_param; 00250 hash_parameter_t cid_unconfirmed_hash_param; 00251 hash_parameter_t cr_hash_param; 00252 } nfs_client_id_parameter_t; 00253 00254 typedef struct nfs_state_id_param__ 00255 { 00256 hash_parameter_t hash_param; 00257 } nfs_state_id_parameter_t; 00258 00259 typedef struct nfs4_owner_parameter_t 00260 { 00261 hash_parameter_t hash_param; 00262 } nfs4_owner_parameter_t; 00263 00264 typedef struct nfs_idmap_cache_param__ 00265 { 00266 hash_parameter_t hash_param; 00267 char mapfile[MAXPATHLEN]; 00268 } nfs_idmap_cache_parameter_t; 00269 00270 #ifdef _USE_NFS4_1 00271 typedef struct nfs_session_id_param__ 00272 { 00273 hash_parameter_t hash_param; 00274 } nfs_session_id_parameter_t; 00275 #endif 00276 00277 typedef struct nfs_fsal_up_param__ 00278 { 00279 pthread_mutex_t event_pool_lock; 00280 pool_t *event_pool; 00281 } nfs_fsal_up_parameter_t; 00282 00283 typedef char entry_name_array_item_t[FSAL_MAX_NAME_LEN]; 00284 00285 typedef struct nfs_version4_parameter__ 00286 { 00287 unsigned int lease_lifetime; 00288 unsigned int fh_expire; 00289 unsigned int returns_err_fh_expired; 00290 unsigned int return_bad_stateid; 00291 char domainname[NFS4_MAX_DOMAIN_LEN]; 00292 char idmapconf[MAXPATHLEN]; 00293 } nfs_version4_parameter_t; 00294 00295 typedef struct nfs_param__ 00296 { 00297 nfs_core_parameter_t core_param; 00298 nfs_worker_parameter_t worker_param; 00299 nfs_rpc_dupreq_parameter_t dupreq_param; 00300 nfs_ip_name_parameter_t ip_name_param; 00301 nfs_idmap_cache_parameter_t uidmap_cache_param; 00302 nfs_idmap_cache_parameter_t gidmap_cache_param; 00303 nfs_idmap_cache_parameter_t unamemap_cache_param; 00304 nfs_idmap_cache_parameter_t gnamemap_cache_param; 00305 nfs_idmap_cache_parameter_t uidgidmap_cache_param; 00306 nfs_ip_stats_parameter_t ip_stats_param; 00307 #ifdef _USE_9P 00308 _9p_parameter_t _9p_param ; 00309 #endif 00310 #ifdef _USE_FSAL_UP 00311 nfs_fsal_up_parameter_t fsal_up_param; 00312 #endif 00313 #ifdef _HAVE_GSSAPI 00314 nfs_krb5_parameter_t krb5_param; 00315 #endif 00316 nfs_version4_parameter_t nfsv4_param; 00317 nfs_client_id_parameter_t client_id_param; 00318 nfs_state_id_parameter_t state_id_param; 00319 #ifdef _USE_NFS4_1 00320 nfs_session_id_parameter_t session_id_param; 00321 #endif /* _USE_NFS4_1 */ 00322 nfs4_owner_parameter_t nfs4_owner_param; 00323 #ifdef _USE_NLM 00324 hash_parameter_t nsm_client_hash_param; 00325 hash_parameter_t nlm_client_hash_param; 00326 hash_parameter_t nlm_owner_hash_param; 00327 #endif 00328 #ifdef _USE_9P 00329 hash_parameter_t _9p_owner_hash_param; 00330 #endif 00331 fsal_parameter_t fsal_param; 00332 external_tools_parameter_t extern_param; 00333 00334 /* list of exports declared in config file */ 00335 exportlist_t *pexportlist; 00336 } nfs_parameter_t; 00337 00338 typedef struct nfs_dupreq_stat__ 00339 { 00340 hash_stat_t htstat; 00341 } nfs_dupreq_stat_t; 00342 00343 typedef struct nfs_request_data__ 00344 { 00345 SVCXPRT *xprt; 00346 struct svc_req req; 00347 struct rpc_msg msg; 00348 char cred_area[2 * MAX_AUTH_BYTES + RQCRED_SIZE]; 00349 nfs_res_t res_nfs; 00350 nfs_arg_t arg_nfs; 00351 struct timeval time_queued; /* The time at which a request was added 00352 * to the worker thread queue. */ 00353 } nfs_request_data_t; 00354 00355 typedef struct wait_entry 00356 { 00357 pthread_mutex_t mtx; 00358 pthread_cond_t cv; 00359 } wait_entry_t; 00360 00361 /* thread wait queue */ 00362 typedef struct wait_q_entry 00363 { 00364 uint32_t lflags; 00365 uint32_t rflags; 00366 wait_entry_t lwe; /* initial waiter */ 00367 wait_entry_t rwe; /* reciprocal waiter */ 00368 struct wait_q_entry *tail; 00369 struct wait_q_entry *next; 00370 } wait_queue_entry_t; 00371 00372 enum rpc_chan_type { 00373 RPC_CHAN_V40, 00374 RPC_CHAN_V41 00375 }; 00376 00377 typedef struct rpc_call_channel 00378 { 00379 enum rpc_chan_type type; 00380 pthread_mutex_t mtx; 00381 uint32_t states; 00382 union { 00383 struct { 00384 nfs_client_id_t *pclientid; 00385 } v40; 00386 } nvu; 00387 time_t last_called; 00388 CLIENT *clnt; 00389 struct rpc_gss_sec gss_sec; 00390 } rpc_call_channel_t; 00391 00392 typedef struct __nfs4_compound { 00393 union { 00394 int type; 00395 struct { 00396 CB_COMPOUND4args args; 00397 CB_COMPOUND4res res; 00398 } v4; 00399 } v_u; 00400 } nfs4_compound_t; 00401 00402 /* RPC callback processing */ 00403 typedef enum rpc_call_hook 00404 { 00405 RPC_CALL_COMPLETE, 00406 RPC_CALL_ABORT, 00407 } rpc_call_hook; 00408 00409 typedef struct _rpc_call rpc_call_t; 00410 00411 typedef int32_t (*rpc_call_func)(rpc_call_t* call, rpc_call_hook hook, 00412 void* arg, uint32_t flags); 00413 00414 extern gss_OID_desc krb5oid; 00415 00416 struct _rpc_call 00417 { 00418 rpc_call_channel_t *chan; 00419 rpc_call_func call_hook; 00420 nfs4_compound_t cbt; 00421 struct wait_entry we; 00422 enum clnt_stat stat; 00423 uint32_t states; 00424 uint32_t flags; 00425 void *u_data[2]; 00426 }; 00427 00428 typedef enum request_type__ 00429 { 00430 NFS_CALL, 00431 NFS_REQUEST, 00432 NFS_REQUEST_LEADER, 00433 _9P_REQUEST 00434 } request_type_t ; 00435 00436 typedef struct request_data__ 00437 { 00438 struct glist_head pending_req_queue; // chaining of pending requests 00439 request_type_t rtype ; 00440 pthread_cond_t req_done_condvar; 00441 pthread_mutex_t req_done_mutex; 00442 union request_content__ { 00443 rpc_call_t *call ; 00444 nfs_request_data_t *nfs ; 00445 #ifdef _USE_9P 00446 _9p_request_data_t _9p ; 00447 #endif 00448 } r_u ; 00449 } request_data_t ; 00450 00451 /* XXXX this is automatically redundant, but in fact upstream TI-RPC is 00452 * not up-to-date with RFC 5665, will fix (Matt) 00453 * 00454 * (c) 2012, Linux Box Corp 00455 */ 00456 enum rfc_5665_nc_type 00457 { 00458 _NC_ERR, 00459 _NC_TCP, 00460 _NC_TCP6, 00461 _NC_RDMA, 00462 _NC_RDMA6, 00463 _NC_SCTP, 00464 _NC_SCTP6, 00465 _NC_UDP, 00466 _NC_UDP6, 00467 }; 00468 typedef enum rfc_5665_nc_type nc_type; 00469 00470 static const struct __netid_nc_table 00471 { 00472 const char *netid; 00473 int netid_len; 00474 const nc_type nc; 00475 int af; 00476 } 00477 netid_nc_table[] = 00478 { 00479 { "-", 1, _NC_ERR, 0 }, 00480 { "tcp", 3, _NC_TCP, AF_INET }, 00481 { "tcp6", 4, _NC_TCP6, AF_INET6 }, 00482 { "rdma", 4, _NC_RDMA, AF_INET }, 00483 { "rdma6", 5, _NC_RDMA6, AF_INET6 }, 00484 { "sctp", 4, _NC_SCTP, AF_INET }, 00485 { "sctp6", 5, _NC_SCTP6, AF_INET6 }, 00486 { "udp", 3, _NC_UDP, AF_INET }, 00487 { "udp6", 4, _NC_UDP6, AF_INET6 }, 00488 }; 00489 00490 nc_type nfs_netid_to_nc(const char *netid); 00491 void nfs_set_client_location(nfs_client_id_t *pclientid, const clientaddr4 *addr4); 00492 00493 /* end TI-RPC */ 00494 00495 typedef struct gsh_addr 00496 { 00497 nc_type nc; 00498 struct sockaddr_storage ss; 00499 uint32_t port; 00500 } gsh_addr_t; 00501 00502 typedef enum idmap_type__ 00503 { UIDMAP_TYPE = 1, 00504 GIDMAP_TYPE = 2 00505 } idmap_type_t; 00506 00507 typedef enum pause_state 00508 { 00509 STATE_STARTUP, 00510 STATE_AWAKEN, 00511 STATE_AWAKE, 00512 STATE_PAUSE, 00513 STATE_PAUSED, 00514 STATE_EXIT 00515 } pause_state_t; 00516 00517 typedef struct nfs_thread_control_block__ 00518 { 00519 pthread_cond_t tcb_condvar; 00520 pthread_mutex_t tcb_mutex; 00521 int tcb_ready; 00522 pause_state_t tcb_state; 00523 char tcb_name[256]; 00524 struct glist_head tcb_list; 00525 } nfs_tcb_t; 00526 00527 extern pool_t *request_pool; 00528 extern pool_t *request_data_pool; 00529 extern pool_t *dupreq_pool; 00530 extern pool_t *ip_stats_pool; 00531 00532 struct nfs_worker_data__ 00533 { 00534 unsigned int worker_index; 00535 int pending_request_len; 00536 struct glist_head pending_request; 00537 LRU_list_t *duplicate_request; 00538 hash_table_t *ht_ip_stats; 00539 pthread_mutex_t request_pool_mutex; 00540 nfs_tcb_t wcb; /* Worker control block */ 00541 00542 nfs_worker_stat_t stats; 00543 unsigned int passcounter; 00544 sockaddr_t hostaddr; 00545 sigset_t sigmask; /* masked signals */ 00546 unsigned int gc_in_progress; 00547 unsigned int current_xid; 00548 fsal_op_context_t thread_fsal_context; 00549 /* Description of current or most recent function processed and start time (or 0) */ 00550 const nfs_function_desc_t *pfuncdesc; 00551 struct timeval timer_start; 00552 }; 00553 00554 /* flush thread data */ 00555 typedef struct nfs_flush_thread_data__ 00556 { 00557 unsigned int thread_index; 00558 00559 /* stats */ 00560 unsigned int nb_flushed; 00561 unsigned int nb_too_young; 00562 unsigned int nb_errors; 00563 unsigned int nb_orphans; 00564 00565 } nfs_flush_thread_data_t; 00566 00570 typedef struct ganesha_stats__ { 00571 nfs_worker_stat_t global_worker_stat; 00572 hash_stat_t cache_inode_hstat; 00573 hash_stat_t uid_map; 00574 hash_stat_t gid_map; 00575 hash_stat_t ip_name_map; 00576 hash_stat_t uid_reverse; 00577 hash_stat_t gid_reverse; 00578 hash_stat_t drc_udp; 00579 hash_stat_t drc_tcp; 00580 fsal_statistics_t global_fsal; 00581 unsigned int min_pending_request; 00582 unsigned int max_pending_request; 00583 unsigned int total_pending_request; 00584 unsigned int average_pending_request; 00585 unsigned int len_pending_request; 00586 unsigned int avg_latency; 00587 unsigned long long total_fsal_calls; 00588 } ganesha_stats_t; 00589 00590 extern nfs_parameter_t nfs_param; 00591 00592 /* ServerEpoch is ServerBootTime unless overriden by -E command line option */ 00593 extern time_t ServerBootTime; 00594 extern time_t ServerEpoch; 00595 00596 extern verifier4 NFS4_write_verifier; /* NFS V4 write verifier */ 00597 extern writeverf3 NFS3_write_verifier; /* NFS V3 write verifier */ 00598 00599 extern nfs_worker_data_t *workers_data; 00600 extern char config_path[MAXPATHLEN]; 00601 extern char pidfile_path[MAXPATHLEN] ; 00602 extern ushort g_nodeid; 00603 00604 typedef enum process_status 00605 { 00606 PROCESS_DISPATCHED, 00607 PROCESS_LOST_CONN, 00608 PROCESS_DONE 00609 } process_status_t; 00610 00611 typedef enum pause_reason 00612 { 00613 PAUSE_RELOAD_EXPORTS, 00614 PAUSE_SHUTDOWN, 00615 } pause_reason_t; 00616 00617 typedef enum awaken_reason 00618 { 00619 AWAKEN_STARTUP, 00620 AWAKEN_RELOAD_EXPORTS, 00621 } awaken_reason_t; 00622 00623 typedef enum pause_rc 00624 { 00625 PAUSE_OK, 00626 PAUSE_PAUSE, /* Calling thread should pause - most callers can ignore this return code */ 00627 PAUSE_EXIT, /* Calling thread should exit */ 00628 } pause_rc; 00629 00630 extern const char *pause_rc_str[]; 00631 00632 typedef enum worker_available_rc 00633 { 00634 WORKER_AVAILABLE, 00635 WORKER_BUSY, 00636 WORKER_PAUSED, 00637 WORKER_GC, 00638 WORKER_ALL_PAUSED, 00639 WORKER_EXIT 00640 } worker_available_rc; 00641 00642 /* 00643 * Object pools 00644 */ 00645 00646 extern pool_t *nfs_clientid_pool; 00647 00648 /* 00649 *functions prototypes 00650 */ 00651 enum auth_stat AuthenticateRequest(nfs_request_data_t *pnfsreq, 00652 bool_t *dispatch); 00653 pause_rc pause_workers(pause_reason_t reason); 00654 pause_rc wake_workers(awaken_reason_t reason); 00655 pause_rc wait_for_workers_to_awaken(); 00656 void DispatchWorkNFS(request_data_t *pnfsreq, unsigned int worker_index); 00657 void *worker_thread(void *IndexArg); 00658 request_data_t *nfs_rpc_get_nfsreq(nfs_worker_data_t *worker, uint32_t flags); 00659 process_status_t process_rpc_request(SVCXPRT *xprt); 00660 00661 process_status_t dispatch_rpc_subrequest(nfs_worker_data_t *mydata, 00662 request_data_t *onfsreq); 00663 int stats_snmp(void); 00664 /* 00665 * Thread entry functions 00666 */ 00667 void *rpc_dispatcher_thread(void *UnusedArg); 00668 void *admin_thread(void *UnusedArg); 00669 void *stats_thread(void *UnusedArg); 00670 void *long_processing_thread(void *UnusedArg); 00671 void *stat_exporter_thread(void *UnusedArg); 00672 void *file_content_gc_thread(void *UnusedArg); 00673 void *nfs_file_content_flush_thread(void *flush_data_arg); 00674 void *reaper_thread(void *UnusedArg); 00675 void *rpc_tcp_socket_manager_thread(void *Arg); 00676 void *sigmgr_thread( void * UnusedArg ); 00677 void *fsal_up_thread(void *Arg); 00678 void *state_async_thread(void *UnusedArg); 00679 00680 #ifdef _USE_UPCALL_SIMULATOR 00681 void * upcall_simulator_thread( void * UnusedArg ) ; 00682 #endif 00683 00684 #ifdef _USE_9P 00685 void * _9p_dispatcher_thread(void *arg); 00686 void DispatchWork9P(request_data_t *pnfsreq, unsigned int worker_index); 00687 void _9p_process_request( _9p_request_data_t * preq9p, nfs_worker_data_t * pworker_data ) ; 00688 #endif 00689 00690 void nfs_operate_on_sigusr1() ; 00691 void nfs_operate_on_sigterm() ; 00692 void nfs_operate_on_sighup() ; 00693 00694 void nfs_Init_svc(void); 00695 void nfs_Init_admin_data(void); 00696 int nfs_Init_worker_data(nfs_worker_data_t * pdata); 00697 int nfs_Init_request_data(nfs_request_data_t * pdata); 00698 int nfs_Init_gc_counter(void); 00699 void nfs_rpc_dispatch_threads(pthread_attr_t *attr_thr); 00700 void constructor_nfs_request_data_t(void *ptr, void *parameters); 00701 void constructor_request_data_t(void *ptr, void *parameters); 00702 00703 /* Config parsing routines */ 00704 int get_stat_exporter_conf(config_file_t in_config, external_tools_parameter_t * out_parameter); 00705 int nfs_read_core_conf(config_file_t in_config, nfs_core_parameter_t * pparam); 00706 int nfs_read_worker_conf(config_file_t in_config, nfs_worker_parameter_t * pparam); 00707 int nfs_read_dupreq_hash_conf(config_file_t in_config, 00708 nfs_rpc_dupreq_parameter_t * pparam); 00709 int nfs_read_ip_name_conf(config_file_t in_config, nfs_ip_name_parameter_t * pparam); 00710 int nfs_read_version4_conf(config_file_t in_config, nfs_version4_parameter_t * pparam); 00711 int nfs_read_client_id_conf(config_file_t in_config, nfs_client_id_parameter_t * pparam); 00712 #ifdef _HAVE_GSSAPI 00713 int nfs_read_krb5_conf(config_file_t in_config, nfs_krb5_parameter_t * pparam); 00714 #endif 00715 int nfs_read_uidmap_conf(config_file_t in_config, nfs_idmap_cache_parameter_t * pparam); 00716 int nfs_read_gidmap_conf(config_file_t in_config, nfs_idmap_cache_parameter_t * pparam); 00717 int nfs_read_state_id_conf(config_file_t in_config, nfs_state_id_parameter_t * pparam); 00718 #ifdef _USE_NFS4_1 00719 int nfs_read_session_id_conf(config_file_t in_config, 00720 nfs_session_id_parameter_t * pparam); 00721 #endif /* _USE_NFS4_1 */ 00722 00723 int nfs_export_create_root_entry(exportlist_t * pexportlist); 00724 00725 /* Add a list of clients to the client array of either an exports entry or 00726 * another service that has a client array (like snmp or statistics exporter) */ 00727 int nfs_AddClientsToClientArray(exportlist_client_t *clients, int new_clients_number, 00728 char **new_clients_name, int option); 00729 00730 int parseAccessParam(char *var_name, char *var_value, 00731 exportlist_t *p_entry, int access_option); 00732 00733 /* Checks an access list for a specific client */ 00734 int export_client_match(sockaddr_t *hostaddr, 00735 char *ipstring, 00736 exportlist_client_t *clients, 00737 exportlist_client_entry_t * pclient_found, 00738 unsigned int export_option); 00739 int export_client_matchv6(struct in6_addr *paddrv6, 00740 exportlist_client_t *clients, 00741 exportlist_client_entry_t * pclient_found, 00742 unsigned int export_option); 00743 00744 /* Config reparsing routines */ 00745 void admin_replace_exports(); 00746 int CleanUpExportContext(fsal_export_context_t * p_export_context); 00747 exportlist_t *RemoveExportEntry(exportlist_t * exportEntry); 00748 exportlist_t *GetExportEntry(char *exportPath); 00749 00750 /* Tools */ 00751 unsigned int get_rpc_xid(struct svc_req *reqp); 00752 void Print_param_worker_in_log(nfs_worker_parameter_t * pparam); 00753 void Print_param_in_log(); 00754 00755 void nfs_reset_stats(void); 00756 00757 int display_req_key(hash_buffer_t * pbuff, char *str); 00758 int display_req_val(hash_buffer_t * pbuff, char *str); 00759 int compare_req(hash_buffer_t * buff1, hash_buffer_t * buff2); 00760 00761 int print_entry_dupreq(LRU_data_t data, char *str); 00762 int clean_entry_dupreq(LRU_entry_t * pentry, void *addparam); 00763 00764 int print_pending_request(LRU_data_t data, char *str); 00765 00766 void auth_stat2str(enum auth_stat, char *str); 00767 00768 uint64_t idmapper_rbt_hash_func(hash_parameter_t * p_hparam, 00769 hash_buffer_t * buffclef); 00770 uint64_t namemapper_rbt_hash_func(hash_parameter_t * p_hparam, 00771 hash_buffer_t * buffclef); 00772 00773 uint32_t namemapper_value_hash_func(hash_parameter_t * p_hparam, 00774 hash_buffer_t * buffclef); 00775 uint32_t idmapper_value_hash_func(hash_parameter_t * p_hparam, 00776 hash_buffer_t * buffclef); 00777 00778 int idmap_populate(char *path, idmap_type_t maptype); 00779 00780 int idmap_gid_init(nfs_idmap_cache_parameter_t param); 00781 int idmap_gname_init(nfs_idmap_cache_parameter_t param); 00782 00783 int idmap_uid_init(nfs_idmap_cache_parameter_t param); 00784 int idmap_uname_init(nfs_idmap_cache_parameter_t param); 00785 int uidgidmap_init(nfs_idmap_cache_parameter_t param); 00786 00787 int display_idmapper_val(hash_buffer_t * pbuff, char *str); 00788 int display_idmapper_key(hash_buffer_t * pbuff, char *str); 00789 00790 int compare_idmapper(hash_buffer_t * buff1, hash_buffer_t * buff2); 00791 int compare_namemapper(hash_buffer_t * buff1, hash_buffer_t * buff2); 00792 int compare_state_id(hash_buffer_t * buff1, hash_buffer_t * buff2); 00793 00794 int idmap_compute_hash_value(char *name, uint32_t * phashval); 00795 int idmap_add(hash_table_t * ht, char *key, unsigned int val); 00796 int uidmap_add(char *key, unsigned int val); 00797 int gidmap_add(char *key, unsigned int val); 00798 00799 int namemap_add(hash_table_t * ht, unsigned int key, char *val); 00800 int unamemap_add(unsigned int key, char *val); 00801 int gnamemap_add(unsigned int key, char *val); 00802 int uidgidmap_add(unsigned int key, unsigned int value); 00803 00804 int idmap_get(hash_table_t * ht, char *key, unsigned long *pval); 00805 int uidmap_get(char *key, unsigned long *pval); 00806 int gidmap_get(char *key, unsigned long *pval); 00807 00808 int namemap_get(hash_table_t * ht, unsigned int key, char *pval); 00809 int unamemap_get(unsigned int key, char *val); 00810 int gnamemap_get(unsigned int key, char *val); 00811 int uidgidmap_get(unsigned int key, unsigned int *pval); 00812 00813 int idmap_remove(hash_table_t * ht, char *key); 00814 int uidmap_remove(char *key); 00815 int gidmap_remove(char *key); 00816 00817 int namemap_remove(hash_table_t * ht, unsigned int key); 00818 int unamemap_remove(unsigned int key); 00819 int gnamemap_remove(unsigned int key); 00820 int uidgidmap_remove(unsigned int key); 00821 00822 int uidgidmap_clear(); 00823 int idmap_clear(); 00824 int namemap_clear(); 00825 00826 void idmap_get_stats(idmap_type_t maptype, hash_stat_t * phstat, 00827 hash_stat_t * phstat_reverse); 00828 00829 int fridgethr_get( pthread_t * pthrid, void *(*thrfunc)(void*), void * thrarg ) ; 00830 void * fridgethr_freeze( ) ; 00831 int fridgethr_init() ; 00832 00833 #define WORKER_INDEX_ANY INT_MAX 00834 unsigned int nfs_core_select_worker_queue(unsigned int avoid_index) ; 00835 00836 int nfs_Init_ip_name(nfs_ip_name_parameter_t param); 00837 hash_table_t *nfs_Init_ip_stats(nfs_ip_stats_parameter_t param); 00838 int nfs_Init_dupreq(nfs_rpc_dupreq_parameter_t param); 00839 00840 extern const nfs_function_desc_t *INVALID_FUNCDESC; 00841 const nfs_function_desc_t *nfs_rpc_get_funcdesc(nfs_request_data_t * preqnfs); 00842 int nfs_rpc_get_args(nfs_request_data_t * preqnfs, const nfs_function_desc_t *pfuncdesc); 00843 00844 #ifdef _USE_FSAL_UP 00845 void *fsal_up_process_thread( void * UnUsedArg ); 00846 void create_fsal_up_threads(); 00847 void nfs_Init_FSAL_UP(); 00848 #endif /* _USE_FSAL_UP */ 00849 00850 void stats_collect (ganesha_stats_t *ganesha_stats); 00851 void nfs_rpc_destroy_chan(rpc_call_channel_t *chan); 00852 int32_t nfs_rpc_dispatch_call(rpc_call_t *call, uint32_t flags); 00853 #endif /* _NFS_CORE_H */