nfs-ganesha 1.4
|
00001 /* 00002 * vim:expandtab:shiftwidth=4:tabstop=4: 00003 */ 00004 00015 #ifdef HAVE_CONFIG_H 00016 #include "config.h" 00017 #endif 00018 #include "fsal_convert.h" 00019 #include "fsal_internal.h" 00020 #include "nfs4_acls.h" 00021 #include "gpfs.h" 00022 #include <sys/types.h> 00023 #include <sys/stat.h> 00024 #include <errno.h> 00025 #include <string.h> 00026 #include <fcntl.h> 00027 #include <sys/resource.h> 00028 00029 #define MAX_2( x, y ) ( (x) > (y) ? (x) : (y) ) 00030 #define MAX_3( x, y, z ) ( (x) > (y) ? MAX_2((x),(z)) : MAX_2((y),(z)) ) 00031 extern uint32_t open_fd_count; 00032 00033 #ifdef _USE_NFS4_ACL 00034 static int gpfs_acl_2_fsal_acl(fsal_attrib_list_t * p_object_attributes, 00035 gpfs_acl_t *p_gpfsacl); 00036 #endif /* _USE_NFS4_ACL */ 00037 00049 int posix2fsal_error(int posix_errorcode) 00050 { 00051 struct rlimit rlim = { 00052 .rlim_cur = RLIM_INFINITY, 00053 .rlim_max = RLIM_INFINITY 00054 }; 00055 00056 switch (posix_errorcode) 00057 { 00058 00059 case EPERM: 00060 return ERR_FSAL_PERM; 00061 00062 case ENOENT: 00063 return ERR_FSAL_NOENT; 00064 00065 /* connection error */ 00066 #ifdef _AIX_5 00067 case ENOCONNECT: 00068 #elif defined _LINUX 00069 case ECONNREFUSED: 00070 case ECONNABORTED: 00071 case ECONNRESET: 00072 #endif 00073 00074 /* IO error */ 00075 case EIO: 00076 00077 /* too many open files */ 00078 case ENFILE: 00079 case EMFILE: 00080 00081 /* broken pipe */ 00082 case EPIPE: 00083 00084 /* all shown as IO errors */ 00085 if (getrlimit(RLIMIT_NOFILE, &rlim) != 0) { 00086 LogCrit(COMPONENT_FSAL, "%s mapping %d to ERR_FSAL_IO, open_fd_count=%d getrlimit failed", 00087 __FUNCTION__, posix_errorcode, open_fd_count); 00088 } 00089 else { 00090 LogCrit(COMPONENT_FSAL, "%s mapping %d to ERR_FSAL_IO, open_fd_count=%d rlim_cur=%ld rlim_max=%ld", 00091 __FUNCTION__, posix_errorcode, open_fd_count, rlim.rlim_cur, rlim.rlim_max); 00092 } 00093 return ERR_FSAL_IO; 00094 00095 /* no such device */ 00096 case ENODEV: 00097 case ENXIO: 00098 LogCrit(COMPONENT_FSAL, "%s mapping %d to ERR_FSAL_NXIO", 00099 __FUNCTION__, posix_errorcode); 00100 return ERR_FSAL_NXIO; 00101 00102 /* invalid file descriptor : */ 00103 case EBADF: 00104 /* we suppose it was not opened... */ 00105 00113 return ERR_FSAL_NOT_OPENED; 00114 00115 case ENOMEM: 00116 case ENOLCK: 00117 return ERR_FSAL_NOMEM; 00118 00119 case EACCES: 00120 return ERR_FSAL_ACCESS; 00121 00122 case EFAULT: 00123 return ERR_FSAL_FAULT; 00124 00125 case EEXIST: 00126 return ERR_FSAL_EXIST; 00127 00128 case EXDEV: 00129 return ERR_FSAL_XDEV; 00130 00131 case ENOTDIR: 00132 return ERR_FSAL_NOTDIR; 00133 00134 case EISDIR: 00135 return ERR_FSAL_ISDIR; 00136 00137 case EINVAL: 00138 return ERR_FSAL_INVAL; 00139 00140 case EFBIG: 00141 return ERR_FSAL_FBIG; 00142 00143 case ETXTBSY: 00144 return ERR_FSAL_FILE_OPEN; 00145 00146 case ENOSPC: 00147 return ERR_FSAL_NOSPC; 00148 00149 case EMLINK: 00150 return ERR_FSAL_MLINK; 00151 00152 case EDQUOT: 00153 return ERR_FSAL_DQUOT; 00154 00155 case ENAMETOOLONG: 00156 return ERR_FSAL_NAMETOOLONG; 00157 00164 #ifdef _AIX 00165 case 87: 00166 #else 00167 case ENOTEMPTY: 00168 case -ENOTEMPTY: 00169 #endif 00170 return ERR_FSAL_NOTEMPTY; 00171 00172 case ESTALE: 00173 return ERR_FSAL_STALE; 00174 00175 /* Error code that needs a retry */ 00176 case EAGAIN: 00177 case EBUSY: 00178 00179 return ERR_FSAL_DELAY; 00180 00181 case ENOTSUP: 00182 return ERR_FSAL_NOTSUPP; 00183 00184 case EOVERFLOW: 00185 return ERR_FSAL_OVERFLOW; 00186 00187 case EDEADLK: 00188 return ERR_FSAL_DEADLOCK; 00189 00190 case EINTR: 00191 return ERR_FSAL_INTERRUPT; 00192 00193 default: 00194 00195 /* other unexpected errors */ 00196 return ERR_FSAL_SERVERFAULT; 00197 00198 } 00199 00200 } 00201 00202 00216 int fsal2posix_openflags(fsal_openflags_t fsal_flags, int *p_posix_flags) 00217 { 00218 int cpt; 00219 00220 if(!p_posix_flags) 00221 return ERR_FSAL_FAULT; 00222 00223 /* check that all used flags exist */ 00224 00225 if(fsal_flags & 00226 ~(FSAL_O_RDONLY | FSAL_O_RDWR | FSAL_O_WRONLY | FSAL_O_APPEND | 00227 FSAL_O_TRUNC | FSAL_O_SYNC)) 00228 return ERR_FSAL_INVAL; 00229 00230 /* Check for flags compatibility */ 00231 00232 /* O_RDONLY O_WRONLY O_RDWR cannot be used together */ 00233 00234 cpt = 0; 00235 if(fsal_flags & FSAL_O_RDONLY) 00236 cpt++; 00237 if(fsal_flags & FSAL_O_RDWR) 00238 cpt++; 00239 if(fsal_flags & FSAL_O_WRONLY) 00240 cpt++; 00241 00242 if(cpt > 1) 00243 return ERR_FSAL_INVAL; 00244 00245 /* FSAL_O_APPEND et FSAL_O_TRUNC cannot be used together */ 00246 00247 if((fsal_flags & FSAL_O_APPEND) && (fsal_flags & FSAL_O_TRUNC)) 00248 return ERR_FSAL_INVAL; 00249 00250 /* FSAL_O_TRUNC without FSAL_O_WRONLY or FSAL_O_RDWR */ 00251 00252 if((fsal_flags & FSAL_O_TRUNC) && !(fsal_flags & (FSAL_O_WRONLY | FSAL_O_RDWR))) 00253 return ERR_FSAL_INVAL; 00254 00255 /* conversion */ 00256 *p_posix_flags = 0; 00257 00258 if(fsal_flags & FSAL_O_RDONLY) 00259 *p_posix_flags |= O_RDONLY; 00260 if(fsal_flags & FSAL_O_WRONLY) 00261 *p_posix_flags |= O_WRONLY; 00262 if(fsal_flags & FSAL_O_RDWR) 00263 *p_posix_flags |= O_RDWR; 00264 if(fsal_flags & FSAL_O_SYNC) 00265 *p_posix_flags |= O_SYNC; 00266 00267 return ERR_FSAL_NO_ERROR; 00268 00269 } 00270 00271 fsal_status_t posix2fsal_attributes(struct stat * p_buffstat, 00272 fsal_attrib_list_t * p_fsalattr_out) 00273 { 00274 00275 fsal_attrib_mask_t supp_attr, unsupp_attr; 00276 00277 /* sanity checks */ 00278 if(!p_buffstat || !p_fsalattr_out) 00279 ReturnCode(ERR_FSAL_FAULT, 0); 00280 00281 /* check that asked attributes are supported */ 00282 supp_attr = global_fs_info.supported_attrs; 00283 00284 unsupp_attr = (p_fsalattr_out->asked_attributes) & (~supp_attr); 00285 if(unsupp_attr) 00286 { 00287 LogFullDebug(COMPONENT_FSAL, "Unsupported attributes: %#llX", 00288 unsupp_attr); 00289 ReturnCode(ERR_FSAL_ATTRNOTSUPP, 0); 00290 } 00291 00292 /* Initialize ACL regardless of whether ACL was asked or not. 00293 * This is needed to make sure ACL attribute is initialized. */ 00294 p_fsalattr_out->acl = NULL; 00295 00296 /* Fills the output struct */ 00297 if(FSAL_TEST_MASK(p_fsalattr_out->asked_attributes, FSAL_ATTR_SUPPATTR)) 00298 { 00299 p_fsalattr_out->supported_attributes = supp_attr; 00300 } 00301 if(FSAL_TEST_MASK(p_fsalattr_out->asked_attributes, FSAL_ATTR_TYPE)) 00302 { 00303 p_fsalattr_out->type = posix2fsal_type(p_buffstat->st_mode); 00304 } 00305 if(FSAL_TEST_MASK(p_fsalattr_out->asked_attributes, FSAL_ATTR_SIZE)) 00306 { 00307 p_fsalattr_out->filesize = p_buffstat->st_size; 00308 } 00309 if(FSAL_TEST_MASK(p_fsalattr_out->asked_attributes, FSAL_ATTR_FSID)) 00310 { 00311 p_fsalattr_out->fsid = posix2fsal_fsid(p_buffstat->st_dev); 00312 } 00313 if(FSAL_TEST_MASK(p_fsalattr_out->asked_attributes, FSAL_ATTR_ACL)) 00314 { 00315 p_fsalattr_out->acl = NULL; 00316 } 00317 if(FSAL_TEST_MASK(p_fsalattr_out->asked_attributes, FSAL_ATTR_FILEID)) 00318 { 00319 p_fsalattr_out->fileid = (fsal_u64_t) (p_buffstat->st_ino); 00320 } 00321 00322 if(FSAL_TEST_MASK(p_fsalattr_out->asked_attributes, FSAL_ATTR_MODE)) 00323 { 00324 p_fsalattr_out->mode = unix2fsal_mode(p_buffstat->st_mode); 00325 } 00326 if(FSAL_TEST_MASK(p_fsalattr_out->asked_attributes, FSAL_ATTR_NUMLINKS)) 00327 { 00328 p_fsalattr_out->numlinks = p_buffstat->st_nlink; 00329 } 00330 if(FSAL_TEST_MASK(p_fsalattr_out->asked_attributes, FSAL_ATTR_OWNER)) 00331 { 00332 p_fsalattr_out->owner = p_buffstat->st_uid; 00333 } 00334 if(FSAL_TEST_MASK(p_fsalattr_out->asked_attributes, FSAL_ATTR_GROUP)) 00335 { 00336 p_fsalattr_out->group = p_buffstat->st_gid; 00337 } 00338 if(FSAL_TEST_MASK(p_fsalattr_out->asked_attributes, FSAL_ATTR_ATIME)) 00339 { 00340 p_fsalattr_out->atime = posix2fsal_time(p_buffstat->st_atime, p_buffstat->st_atim.tv_nsec); 00341 } 00342 00343 if(FSAL_TEST_MASK(p_fsalattr_out->asked_attributes, FSAL_ATTR_CTIME)) 00344 { 00345 p_fsalattr_out->ctime = posix2fsal_time(p_buffstat->st_ctime, p_buffstat->st_ctim.tv_nsec); 00346 } 00347 if(FSAL_TEST_MASK(p_fsalattr_out->asked_attributes, FSAL_ATTR_MTIME)) 00348 { 00349 p_fsalattr_out->mtime = posix2fsal_time(p_buffstat->st_mtime, p_buffstat->st_mtim.tv_nsec); 00350 } 00351 00352 if(FSAL_TEST_MASK(p_fsalattr_out->asked_attributes, FSAL_ATTR_CHGTIME)) 00353 { 00354 if(p_buffstat->st_mtime == p_buffstat->st_ctime) 00355 { 00356 if(p_buffstat->st_mtim.tv_nsec > p_buffstat->st_ctim.tv_nsec) 00357 p_fsalattr_out->chgtime 00358 = posix2fsal_time(p_buffstat->st_mtime, p_buffstat->st_mtim.tv_nsec); 00359 else 00360 p_fsalattr_out->chgtime 00361 = posix2fsal_time(p_buffstat->st_ctime, p_buffstat->st_ctim.tv_nsec); 00362 } 00363 else if(p_buffstat->st_mtime > p_buffstat->st_ctime) 00364 { 00365 p_fsalattr_out->chgtime 00366 = posix2fsal_time(p_buffstat->st_mtime, p_buffstat->st_mtim.tv_nsec); 00367 } 00368 else 00369 { 00370 p_fsalattr_out->chgtime 00371 = posix2fsal_time(p_buffstat->st_ctime, p_buffstat->st_ctim.tv_nsec); 00372 } 00373 p_fsalattr_out->change = (uint64_t) p_fsalattr_out->chgtime.seconds + 00374 (uint64_t) p_fsalattr_out->chgtime.nseconds; 00375 } 00376 00377 if(FSAL_TEST_MASK(p_fsalattr_out->asked_attributes, FSAL_ATTR_SPACEUSED)) 00378 { 00379 p_fsalattr_out->spaceused = p_buffstat->st_blocks * S_BLKSIZE; 00380 } 00381 00382 if(FSAL_TEST_MASK(p_fsalattr_out->asked_attributes, FSAL_ATTR_RAWDEV)) 00383 { 00384 p_fsalattr_out->rawdev = posix2fsal_devt(p_buffstat->st_rdev); /* XXX: convert ? */ 00385 } 00386 /* mounted_on_fileid : 00387 if ( FSAL_TEST_MASK(p_fsalattr_out->asked_attributes, 00388 FSAL_ATTR_MOUNTFILEID )){ 00389 p_fsalattr_out->mounted_on_fileid = 00390 hpss2fsal_64( p_hpss_attr_in->FilesetRootId ); 00391 } 00392 */ 00393 00394 /* everything has been copied ! */ 00395 00396 ReturnCode(ERR_FSAL_NO_ERROR, 0); 00397 } 00398 00399 /* Same function as posixstat64_2_fsal_attributes. When NFS4 ACL support 00400 * is enabled, this will replace posixstat64_2_fsal_attributes. */ 00401 fsal_status_t gpfsfsal_xstat_2_fsal_attributes(gpfsfsal_xstat_t *p_buffxstat, 00402 fsal_attrib_list_t *p_fsalattr_out) 00403 { 00404 00405 fsal_attrib_mask_t supp_attr, unsupp_attr; 00406 struct stat *p_buffstat; 00407 00408 /* sanity checks */ 00409 if(!p_buffxstat || !p_fsalattr_out) 00410 ReturnCode(ERR_FSAL_FAULT, 0); 00411 00412 /* check that asked attributes are supported */ 00413 supp_attr = global_fs_info.supported_attrs; 00414 00415 unsupp_attr = (p_fsalattr_out->asked_attributes) & (~supp_attr); 00416 if(unsupp_attr) 00417 { 00418 LogFullDebug(COMPONENT_FSAL, "Unsupported attributes: %#llX", 00419 unsupp_attr); 00420 ReturnCode(ERR_FSAL_ATTRNOTSUPP, 0); 00421 } 00422 00423 p_buffstat = &p_buffxstat->buffstat; 00424 00425 /* Fills the output struct */ 00426 if(FSAL_TEST_MASK(p_fsalattr_out->asked_attributes, FSAL_ATTR_SUPPATTR)) 00427 { 00428 p_fsalattr_out->supported_attributes = supp_attr; 00429 LogFullDebug(COMPONENT_FSAL, "supported_attributes = %llu", p_fsalattr_out->supported_attributes); 00430 } 00431 if(FSAL_TEST_MASK(p_fsalattr_out->asked_attributes, FSAL_ATTR_TYPE)) 00432 { 00433 p_fsalattr_out->type = posix2fsal_type(p_buffstat->st_mode); 00434 LogFullDebug(COMPONENT_FSAL, "type = 0x%x", p_fsalattr_out->type); 00435 } 00436 if(FSAL_TEST_MASK(p_fsalattr_out->asked_attributes, FSAL_ATTR_SIZE)) 00437 { 00438 p_fsalattr_out->filesize = p_buffstat->st_size; 00439 LogFullDebug(COMPONENT_FSAL, "filesize = %llu", 00440 (unsigned long long)p_fsalattr_out->filesize); 00441 } 00442 if(FSAL_TEST_MASK(p_fsalattr_out->asked_attributes, FSAL_ATTR_FSID)) 00443 { 00444 p_fsalattr_out->fsid = posix2fsal_fsid(p_buffstat->st_dev); 00445 LogFullDebug(COMPONENT_FSAL, "fsid major = %llu, minor = %llu", p_fsalattr_out->fsid.major, p_fsalattr_out->fsid.minor); 00446 } 00447 if(FSAL_TEST_MASK(p_fsalattr_out->asked_attributes, FSAL_ATTR_ACL)) 00448 { 00449 #ifndef _USE_NFS4_ACL 00450 p_fsalattr_out->acl = NULL; 00451 #else 00452 if(p_buffxstat->attr_valid & XATTR_ACL) 00453 { 00454 /* ACL is valid, so try to convert fsal acl. */ 00455 if(gpfs_acl_2_fsal_acl(p_fsalattr_out, 00456 (gpfs_acl_t *)p_buffxstat->buffacl) != ERR_FSAL_NO_ERROR) 00457 p_fsalattr_out->acl = NULL; 00458 } 00459 #endif /* _USE_NFS4_ACL */ 00460 LogFullDebug(COMPONENT_FSAL, "acl = %p", p_fsalattr_out->acl); 00461 } 00462 if(FSAL_TEST_MASK(p_fsalattr_out->asked_attributes, FSAL_ATTR_FILEID)) 00463 { 00464 p_fsalattr_out->fileid = (fsal_u64_t) (p_buffstat->st_ino); 00465 LogFullDebug(COMPONENT_FSAL, "fileid = %llu", p_fsalattr_out->fileid); 00466 } 00467 00468 if(FSAL_TEST_MASK(p_fsalattr_out->asked_attributes, FSAL_ATTR_MODE)) 00469 { 00470 p_fsalattr_out->mode = unix2fsal_mode(p_buffstat->st_mode); 00471 LogFullDebug(COMPONENT_FSAL, "mode = %llu", (long long unsigned int) p_fsalattr_out->mode); 00472 } 00473 if(FSAL_TEST_MASK(p_fsalattr_out->asked_attributes, FSAL_ATTR_NUMLINKS)) 00474 { 00475 p_fsalattr_out->numlinks = p_buffstat->st_nlink; 00476 LogFullDebug(COMPONENT_FSAL, "numlinks = %lu", p_fsalattr_out->numlinks); 00477 } 00478 if(FSAL_TEST_MASK(p_fsalattr_out->asked_attributes, FSAL_ATTR_OWNER)) 00479 { 00480 p_fsalattr_out->owner = p_buffstat->st_uid; 00481 LogFullDebug(COMPONENT_FSAL, "owner = %u", p_fsalattr_out->owner); 00482 } 00483 if(FSAL_TEST_MASK(p_fsalattr_out->asked_attributes, FSAL_ATTR_GROUP)) 00484 { 00485 p_fsalattr_out->group = p_buffstat->st_gid; 00486 LogFullDebug(COMPONENT_FSAL, "group = %u", p_fsalattr_out->group); 00487 } 00488 if(FSAL_TEST_MASK(p_fsalattr_out->asked_attributes, FSAL_ATTR_ATIME)) 00489 { 00490 p_fsalattr_out->atime = posix2fsal_time(p_buffstat->st_atime, p_buffstat->st_atim.tv_nsec); 00491 LogFullDebug(COMPONENT_FSAL, "atime = %u", p_fsalattr_out->atime.seconds); 00492 } 00493 00494 if(FSAL_TEST_MASK(p_fsalattr_out->asked_attributes, FSAL_ATTR_CTIME)) 00495 { 00496 p_fsalattr_out->ctime = posix2fsal_time(p_buffstat->st_ctime, p_buffstat->st_ctim.tv_nsec); 00497 LogFullDebug(COMPONENT_FSAL, "ctime = %u", p_fsalattr_out->ctime.seconds); 00498 } 00499 if(FSAL_TEST_MASK(p_fsalattr_out->asked_attributes, FSAL_ATTR_MTIME)) 00500 { 00501 p_fsalattr_out->mtime = posix2fsal_time(p_buffstat->st_mtime, p_buffstat->st_mtim.tv_nsec); 00502 LogFullDebug(COMPONENT_FSAL, "mtime = %u", p_fsalattr_out->mtime.seconds); 00503 } 00504 00505 if(FSAL_TEST_MASK(p_fsalattr_out->asked_attributes, FSAL_ATTR_CHGTIME)) 00506 { 00507 if(p_buffstat->st_mtime == p_buffstat->st_ctime) 00508 { 00509 if(p_buffstat->st_mtim.tv_nsec > p_buffstat->st_ctim.tv_nsec) 00510 p_fsalattr_out->chgtime 00511 = posix2fsal_time(p_buffstat->st_mtime, p_buffstat->st_mtim.tv_nsec); 00512 else 00513 p_fsalattr_out->chgtime 00514 = posix2fsal_time(p_buffstat->st_ctime, p_buffstat->st_ctim.tv_nsec); 00515 } 00516 else if(p_buffstat->st_mtime > p_buffstat->st_ctime) 00517 { 00518 p_fsalattr_out->chgtime 00519 = posix2fsal_time(p_buffstat->st_mtime, p_buffstat->st_mtim.tv_nsec); 00520 } 00521 else 00522 { 00523 p_fsalattr_out->chgtime 00524 = posix2fsal_time(p_buffstat->st_ctime, p_buffstat->st_ctim.tv_nsec); 00525 } 00526 p_fsalattr_out->change = (uint64_t) p_fsalattr_out->chgtime.seconds + 00527 (uint64_t) p_fsalattr_out->chgtime.nseconds; 00528 LogFullDebug(COMPONENT_FSAL, "chgtime = %u", p_fsalattr_out->chgtime.seconds); 00529 00530 } 00531 00532 if(FSAL_TEST_MASK(p_fsalattr_out->asked_attributes, FSAL_ATTR_SPACEUSED)) 00533 { 00534 p_fsalattr_out->spaceused = p_buffstat->st_blocks * S_BLKSIZE; 00535 LogFullDebug(COMPONENT_FSAL, "spaceused = %llu", 00536 (unsigned long long)p_fsalattr_out->spaceused); 00537 } 00538 00539 if(FSAL_TEST_MASK(p_fsalattr_out->asked_attributes, FSAL_ATTR_RAWDEV)) 00540 { 00541 p_fsalattr_out->rawdev = posix2fsal_devt(p_buffstat->st_rdev); /* XXX: convert ? */ 00542 LogFullDebug(COMPONENT_FSAL, 00543 "rawdev major = %u, minor = %u", 00544 (unsigned int) p_fsalattr_out->rawdev.major, 00545 (unsigned int) p_fsalattr_out->rawdev.minor); 00546 } 00547 /* mounted_on_fileid : 00548 if ( FSAL_TEST_MASK(p_fsalattr_out->asked_attributes, 00549 FSAL_ATTR_MOUNTFILEID )){ 00550 p_fsalattr_out->mounted_on_fileid = 00551 hpss2fsal_64( p_hpss_attr_in->FilesetRootId ); 00552 } 00553 */ 00554 00555 /* everything has been copied ! */ 00556 00557 ReturnCode(ERR_FSAL_NO_ERROR, 0); 00558 } 00559 00560 #ifdef _USE_NFS4_ACL 00561 /* Covert GPFS NFS4 ACLs to FSAL ACLs, and set the ACL 00562 * pointer of attribute. */ 00563 static int gpfs_acl_2_fsal_acl(fsal_attrib_list_t * p_object_attributes, 00564 gpfs_acl_t *p_gpfsacl) 00565 { 00566 fsal_acl_status_t status; 00567 fsal_acl_data_t acldata; 00568 fsal_ace_t *pace; 00569 fsal_acl_t *pacl; 00570 gpfs_ace_v4_t *pace_gpfs; 00571 00572 /* sanity checks */ 00573 if(!p_object_attributes || !p_gpfsacl) 00574 return ERR_FSAL_FAULT; 00575 00576 /* Create fsal acl data. */ 00577 acldata.naces = p_gpfsacl->acl_nace; 00578 acldata.aces = (fsal_ace_t *)nfs4_ace_alloc(acldata.naces); 00579 00580 /* Fill fsal acl data from gpfs acl. */ 00581 for(pace = acldata.aces, pace_gpfs = p_gpfsacl->ace_v4; 00582 pace < acldata.aces + acldata.naces; pace++, pace_gpfs++) 00583 { 00584 pace->type = pace_gpfs->aceType; 00585 pace->flag = pace_gpfs->aceFlags; 00586 pace->iflag = pace_gpfs->aceIFlags; 00587 pace->perm = pace_gpfs->aceMask; 00588 00589 if(IS_FSAL_ACE_SPECIAL_ID(*pace)) /* Record special user. */ 00590 { 00591 pace->who.uid = pace_gpfs->aceWho; 00592 } 00593 else 00594 { 00595 if(IS_FSAL_ACE_GROUP_ID(*pace)) /* Record group. */ 00596 pace->who.gid = pace_gpfs->aceWho; 00597 else /* Record user. */ 00598 pace->who.uid = pace_gpfs->aceWho; 00599 } 00600 00601 LogDebug(COMPONENT_FSAL, 00602 "gpfs_acl_2_fsal_acl: fsal ace: type = 0x%x, flag = 0x%x, perm = 0x%x, special = %d, %s = 0x%x", 00603 pace->type, pace->flag, pace->perm, IS_FSAL_ACE_SPECIAL_ID(*pace), 00604 GET_FSAL_ACE_WHO_TYPE(*pace), GET_FSAL_ACE_WHO(*pace)); 00605 } 00606 00607 /* Create a new hash table entry for fsal acl. */ 00608 pacl = nfs4_acl_new_entry(&acldata, &status); 00609 LogDebug(COMPONENT_FSAL, "fsal acl = %p, fsal_acl_status = %u", pacl, status); 00610 00611 if(pacl == NULL) 00612 { 00613 LogCrit(COMPONENT_FSAL, "gpfs_acl_2_fsal_acl: failed to create a new acl entry"); 00614 return ERR_FSAL_FAULT; 00615 } 00616 00617 /* Add fsal acl to attribute. */ 00618 p_object_attributes->acl = pacl; 00619 00620 return ERR_FSAL_NO_ERROR; 00621 } 00622 00623 /* Covert FSAL ACLs to GPFS NFS4 ACLs. */ 00624 fsal_status_t fsal_acl_2_gpfs_acl(fsal_acl_t *p_fsalacl, gpfsfsal_xstat_t *p_buffxstat) 00625 { 00626 int i; 00627 fsal_ace_t *pace; 00628 gpfs_acl_t *p_gpfsacl; 00629 00630 p_gpfsacl = (gpfs_acl_t *) p_buffxstat->buffacl; 00631 00632 p_gpfsacl->acl_level = 0; 00633 p_gpfsacl->acl_version = GPFS_ACL_VERSION_NFS4; 00634 p_gpfsacl->acl_type = GPFS_ACL_TYPE_NFS4; 00635 p_gpfsacl->acl_nace = p_fsalacl->naces; 00636 p_gpfsacl->acl_len = ((int)(signed long)&(((gpfs_acl_t *) 0)->ace_v1)) + p_gpfsacl->acl_nace * sizeof(gpfs_ace_v4_t); 00637 00638 for(pace = p_fsalacl->aces, i = 0; pace < p_fsalacl->aces + p_fsalacl->naces; pace++, i++) 00639 { 00640 p_gpfsacl->ace_v4[i].aceType = pace->type; 00641 p_gpfsacl->ace_v4[i].aceFlags = pace->flag; 00642 p_gpfsacl->ace_v4[i].aceIFlags = pace->iflag; 00643 p_gpfsacl->ace_v4[i].aceMask = pace->perm; 00644 00645 if(IS_FSAL_ACE_SPECIAL_ID(*pace)) 00646 p_gpfsacl->ace_v4[i].aceWho = pace->who.uid; 00647 else 00648 { 00649 if(IS_FSAL_ACE_GROUP_ID(*pace)) 00650 p_gpfsacl->ace_v4[i].aceWho = pace->who.gid; 00651 else 00652 p_gpfsacl->ace_v4[i].aceWho = pace->who.uid; 00653 } 00654 00655 LogDebug(COMPONENT_FSAL, "fsal_acl_2_gpfs_acl: gpfs ace: type = 0x%x, flag = 0x%x, perm = 0x%x, special = %d, %s = 0x%x", 00656 p_gpfsacl->ace_v4[i].aceType, p_gpfsacl->ace_v4[i].aceFlags, p_gpfsacl->ace_v4[i].aceMask, 00657 (p_gpfsacl->ace_v4[i].aceIFlags & FSAL_ACE_IFLAG_SPECIAL_ID) ? 1 : 0, 00658 (p_gpfsacl->ace_v4[i].aceFlags & FSAL_ACE_FLAG_GROUP_ID) ? "gid" : "uid", 00659 p_gpfsacl->ace_v4[i].aceWho); 00660 00661 } 00662 00663 ReturnCode(ERR_FSAL_NO_ERROR, 0); 00664 } 00665 00666 fsal_status_t fsal_cred_2_gpfs_cred(struct user_credentials *p_fsalcred, 00667 struct xstat_cred_t *p_gpfscred) 00668 { 00669 int i; 00670 00671 if(!p_fsalcred || !p_gpfscred) 00672 ReturnCode(ERR_FSAL_FAULT, 0); 00673 00674 p_gpfscred->principal = p_fsalcred->user; 00675 p_gpfscred->group = p_fsalcred->group; 00676 p_gpfscred->num_groups = p_fsalcred->nbgroups; 00677 00678 for(i = 0; i < p_fsalcred->nbgroups; i++) 00679 { 00680 p_gpfscred->eGroups[i] = p_fsalcred->alt_groups[i]; 00681 } 00682 00683 ReturnCode(ERR_FSAL_NO_ERROR, 0); 00684 } 00685 00686 fsal_status_t fsal_mode_2_gpfs_mode(fsal_accessmode_t fsal_mode, 00687 fsal_accessflags_t v4mask, 00688 unsigned int *p_gpfsmode, 00689 fsal_boolean_t is_dir) 00690 { 00691 int gpfs_mode = 0; 00692 00693 if(!p_gpfsmode) 00694 ReturnCode(ERR_FSAL_FAULT, 0); 00695 00696 /* If mode is zero, translate v4mask to posix mode. */ 00697 if(fsal_mode == 0) 00698 { 00699 if(!is_dir) 00700 { 00701 if(v4mask & FSAL_ACE_PERM_READ_DATA) 00702 gpfs_mode |= FSAL_R_OK; 00703 } 00704 else 00705 { 00706 if(v4mask & FSAL_ACE_PERM_LIST_DIR) 00707 { 00708 gpfs_mode |= FSAL_R_OK; 00709 gpfs_mode |= FSAL_X_OK; 00710 } 00711 } 00712 00713 if(!is_dir) 00714 { 00715 if(v4mask & FSAL_ACE_PERM_WRITE_DATA) 00716 gpfs_mode |= FSAL_W_OK; 00717 } 00718 else 00719 { 00720 if(v4mask & FSAL_ACE_PERM_ADD_FILE) 00721 { 00722 gpfs_mode |= FSAL_W_OK; 00723 gpfs_mode |= FSAL_X_OK; 00724 } 00725 } 00726 00727 if(!is_dir) 00728 { 00729 if(v4mask & FSAL_ACE_PERM_APPEND_DATA) 00730 gpfs_mode |= FSAL_W_OK; 00731 } 00732 else 00733 { 00734 if(v4mask & FSAL_ACE_PERM_ADD_SUBDIRECTORY) 00735 { 00736 gpfs_mode |= FSAL_W_OK; 00737 gpfs_mode |= FSAL_X_OK; 00738 } 00739 } 00740 00741 #if 0 00742 if(v4mask & FSAL_ACE_PERM_READ_NAMED_ATTR) 00743 gpfs_mode |= FSAL_R_OK; 00744 00745 if(v4mask & FSAL_ACE_PERM_WRITE_NAMED_ATTR) 00746 gpfs_mode |= FSAL_W_OK; 00747 #endif 00748 00749 if(!is_dir) 00750 { 00751 if(v4mask & FSAL_ACE_PERM_EXECUTE) 00752 gpfs_mode |= FSAL_X_OK; 00753 } 00754 else 00755 { 00756 if(v4mask & FSAL_ACE_PERM_DELETE_CHILD) 00757 { 00758 gpfs_mode |= FSAL_W_OK; 00759 gpfs_mode |= FSAL_X_OK; 00760 } 00761 } 00762 00763 #if 0 00764 if(v4mask & FSAL_ACE_PERM_READ_ATTR) 00765 gpfs_mode |= FSAL_R_OK; 00766 00767 if(v4mask & FSAL_ACE_PERM_WRITE_ATTR) 00768 gpfs_mode |= FSAL_W_OK; 00769 #endif 00770 00771 if(v4mask & FSAL_ACE_PERM_DELETE) 00772 gpfs_mode |= FSAL_W_OK; 00773 00774 #if 0 00775 if(v4mask & FSAL_ACE_PERM_READ_ACL) 00776 gpfs_mode |= FSAL_R_OK; 00777 00778 if(v4mask & FSAL_ACE_PERM_WRITE_ACL) 00779 gpfs_mode |= FSAL_W_OK; 00780 00781 if(v4mask & FSAL_ACE_PERM_WRITE_OWNER) 00782 gpfs_mode |= FSAL_W_OK; 00783 #endif 00784 00785 gpfs_mode = gpfs_mode >> 24; 00786 } 00787 else 00788 { 00789 gpfs_mode = fsal_mode >> 24; 00790 } 00791 00792 LogDebug(COMPONENT_FSAL, 00793 "fsal_mode 0x%x, v4mask 0x%x, is_dir %d converted to gpfs_mode 0x%x", 00794 fsal_mode, v4mask, is_dir, gpfs_mode); 00795 00796 *p_gpfsmode = gpfs_mode; 00797 00798 ReturnCode(ERR_FSAL_NO_ERROR, 0); 00799 } 00800 #endif /* _USE_NFS4_ACL */