nfs-ganesha 1.4

fsal_init.c

Go to the documentation of this file.
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(&param);
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 }