nfs-ganesha 1.4
|
00001 /* 00002 * vim:expandtab:shiftwidth=8:tabstop=8: 00003 */ 00004 00014 #ifdef HAVE_CONFIG_H 00015 #include "config.h" 00016 #endif 00017 00018 #ifdef _SOLARIS 00019 #include "solaris_port.h" 00020 #endif /* _SOLARIS */ 00021 00022 #include <string.h> 00023 #include <signal.h> 00024 00025 #include "fsal.h" 00026 #include "fsal_internal.h" 00027 #include "fsal_common.h" 00028 00029 #ifdef _USE_GSSRPC 00030 #include <gssrpc/rpc.h> 00031 #else 00032 #include <rpc/rpc.h> 00033 #endif 00034 00035 #ifdef _HANDLE_MAPPING 00036 #include "handle_mapping/handle_mapping.h" 00037 #endif 00038 00039 void *FSAL_proxy_clientid_renewer_thread(void *); 00040 00041 pthread_t thrid_clientid_renewer; 00042 00043 /* A variable to be seen (for read) in other files */ 00044 proxyfs_specific_initinfo_t global_fsal_proxy_specific_info; 00045 00047 static int FS_Specific_Init(proxyfs_specific_initinfo_t * fs_init_info) 00048 { 00049 sigset_t sigset_in; 00050 sigset_t sigset_out; 00051 pthread_attr_t attr_thr; 00052 int rc; 00053 00054 memcpy(&global_fsal_proxy_specific_info, fs_init_info, 00055 sizeof(proxyfs_specific_initinfo_t)); 00056 00057 /* No SIG_PIPE. This is mandatory for reconnection logic. If sigpipe is not blocked, 00058 * then when a server crashes the next clnt_call will cause un unhandled sigpipe that 00059 * will crash the server */ 00060 sigemptyset(&sigset_in); 00061 sigaddset(&sigset_in, SIGPIPE); 00062 00063 if(sigprocmask(SIG_BLOCK, &sigset_in, &sigset_out) == -1) 00064 return -1; 00065 00066 #ifdef _HANDLE_MAPPING 00067 00068 /* Initialize NFSv2/3 handle mapping management */ 00069 00070 if(fs_init_info->enable_handle_mapping) 00071 { 00072 int rc; 00073 handle_map_param_t param; 00074 00075 strcpy(param.databases_directory, fs_init_info->hdlmap_dbdir); 00076 strcpy(param.temp_directory, fs_init_info->hdlmap_tmpdir); 00077 param.database_count = fs_init_info->hdlmap_dbcount; 00078 param.hashtable_size = fs_init_info->hdlmap_hashsize; 00079 param.nb_handles_prealloc = fs_init_info->hdlmap_nb_entry_prealloc; 00080 param.nb_db_op_prealloc = fs_init_info->hdlmap_nb_db_op_prealloc; 00081 param.synchronous_insert = FALSE; 00082 00083 rc = HandleMap_Init(¶m); 00084 00085 if(rc) 00086 return rc; 00087 } 00088 #endif 00089 /* Init the thread in charge of renewing the client id */ 00090 /* Init for thread parameter (mostly for scheduling) */ 00091 pthread_attr_init(&attr_thr); 00092 00093 pthread_attr_setscope(&attr_thr, PTHREAD_SCOPE_SYSTEM); 00094 pthread_attr_setdetachstate(&attr_thr, PTHREAD_CREATE_JOINABLE); 00095 00096 if((rc = pthread_create(&thrid_clientid_renewer, 00097 &attr_thr, 00098 FSAL_proxy_clientid_renewer_thread, (void *)NULL) != 0)) 00099 { 00100 LogError(COMPONENT_FSAL, ERR_SYS, ERR_PTHREAD_CREATE, rc); 00101 exit(1); 00102 } 00103 00104 return 0; 00105 } 00106 00128 fsal_status_t PROXYFSAL_Init(fsal_parameter_t * init_info /* IN */ 00129 ) 00130 { 00131 00132 fsal_status_t status; 00133 int rc; 00134 00135 /* sanity check. */ 00136 00137 if(!init_info) 00138 Return(ERR_FSAL_FAULT, 0, INDEX_FSAL_Init); 00139 00140 /* >> You can check args bellow << */ 00141 00142 /* proceeds FSAL internal status initialization */ 00143 00144 status = fsal_internal_init_global(&(init_info->fsal_info), 00145 &(init_info->fs_common_info)); 00146 00147 if(FSAL_IS_ERROR(status)) 00148 Return(status.major, status.minor, INDEX_FSAL_Init); 00149 00150 /* >> You can also initialize some filesystem stuff << */ 00151 00152 if((rc = FS_Specific_Init((proxyfs_specific_initinfo_t *) &init_info->fs_specific_info))) 00153 Return(ERR_FSAL_BAD_INIT, -rc, INDEX_FSAL_Init); 00154 00155 /* Everything went OK. */ 00156 00157 Return(ERR_FSAL_NO_ERROR, 0, INDEX_FSAL_Init); 00158 00159 } 00160 00161 /* To be called before exiting */ 00162 fsal_status_t PROXYFSAL_terminate() 00163 { 00164 #ifdef _HANDLE_MAPPING 00165 int rc; 00166 00167 if(global_fsal_proxy_specific_info.enable_handle_mapping) 00168 { 00169 rc = HandleMap_Flush(); 00170 00171 if(rc) 00172 ReturnCode(ERR_FSAL_SERVERFAULT, rc); 00173 } 00174 #endif 00175 00176 ReturnCode(ERR_FSAL_NO_ERROR, 0); 00177 }