nfs-ganesha 1.4

fsal_convert.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 #include "fsal_convert.h"
00018 #include "fsal_internal.h"
00019 #include <sys/types.h>
00020 #include <errno.h>
00021 
00022 #include <hpss_errno.h>
00023 
00024 #define MAX_2( x, y )    ( (x) > (y) ? (x) : (y) )
00025 #define MAX_3( x, y, z ) ( (x) > (y) ? MAX_2((x),(z)) : MAX_2((y),(z)) )
00026 
00038 int hpss2fsal_error(int hpss_errorcode)
00039 {
00040 
00041   switch (hpss_errorcode)
00042     {
00043 
00044     case HPSS_E_NOERROR:
00045       return ERR_FSAL_NO_ERROR;
00046 
00047     case EPERM:
00048     case HPSS_EPERM:
00049       return ERR_FSAL_PERM;
00050 
00051     case ENOENT:
00052     case HPSS_ENOENT:
00053       return ERR_FSAL_NOENT;
00054 
00055       /* connection error */
00056 #ifdef _AIX_5
00057     case ENOCONNECT:
00058 #elif defined _LINUX
00059     case ECONNREFUSED:
00060     case ECONNABORTED:
00061     case ECONNRESET:
00062 #endif
00063     case HPSS_ECONN:
00064 
00065       /* IO error */
00066     case EIO:
00067     case HPSS_EIO:
00068 
00069       /* too many open files */
00070     case ENFILE:
00071     case HPSS_ENFILE:
00072     case EMFILE:
00073     case HPSS_EMFILE:
00074 
00075       /* broken pipe */
00076     case EPIPE:
00077     case HPSS_EPIPE:
00078 
00079       /* all shown as IO errors */
00080       return ERR_FSAL_IO;
00081 
00082       /* no such device */
00083     case ENODEV:
00084     case HPSS_ENODEV:
00085     case ENXIO:
00086     case HPSS_ENXIO:
00087       return ERR_FSAL_NXIO;
00088 
00089       /* invalid file descriptor : */
00090     case EBADF:
00091     case HPSS_EBADF:
00092       /* we suppose it was not opened... */
00093 
00101       return ERR_FSAL_NOT_OPENED;
00102 
00103     case ENOMEM:
00104     case HPSS_ENOMEM:
00105       return ERR_FSAL_NOMEM;
00106 
00107     case EACCES:
00108     case HPSS_EACCES:
00109       return ERR_FSAL_ACCESS;
00110 
00111     case EFAULT:
00112     case HPSS_EFAULT:
00113       return ERR_FSAL_FAULT;
00114 
00115     case EEXIST:
00116     case HPSS_EEXIST:
00117       return ERR_FSAL_EXIST;
00118 
00119     case EXDEV:
00120     case HPSS_EXDEV:
00121       return ERR_FSAL_XDEV;
00122 
00123     case ENOTDIR:
00124     case HPSS_ENOTDIR:
00125       return ERR_FSAL_NOTDIR;
00126 
00127     case EISDIR:
00128     case HPSS_EISDIR:
00129       return ERR_FSAL_ISDIR;
00130 
00131     case EINVAL:
00132     case HPSS_EINVAL:
00133       return ERR_FSAL_INVAL;
00134 
00135     case EFBIG:
00136     case HPSS_EFBIG:
00137       return ERR_FSAL_FBIG;
00138 
00139     case ENOSPC:
00140     case HPSS_ENOSPACE:
00141       return ERR_FSAL_NOSPC;
00142 
00143     case EMLINK:
00144     case HPSS_EMLINK:
00145       return ERR_FSAL_MLINK;
00146 
00147     case EDQUOT:
00148     case HPSS_EDQUOT:
00149       return ERR_FSAL_DQUOT;
00150 
00151     case ENAMETOOLONG:
00152     case HPSS_ENAMETOOLONG:
00153       return ERR_FSAL_NAMETOOLONG;
00154 
00161 #ifdef _AIX
00162     case 87:
00163 #else
00164     case ENOTEMPTY:
00165     case -ENOTEMPTY:
00166 #endif
00167     case HPSS_ENOTEMPTY:
00168       return ERR_FSAL_NOTEMPTY;
00169 
00170     case ESTALE:
00171     case HPSS_ESTALE:
00172       return ERR_FSAL_STALE;
00173 
00174       /* Error code that needs a retry */
00175     case EAGAIN:
00176     case HPSS_EAGAIN:
00177     case EBUSY:
00178     case HPSS_EBUSY:
00179 
00180       return ERR_FSAL_DELAY;
00181 
00182     default:
00183 
00184 #if HPSS_MAJOR_VERSION == 5
00185 
00186       /* hsec error code regarding security (-3000...) */
00187       if((hpss_errorcode <= -3000) && (hpss_errorcode > -4000))
00188         return ERR_FSAL_SEC;
00189 
00190 #elif HPSS_MAJOR_VERSION == 6
00191 
00192       /* hsec error code regarding security (-11000...) */
00193       if((hpss_errorcode <= HPSS_SEC_ENOT_AUTHORIZED)
00194          && (hpss_errorcode >= HPSS_SEC_LDAP_ERROR))
00195         return ERR_FSAL_SEC;
00196 #elif HPSS_MAJOR_VERSION == 7
00197 
00198       /* hsec error code regarding security (-11000...) */
00199       if((hpss_errorcode <= HPSS_SEC_ENOT_AUTHORIZED)
00200          && (hpss_errorcode >= HPSS_SEC_LDAP_RETRY))
00201         return ERR_FSAL_SEC;
00202 
00203 #endif
00204 
00205       /* other unexpected errors */
00206       return ERR_FSAL_SERVERFAULT;
00207 
00208     }
00209 
00210 }
00211 
00221 int fsal2hpss_testperm(fsal_accessflags_t testperm)
00222 {
00223 
00224   int hpss_testperm = 0;
00225 
00226   if(testperm & FSAL_R_OK)
00227     hpss_testperm |= R_OK;
00228   if(testperm & FSAL_W_OK)
00229     hpss_testperm |= W_OK;
00230   if(testperm & FSAL_X_OK)
00231     hpss_testperm |= X_OK;
00232   if(testperm & FSAL_F_OK)
00233     hpss_testperm |= F_OK;
00234 
00235   return hpss_testperm;
00236 
00237 }
00238 
00252 int fsal2hpss_openflags(fsal_openflags_t fsal_flags, int *p_hpss_flags)
00253 {
00254   int cpt;
00255 
00256   if(!p_hpss_flags)
00257     return ERR_FSAL_FAULT;
00258 
00259   /* check that all used flags exist */
00260 
00261   if(fsal_flags &
00262      ~(FSAL_O_RDONLY | FSAL_O_RDWR | FSAL_O_WRONLY | FSAL_O_APPEND | FSAL_O_TRUNC))
00263     return ERR_FSAL_INVAL;
00264 
00265   /* Check for flags compatibility */
00266 
00267   /* O_RDONLY O_WRONLY O_RDWR cannot be used together */
00268 
00269   cpt = 0;
00270   if(fsal_flags & FSAL_O_RDONLY)
00271     cpt++;
00272   if(fsal_flags & FSAL_O_RDWR)
00273     cpt++;
00274   if(fsal_flags & FSAL_O_WRONLY)
00275     cpt++;
00276 
00277   if(cpt > 1)
00278     return ERR_FSAL_INVAL;
00279 
00280   /* FSAL_O_APPEND et FSAL_O_TRUNC cannot be used together */
00281 
00282   if((fsal_flags & FSAL_O_APPEND) && (fsal_flags & FSAL_O_TRUNC))
00283     return ERR_FSAL_INVAL;
00284 
00285   /* FSAL_O_TRUNC without FSAL_O_WRONLY or FSAL_O_RDWR */
00286 
00287   if((fsal_flags & FSAL_O_TRUNC) && !(fsal_flags & (FSAL_O_WRONLY | FSAL_O_RDWR)))
00288     return ERR_FSAL_INVAL;
00289 
00290   /* conversion */
00291 
00292   *p_hpss_flags = 0;
00293 
00294   if(fsal_flags & FSAL_O_RDONLY)
00295     *p_hpss_flags |= O_RDONLY;
00296   if(fsal_flags & FSAL_O_RDWR)
00297     *p_hpss_flags |= O_RDWR;
00298   if(fsal_flags & FSAL_O_WRONLY)
00299     *p_hpss_flags |= O_WRONLY;
00300   if(fsal_flags & FSAL_O_APPEND)
00301     *p_hpss_flags |= O_APPEND;
00302   if(fsal_flags & FSAL_O_TRUNC)
00303     *p_hpss_flags |= O_TRUNC;
00304 
00305   return ERR_FSAL_NO_ERROR;
00306 
00307 }
00308 
00319 fsal_nodetype_t hpss2fsal_type(unsigned32 hpss_type_in)
00320 {
00321 
00322   switch (hpss_type_in)
00323     {
00324 
00325     case NS_OBJECT_TYPE_DIRECTORY:
00326       return FSAL_TYPE_DIR;
00327 
00328     case NS_OBJECT_TYPE_HARD_LINK:
00329     case NS_OBJECT_TYPE_FILE:
00330       return FSAL_TYPE_FILE;
00331 
00332     case NS_OBJECT_TYPE_SYM_LINK:
00333       return FSAL_TYPE_LNK;
00334 
00335     case NS_OBJECT_TYPE_JUNCTION:
00336       return FSAL_TYPE_JUNCTION;
00337 
00338     default:
00339       LogEvent(COMPONENT_FSAL, "Unknown object type: %d", hpss_type_in);
00340       return -1;
00341     }
00342 
00343 }
00344 
00350 fsal_time_t hpss2fsal_time(timestamp_sec_t tsec)
00351 {
00352   fsal_time_t fsaltime;
00353 
00354   fsaltime.seconds = (fsal_uint_t) tsec;
00355   fsaltime.nseconds = 0;
00356 
00357   return fsaltime;
00358 }
00359 
00360 /* fsal2hpss_time is a macro */
00361 
00371 fsal_u64_t hpss2fsal_64(u_signed64 hpss_size_in)
00372 {
00373 
00374   long long output_buff;
00375   CONVERT_U64_TO_LONGLONG(hpss_size_in, output_buff);
00376   return (fsal_u64_t) (output_buff);
00377 
00378 }
00379 
00389 u_signed64 fsal2hpss_64(fsal_u64_t fsal_size_in)
00390 {
00391 
00392   u_signed64 output_buff;
00393   CONVERT_LONGLONG_TO_U64(fsal_size_in, output_buff);
00394 
00395   return output_buff;
00396 
00397 }
00398 
00408 fsal_fsid_t hpss2fsal_fsid(u_signed64 hpss_fsid_in)
00409 {
00410 
00411   fsal_fsid_t fsid;
00412 
00413   fsid.major = high32m(hpss_fsid_in);
00414   fsid.minor = low32m(hpss_fsid_in);
00415 
00416   return fsid;
00417 
00418 }
00419 
00439 fsal_accessmode_t hpss2fsal_mode(unsigned32 uid_bit,
00440                                  unsigned32 gid_bit,
00441                                  unsigned32 sticky_bit,
00442                                  unsigned32 user_perms,
00443                                  unsigned32 group_perms, unsigned32 other_perms)
00444 {
00445 
00446   fsal_accessmode_t out_mode = 0;
00447 
00448   /* special bits */
00449   if(uid_bit)
00450     out_mode |= FSAL_MODE_SUID;
00451   if(gid_bit)
00452     out_mode |= FSAL_MODE_SGID;
00453   if(sticky_bit)
00454     out_mode |= FSAL_MODE_SVTX;
00455 
00456   /* user perms */
00457   if(user_perms & NS_PERMS_RD)
00458     out_mode |= FSAL_MODE_RUSR;
00459   if(user_perms & NS_PERMS_WR)
00460     out_mode |= FSAL_MODE_WUSR;
00461   if(user_perms & NS_PERMS_XS)
00462     out_mode |= FSAL_MODE_XUSR;
00463 
00464   /* group perms */
00465   if(group_perms & NS_PERMS_RD)
00466     out_mode |= FSAL_MODE_RGRP;
00467   if(group_perms & NS_PERMS_WR)
00468     out_mode |= FSAL_MODE_WGRP;
00469   if(group_perms & NS_PERMS_XS)
00470     out_mode |= FSAL_MODE_XGRP;
00471 
00472   /* other perms */
00473   if(other_perms & NS_PERMS_RD)
00474     out_mode |= FSAL_MODE_ROTH;
00475   if(other_perms & NS_PERMS_WR)
00476     out_mode |= FSAL_MODE_WOTH;
00477   if(other_perms & NS_PERMS_XS)
00478     out_mode |= FSAL_MODE_XOTH;
00479 
00480   return out_mode;
00481 
00482 }
00483 
00505 void fsal2hpss_mode(fsal_accessmode_t fsal_mode,
00506 #if HPSS_MAJOR_VERSION < 7
00507                     unsigned32 * uid_bit, unsigned32 * gid_bit, unsigned32 * sticky_bit,
00508 #else
00509                     unsigned32 * mode_perms,
00510 #endif
00511                     unsigned32 * user_perms,
00512                     unsigned32 * group_perms, unsigned32 * other_perms)
00513 {
00514 
00515   /* init outputs */
00516 
00517 #if HPSS_MAJOR_VERSION < 7
00518   *uid_bit = 0;
00519   *gid_bit = 0;
00520   *sticky_bit = 0;
00521 #else
00522   *mode_perms = 0;
00523 #endif
00524   *user_perms = 0;
00525   *group_perms = 0;
00526   *other_perms = 0;
00527 
00528   /* special bits */
00529 
00530 #if HPSS_MAJOR_VERSION < 7
00531   if(fsal_mode & FSAL_MODE_SUID)
00532     *uid_bit = 1;
00533   if(fsal_mode & FSAL_MODE_SGID)
00534     *gid_bit = 1;
00535   if(fsal_mode & FSAL_MODE_SVTX)
00536     *sticky_bit = 1;
00537 #else
00538   if(fsal_mode & FSAL_MODE_SUID)
00539     (*mode_perms) |= NS_PERMS_RD;
00540   if(fsal_mode & FSAL_MODE_SGID)
00541     (*mode_perms) |= NS_PERMS_WR;
00542   if(fsal_mode & FSAL_MODE_SVTX)
00543     (*mode_perms) |= NS_PERMS_XS;
00544 #endif
00545 
00546   /* user perms */
00547 
00548   if(fsal_mode & FSAL_MODE_RUSR)
00549     *user_perms |= NS_PERMS_RD;
00550   if(fsal_mode & FSAL_MODE_WUSR)
00551     *user_perms |= NS_PERMS_WR;
00552   if(fsal_mode & FSAL_MODE_XUSR)
00553     *user_perms |= NS_PERMS_XS;
00554 
00555   /* group perms */
00556 
00557   if(fsal_mode & FSAL_MODE_RGRP)
00558     *group_perms |= NS_PERMS_RD;
00559   if(fsal_mode & FSAL_MODE_WGRP)
00560     *group_perms |= NS_PERMS_WR;
00561   if(fsal_mode & FSAL_MODE_XGRP)
00562     *group_perms |= NS_PERMS_XS;
00563 
00564   /* other perms */
00565 
00566   if(fsal_mode & FSAL_MODE_ROTH)
00567     *other_perms |= NS_PERMS_RD;
00568   if(fsal_mode & FSAL_MODE_WOTH)
00569     *other_perms |= NS_PERMS_WR;
00570   if(fsal_mode & FSAL_MODE_XOTH)
00571     *other_perms |= NS_PERMS_XS;
00572 
00573   return;
00574 
00575 }
00576 
00602 fsal_status_t hpss2fsal_attributes(ns_ObjHandle_t * p_hpss_handle_in,
00603                                    hpss_Attrs_t * p_hpss_attr_in,
00604                                    fsal_attrib_list_t * p_fsalattr_out)
00605 {
00606 
00607   fsal_attrib_mask_t supp_attr, unsupp_attr;
00608 
00609   /* sanity checks */
00610   if(!p_hpss_handle_in || !p_hpss_attr_in || !p_fsalattr_out)
00611     ReturnCode(ERR_FSAL_FAULT, 0);
00612 
00613   if(p_fsalattr_out->asked_attributes == 0)
00614     {
00615       p_fsalattr_out->asked_attributes = global_fs_info.supported_attrs;
00616 
00617       LogCrit(COMPONENT_FSAL,
00618           "Error: p_fsalattr_out->asked_attributes  valait 0 dans hpss2fsal_attributes line %d, fichier %s",
00619            __LINE__, __FILE__);
00620     }
00621 
00622   /* check that asked attributes are supported */
00623   supp_attr = global_fs_info.supported_attrs;
00624 
00625   unsupp_attr = (p_fsalattr_out->asked_attributes) & (~supp_attr);
00626 
00627   if(unsupp_attr)
00628     {
00629       LogFullDebug(COMPONENT_FSAL,
00630                         "Unsupported attributes: %#llX    removing it from asked attributes ",
00631                         unsupp_attr);
00632 
00633       p_fsalattr_out->asked_attributes =
00634           p_fsalattr_out->asked_attributes & (~unsupp_attr);
00635 
00636       /* ReturnCode( ERR_FSAL_ATTRNOTSUPP, 0 ); */
00637     }
00638 
00639   /* Initialize ACL regardless of whether ACL was asked or not.
00640    * This is needed to make sure ACL attribute is initialized. */
00641   p_fsalattr_out->acl = NULL;
00642 
00643   /* Fills the output struct */
00644   if(FSAL_TEST_MASK(p_fsalattr_out->asked_attributes, FSAL_ATTR_SUPPATTR))
00645     {
00646       p_fsalattr_out->supported_attributes = supp_attr;
00647     }
00648   if(FSAL_TEST_MASK(p_fsalattr_out->asked_attributes, FSAL_ATTR_TYPE))
00649     {
00650       p_fsalattr_out->type = hpss2fsal_type(p_hpss_handle_in->Type);
00651     }
00652   if(FSAL_TEST_MASK(p_fsalattr_out->asked_attributes, FSAL_ATTR_SIZE))
00653     {
00654       p_fsalattr_out->filesize = hpss2fsal_64(p_hpss_attr_in->DataLength);
00655     }
00656   if(FSAL_TEST_MASK(p_fsalattr_out->asked_attributes, FSAL_ATTR_FSID))
00657     {
00658       p_fsalattr_out->fsid = hpss2fsal_fsid(p_hpss_attr_in->FilesetId);
00659     }
00660   if(FSAL_TEST_MASK(p_fsalattr_out->asked_attributes, FSAL_ATTR_ACL))
00661     {
00662 
00663       if(p_hpss_attr_in->ExtendedACLs == 0)
00664         {
00665           p_fsalattr_out->acl = NULL;
00666         }
00667       else
00668         {
00669 
00672         }
00673 
00674     }
00675   if(FSAL_TEST_MASK(p_fsalattr_out->asked_attributes, FSAL_ATTR_FILEID))
00676     {
00677       p_fsalattr_out->fileid = (fsal_u64_t) hpss_GetObjId(p_hpss_handle_in);
00678     }
00679 
00680   if(FSAL_TEST_MASK(p_fsalattr_out->asked_attributes, FSAL_ATTR_MODE))
00681     {
00682       p_fsalattr_out->mode = hpss2fsal_mode(
00683 #if HPSS_MAJOR_VERSION < 7
00684                                              p_hpss_attr_in->SetUIDBit,
00685                                              p_hpss_attr_in->SetGIDBit,
00686                                              p_hpss_attr_in->SetStickyBit,
00687 #else
00688                                              p_hpss_attr_in->ModePerms & NS_PERMS_RD,
00689                                              p_hpss_attr_in->ModePerms & NS_PERMS_WR,
00690                                              p_hpss_attr_in->ModePerms & NS_PERMS_XS,
00691 #endif
00692                                              p_hpss_attr_in->UserPerms,
00693                                              p_hpss_attr_in->GroupPerms,
00694                                              p_hpss_attr_in->OtherPerms);
00695     }
00696   if(FSAL_TEST_MASK(p_fsalattr_out->asked_attributes, FSAL_ATTR_NUMLINKS))
00697     {
00698       p_fsalattr_out->numlinks = p_hpss_attr_in->LinkCount;
00699     }
00700   if(FSAL_TEST_MASK(p_fsalattr_out->asked_attributes, FSAL_ATTR_OWNER))
00701     {
00702       p_fsalattr_out->owner = p_hpss_attr_in->UID;
00703     }
00704   if(FSAL_TEST_MASK(p_fsalattr_out->asked_attributes, FSAL_ATTR_GROUP))
00705     {
00706       p_fsalattr_out->group = p_hpss_attr_in->GID;
00707     }
00708   if(FSAL_TEST_MASK(p_fsalattr_out->asked_attributes, FSAL_ATTR_ATIME))
00709     {
00710 
00711       LogFullDebug(COMPONENT_FSAL, "Getting ATIME:");
00712       LogFullDebug(COMPONENT_FSAL, "\tTimeLastRead = %d",
00713                         p_hpss_attr_in->TimeLastRead);
00714       LogFullDebug(COMPONENT_FSAL, "\tTimeCreated = %d",
00715                         p_hpss_attr_in->TimeCreated);
00716 
00717       if(p_hpss_attr_in->TimeLastRead != 0)
00718         p_fsalattr_out->atime = hpss2fsal_time(p_hpss_attr_in->TimeLastRead);
00719       else
00720         p_fsalattr_out->atime = hpss2fsal_time(p_hpss_attr_in->TimeCreated);
00721 
00722     }
00723   if(FSAL_TEST_MASK(p_fsalattr_out->asked_attributes, FSAL_ATTR_CREATION))
00724     {
00725       p_fsalattr_out->creation = hpss2fsal_time(p_hpss_attr_in->TimeCreated);
00726     }
00727 
00728   if(FSAL_TEST_MASK(p_fsalattr_out->asked_attributes, FSAL_ATTR_CTIME))
00729     {
00730       p_fsalattr_out->ctime = hpss2fsal_time(p_hpss_attr_in->TimeModified);
00731     }
00732   if(FSAL_TEST_MASK(p_fsalattr_out->asked_attributes, FSAL_ATTR_MTIME))
00733     {
00734 
00735       LogFullDebug(COMPONENT_FSAL, "Getting MTIME:");
00736       LogFullDebug(COMPONENT_FSAL, "\tType = %d",
00737                         hpss2fsal_type(p_hpss_handle_in->Type));
00738       LogFullDebug(COMPONENT_FSAL, "\tTimeLastWritten = %d",
00739                         p_hpss_attr_in->TimeLastWritten);
00740       LogFullDebug(COMPONENT_FSAL, "\tTimeModified = %d",
00741                         p_hpss_attr_in->TimeModified);
00742       LogFullDebug(COMPONENT_FSAL, "\tTimeCreated = %d",
00743                         p_hpss_attr_in->TimeCreated);
00744 
00745       switch (hpss2fsal_type(p_hpss_handle_in->Type))
00746         {
00747 
00748         case FSAL_TYPE_FILE:
00749         case FSAL_TYPE_LNK:
00750 
00751           if(p_hpss_attr_in->TimeLastWritten != 0)
00752             p_fsalattr_out->mtime = hpss2fsal_time(p_hpss_attr_in->TimeLastWritten);
00753           else
00754             p_fsalattr_out->mtime = hpss2fsal_time(p_hpss_attr_in->TimeCreated);
00755           break;
00756 
00757         case FSAL_TYPE_DIR:
00758         case FSAL_TYPE_JUNCTION:
00759 
00760           if(p_hpss_attr_in->TimeModified != 0)
00761             p_fsalattr_out->mtime = hpss2fsal_time(p_hpss_attr_in->TimeModified);
00762           else
00763             p_fsalattr_out->mtime = hpss2fsal_time(p_hpss_attr_in->TimeCreated);
00764           break;
00765 
00766         default:
00767           ReturnCode(ERR_FSAL_SERVERFAULT, 0);
00768 
00769         }
00770     }
00771 
00772   if(FSAL_TEST_MASK(p_fsalattr_out->asked_attributes, FSAL_ATTR_CHGTIME))
00773     {
00774       p_fsalattr_out->chgtime
00775           =
00776           hpss2fsal_time(MAX_3
00777                          (p_hpss_attr_in->TimeModified, p_hpss_attr_in->TimeCreated,
00778                           p_hpss_attr_in->TimeLastWritten));
00779       p_fsalattr_out->change = (uint64_t) p_fsalattr_out->chgtime.seconds ;
00780     }
00781 
00782   if(FSAL_TEST_MASK(p_fsalattr_out->asked_attributes, FSAL_ATTR_SPACEUSED))
00783     {
00784       p_fsalattr_out->spaceused = hpss2fsal_64(p_hpss_attr_in->DataLength);
00785     }
00786   if(FSAL_TEST_MASK(p_fsalattr_out->asked_attributes, FSAL_ATTR_MOUNTFILEID))
00787     {
00788       p_fsalattr_out->mounted_on_fileid = hpss2fsal_64(p_hpss_attr_in->FilesetRootId);
00789     }
00790 
00791   /* everything has been copied ! */
00792 
00793   ReturnCode(ERR_FSAL_NO_ERROR, 0);
00794 
00795 }
00796 
00817 fsal_status_t hpssHandle2fsalAttributes(ns_ObjHandle_t * p_hpsshandle_in,
00818                                         fsal_attrib_list_t * p_fsalattr_out)
00819 {
00820 
00821   fsal_attrib_mask_t avail_attr, unavail_attr;
00822 
00823   /* sanity check */
00824   if(!p_hpsshandle_in || !p_fsalattr_out)
00825     ReturnCode(ERR_FSAL_FAULT, 0);
00826 
00827   /* check that asked attributes are available */
00828   avail_attr = (FSAL_ATTR_SUPPATTR | FSAL_ATTR_TYPE | FSAL_ATTR_FILEID);
00829 
00830   unavail_attr = (p_fsalattr_out->asked_attributes) & (~avail_attr);
00831   if(unavail_attr)
00832     {
00833       LogFullDebug(COMPONENT_FSAL,
00834                         "Attributes not available: %#llX", unavail_attr);
00835       ReturnCode(ERR_FSAL_ATTRNOTSUPP, 0);
00836     }
00837 
00838   /* Fills the output struct */
00839   if(FSAL_TEST_MASK(p_fsalattr_out->asked_attributes, FSAL_ATTR_SUPPATTR))
00840     {
00841       p_fsalattr_out->supported_attributes = global_fs_info.supported_attrs;
00842     }
00843   if(FSAL_TEST_MASK(p_fsalattr_out->asked_attributes, FSAL_ATTR_TYPE))
00844     {
00845       p_fsalattr_out->type = hpss2fsal_type(p_hpsshandle_in->Type);
00846     }
00847   if(FSAL_TEST_MASK(p_fsalattr_out->asked_attributes, FSAL_ATTR_FILEID))
00848     {
00849       p_fsalattr_out->fileid = (fsal_u64_t) hpss_GetObjId(p_hpsshandle_in);
00850     }
00851 
00852   /* everything has been copied ! */
00853 
00854   ReturnCode(ERR_FSAL_NO_ERROR, 0);
00855 
00856 }
00857 
00883 fsal_status_t fsal2hpss_attribset(hpssfsal_handle_t * p_fsal_handle,
00884                                   fsal_attrib_list_t * p_attrib_set,
00885                                   hpss_fileattrbits_t * p_hpss_attrmask,
00886                                   hpss_Attrs_t * p_hpss_attrs)
00887 {
00888 
00889   fsal_attrib_mask_t settable_attrs, supp_attrs, unavail_attrs, unsettable_attrs;
00890 
00891   /* sanity check */
00892 
00893   if(!p_attrib_set || !p_hpss_attrmask || !p_hpss_attrs)
00894     ReturnCode(ERR_FSAL_FAULT, 0);
00895 
00896   /* init output values */
00897 
00898   memset(p_hpss_attrmask, 0, sizeof(hpss_fileattrbits_t));
00899   memset(p_hpss_attrs, 0, sizeof(hpss_Attrs_t));
00900 
00903   /* Supported attributes */
00904 
00905   supp_attrs = global_fs_info.supported_attrs;
00906 
00907   /* Settable attrs. */
00908 
00909   settable_attrs = (FSAL_ATTR_SIZE | FSAL_ATTR_ACL |
00910                     FSAL_ATTR_MODE | FSAL_ATTR_OWNER |
00911                     FSAL_ATTR_GROUP | FSAL_ATTR_ATIME |
00912                     FSAL_ATTR_CTIME | FSAL_ATTR_MTIME);
00913 
00914   /* If there are unsupported attributes, return ERR_FSAL_ATTRNOTSUPP */
00915 
00916   unavail_attrs = (p_attrib_set->asked_attributes) & (~supp_attrs);
00917 
00918   if(unavail_attrs)
00919     {
00920       LogFullDebug(COMPONENT_FSAL,
00921                         "Attributes not supported: %#llX", unavail_attrs);
00922 
00923       /* Error : unsupported attribute. */
00924 
00925       ReturnCode(ERR_FSAL_ATTRNOTSUPP, 0);
00926     }
00927 
00928   /* If there are read-only attributes, return. */
00929 
00930   unsettable_attrs = (p_attrib_set->asked_attributes) & (~settable_attrs);
00931 
00932   if(unsettable_attrs)
00933     {
00934       LogFullDebug(COMPONENT_FSAL,
00935                         "Read-Only Attributes: %#llX", unsettable_attrs);
00936 
00937       /* Error : unsettable attribute. */
00938 
00939       ReturnCode(ERR_FSAL_INVAL, 0);
00940     }
00941 
00942   /* convert settable attributes */
00943 
00944   if(FSAL_TEST_MASK(p_attrib_set->asked_attributes, FSAL_ATTR_SIZE))
00945     {
00946 
00947       (*p_hpss_attrmask) =
00948           API_AddRegisterValues(*p_hpss_attrmask, CORE_ATTR_DATA_LENGTH, -1);
00949 
00950       p_hpss_attrs->DataLength = fsal2hpss_64(p_attrib_set->filesize);
00951 
00952     }
00953 
00956   if(FSAL_TEST_MASK(p_attrib_set->asked_attributes, FSAL_ATTR_MODE))
00957     {
00958 
00959       (*p_hpss_attrmask) =
00960           API_AddRegisterValues(*p_hpss_attrmask,
00961                                 CORE_ATTR_USER_PERMS,
00962                                 CORE_ATTR_GROUP_PERMS, CORE_ATTR_OTHER_PERMS,
00963 #if HPSS_MAJOR_VERSION < 7
00964                                 CORE_ATTR_SET_GID,
00965                                 CORE_ATTR_SET_UID, CORE_ATTR_SET_STICKY,
00966 #else
00967                                 CORE_ATTR_MODE_PERMS,
00968 #endif
00969                                 -1);
00970 
00971       /* convert mode and set output structure. */
00972       fsal2hpss_mode(p_attrib_set->mode,
00973 #if HPSS_MAJOR_VERSION < 7
00974                      &(p_hpss_attrs->SetUIDBit),
00975                      &(p_hpss_attrs->SetGIDBit), &(p_hpss_attrs->SetStickyBit),
00976 #else
00977                      &(p_hpss_attrs->ModePerms),
00978 #endif
00979                      &(p_hpss_attrs->UserPerms),
00980                      &(p_hpss_attrs->GroupPerms), &(p_hpss_attrs->OtherPerms));
00981 
00982     }
00983 
00984   if(FSAL_TEST_MASK(p_attrib_set->asked_attributes, FSAL_ATTR_OWNER))
00985     {
00986 
00987       (*p_hpss_attrmask) = API_AddRegisterValues(*p_hpss_attrmask, CORE_ATTR_UID, -1);
00988 
00989       p_hpss_attrs->UID = p_attrib_set->owner;
00990 
00991       LogFullDebug(COMPONENT_FSAL, "Setting Owner = : %d ",
00992                         p_attrib_set->owner);
00993     }
00994 
00995   if(FSAL_TEST_MASK(p_attrib_set->asked_attributes, FSAL_ATTR_GROUP))
00996     {
00997 
00998       (*p_hpss_attrmask) = API_AddRegisterValues(*p_hpss_attrmask, CORE_ATTR_GID, -1);
00999 
01000       p_hpss_attrs->GID = p_attrib_set->group;
01001 
01002     }
01003 
01004   if(FSAL_TEST_MASK(p_attrib_set->asked_attributes, FSAL_ATTR_ATIME))
01005     {
01006 
01007       (*p_hpss_attrmask) =
01008           API_AddRegisterValues(*p_hpss_attrmask, CORE_ATTR_TIME_LAST_READ, -1);
01009 
01010       p_hpss_attrs->TimeLastRead = fsal2hpss_time(p_attrib_set->atime);
01011 
01012       LogFullDebug(COMPONENT_FSAL, "Setting ATIME:");
01013       LogFullDebug(COMPONENT_FSAL, "\tTimeLastRead = %d",
01014                         p_hpss_attrs->TimeLastRead);
01015 
01016     }
01017 
01018   if(FSAL_TEST_MASK(p_attrib_set->asked_attributes, FSAL_ATTR_MTIME))
01019     {
01020       LogFullDebug(COMPONENT_FSAL, "Setting MTIME:");
01021       LogFullDebug(COMPONENT_FSAL, "\tType = %d", p_fsal_handle->data.obj_type);
01022 
01023       switch (p_fsal_handle->data.obj_type)
01024         {
01025         case FSAL_TYPE_FILE:
01026         case FSAL_TYPE_LNK:
01027 
01028           (*p_hpss_attrmask) =
01029               API_AddRegisterValues(*p_hpss_attrmask, CORE_ATTR_TIME_LAST_WRITTEN, -1);
01030           p_hpss_attrs->TimeLastWritten = fsal2hpss_time(p_attrib_set->mtime);
01031 
01032           LogFullDebug(COMPONENT_FSAL, "\tTimeLastWritten = %d",
01033                             p_hpss_attrs->TimeLastWritten);
01034 
01035           break;
01036 
01037         case FSAL_TYPE_DIR:
01038         case FSAL_TYPE_JUNCTION:
01039 
01040           (*p_hpss_attrmask) =
01041               API_AddRegisterValues(*p_hpss_attrmask, CORE_ATTR_TIME_MODIFIED, -1);
01042           p_hpss_attrs->TimeModified = fsal2hpss_time(p_attrib_set->mtime);
01043 
01044           LogFullDebug(COMPONENT_FSAL, "\tTimeModified = %d",
01045                             p_hpss_attrs->TimeModified);
01046 
01047           break;
01048 
01049         default:
01050           ReturnCode(ERR_FSAL_SERVERFAULT, 0);
01051 
01052         }                       /* end switch */
01053 
01054     }
01055   /* end testmask FSAL_ATTR_MTIME */
01056   if(FSAL_TEST_MASK(p_attrib_set->asked_attributes, FSAL_ATTR_CTIME))
01057     {
01058 
01059       (*p_hpss_attrmask) =
01060           API_AddRegisterValues(*p_hpss_attrmask, CORE_ATTR_TIME_MODIFIED, -1);
01061 
01062       p_hpss_attrs->TimeModified = fsal2hpss_time(p_attrib_set->ctime);
01063 
01064     }
01065 
01066   ReturnCode(ERR_FSAL_NO_ERROR, 0);
01067 
01068 }