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 #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 */