#ifndef UVFS_LINUX_ATTR_H #define UVFS_LINUX_ATTR_H #include "uvfs_prot.h" #define PERM_MASK ((1<<13) - 1) #define TYPE_MASK (S_IFMT | S_IFSOCK | S_IFLNK | S_IFREG | S_IFBLK | S_IFDIR \ | S_IFCHR | S_IFIFO) static int modes[] = { 0, S_IFREG, S_IFDIR, S_IFBLK,S_IFCHR, S_IFLNK, S_IFSOCK, S_IFIFO }; static inline int mode2type (int m) { m &= ~PERM_MASK; m &= TYPE_MASK; switch (m) { case S_IFREG: return NF3REG; case S_IFDIR: return NF3DIR; case S_IFBLK: return NF3BLK; case S_IFCHR: return NF3CHR; case S_IFLNK: return NF3LNK; case S_IFSOCK: return NF3SOCK; case S_IFIFO: return NF3FIFO; default: return 0; } return 0; } static inline void fattr2inode (uvfs_fattr *attr, struct inode *inode) { inode->i_ino = attr->fileid; inode->i_dev = inode->i_sb->s_dev; inode->i_mode = (attr->mode & PERM_MASK) | modes[attr->type]; inode->i_nlink = attr->nlink; inode->i_uid = attr->uid; inode->i_gid = attr->gid; inode->i_rdev = MKDEV(attr->rdev.major & 0xFF, attr->rdev.minor & 0XFF); inode->i_size = attr->size; inode->i_atime = attr->atime.seconds; inode->i_mtime = attr->mtime.seconds; inode->i_ctime = attr->ctime.seconds; /* attr->fsid; */ /* attr->used; */ /* attr->expire; */ } static inline void inode2fattr (struct inode *inode, uvfs_fattr *attr) { attr->fileid = inode->i_ino; attr->mode = inode->i_mode & PERM_MASK; attr->type = mode2type (inode->i_mode); attr->nlink = inode->i_nlink; attr->uid = inode->i_uid; attr->gid = inode->i_gid; attr->rdev.minor = MINOR(inode->i_rdev); attr->rdev.major = MAJOR(inode->i_rdev); attr->size = inode->i_size; attr->atime.seconds = inode->i_atime; attr->mtime.seconds = inode->i_mtime; attr->ctime.seconds = inode->i_ctime; } static inline int uvfs_getattr (uvfs_fh arg, struct super_block *sb, uvfs_fattr *attr) { uvfs_attrres res; int err = 0; bzero (&arg, sizeof arg); bzero (&res, sizeof res); err = krpc_callit (SBTORPCQ(sb), &uvfsprog_1, UVFSPROC_GETATTR, &arg, &res); if (!err && !res.status) err = res.status; *attr = res.u.attributes; xdr_free (xdr_uvfs_attrres, &res); return err; } #endif /* UVFS_LINUX_ATTR_H */