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); }
static int file_attributes_to_xattr_attrs(struct attrlist *file_attrs, struct attrlist *xattr_attrs, unsigned int attr_index) { /* supported attributes are: * - owner (same as the objet) * - group (same as the objet) * - type FSAL_TYPE_XATTR * - fileid (attr index ? or (fileid^((index+1)<<24)) ) * - mode (config & file) * - atime, mtime, ctime = these of the object ? * - size=1block, used=1block * - rdev=0 * - nlink=1 */ attrmask_t supported = ATTR_MODE | ATTR_FILEID | ATTR_TYPE | ATTR_OWNER | ATTR_GROUP | ATTR_ATIME | ATTR_MTIME | ATTR_CTIME | ATTR_CREATION | ATTR_CHGTIME | ATTR_SIZE | ATTR_SPACEUSED | ATTR_NUMLINKS | ATTR_RAWDEV | ATTR_FSID; attrmask_t unsupp; if (xattr_attrs->mask == 0) { xattr_attrs->mask = supported; LogCrit(COMPONENT_FSAL, "Error: xattr_attrs->mask was 0 in %s() line %d, file %s", __func__, __LINE__, __FILE__); } unsupp = xattr_attrs->mask & (~supported); if (unsupp) { LogDebug(COMPONENT_FSAL, "Asking for unsupported attributes in %s(): %#llX removing it from asked attributes", __func__, (long long unsigned int)unsupp); xattr_attrs->mask &= (~unsupp); } if (xattr_attrs->mask & ATTR_MODE) { xattr_attrs->mode = file_attrs->mode; if (attr_is_read_only(attr_index)) xattr_attrs->mode &= ~(0222); } if (xattr_attrs->mask & ATTR_FILEID) { unsigned int i; unsigned long hash = attr_index + 1; char *str = (char *)&file_attrs->fileid; for (i = 0; i < sizeof(xattr_attrs->fileid); i++, str++) hash = (hash << 5) - hash + (unsigned long)(*str); xattr_attrs->fileid = hash; } if (xattr_attrs->mask & ATTR_TYPE) xattr_attrs->type = EXTENDED_ATTR; if (xattr_attrs->mask & ATTR_OWNER) xattr_attrs->owner = file_attrs->owner; if (xattr_attrs->mask & ATTR_GROUP) xattr_attrs->group = file_attrs->group; if (xattr_attrs->mask & ATTR_ATIME) xattr_attrs->atime = file_attrs->atime; if (xattr_attrs->mask & ATTR_MTIME) xattr_attrs->mtime = file_attrs->mtime; if (xattr_attrs->mask & ATTR_CTIME) xattr_attrs->ctime = file_attrs->ctime; if (xattr_attrs->mask & ATTR_CREATION) xattr_attrs->creation = file_attrs->creation; if (xattr_attrs->mask & ATTR_CHGTIME) { xattr_attrs->chgtime = file_attrs->chgtime; xattr_attrs->change = timespec_to_nsecs(&xattr_attrs->chgtime); } if (xattr_attrs->mask & ATTR_SIZE) xattr_attrs->filesize = DEV_BSIZE; if (xattr_attrs->mask & ATTR_SPACEUSED) xattr_attrs->spaceused = DEV_BSIZE; if (xattr_attrs->mask & ATTR_NUMLINKS) xattr_attrs->numlinks = 1; if (xattr_attrs->mask & ATTR_RAWDEV) { xattr_attrs->rawdev.major = 0; xattr_attrs->rawdev.minor = 0; } if (xattr_attrs->mask & ATTR_FSID) xattr_attrs->fsid = file_attrs->fsid; /* if mode==0, then owner is set to root and mode is set to 0600 */ if ((xattr_attrs->mask & ATTR_OWNER) && (xattr_attrs->mask & ATTR_MODE) && (xattr_attrs->mode == 0)) { xattr_attrs->owner = 0; xattr_attrs->mode = 0600; if (attr_is_read_only(attr_index)) xattr_attrs->mode &= ~(0200); } return 0; }