void posix2fsal_attributes(const struct stat *buffstat, struct attrlist *fsalattr) { FSAL_CLEAR_MASK(fsalattr->mask); /* Fills the output struct */ fsalattr->type = posix2fsal_type(buffstat->st_mode); FSAL_SET_MASK(fsalattr->mask, ATTR_TYPE); fsalattr->filesize = buffstat->st_size; FSAL_SET_MASK(fsalattr->mask, ATTR_SIZE); fsalattr->fsid = posix2fsal_fsid(buffstat->st_dev); FSAL_SET_MASK(fsalattr->mask, ATTR_FSID); fsalattr->fileid = buffstat->st_ino; FSAL_SET_MASK(fsalattr->mask, ATTR_FILEID); fsalattr->mode = unix2fsal_mode(buffstat->st_mode); FSAL_SET_MASK(fsalattr->mask, ATTR_MODE); fsalattr->numlinks = buffstat->st_nlink; FSAL_SET_MASK(fsalattr->mask, ATTR_NUMLINKS); fsalattr->owner = buffstat->st_uid; FSAL_SET_MASK(fsalattr->mask, ATTR_OWNER); fsalattr->group = buffstat->st_gid; FSAL_SET_MASK(fsalattr->mask, ATTR_GROUP); /* Use full timer resolution */ #ifdef LINUX fsalattr->atime = buffstat->st_atim; fsalattr->ctime = buffstat->st_ctim; fsalattr->mtime = buffstat->st_mtim; fsalattr->chgtime = (gsh_time_cmp(&buffstat->st_mtim, &buffstat->st_ctim) > 0) ? fsalattr->mtime : fsalattr->ctime; #elif FREEBSD fsalattr->atime = buffstat->st_atimespec; fsalattr->ctime = buffstat->st_ctimespec; fsalattr->mtime = buffstat->st_mtimespec; fsalattr->chgtime = (gsh_time_cmp(&buffstat->st_mtimespec, &buffstat->st_ctimespec) > 0) ? fsalattr->mtime : fsalattr->ctime; #endif FSAL_SET_MASK(fsalattr->mask, ATTR_ATIME); FSAL_SET_MASK(fsalattr->mask, ATTR_CTIME); FSAL_SET_MASK(fsalattr->mask, ATTR_MTIME); fsalattr->change = timespec_to_nsecs(&fsalattr->chgtime); FSAL_SET_MASK(fsalattr->mask, ATTR_CHGTIME); fsalattr->spaceused = buffstat->st_blocks * S_BLKSIZE; FSAL_SET_MASK(fsalattr->mask, ATTR_SPACEUSED); fsalattr->rawdev = posix2fsal_devt(buffstat->st_rdev); FSAL_SET_MASK(fsalattr->mask, ATTR_RAWDEV); }
fsal_status_t posix2fsal_attributes(struct stat * p_buffstat, struct attrlist * p_fsalattr_out) { /* sanity checks */ if(!p_buffstat || !p_fsalattr_out) return fsalstat(ERR_FSAL_FAULT, 0); /* Initialize ACL regardless of whether ACL was asked or not. * This is needed to make sure ACL attribute is initialized. */ p_fsalattr_out->acl = NULL; /* Fills the output struct */ if(FSAL_TEST_MASK(p_fsalattr_out->mask, ATTR_TYPE)) { p_fsalattr_out->type = posix2fsal_type(p_buffstat->st_mode); } if(FSAL_TEST_MASK(p_fsalattr_out->mask, ATTR_SIZE)) { p_fsalattr_out->filesize = p_buffstat->st_size; } if(FSAL_TEST_MASK(p_fsalattr_out->mask, ATTR_FSID)) { p_fsalattr_out->fsid = posix2fsal_fsid(p_buffstat->st_dev); } if(FSAL_TEST_MASK(p_fsalattr_out->mask, ATTR_ACL)) { p_fsalattr_out->acl = NULL; } if(FSAL_TEST_MASK(p_fsalattr_out->mask, ATTR_FILEID)) { p_fsalattr_out->fileid = (uint64_t) (p_buffstat->st_ino); } if(FSAL_TEST_MASK(p_fsalattr_out->mask, ATTR_MODE)) { p_fsalattr_out->mode = unix2fsal_mode(p_buffstat->st_mode); } if(FSAL_TEST_MASK(p_fsalattr_out->mask, ATTR_NUMLINKS)) { p_fsalattr_out->numlinks = p_buffstat->st_nlink; } if(FSAL_TEST_MASK(p_fsalattr_out->mask, ATTR_OWNER)) { p_fsalattr_out->owner = p_buffstat->st_uid; } if(FSAL_TEST_MASK(p_fsalattr_out->mask, ATTR_GROUP)) { p_fsalattr_out->group = p_buffstat->st_gid; } if(FSAL_TEST_MASK(p_fsalattr_out->mask, ATTR_ATIME)) { p_fsalattr_out->atime = p_buffstat->st_atim; } if(FSAL_TEST_MASK(p_fsalattr_out->mask, ATTR_CTIME)) { p_fsalattr_out->ctime = p_buffstat->st_ctim; } if(FSAL_TEST_MASK(p_fsalattr_out->mask, ATTR_MTIME)) { p_fsalattr_out->mtime = p_buffstat->st_mtim; } if(FSAL_TEST_MASK(p_fsalattr_out->mask, ATTR_CHGTIME)) { p_fsalattr_out->chgtime = (gsh_time_cmp(&p_buffstat->st_mtim, &p_buffstat->st_ctim) > 0) ? p_buffstat->st_mtim : p_buffstat->st_ctim; /* XXX */ p_fsalattr_out->change = p_fsalattr_out->chgtime.tv_sec + p_fsalattr_out->chgtime.tv_nsec; } if(FSAL_TEST_MASK(p_fsalattr_out->mask, ATTR_SPACEUSED)) { p_fsalattr_out->spaceused = p_buffstat->st_blocks * S_BLKSIZE; } if(FSAL_TEST_MASK(p_fsalattr_out->mask, ATTR_RAWDEV)) { p_fsalattr_out->rawdev = posix2fsal_devt(p_buffstat->st_rdev); /* XXX: convert ? */ } /* mounted_on_fileid : if ( FSAL_TEST_MASK(p_fsalattr_out->mask, ATTR_MOUNTFILEID )){ p_fsalattr_out->mounted_on_fileid = hpss2fsal_64( p_hpss_attr_in->FilesetRootId ); } */ /* everything has been copied ! */ return fsalstat(ERR_FSAL_NO_ERROR, 0); }