static u32 * xdr_decode_fattr(u32 *p, struct nfs_fattr *fattr) { u32 rdev; fattr->type = (enum nfs_ftype) ntohl(*p++); fattr->mode = ntohl(*p++); fattr->nlink = ntohl(*p++); fattr->uid = ntohl(*p++); fattr->gid = ntohl(*p++); fattr->size = ntohl(*p++); fattr->du.nfs2.blocksize = ntohl(*p++); rdev = ntohl(*p++); fattr->du.nfs2.blocks = ntohl(*p++); fattr->fsid_u.nfs3 = ntohl(*p++); fattr->fileid = ntohl(*p++); p = xdr_decode_time(p, &fattr->atime); p = xdr_decode_time(p, &fattr->mtime); p = xdr_decode_time(p, &fattr->ctime); fattr->valid |= NFS_ATTR_FATTR; fattr->rdev = new_decode_dev(rdev); if (fattr->type == NFCHR && rdev == NFS2_FIFO_DEV) { fattr->type = NFFIFO; fattr->mode = (fattr->mode & ~S_IFMT) | S_IFIFO; fattr->rdev = 0; } fattr->timestamp = jiffies; return p; }
static inline u32 * xdr_decode_fattr(u32 *p, struct nfs_fattr *fattr) { fattr->type = (enum nfs_ftype) ntohl(*p++); fattr->mode = ntohl(*p++); fattr->nlink = ntohl(*p++); fattr->uid = ntohl(*p++); fattr->gid = ntohl(*p++); fattr->size = ntohl(*p++); fattr->du.nfs2.blocksize = ntohl(*p++); fattr->rdev = ntohl(*p++); fattr->du.nfs2.blocks = ntohl(*p++); fattr->fsid = ntohl(*p++); fattr->fileid = ntohl(*p++); p = xdr_decode_time(p, &fattr->atime); p = xdr_decode_time(p, &fattr->mtime); p = xdr_decode_time(p, &fattr->ctime); fattr->valid |= NFS_ATTR_FATTR; if (fattr->type == NFCHR && fattr->rdev == NFS2_FIFO_DEV) { fattr->type = NFFIFO; fattr->mode = (fattr->mode & ~S_IFMT) | S_IFIFO; fattr->rdev = 0; } return p; }
static __be32 * xdr_decode_fattr(__be32 *p, struct nfs_fattr *fattr) { u32 rdev, type; type = ntohl(*p++); fattr->mode = ntohl(*p++); fattr->nlink = ntohl(*p++); fattr->uid = ntohl(*p++); fattr->gid = ntohl(*p++); fattr->size = ntohl(*p++); fattr->du.nfs2.blocksize = ntohl(*p++); rdev = ntohl(*p++); fattr->du.nfs2.blocks = ntohl(*p++); fattr->fsid.major = ntohl(*p++); fattr->fsid.minor = 0; fattr->fileid = ntohl(*p++); p = xdr_decode_time(p, &fattr->atime); p = xdr_decode_time(p, &fattr->mtime); p = xdr_decode_time(p, &fattr->ctime); fattr->valid |= NFS_ATTR_FATTR_V2; fattr->rdev = new_decode_dev(rdev); if (type == NFCHR && rdev == NFS2_FIFO_DEV) { fattr->mode = (fattr->mode & ~S_IFMT) | S_IFIFO; fattr->rdev = 0; } return p; }
/* * 2.3.5. fattr * * struct fattr { * ftype type; * unsigned int mode; * unsigned int nlink; * unsigned int uid; * unsigned int gid; * unsigned int size; * unsigned int blocksize; * unsigned int rdev; * unsigned int blocks; * unsigned int fsid; * unsigned int fileid; * timeval atime; * timeval mtime; * timeval ctime; * }; * */ static int decode_fattr(struct xdr_stream *xdr, struct nfs_fattr *fattr) { u32 rdev, type; __be32 *p; p = xdr_inline_decode(xdr, NFS_fattr_sz << 2); if (unlikely(p == NULL)) goto out_overflow; fattr->valid |= NFS_ATTR_FATTR_V2; p = xdr_decode_ftype(p, &type); fattr->mode = be32_to_cpup(p++); fattr->nlink = be32_to_cpup(p++); fattr->uid = be32_to_cpup(p++); fattr->gid = be32_to_cpup(p++); fattr->size = be32_to_cpup(p++); fattr->du.nfs2.blocksize = be32_to_cpup(p++); rdev = be32_to_cpup(p++); fattr->rdev = new_decode_dev(rdev); if (type == (u32)NFCHR && rdev == (u32)NFS2_FIFO_DEV) { fattr->mode = (fattr->mode & ~S_IFMT) | S_IFIFO; fattr->rdev = 0; } fattr->du.nfs2.blocks = be32_to_cpup(p++); fattr->fsid.major = be32_to_cpup(p++); fattr->fsid.minor = 0; fattr->fileid = be32_to_cpup(p++); p = xdr_decode_time(p, &fattr->atime); p = xdr_decode_time(p, &fattr->mtime); xdr_decode_time(p, &fattr->ctime); fattr->change_attr = nfs_timespec_to_change_attr(&fattr->ctime); return 0; out_overflow: print_overflow_msg(__func__, xdr); return -EIO; }