nfs-ganesha 1.4

fsal_proxy_internal.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 #define FSAL_INTERNAL_C
00018 
00019 #ifdef _SOLARIS
00020 #include "solaris_port.h"
00021 #endif                          /* _SOLARIS */
00022 
00023 #ifdef _USE_GSSRPC
00024 #include <gssrpc/rpc.h>
00025 #include <gssrpc/clnt.h>
00026 #include <gssrpc/xdr.h>
00027 #include <gssrpc/auth.h>
00028 #else
00029 #include <rpc/rpc.h>
00030 #include <rpc/clnt.h>
00031 #include <rpc/xdr.h>
00032 #include <rpc/auth.h>
00033 #include <arpa/inet.h>
00034 #endif
00035 #include "nfs4.h"
00036 
00037 #include "nfs_proto_functions.h"
00038 #include "fsal_nfsv4_macros.h"
00039 
00040 #include "fsal_internal.h"
00041 #include "fsal_convert.h"
00042 #include "fsal_common.h"
00043 #include "SemN.h"
00044 
00045 #include <pthread.h>
00046 #include <string.h>
00047 #include "abstract_mem.h"
00048 
00049 extern time_t ServerBootTime;
00050 extern fsal_staticfsinfo_t global_fs_info;
00051 extern proxyfs_specific_initinfo_t global_fsal_proxy_specific_info;
00052 
00053 void fsal_interval_proxy_fsalattr2bitmap4(fsal_attrib_list_t * pfsalattr,
00054                                           bitmap4 * pbitmap)
00055 {
00056   uint32_t tmpattrlist[100];
00057   uint32_t attrlen = 0;
00058 
00059   if(FSAL_TEST_MASK(pfsalattr->asked_attributes, FSAL_ATTR_SIZE))
00060     tmpattrlist[attrlen++] = FATTR4_SIZE;
00061   if(FSAL_TEST_MASK(pfsalattr->asked_attributes, FSAL_ATTR_MODE))
00062     tmpattrlist[attrlen++] = FATTR4_MODE;
00063   if(FSAL_TEST_MASK(pfsalattr->asked_attributes, FSAL_ATTR_OWNER))
00064     tmpattrlist[attrlen++] = FATTR4_OWNER;
00065   if(FSAL_TEST_MASK(pfsalattr->asked_attributes, FSAL_ATTR_GROUP))
00066     tmpattrlist[attrlen++] = FATTR4_OWNER_GROUP;
00067   if(FSAL_TEST_MASK(pfsalattr->asked_attributes, FSAL_ATTR_ATIME))
00068     tmpattrlist[attrlen++] = FATTR4_TIME_ACCESS_SET;
00069   if(FSAL_TEST_MASK(pfsalattr->asked_attributes, FSAL_ATTR_MTIME))
00070     tmpattrlist[attrlen++] = FATTR4_TIME_MODIFY_SET;
00071   if(FSAL_TEST_MASK(pfsalattr->asked_attributes, FSAL_ATTR_CTIME))
00072     tmpattrlist[attrlen++] = FATTR4_TIME_METADATA;
00073  
00074   nfs4_list_to_bitmap4(pbitmap, attrlen, tmpattrlist);
00075 }                               /* fsal_interval_proxy_fsalattr2bitmap4 */
00076 
00087 void fsal_internal_proxy_create_fattr_bitmap(bitmap4 * pbitmap)
00088 {
00089   uint32_t tmpattrlist[20];
00090   uint32_t attrlen = 0;
00091 
00092   pbitmap->bitmap4_len = 2;
00093 
00094   memset(pbitmap->bitmap4_val, 0, sizeof(uint32_t) * pbitmap->bitmap4_len);
00095 
00096   tmpattrlist[0] = FATTR4_TYPE;
00097   tmpattrlist[1] = FATTR4_CHANGE;
00098   tmpattrlist[2] = FATTR4_SIZE;
00099   tmpattrlist[3] = FATTR4_FSID;
00100   tmpattrlist[4] = FATTR4_FILEID;
00101   tmpattrlist[5] = FATTR4_MODE;
00102   tmpattrlist[6] = FATTR4_NUMLINKS;
00103   tmpattrlist[7] = FATTR4_OWNER;
00104   tmpattrlist[8] = FATTR4_OWNER_GROUP;
00105   tmpattrlist[9] = FATTR4_SPACE_USED;
00106   tmpattrlist[10] = FATTR4_TIME_ACCESS;
00107   tmpattrlist[11] = FATTR4_TIME_METADATA;
00108   tmpattrlist[12] = FATTR4_TIME_MODIFY;
00109   tmpattrlist[13] = FATTR4_RAWDEV;
00110 
00111   attrlen = 14;
00112 
00113   nfs4_list_to_bitmap4(pbitmap, attrlen, tmpattrlist);
00114 
00115 }                               /* fsal_internal_proxy_create_fattr_bitmap */
00116 
00117 void fsal_internal_proxy_create_fattr_readdir_bitmap(bitmap4 * pbitmap)
00118 {
00119   uint32_t tmpattrlist[20];
00120   uint32_t attrlen = 0;
00121 
00122   pbitmap->bitmap4_len = 2;
00123   memset(pbitmap->bitmap4_val, 0, sizeof(uint32_t) * pbitmap->bitmap4_len);
00124 
00125   tmpattrlist[0] = FATTR4_TYPE;
00126   tmpattrlist[1] = FATTR4_CHANGE;
00127   tmpattrlist[2] = FATTR4_SIZE;
00128   tmpattrlist[3] = FATTR4_FSID;
00129   tmpattrlist[4] = FATTR4_FILEHANDLE;
00130   tmpattrlist[5] = FATTR4_FILEID;
00131   tmpattrlist[6] = FATTR4_MODE;
00132   tmpattrlist[7] = FATTR4_NUMLINKS;
00133   tmpattrlist[8] = FATTR4_OWNER;
00134   tmpattrlist[9] = FATTR4_OWNER_GROUP;
00135   tmpattrlist[10] = FATTR4_SPACE_USED;
00136   tmpattrlist[11] = FATTR4_TIME_ACCESS;
00137   tmpattrlist[12] = FATTR4_TIME_METADATA;
00138   tmpattrlist[13] = FATTR4_TIME_MODIFY;
00139   tmpattrlist[14] = FATTR4_RAWDEV;
00140 
00141   attrlen = 15;
00142 
00143   nfs4_list_to_bitmap4(pbitmap, attrlen, tmpattrlist);
00144 
00145 }                               /* fsal_internal_proxy_create_fattr_readdir_bitmap */
00146 
00147 void fsal_internal_proxy_create_fattr_fsinfo_bitmap(bitmap4 * pbitmap)
00148 {
00149   uint32_t tmpattrlist[10];
00150   uint32_t attrlen = 0;
00151 
00152   pbitmap->bitmap4_len = 2;
00153   memset(pbitmap->bitmap4_val, 0, sizeof(uint32_t) * pbitmap->bitmap4_len);
00154 
00155   tmpattrlist[0] = FATTR4_FILES_AVAIL;
00156   tmpattrlist[1] = FATTR4_FILES_FREE;
00157   tmpattrlist[2] = FATTR4_FILES_TOTAL;
00158   tmpattrlist[3] = FATTR4_SPACE_AVAIL;
00159   tmpattrlist[4] = FATTR4_SPACE_FREE;
00160   tmpattrlist[5] = FATTR4_SPACE_TOTAL;
00161 
00162   attrlen = 6;
00163 
00164   nfs4_list_to_bitmap4(pbitmap, attrlen, tmpattrlist);
00165 
00166 }                               /* fsal_internal_proxy_create_fattr_fsinfo_bitmap */
00167 
00168 void fsal_internal_proxy_setup_readdir_fattr(fsal_proxy_internal_fattr_readdir_t * pfattr)
00169 {
00170   /* Just do the correct connection */
00171   pfattr->owner.utf8string_val = pfattr->padowner;
00172   pfattr->owner_group.utf8string_val = pfattr->padgroup;
00173   pfattr->filehandle.nfs_fh4_val = pfattr->padfh;
00174 }
00175 
00176 void fsal_internal_proxy_setup_fattr(fsal_proxy_internal_fattr_t * pfattr)
00177 {
00178   /* Just do the correct connection */
00179   pfattr->owner.utf8string_val = pfattr->padowner;
00180   pfattr->owner_group.utf8string_val = pfattr->padgroup;
00181 }
00182 
00194 fsal_status_t fsal_internal_proxy_error_convert(nfsstat4 nfsstatus, int indexfunc)
00195 {
00196   switch (nfsstatus)
00197     {
00198     case NFS4_OK:
00199       Return(ERR_FSAL_NO_ERROR, (int)nfsstatus, indexfunc);
00200       break;
00201 
00202     case NFS4ERR_PERM:
00203       Return(ERR_FSAL_PERM, (int)nfsstatus, indexfunc);
00204       break;
00205 
00206     case NFS4ERR_NOENT:
00207       Return(ERR_FSAL_NOENT, (int)nfsstatus, indexfunc);
00208       break;
00209 
00210     case NFS4ERR_IO:
00211       Return(ERR_FSAL_IO, (int)nfsstatus, indexfunc);
00212       break;
00213 
00214     case NFS4ERR_NXIO:
00215       Return(ERR_FSAL_NXIO, (int)nfsstatus, indexfunc);
00216       break;
00217 
00218     case NFS4ERR_ACCESS:
00219     case NFS4ERR_DENIED:
00220       Return(ERR_FSAL_ACCESS, (int)nfsstatus, indexfunc);
00221       break;
00222 
00223     case NFS4ERR_EXIST:
00224       Return(ERR_FSAL_EXIST, (int)nfsstatus, indexfunc);
00225       break;
00226 
00227     case NFS4ERR_XDEV:
00228       Return(ERR_FSAL_XDEV, (int)nfsstatus, indexfunc);
00229       break;
00230 
00231     case NFS4ERR_NOTDIR:
00232       Return(ERR_FSAL_NOTDIR, (int)nfsstatus, indexfunc);
00233       break;
00234 
00235     case NFS4ERR_ISDIR:
00236       Return(ERR_FSAL_ISDIR, (int)nfsstatus, indexfunc);
00237       break;
00238 
00239     case NFS4ERR_INVAL:
00240       Return(ERR_FSAL_INVAL, (int)nfsstatus, indexfunc);
00241       break;
00242 
00243     case NFS4ERR_FBIG:
00244       Return(ERR_FSAL_FBIG, 0, indexfunc);
00245       break;
00246 
00247     case NFS4ERR_NOSPC:
00248       Return(ERR_FSAL_NOSPC, (int)nfsstatus, indexfunc);
00249       break;
00250 
00251     case NFS4ERR_ROFS:
00252       Return(ERR_FSAL_ROFS, (int)nfsstatus, indexfunc);
00253       break;
00254 
00255     case NFS4ERR_MLINK:
00256       Return(ERR_FSAL_MLINK, (int)nfsstatus, indexfunc);
00257       break;
00258 
00259     case NFS4ERR_NAMETOOLONG:
00260       Return(ERR_FSAL_NAMETOOLONG, (int)nfsstatus, indexfunc);
00261       break;
00262 
00263     case NFS4ERR_NOTEMPTY:
00264       Return(ERR_FSAL_NOTEMPTY, (int)nfsstatus, indexfunc);
00265       break;
00266 
00267     case NFS4ERR_DQUOT:
00268       Return(ERR_FSAL_DQUOT, (int)nfsstatus, indexfunc);
00269       break;
00270 
00271     case NFS4ERR_STALE:
00272       Return(ERR_FSAL_STALE, (int)nfsstatus, indexfunc);
00273       break;
00274 
00275     case NFS4ERR_BADHANDLE:
00276       Return(ERR_FSAL_BADHANDLE, (int)nfsstatus, indexfunc);
00277       break;
00278 
00279     case NFS4ERR_BAD_COOKIE:
00280       Return(ERR_FSAL_BADCOOKIE, (int)nfsstatus, indexfunc);
00281       break;
00282 
00283     case NFS4ERR_NOTSUPP:
00284       Return(ERR_FSAL_NOTSUPP, (int)nfsstatus, indexfunc);
00285       break;
00286 
00287     case NFS4ERR_TOOSMALL:
00288       Return(ERR_FSAL_TOOSMALL, (int)nfsstatus, indexfunc);
00289       break;
00290 
00291     case NFS4ERR_SERVERFAULT:
00292       Return(ERR_FSAL_SERVERFAULT, (int)nfsstatus, indexfunc);
00293       break;
00294 
00295     case NFS4ERR_BADTYPE:
00296       Return(ERR_FSAL_BADTYPE, (int)nfsstatus, indexfunc);
00297       break;
00298 
00299     case NFS4ERR_DELAY:
00300       Return(ERR_FSAL_DELAY, (int)nfsstatus, indexfunc);
00301       break;
00302 
00303     case NFS4ERR_SAME:
00304     case NFS4ERR_NOT_SAME:
00305       Return(ERR_FSAL_NO_ERROR, (int)nfsstatus, indexfunc);     /* no "actual" errors */
00306       break;
00307 
00308     case NFS4ERR_GRACE:
00309       Return(ERR_FSAL_DELAY, (int)nfsstatus, indexfunc);
00310       break;
00311 
00312     case NFS4ERR_EXPIRED:
00313     case NFS4ERR_LOCKED:
00314     case NFS4ERR_SHARE_DENIED:
00315     case NFS4ERR_LOCK_RANGE:
00316     case NFS4ERR_OPENMODE:
00317     case NFS4ERR_FILE_OPEN:
00318       Return(ERR_FSAL_ACCESS, (int)nfsstatus, indexfunc);
00319       break;
00320 
00321     case NFS4ERR_FHEXPIRED:
00322       Return(ERR_FSAL_FHEXPIRED, (int)nfsstatus, indexfunc);
00323       break;
00324 
00325     case NFS4ERR_WRONGSEC:
00326       Return(ERR_FSAL_SEC, (int)nfsstatus, indexfunc);
00327       break;
00328 
00329     case NFS4ERR_CLID_INUSE:
00330     case NFS4ERR_MOVED:
00331     case NFS4ERR_RESOURCE:
00332     case NFS4ERR_MINOR_VERS_MISMATCH:
00333     case NFS4ERR_STALE_CLIENTID:
00334     case NFS4ERR_STALE_STATEID:
00335     case NFS4ERR_OLD_STATEID:
00336     case NFS4ERR_BAD_STATEID:
00337     case NFS4ERR_BAD_SEQID:
00338     case NFS4ERR_RESTOREFH:
00339     case NFS4ERR_LEASE_MOVED:
00340     case NFS4ERR_NO_GRACE:
00341     case NFS4ERR_RECLAIM_BAD:
00342     case NFS4ERR_RECLAIM_CONFLICT:
00343     case NFS4ERR_BADXDR:
00344     case NFS4ERR_BADCHAR:
00345     case NFS4ERR_BADNAME:
00346     case NFS4ERR_BAD_RANGE:
00347     case NFS4ERR_BADOWNER:
00348     case NFS4ERR_OP_ILLEGAL:
00349     case NFS4ERR_LOCKS_HELD:
00350     case NFS4ERR_LOCK_NOTSUPP:
00351     case NFS4ERR_DEADLOCK:
00352     case NFS4ERR_ADMIN_REVOKED:
00353     case NFS4ERR_CB_PATH_DOWN:
00354       Return(ERR_FSAL_INVAL, (int)nfsstatus, indexfunc);        /* For wanting of something wiser */
00355       break;
00356 
00357     case NFS4ERR_NOFILEHANDLE:
00358       Return(ERR_FSAL_BADHANDLE, (int)nfsstatus, indexfunc);
00359       break;
00360 
00361     case NFS4ERR_SYMLINK:
00362       Return(ERR_FSAL_SYMLINK, (int)nfsstatus, indexfunc);
00363       break;
00364 
00365     case NFS4ERR_ATTRNOTSUPP:
00366       Return(ERR_FSAL_ATTRNOTSUPP, (int)nfsstatus, indexfunc);
00367       break;
00368 
00369     default:                   /* Should never occur, all cases are stated above */
00370       Return(ERR_FSAL_INVAL, (int)nfsstatus, indexfunc);
00371       break;
00372 
00373     }                           /* switch( nfsstatus ) */
00374 
00375 }                               /* fsal_internal_proxy_error_convert */
00376 
00389 int fsal_internal_proxy_create_fh(nfs_fh4 * pnfs4_handle,
00390                                   fsal_nodetype_t type,
00391                                   fsal_u64_t fileid, fsal_handle_t * fsal_handle)
00392 {
00393   proxyfsal_handle_t * pfsal_handle = (proxyfsal_handle_t *) fsal_handle;
00394 
00395   if(pnfs4_handle == NULL || pfsal_handle == NULL)
00396     return FALSE;
00397 
00398   if(isFullDebug(COMPONENT_FSAL))
00399     {
00400       char outstr[1024];
00401       nfs4_sprint_fhandle(pnfs4_handle, outstr);
00402       LogFullDebug(COMPONENT_FSAL, "fsal_internal_proxy_create_fh: input nfsv4 server handle=%s", outstr);
00403     }
00404  
00405   memset( (char *)pfsal_handle, 0, sizeof( proxyfsal_handle_t ) ) ;
00406 
00407   pfsal_handle->data.object_type_reminder = type;
00408   pfsal_handle->data.fileid4 = fileid;
00409   pfsal_handle->data.srv_handle_len = pnfs4_handle->nfs_fh4_len;
00410   memset(pfsal_handle->data.srv_handle_val, 0, FSAL_PROXY_FILEHANDLE_MAX_LEN);
00411   memcpy(pfsal_handle->data.srv_handle_val, pnfs4_handle->nfs_fh4_val,
00412          pnfs4_handle->nfs_fh4_len);
00413 
00414   if(isFullDebug(COMPONENT_FSAL))
00415     {
00416       char outstr[1024];
00417       if(type == FSAL_TYPE_FILE)
00418         {
00419           nfs_fh4 tmpfh;
00420 
00421           tmpfh.nfs_fh4_len = pfsal_handle->data.srv_handle_len;
00422           tmpfh.nfs_fh4_val = pfsal_handle->data.srv_handle_val;
00423           nfs4_sprint_fhandle(&tmpfh, outstr);
00424           LogFullDebug(COMPONENT_FSAL,
00425                        "fsal_internal_proxy_create_fh: output nfsv4 server handle= %s fileid=%llu",
00426                        outstr, fileid);
00427         }
00428 
00429       if(memcmp
00430          (pfsal_handle->data.srv_handle_val, pnfs4_handle->nfs_fh4_val, pnfs4_handle->nfs_fh4_len))
00431         LogFullDebug(COMPONENT_FSAL,
00432                      "CRITICAL ERROR: ==========> Filehandle mismatch n ifsal_internal_proxy_create");
00433     }
00434 
00435   return TRUE;
00436 }                               /* fsal_internal_proxy_create_fh */
00437 
00449 int fsal_internal_proxy_extract_fh(nfs_fh4 * pnfs4_handle,
00450                                    fsal_handle_t * fsal_handle)
00451 {
00452   proxyfsal_handle_t * pfsal_handle = (proxyfsal_handle_t *) fsal_handle;
00453 
00454   if(pnfs4_handle == NULL || pfsal_handle == NULL)
00455     return FALSE;
00456 
00457   pnfs4_handle->nfs_fh4_len = pfsal_handle->data.srv_handle_len;
00458   pnfs4_handle->nfs_fh4_val = pfsal_handle->data.srv_handle_val;
00459 
00460   if(isFullDebug(COMPONENT_FSAL))
00461     {
00462       char outstr[1024];
00463       nfs4_sprint_fhandle(pnfs4_handle, outstr);
00464       LogFullDebug(COMPONENT_FSAL, "fsal_internal_proxy_extract_fh: input nfsv4 server handle=%s\n", outstr);
00465     }
00466 
00467   return TRUE;
00468 }                               /* fsal_internal_proxy_extract_fh */
00469 
00482 int fsal_internal_proxy_fsal_name_2_utf8(fsal_name_t * pname, utf8string * utf8str)
00483 {
00484   char tmpstr[FSAL_MAX_NAME_LEN];
00485   fsal_status_t fsal_status;
00486 
00487   if(pname == NULL || utf8str == NULL)
00488     return FALSE;
00489 
00490   fsal_status = FSAL_name2str(pname, tmpstr, FSAL_MAX_NAME_LEN);
00491   if(fsal_status.major != ERR_FSAL_NO_ERROR)
00492     return FALSE;
00493 
00494   if(utf8str->utf8string_len == 0)
00495     {
00496       if((utf8str->utf8string_val = gsh_malloc(pname->len)) == NULL)
00497         return FALSE;
00498       else
00499         utf8str->utf8string_len = pname->len;
00500     }
00501 
00502   if(str2utf8(tmpstr, utf8str) == -1)
00503     return FALSE;
00504   return TRUE;
00505 }                               /* fsal_internal_proxy_fsal_name_2_utf8 */
00506 
00519 int fsal_internal_proxy_fsal_path_2_utf8(fsal_path_t * ppath, utf8string * utf8str)
00520 {
00521   char tmpstr[FSAL_MAX_PATH_LEN];
00522   fsal_status_t fsal_status;
00523 
00524   if(ppath == NULL || utf8str == NULL)
00525     return FALSE;
00526 
00527   fsal_status = FSAL_path2str(ppath, tmpstr, FSAL_MAX_NAME_LEN);
00528   if(fsal_status.major != ERR_FSAL_NO_ERROR)
00529     return FALSE;
00530 
00531   if(utf8str->utf8string_len == 0)
00532     {
00533       if((utf8str->utf8string_val = gsh_malloc(ppath->len)) == NULL)
00534         return FALSE;
00535       else
00536         utf8str->utf8string_len = ppath->len;
00537     }
00538 
00539   if(str2utf8(tmpstr, utf8str) == -1)
00540     return FALSE;
00541 
00542   return TRUE;
00543 }                               /* fsal_internal_proxy_fsal_path_2_utf8 */
00544 
00557 int fsal_internal_proxy_fsal_utf8_2_path(fsal_path_t * ppath, utf8string * utf8str)
00558 {
00559   char tmpstr[FSAL_MAX_PATH_LEN];
00560   fsal_status_t fsal_status;
00561 
00562   if(ppath == NULL || utf8str == NULL)
00563     return FALSE;
00564 
00565   if(utf82str(tmpstr, sizeof(tmpstr), utf8str) == -1)
00566     return FALSE;
00567 
00568   fsal_status = FSAL_str2path(tmpstr, FSAL_MAX_PATH_LEN, ppath);
00569   if(fsal_status.major != ERR_FSAL_NO_ERROR)
00570     return FALSE;
00571 
00572   return TRUE;
00573 }                               /* fsal_internal_proxy_fsal_utf8_2_path */
00574 
00587 int fsal_internal_proxy_fsal_utf8_2_name(fsal_name_t * pname, utf8string * utf8str)
00588 {
00589   char tmpstr[FSAL_MAX_NAME_LEN];
00590   fsal_status_t fsal_status;
00591 
00592   if(pname == NULL || utf8str == NULL)
00593     return FALSE;
00594 
00595   if(utf82str(tmpstr, sizeof(tmpstr), utf8str) == -1)
00596     return FALSE;
00597 
00598   fsal_status = FSAL_str2name(tmpstr, FSAL_MAX_NAME_LEN, pname);
00599   if(fsal_status.major != ERR_FSAL_NO_ERROR)
00600     return FALSE;
00601 
00602   return TRUE;
00603 }                               /* fsal_internal_proxy_fsal_utf8_2_name */
00604 
00617 int proxy_Fattr_To_FSAL_dynamic_fsinfo(fsal_dynamicfsinfo_t * pdynamicinfo,
00618                                        fattr4 * Fattr)
00619 {
00620   u_int LastOffset = 0;
00621   unsigned int i = 0;
00622   char __attribute__ ((__unused__)) funcname[] = "proxy_Fattr_To_FSAL_dynamic_fsinfo";
00623   uint32_t attrmasklist[FATTR4_MOUNTED_ON_FILEID];      /* List cannot be longer than FATTR4_MOUNTED_ON_FILEID */
00624   uint32_t attrmasklen = 0;
00625   uint32_t attribute_to_set = 0;
00626   uint64_t tmp_uint64 = 0LL;
00627 
00628   if(pdynamicinfo == NULL || Fattr == NULL)
00629     return -1;
00630 
00631   /* Check attributes data */
00632   if(Fattr->attr_vals.attrlist4_val == NULL)
00633     return -1;
00634 
00635   /* Convert the attribute bitmap to an attribute list */
00636   nfs4_bitmap4_to_list(&(Fattr->attrmask), &attrmasklen, attrmasklist);
00637 
00638   LogFullDebug(COMPONENT_NFS_V4, "   nfs4_bitmap4_to_list ====> attrmasklen = %d\n", attrmasklen);
00639 
00640   /* Init */
00641   memset((char *)pdynamicinfo, 0, sizeof(fsal_dynamicfsinfo_t));
00642 
00643   for(i = 0; i < attrmasklen; i++)
00644     {
00645       attribute_to_set = attrmasklist[i];
00646 
00647       if(attrmasklist[i] > FATTR4_MOUNTED_ON_FILEID)
00648         {
00649           /* Erroneous value... skip */
00650           continue;
00651         }
00652       LogFullDebug(COMPONENT_NFS_V4, "=================> nfs4_Fattr_To_FSAL_attr: i=%u attr=%u\n", i,
00653              attrmasklist[i]);
00654       LogFullDebug(COMPONENT_NFS_V4, "Flag for Operation = %d|%d is ON,  name  = %s  reply_size = %d\n",
00655              attrmasklist[i], fattr4tab[attribute_to_set].val,
00656              fattr4tab[attribute_to_set].name, fattr4tab[attribute_to_set].size_fattr4);
00657 
00658       switch (attribute_to_set)
00659         {
00660         case FATTR4_FILES_AVAIL:
00661           memcpy((char *)&tmp_uint64,
00662                  (char *)(Fattr->attr_vals.attrlist4_val + LastOffset),
00663                  sizeof(fattr4_files_avail));
00664           pdynamicinfo->avail_files = nfs_ntohl64(tmp_uint64);
00665 
00666           LastOffset += fattr4tab[attribute_to_set].size_fattr4;
00667 
00668           break;
00669 
00670         case FATTR4_FILES_FREE:
00671           memcpy((char *)&tmp_uint64,
00672                  (char *)(Fattr->attr_vals.attrlist4_val + LastOffset),
00673                  sizeof(fattr4_files_free));
00674           pdynamicinfo->free_files = nfs_ntohl64(tmp_uint64);
00675 
00676           LastOffset += fattr4tab[attribute_to_set].size_fattr4;
00677 
00678           break;
00679 
00680         case FATTR4_FILES_TOTAL:
00681           memcpy((char *)&tmp_uint64,
00682                  (char *)(Fattr->attr_vals.attrlist4_val + LastOffset),
00683                  sizeof(fattr4_files_total));
00684           pdynamicinfo->total_files = nfs_ntohl64(tmp_uint64);
00685 
00686           LastOffset += fattr4tab[attribute_to_set].size_fattr4;
00687 
00688           break;
00689 
00690         case FATTR4_SPACE_AVAIL:
00691           memcpy((char *)&tmp_uint64,
00692                  (char *)(Fattr->attr_vals.attrlist4_val + LastOffset),
00693                  sizeof(fattr4_space_avail));
00694           pdynamicinfo->avail_bytes = nfs_ntohl64(tmp_uint64);
00695 
00696           LastOffset += fattr4tab[attribute_to_set].size_fattr4;
00697 
00698           break;
00699 
00700         case FATTR4_SPACE_FREE:
00701           memcpy((char *)&tmp_uint64,
00702                  (char *)(Fattr->attr_vals.attrlist4_val + LastOffset),
00703                  sizeof(fattr4_space_free));
00704           pdynamicinfo->free_bytes = nfs_ntohl64(tmp_uint64);
00705 
00706           LastOffset += fattr4tab[attribute_to_set].size_fattr4;
00707 
00708           break;
00709 
00710         case FATTR4_SPACE_TOTAL:
00711           memcpy((char *)&tmp_uint64,
00712                  (char *)(Fattr->attr_vals.attrlist4_val + LastOffset),
00713                  sizeof(fattr4_space_total));
00714           pdynamicinfo->total_bytes = nfs_ntohl64(tmp_uint64);
00715 
00716           LastOffset += fattr4tab[attribute_to_set].size_fattr4;
00717 
00718           break;
00719 
00720         default:
00721           LogFullDebug(COMPONENT_NFS_V4, "SATTR: Attribut no supporte %d name=%s\n", attribute_to_set,
00722                  fattr4tab[attribute_to_set].name);
00723           LastOffset += fattr4tab[attribute_to_set].size_fattr4;
00724           break;
00725 
00726         }                       /*   switch( attribute_to_set ) */
00727 
00728     }
00729 
00730   return 1;
00731 
00732 }                               /* proxy_Fattr_To_FSAL_dynamic_fsinfo */
00733 
00746 int proxy_Fattr_To_FSAL_attr(fsal_attrib_list_t * pFSAL_attr,
00747                              proxyfsal_handle_t * phandle, fattr4 * Fattr)
00748 {
00749   nfs_fh4 hdl4;
00750 
00751   if (Fattr4_To_FSAL_attr(pFSAL_attr, Fattr, &hdl4) != NFS4_OK)
00752       return -1;
00753 
00754   return fsal_internal_proxy_create_fh(&hdl4, pFSAL_attr->type, pFSAL_attr->fileid,
00755                                       (fsal_handle_t *)phandle);
00756 }                               /* proxy_Fattr_To_FSAL_attr */
00757 
00758 fsal_status_t fsal_internal_set_auth_gss(proxyfsal_op_context_t * p_thr_context)
00759 {
00760 #ifdef _USE_GSSRPC
00761   fsal_status_t fsal_status;
00762   struct rpc_gss_sec rpcsec_gss_data;
00763   gss_OID mechOid;
00764   char mechname[1024];
00765   gss_buffer_desc mechgssbuff;
00766   OM_uint32 maj_stat, min_stat;
00767 
00768   /* Set up mechOid */
00769   strcpy(mechname, "{ 1 2 840 113554 1 2 2 }");
00770 
00771   mechgssbuff.value = mechname;
00772   mechgssbuff.length = strlen(mechgssbuff.value);
00773 
00774   LogFullDebug(COMPONENT_FSAL, "----> %p\n", p_thr_context->rpc_client);
00775   if((maj_stat = gss_str_to_oid(&min_stat, &mechgssbuff, &mechOid)) != GSS_S_COMPLETE)
00776     Return(ERR_FSAL_SEC, maj_stat, INDEX_FSAL_InitClientContext);
00777 
00778   /* Authentification avec RPCSEC_GSS */
00779   rpcsec_gss_data.mech = mechOid;
00780   rpcsec_gss_data.qop = GSS_C_QOP_DEFAULT;
00781   rpcsec_gss_data.svc = global_fsal_proxy_specific_info.sec_type;
00782 
00783   if((p_thr_context->rpc_client->cl_auth =
00784       authgss_create_default(p_thr_context->rpc_client,
00785                              global_fsal_proxy_specific_info.remote_principal,
00786                              &rpcsec_gss_data)) == NULL)
00787     Return(ERR_FSAL_SEC, 0, INDEX_FSAL_InitClientContext);
00788 #endif
00789   Return(ERR_FSAL_NO_ERROR, 0, INDEX_FSAL_InitClientContext);
00790 }                               /* fsal_internal_set_auth_gss */
00791 
00792 
00793 fsal_status_t
00794 fsal_proxy_create_rpc_clnt(proxyfsal_op_context_t * ctx)
00795 {
00796   int sock;
00797   struct sockaddr_in addr_rpc;
00798   struct timeval timeout = TIMEOUTRPC;
00799   int rc;
00800   int priv_port = 0 ; 
00801   fsal_status_t fsal_status;
00802   char addr[INET_ADDRSTRLEN];
00803 
00804   memset(&addr_rpc, 0, sizeof(addr_rpc));
00805   addr_rpc.sin_port = ctx->srv_port;
00806   addr_rpc.sin_family = AF_INET;
00807   addr_rpc.sin_addr.s_addr = ctx->srv_addr;
00808 
00809   if(!strcmp(ctx->srv_proto, "udp"))
00810     {
00811       if((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0)
00812         ReturnCode(ERR_FSAL_FAULT, errno);
00813 
00814       ctx->rpc_client = clntudp_bufcreate(&addr_rpc,
00815                                           ctx->srv_prognum,
00816                                           FSAL_PROXY_NFS_V4,
00817                                           (struct timeval){ 25, 0},
00818                                           &sock,
00819                                           ctx->srv_sendsize,
00820                                           ctx->srv_recvsize);
00821 
00822       if(ctx->rpc_client == NULL)
00823         {
00824 
00825           LogCrit(COMPONENT_FSAL,
00826                   "Cannot contact server addr=%s port=%u prognum=%u using NFSv4 protocol",
00827                   inet_ntop(AF_INET, &ctx->srv_addr, addr, sizeof(addr)),
00828                   ntohs(ctx->srv_port), ctx->srv_prognum);
00829 
00830           ReturnCode(ERR_FSAL_INVAL, 0);
00831         }
00832     }
00833   else if(!strcmp(ctx->srv_proto, "tcp"))
00834     {
00835       if( ctx->use_privileged_client_port  == TRUE )
00836         {
00837           if( (sock = rresvport( &priv_port ) )< 0 )
00838            {
00839              LogCrit(COMPONENT_FSAL, "Cannot create a tcp socket on a privileged port");
00840              ReturnCode(ERR_FSAL_FAULT, 0);
00841            }
00842         }
00843       else
00844         {
00845           if((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
00846             {
00847               LogCrit(COMPONENT_FSAL, "Cannot create a tcp socket - %d", errno);
00848               ReturnCode(ERR_FSAL_FAULT, 0);
00849             }
00850         }
00851 
00852       if(connect(sock, (struct sockaddr *)&addr_rpc, sizeof(addr_rpc)) < 0)
00853         {
00854           LogCrit(COMPONENT_FSAL,
00855                   "Cannot connect to server addr=%s port=%u",
00856                   inet_ntop(AF_INET, &ctx->srv_addr, addr, sizeof(addr)),
00857                   ntohs(ctx->srv_port));
00858 
00859           ReturnCode(ERR_FSAL_FAULT, 0);
00860         }
00861 
00862       ctx->rpc_client = clnttcp_create(&addr_rpc,
00863                                        ctx->srv_prognum,
00864                                        FSAL_PROXY_NFS_V4,
00865                                        &sock,
00866                                        ctx->srv_sendsize,
00867                                        ctx->srv_recvsize);
00868       if(ctx->rpc_client == NULL)
00869         {
00870           LogCrit(COMPONENT_FSAL,
00871                   "Cannot contact server addr=%s port=%u prognum=%u using NFSv4 protocol",
00872                   inet_ntop(AF_INET, &ctx->srv_addr, addr, sizeof(addr)),
00873                   ntohs(ctx->srv_port), ctx->srv_prognum);
00874 
00875           ReturnCode(ERR_FSAL_INVAL, 0);
00876         }
00877     }
00878   else
00879     {
00880       ReturnCode(ERR_FSAL_INVAL, 0);
00881     }
00882 
00883   ctx->socket = sock;
00884 
00885 #ifdef _USE_GSSRPC
00886   if(global_fsal_proxy_specific_info.active_krb5 == TRUE)
00887     {
00888       fsal_status = fsal_internal_set_auth_gss(ctx);
00889       if(FSAL_IS_ERROR(fsal_status))
00890         ReturnCode(fsal_status.major, fsal_status.minor);
00891     }
00892   else
00893 #endif                          /* _USE_GSSRPC */
00894   if((ctx->rpc_client->cl_auth = authunix_create_default()) == NULL)
00895     ReturnCode(ERR_FSAL_INVAL, 0);
00896 
00897   /* test if the newly created context can 'ping' the server via PROC_NULL */
00898   rc = clnt_call(ctx->rpc_client, NFSPROC4_NULL,
00899                  (xdrproc_t) xdr_void, (caddr_t) NULL,
00900                  (xdrproc_t) xdr_void, (caddr_t) NULL, timeout);
00901   if(rc  != RPC_SUCCESS)
00902     ReturnCode(ERR_FSAL_INVAL, rc);
00903 
00904   fsal_status = FSAL_proxy_setclientid(ctx);
00905   if(FSAL_IS_ERROR(fsal_status))
00906     ReturnCode(ERR_FSAL_FAULT, 0);
00907 
00908   ReturnCode(ERR_FSAL_NO_ERROR, 0);
00909 }
00910 
00922 int fsal_internal_ClientReconnect(proxyfsal_op_context_t * p_thr_context)
00923 {
00924   fsal_status_t fsal_status;
00925   char addr[INET_ADDRSTRLEN];
00926 
00927   LogEvent(COMPONENT_FSAL,
00928            "Lost connection to the server %s, trying to reconnect",
00929            inet_ntop(AF_INET,  &p_thr_context->srv_addr, addr, sizeof(addr)));
00930 
00931   /* First of all, close the formerly opened socket that is now useless */
00932   if( close( p_thr_context->socket ) == -1 )
00933     LogMajor( COMPONENT_FSAL,
00934               "FSAL RECONNECT : got POSIX error %u while closing socket in fsal_internal_ClientReconnect", errno ) ;
00935   
00936   if(p_thr_context->rpc_client)
00937     {
00938       auth_destroy(p_thr_context->rpc_client->cl_auth);
00939       p_thr_context->rpc_client->cl_auth = NULL;
00940       clnt_destroy(p_thr_context->rpc_client);
00941       p_thr_context->rpc_client = NULL;
00942     }
00943   fsal_status = fsal_proxy_create_rpc_clnt(p_thr_context);
00944   if(FSAL_IS_ERROR(fsal_status))
00945     return -1;
00946 
00947   fsal_status = FSAL_proxy_setclientid_renego(p_thr_context);
00948   if(FSAL_IS_ERROR(fsal_status))
00949     return -1;
00950 
00951   return 0;
00952 }                               /* fsal_internal_ClientReconnect */
00953 
00966 fsal_status_t FSAL_proxy_open_confirm(proxyfsal_file_t * pfd)
00967 {
00968   fsal_status_t fsal_status;
00969   int rc;
00970   
00971 
00972   COMPOUND4args argnfs4;
00973   COMPOUND4res resnfs4;
00974   nfs_fh4 nfs4fh;
00975 
00976 #define FSAL_PROXY_OPEN_CONFIRM_NB_OP_ALLOC 2
00977 #define FSAL_PROXY_OPEN_CONFIRM_IDX_OP_PUTFH        0
00978 #define FSAL_PROXY_OPEN_CONFIRM_IDX_OP_OPEN_CONFIRM 1
00979   nfs_argop4 argoparray[FSAL_PROXY_OPEN_CONFIRM_NB_OP_ALLOC];
00980   nfs_resop4 resoparray[FSAL_PROXY_OPEN_CONFIRM_NB_OP_ALLOC];
00981   struct timeval timeout = TIMEOUTRPC;
00982 
00983   if(pfd == NULL)
00984     {
00985       fsal_status.major = ERR_FSAL_FAULT;
00986       fsal_status.minor = 0;
00987 
00988       return fsal_status;
00989     }
00990 
00991   if(pfd->pcontext == NULL)
00992     {
00993       LogFullDebug(COMPONENT_FSAL, "===================> FSAL_proxy_open_confirm: Non initialized fd !!!!!");
00994       fsal_status.major = ERR_FSAL_FAULT;
00995       fsal_status.minor = 0;
00996 
00997       return fsal_status;
00998     }
00999   /* Get NFSv4 File handle */
01000   if(fsal_internal_proxy_extract_fh(&nfs4fh, (fsal_handle_t *) &pfd->fhandle) == FALSE)
01001     {
01002       fsal_status.major = ERR_FSAL_FAULT;
01003       fsal_status.minor = 0;
01004 
01005       return fsal_status;
01006     }
01007 
01008   /* Setup results structures */
01009   argnfs4.argarray.argarray_val = argoparray;
01010   resnfs4.resarray.resarray_val = resoparray;
01011   argnfs4.minorversion = 0;
01012   argnfs4.tag.utf8string_val = NULL;
01013   argnfs4.tag.utf8string_len = 0;
01014   argnfs4.argarray.argarray_len = 0;
01015 
01016   COMPOUNDV4_ARG_ADD_OP_PUTFH(argnfs4, nfs4fh);
01017   argnfs4.argarray.argarray_val[FSAL_PROXY_OPEN_CONFIRM_IDX_OP_OPEN_CONFIRM].argop =
01018       NFS4_OP_OPEN_CONFIRM;
01019   argnfs4.argarray.argarray_val[FSAL_PROXY_OPEN_CONFIRM_IDX_OP_OPEN_CONFIRM].nfs_argop4_u.
01020       opopen_confirm.open_stateid.seqid = pfd->stateid.seqid;
01021   memcpy((char *)argnfs4.argarray.
01022          argarray_val[FSAL_PROXY_OPEN_CONFIRM_IDX_OP_OPEN_CONFIRM].nfs_argop4_u.
01023          opopen_confirm.open_stateid.other, (char *)pfd->stateid.other, 12);
01024   argnfs4.argarray.argarray_val[FSAL_PROXY_OPEN_CONFIRM_IDX_OP_OPEN_CONFIRM].nfs_argop4_u.
01025       opopen_confirm.seqid = pfd->stateid.seqid + 1;
01026   argnfs4.argarray.argarray_len = 2;
01027 
01028   TakeTokenFSCall();
01029   /* Call the NFSv4 function */
01030   COMPOUNDV4_EXECUTE(pfd->pcontext, argnfs4, resnfs4, rc);
01031   if(rc != RPC_SUCCESS)
01032     {
01033       ReleaseTokenFSCall();
01034 
01035       fsal_status.major = ERR_FSAL_IO;
01036       fsal_status.minor = resnfs4.status;
01037 
01038       return fsal_status;
01039     }
01040   ReleaseTokenFSCall();
01041 
01042   /* set the error is res if not NFS4_OK */
01043   if(resnfs4.status != NFS4_OK)
01044     {
01045       fsal_status.major = ERR_FSAL_IO;
01046       fsal_status.minor = resnfs4.status;
01047 
01048       return fsal_status;
01049     }
01050   /* Update the file descriptor with the new stateid */
01051   pfd->stateid.seqid =
01052       resnfs4.resarray.resarray_val[FSAL_PROXY_OPEN_CONFIRM_IDX_OP_OPEN_CONFIRM].
01053       nfs_resop4_u.opopen_confirm.OPEN_CONFIRM4res_u.resok4.open_stateid.seqid;
01054   memcpy((char *)pfd->stateid.other,
01055          (char *)resnfs4.resarray.
01056          resarray_val[FSAL_PROXY_OPEN_CONFIRM_IDX_OP_OPEN_CONFIRM].nfs_resop4_u.
01057          opopen_confirm.OPEN_CONFIRM4res_u.resok4.open_stateid.other, 12);
01058 
01059   fsal_status.major = ERR_FSAL_NO_ERROR;
01060   fsal_status.minor = NFS4_OK;
01061 
01062   return fsal_status;
01063 }                               /* FSAL_proxy_open_confirm */
01064 
01065 void *FSAL_proxy_change_user(proxyfsal_op_context_t * p_thr_context)
01066 {
01067   static char hostname[MAXNAMLEN];
01068   static bool_t done = FALSE;
01069 
01070   P(p_thr_context->lock);
01071   switch (p_thr_context->rpc_client->cl_auth->ah_cred.oa_flavor)
01072     {
01073     case AUTH_NONE:
01074       /* well... to be honest, there is nothing to be done here... */
01075       break;
01076 
01077     case AUTH_UNIX:
01078       if(!done)
01079         {
01080           if(gethostname(hostname, MAXNAMLEN) == -1)
01081             strncpy(hostname, "NFS-GANESHA/Proxy", MAXNAMLEN);
01082 
01083           done = TRUE;
01084         }
01085       auth_destroy(p_thr_context->rpc_client->cl_auth);
01086 
01087       p_thr_context->rpc_client->cl_auth =
01088               authunix_create(hostname,
01089                               p_thr_context->credential.user,
01090                               p_thr_context->credential.group,
01091                               p_thr_context->credential.nbgroups,
01092                               p_thr_context->credential.alt_groups);
01093       break;
01094 #ifdef _USE_GSSRPC
01095     case RPCSEC_GSS:
01096 #endif
01097     default:
01099       break;
01100 
01101     }                           /* switch( pthr_context->rpc_client->cl_auth->ah_cred.oa_flavor ) */
01102 
01103   V(p_thr_context->lock);
01104 
01105   /* Return authentication */
01106   return p_thr_context->rpc_client->cl_auth;
01107 }                               /* FSAL_proxy_change_user */