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 #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 }