nfs-ganesha 1.4

nfs_core.h

Go to the documentation of this file.
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 */