nfs-ganesha 1.4
|
00001 /* 00002 * vim:expandtab:shiftwidth=8:tabstop=8: 00003 */ 00004 00012 #ifdef HAVE_CONFIG_H 00013 #include "config.h" 00014 #endif 00015 00016 #include "fsal.h" 00017 #include "fsal_internal.h" 00018 #include "fsal_convert.h" 00019 #include "HPSSclapiExt/hpssclapiext.h" 00020 00021 #include <hpss_errno.h> 00022 00062 fsal_status_t HPSSFSAL_open_by_name(hpssfsal_handle_t * dirhandle, /* IN */ 00063 fsal_name_t * filename, /* IN */ 00064 hpssfsal_op_context_t * p_context, /* IN */ 00065 fsal_openflags_t openflags, /* IN */ 00066 hpssfsal_file_t * file_descriptor, /* OUT */ 00067 fsal_attrib_list_t * 00068 file_attributes /* [ IN/OUT ] */ ) 00069 { 00070 fsal_status_t fsal_status; 00071 hpssfsal_handle_t filehandle; 00072 00073 if(!dirhandle || !filename || !p_context || !file_descriptor) 00074 Return(ERR_FSAL_FAULT, 0, INDEX_FSAL_open_by_name); 00075 00076 fsal_status = 00077 HPSSFSAL_lookup(dirhandle, filename, p_context, &filehandle, file_attributes); 00078 if(FSAL_IS_ERROR(fsal_status)) 00079 return fsal_status; 00080 00081 return HPSSFSAL_open(&filehandle, p_context, openflags, file_descriptor, 00082 file_attributes); 00083 } 00084 00121 fsal_status_t HPSSFSAL_open(hpssfsal_handle_t * filehandle, /* IN */ 00122 hpssfsal_op_context_t * p_context, /* IN */ 00123 fsal_openflags_t openflags, /* IN */ 00124 hpssfsal_file_t * file_descriptor, /* OUT */ 00125 fsal_attrib_list_t * file_attributes /* [ IN/OUT ] */ 00126 ) 00127 { 00128 00129 int rc; 00130 int hpss_flags; 00131 hpss_Attrs_t hpss_attributes; 00132 TYPE_TOKEN_HPSS hpss_authz; 00133 00134 /* sanity checks. 00135 * note : file_attributes is optional. 00136 */ 00137 if(!filehandle || !p_context || !file_descriptor) 00138 Return(ERR_FSAL_FAULT, 0, INDEX_FSAL_open); 00139 00140 /* check if it is a file */ 00141 00142 if(filehandle->data.obj_type != FSAL_TYPE_FILE) 00143 { 00144 Return(ERR_FSAL_INVAL, 0, INDEX_FSAL_open); 00145 } 00146 00147 /* convert fsal open flags to hpss open flags */ 00148 00149 rc = fsal2hpss_openflags(openflags, &hpss_flags); 00150 00151 /* flags conflicts. */ 00152 00153 if(rc) 00154 { 00155 LogEvent(COMPONENT_FSAL, 00156 "Invalid/conflicting flags : %#X", openflags); 00157 Return(rc, 0, INDEX_FSAL_open); 00158 } 00159 00160 TakeTokenFSCall(); 00161 00162 rc = HPSSFSAL_OpenHandle(&filehandle->data.ns_handle, /* IN - object handle */ 00163 NULL, hpss_flags, /* IN - Type of file access */ 00164 (mode_t) 0644, /* IN - Desired file perms if create */ 00165 &p_context->credential.hpss_usercred, /* IN - User credentials */ 00166 NULL, /* IN - Desired class of service */ 00167 NULL, /* IN - Priorities of hint struct */ 00168 NULL, /* OUT - Granted class of service */ 00169 (file_attributes ? &hpss_attributes : NULL), /* OUT - returned attributes */ 00170 NULL, /* OUT - returned handle */ 00171 &hpss_authz /* OUT - Client authorization */ 00172 ); 00173 00174 ReleaseTokenFSCall(); 00175 00176 /* /!\ rc is the file descriptor number !!! */ 00177 00178 /* The HPSS_ENOENT error actually means that handle is STALE */ 00179 if(rc == HPSS_ENOENT) 00180 Return(ERR_FSAL_STALE, -rc, INDEX_FSAL_open); 00181 else if(rc < 0) 00182 Return(hpss2fsal_error(rc), -rc, INDEX_FSAL_open); 00183 00184 /* fills output struct */ 00185 00186 file_descriptor->filedes = rc; 00187 #if HPSS_MAJOR_VERSION < 7 00188 file_descriptor->fileauthz = hpss_authz; 00189 #endif 00190 00191 /* set output attributes if asked */ 00192 00193 if(file_attributes) 00194 { 00195 00196 fsal_status_t status; 00197 00198 status = hpss2fsal_attributes(&(filehandle->data.ns_handle), 00199 &hpss_attributes, file_attributes); 00200 00201 if(FSAL_IS_ERROR(status)) 00202 { 00203 FSAL_CLEAR_MASK(file_attributes->asked_attributes); 00204 FSAL_SET_MASK(file_attributes->asked_attributes, FSAL_ATTR_RDATTR_ERR); 00205 } 00206 } 00207 00208 Return(ERR_FSAL_NO_ERROR, 0, INDEX_FSAL_open); 00209 00210 } 00211 00240 fsal_status_t HPSSFSAL_read(hpssfsal_file_t * file_descriptor, /* IN */ 00241 fsal_seek_t * seek_descriptor, /* [IN] */ 00242 fsal_size_t buffer_size, /* IN */ 00243 caddr_t buffer, /* OUT */ 00244 fsal_size_t * read_amount, /* OUT */ 00245 fsal_boolean_t * end_of_file /* OUT */ 00246 ) 00247 { 00248 00249 ssize_t nb_read; 00250 size_t i_size; 00251 int error = 0; 00252 off_t seekoffset = 0; 00253 /* sanity checks. */ 00254 00255 if(!file_descriptor || !buffer || !read_amount || !end_of_file) 00256 Return(ERR_FSAL_FAULT, 0, INDEX_FSAL_read); 00257 00259 i_size = (size_t) buffer_size; 00260 00261 /* positioning */ 00262 00263 if(seek_descriptor) 00264 { 00265 00266 switch (seek_descriptor->whence) 00267 { 00268 case FSAL_SEEK_CUR: 00269 /* set position plus offset */ 00270 00271 TakeTokenFSCall(); 00272 00273 seekoffset = 00274 hpss_Lseek(file_descriptor->filedes, seek_descriptor->offset, SEEK_CUR); 00275 00276 ReleaseTokenFSCall(); 00277 00278 break; 00279 00280 case FSAL_SEEK_SET: 00281 /* set absolute position to offset */ 00282 00283 TakeTokenFSCall(); 00284 00285 seekoffset = 00286 hpss_Lseek(file_descriptor->filedes, seek_descriptor->offset, SEEK_SET); 00287 00288 ReleaseTokenFSCall(); 00289 00290 break; 00291 00292 case FSAL_SEEK_END: 00293 /* set end of file plus offset */ 00294 00295 TakeTokenFSCall(); 00296 00297 seekoffset = 00298 hpss_Lseek(file_descriptor->filedes, seek_descriptor->offset, SEEK_END); 00299 00300 ReleaseTokenFSCall(); 00301 00302 break; 00303 } 00304 00305 if(seekoffset < 0) 00306 { 00307 error = (int)seekoffset; 00308 00309 LogEvent(COMPONENT_FSAL, 00310 "Error in hpss_Lseek operation (whence=%s, offset=%lld)", 00311 (seek_descriptor->whence == FSAL_SEEK_CUR ? "SEEK_CUR" : 00312 (seek_descriptor->whence == FSAL_SEEK_SET ? "SEEK_SET" : 00313 (seek_descriptor->whence == 00314 FSAL_SEEK_END ? "SEEK_END" : "ERROR"))), 00315 seek_descriptor->offset); 00316 00317 Return(hpss2fsal_error(error), -error, INDEX_FSAL_read); 00318 } 00319 00320 } 00321 00322 /* read operation */ 00323 00324 TakeTokenFSCall(); 00325 00326 nb_read = hpss_Read(file_descriptor->filedes, /* IN - ID of object to be read */ 00327 (void *)buffer, /* IN - Buffer in which to receive data */ 00328 i_size); /* IN - number of bytes to read */ 00329 00330 ReleaseTokenFSCall(); 00331 00334 if(nb_read < 0) 00335 { 00336 error = (int)nb_read; 00337 Return(hpss2fsal_error(error), -error, INDEX_FSAL_read); 00338 } 00339 00340 /* set output vars */ 00341 00342 *read_amount = (fsal_size_t) nb_read; 00343 *end_of_file = (nb_read == 0); 00344 00345 Return(ERR_FSAL_NO_ERROR, 0, INDEX_FSAL_read); 00346 00347 } 00348 00376 fsal_status_t HPSSFSAL_write(hpssfsal_file_t * file_descriptor, /* IN */ 00377 fsal_op_context_t * p_context, /* IN */ 00378 fsal_seek_t * seek_descriptor, /* IN */ 00379 fsal_size_t buffer_size, /* IN */ 00380 caddr_t buffer, /* IN */ 00381 fsal_size_t * write_amount /* OUT */ 00382 ) 00383 { 00384 00385 ssize_t nb_written; 00386 size_t i_size; 00387 int error = 0; 00388 off_t seekoffset = 0; 00389 00390 /* sanity checks. */ 00391 if(!file_descriptor || !buffer || !write_amount) 00392 Return(ERR_FSAL_FAULT, 0, INDEX_FSAL_write); 00393 00395 i_size = (size_t) buffer_size; 00396 00397 /* positioning */ 00398 00399 if(seek_descriptor) 00400 { 00401 00402 switch (seek_descriptor->whence) 00403 { 00404 case FSAL_SEEK_CUR: 00405 /* set position plus offset */ 00406 00407 TakeTokenFSCall(); 00408 00409 seekoffset = 00410 hpss_Lseek(file_descriptor->filedes, seek_descriptor->offset, SEEK_CUR); 00411 00412 ReleaseTokenFSCall(); 00413 00414 break; 00415 00416 case FSAL_SEEK_SET: 00417 /* set absolute position to offset */ 00418 00419 TakeTokenFSCall(); 00420 00421 seekoffset = 00422 hpss_Lseek(file_descriptor->filedes, seek_descriptor->offset, SEEK_SET); 00423 00424 ReleaseTokenFSCall(); 00425 00426 break; 00427 00428 case FSAL_SEEK_END: 00429 /* set end of file plus offset */ 00430 00431 TakeTokenFSCall(); 00432 00433 seekoffset = 00434 hpss_Lseek(file_descriptor->filedes, seek_descriptor->offset, SEEK_END); 00435 00436 ReleaseTokenFSCall(); 00437 00438 break; 00439 } 00440 00441 if(seekoffset < 0) 00442 { 00443 error = (int)seekoffset; 00444 00445 LogEvent(COMPONENT_FSAL, 00446 "FSAL_write: Error in hpss_Lseek operation (whence=%s, offset=%lld)", 00447 (seek_descriptor->whence == FSAL_SEEK_CUR ? "SEEK_CUR" : 00448 (seek_descriptor->whence == FSAL_SEEK_SET ? "SEEK_SET" : 00449 (seek_descriptor->whence == 00450 FSAL_SEEK_END ? "SEEK_END" : "ERROR"))), 00451 seek_descriptor->offset); 00452 00453 Return(hpss2fsal_error(error), -error, INDEX_FSAL_write); 00454 } 00455 00456 } 00457 00458 /* write operation */ 00459 00460 TakeTokenFSCall(); 00461 00462 nb_written = hpss_Write(file_descriptor->filedes, /* IN - ID of object to be read */ 00463 (void *)buffer, /* IN - Buffer in which to receive data */ 00464 i_size); /* IN - number of bytes to read */ 00465 00466 ReleaseTokenFSCall(); 00467 00470 if(nb_written < 0) 00471 { 00472 error = (int)nb_written; 00473 Return(hpss2fsal_error(error), -error, INDEX_FSAL_write); 00474 } 00475 00476 /* set output vars */ 00477 00478 *write_amount = (fsal_size_t) nb_written; 00479 00480 Return(ERR_FSAL_NO_ERROR, 0, INDEX_FSAL_write); 00481 00482 } 00483 00501 fsal_status_t HPSSFSAL_commit( hpssfsal_file_t * p_file_descriptor, 00502 fsal_off_t offset, 00503 fsal_size_t length ) 00504 { 00505 int rc, errsv; 00506 00507 /* sanity checks. */ 00508 if(!p_file_descriptor) 00509 Return(ERR_FSAL_FAULT, 0, INDEX_FSAL_commit); 00510 00511 /* Flush data. */ 00512 TakeTokenFSCall(); 00513 rc = hpss_Fsync(p_file_descriptor->filedes); 00514 errsv = errno; 00515 ReleaseTokenFSCall(); 00516 00517 if(rc) 00518 { 00519 LogEvent(COMPONENT_FSAL, "Error in fsync operation"); 00520 Return(hpss2fsal_error(errsv), errsv, INDEX_FSAL_commit); 00521 } 00522 00523 Return(ERR_FSAL_NO_ERROR, 0, INDEX_FSAL_commit); 00524 } 00525 00540 fsal_status_t HPSSFSAL_close(hpssfsal_file_t * file_descriptor /* IN */ 00541 ) 00542 { 00543 00544 int rc; 00545 00546 /* sanity checks. */ 00547 if(!file_descriptor) 00548 Return(ERR_FSAL_FAULT, 0, INDEX_FSAL_close); 00549 00550 /* call to close */ 00551 00552 TakeTokenFSCall(); 00553 00554 rc = hpss_Close(file_descriptor->filedes); 00555 00556 ReleaseTokenFSCall(); 00557 00558 if(rc) 00559 Return(hpss2fsal_error(rc), -rc, INDEX_FSAL_close); 00560 00561 Return(ERR_FSAL_NO_ERROR, 0, INDEX_FSAL_close); 00562 00563 } 00564 00565 /* Some unsupported calls used in FSAL_PROXY, just for permit the ganeshell to compile */ 00566 fsal_status_t HPSSFSAL_open_by_fileid(hpssfsal_handle_t * filehandle, /* IN */ 00567 fsal_u64_t fileid, /* IN */ 00568 hpssfsal_op_context_t * p_context, /* IN */ 00569 fsal_openflags_t openflags, /* IN */ 00570 hpssfsal_file_t * file_descriptor, /* OUT */ 00571 fsal_attrib_list_t * 00572 file_attributes /* [ IN/OUT ] */ ) 00573 { 00574 Return(ERR_FSAL_NOTSUPP, 0, INDEX_FSAL_open_by_fileid); 00575 } 00576 00577 fsal_status_t HPSSFSAL_close_by_fileid(hpssfsal_file_t * file_descriptor /* IN */ , 00578 fsal_u64_t fileid) 00579 { 00580 Return(ERR_FSAL_NOTSUPP, 0, INDEX_FSAL_open_by_fileid); 00581 } 00582 00583 unsigned int HPSSFSAL_GetFileno(hpssfsal_file_t * pfile) 00584 { 00585 return pfile->filedes; 00586 }