nfs-ganesha 1.4

fsal_fileop.c

Go to the documentation of this file.
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 }