📄 nfs4xdr.c
字号:
{ uint32_t *p; fsid->major = 0; fsid->minor = 0; if (unlikely(bitmap[0] & (FATTR4_WORD0_FSID - 1U))) return -EIO; if (likely(bitmap[0] & FATTR4_WORD0_FSID)) { READ_BUF(16); READ64(fsid->major); READ64(fsid->minor); bitmap[0] &= ~FATTR4_WORD0_FSID; } dprintk("%s: fsid=(0x%Lx/0x%Lx)\n", __FUNCTION__, (unsigned long long)fsid->major, (unsigned long long)fsid->minor); return 0;}static int decode_attr_lease_time(struct xdr_stream *xdr, uint32_t *bitmap, uint32_t *res){ uint32_t *p; *res = 60; if (unlikely(bitmap[0] & (FATTR4_WORD0_LEASE_TIME - 1U))) return -EIO; if (likely(bitmap[0] & FATTR4_WORD0_LEASE_TIME)) { READ_BUF(4); READ32(*res); bitmap[0] &= ~FATTR4_WORD0_LEASE_TIME; } dprintk("%s: file size=%u\n", __FUNCTION__, (unsigned int)*res); return 0;}static int decode_attr_aclsupport(struct xdr_stream *xdr, uint32_t *bitmap, uint32_t *res){ uint32_t *p; *res = ACL4_SUPPORT_ALLOW_ACL|ACL4_SUPPORT_DENY_ACL; if (unlikely(bitmap[0] & (FATTR4_WORD0_ACLSUPPORT - 1U))) return -EIO; if (likely(bitmap[0] & FATTR4_WORD0_ACLSUPPORT)) { READ_BUF(4); READ32(*res); bitmap[0] &= ~FATTR4_WORD0_ACLSUPPORT; } dprintk("%s: ACLs supported=%u\n", __FUNCTION__, (unsigned int)*res); return 0;}static int decode_attr_fileid(struct xdr_stream *xdr, uint32_t *bitmap, uint64_t *fileid){ uint32_t *p; *fileid = 0; if (unlikely(bitmap[0] & (FATTR4_WORD0_FILEID - 1U))) return -EIO; if (likely(bitmap[0] & FATTR4_WORD0_FILEID)) { READ_BUF(8); READ64(*fileid); bitmap[0] &= ~FATTR4_WORD0_FILEID; } dprintk("%s: fileid=%Lu\n", __FUNCTION__, (unsigned long long)*fileid); return 0;}static int decode_attr_files_avail(struct xdr_stream *xdr, uint32_t *bitmap, uint64_t *res){ uint32_t *p; int status = 0; *res = 0; if (unlikely(bitmap[0] & (FATTR4_WORD0_FILES_AVAIL - 1U))) return -EIO; if (likely(bitmap[0] & FATTR4_WORD0_FILES_AVAIL)) { READ_BUF(8); READ64(*res); bitmap[0] &= ~FATTR4_WORD0_FILES_AVAIL; } dprintk("%s: files avail=%Lu\n", __FUNCTION__, (unsigned long long)*res); return status;}static int decode_attr_files_free(struct xdr_stream *xdr, uint32_t *bitmap, uint64_t *res){ uint32_t *p; int status = 0; *res = 0; if (unlikely(bitmap[0] & (FATTR4_WORD0_FILES_FREE - 1U))) return -EIO; if (likely(bitmap[0] & FATTR4_WORD0_FILES_FREE)) { READ_BUF(8); READ64(*res); bitmap[0] &= ~FATTR4_WORD0_FILES_FREE; } dprintk("%s: files free=%Lu\n", __FUNCTION__, (unsigned long long)*res); return status;}static int decode_attr_files_total(struct xdr_stream *xdr, uint32_t *bitmap, uint64_t *res){ uint32_t *p; int status = 0; *res = 0; if (unlikely(bitmap[0] & (FATTR4_WORD0_FILES_TOTAL - 1U))) return -EIO; if (likely(bitmap[0] & FATTR4_WORD0_FILES_TOTAL)) { READ_BUF(8); READ64(*res); bitmap[0] &= ~FATTR4_WORD0_FILES_TOTAL; } dprintk("%s: files total=%Lu\n", __FUNCTION__, (unsigned long long)*res); return status;}static int decode_attr_maxfilesize(struct xdr_stream *xdr, uint32_t *bitmap, uint64_t *res){ uint32_t *p; int status = 0; *res = 0; if (unlikely(bitmap[0] & (FATTR4_WORD0_MAXFILESIZE - 1U))) return -EIO; if (likely(bitmap[0] & FATTR4_WORD0_MAXFILESIZE)) { READ_BUF(8); READ64(*res); bitmap[0] &= ~FATTR4_WORD0_MAXFILESIZE; } dprintk("%s: maxfilesize=%Lu\n", __FUNCTION__, (unsigned long long)*res); return status;}static int decode_attr_maxlink(struct xdr_stream *xdr, uint32_t *bitmap, uint32_t *maxlink){ uint32_t *p; int status = 0; *maxlink = 1; if (unlikely(bitmap[0] & (FATTR4_WORD0_MAXLINK - 1U))) return -EIO; if (likely(bitmap[0] & FATTR4_WORD0_MAXLINK)) { READ_BUF(4); READ32(*maxlink); bitmap[0] &= ~FATTR4_WORD0_MAXLINK; } dprintk("%s: maxlink=%u\n", __FUNCTION__, *maxlink); return status;}static int decode_attr_maxname(struct xdr_stream *xdr, uint32_t *bitmap, uint32_t *maxname){ uint32_t *p; int status = 0; *maxname = 1024; if (unlikely(bitmap[0] & (FATTR4_WORD0_MAXNAME - 1U))) return -EIO; if (likely(bitmap[0] & FATTR4_WORD0_MAXNAME)) { READ_BUF(4); READ32(*maxname); bitmap[0] &= ~FATTR4_WORD0_MAXNAME; } dprintk("%s: maxname=%u\n", __FUNCTION__, *maxname); return status;}static int decode_attr_maxread(struct xdr_stream *xdr, uint32_t *bitmap, uint32_t *res){ uint32_t *p; int status = 0; *res = 1024; if (unlikely(bitmap[0] & (FATTR4_WORD0_MAXREAD - 1U))) return -EIO; if (likely(bitmap[0] & FATTR4_WORD0_MAXREAD)) { uint64_t maxread; READ_BUF(8); READ64(maxread); if (maxread > 0x7FFFFFFF) maxread = 0x7FFFFFFF; *res = (uint32_t)maxread; bitmap[0] &= ~FATTR4_WORD0_MAXREAD; } dprintk("%s: maxread=%lu\n", __FUNCTION__, (unsigned long)*res); return status;}static int decode_attr_maxwrite(struct xdr_stream *xdr, uint32_t *bitmap, uint32_t *res){ uint32_t *p; int status = 0; *res = 1024; if (unlikely(bitmap[0] & (FATTR4_WORD0_MAXWRITE - 1U))) return -EIO; if (likely(bitmap[0] & FATTR4_WORD0_MAXWRITE)) { uint64_t maxwrite; READ_BUF(8); READ64(maxwrite); if (maxwrite > 0x7FFFFFFF) maxwrite = 0x7FFFFFFF; *res = (uint32_t)maxwrite; bitmap[0] &= ~FATTR4_WORD0_MAXWRITE; } dprintk("%s: maxwrite=%lu\n", __FUNCTION__, (unsigned long)*res); return status;}static int decode_attr_mode(struct xdr_stream *xdr, uint32_t *bitmap, uint32_t *mode){ uint32_t *p; *mode = 0; if (unlikely(bitmap[1] & (FATTR4_WORD1_MODE - 1U))) return -EIO; if (likely(bitmap[1] & FATTR4_WORD1_MODE)) { READ_BUF(4); READ32(*mode); *mode &= ~S_IFMT; bitmap[1] &= ~FATTR4_WORD1_MODE; } dprintk("%s: file mode=0%o\n", __FUNCTION__, (unsigned int)*mode); return 0;}static int decode_attr_nlink(struct xdr_stream *xdr, uint32_t *bitmap, uint32_t *nlink){ uint32_t *p; *nlink = 1; if (unlikely(bitmap[1] & (FATTR4_WORD1_NUMLINKS - 1U))) return -EIO; if (likely(bitmap[1] & FATTR4_WORD1_NUMLINKS)) { READ_BUF(4); READ32(*nlink); bitmap[1] &= ~FATTR4_WORD1_NUMLINKS; } dprintk("%s: nlink=%u\n", __FUNCTION__, (unsigned int)*nlink); return 0;}static int decode_attr_owner(struct xdr_stream *xdr, uint32_t *bitmap, struct nfs4_client *clp, int32_t *uid){ uint32_t len, *p; *uid = -2; if (unlikely(bitmap[1] & (FATTR4_WORD1_OWNER - 1U))) return -EIO; if (likely(bitmap[1] & FATTR4_WORD1_OWNER)) { READ_BUF(4); READ32(len); READ_BUF(len); if (len < XDR_MAX_NETOBJ) { if (nfs_map_name_to_uid(clp, (char *)p, len, uid) != 0) dprintk("%s: nfs_map_name_to_uid failed!\n", __FUNCTION__); } else printk(KERN_WARNING "%s: name too long (%u)!\n", __FUNCTION__, len); bitmap[1] &= ~FATTR4_WORD1_OWNER; } dprintk("%s: uid=%d\n", __FUNCTION__, (int)*uid); return 0;}static int decode_attr_group(struct xdr_stream *xdr, uint32_t *bitmap, struct nfs4_client *clp, int32_t *gid){ uint32_t len, *p; *gid = -2; if (unlikely(bitmap[1] & (FATTR4_WORD1_OWNER_GROUP - 1U))) return -EIO; if (likely(bitmap[1] & FATTR4_WORD1_OWNER_GROUP)) { READ_BUF(4); READ32(len); READ_BUF(len); if (len < XDR_MAX_NETOBJ) { if (nfs_map_group_to_gid(clp, (char *)p, len, gid) != 0) dprintk("%s: nfs_map_group_to_gid failed!\n", __FUNCTION__); } else printk(KERN_WARNING "%s: name too long (%u)!\n", __FUNCTION__, len); bitmap[1] &= ~FATTR4_WORD1_OWNER_GROUP; } dprintk("%s: gid=%d\n", __FUNCTION__, (int)*gid); return 0;}static int decode_attr_rdev(struct xdr_stream *xdr, uint32_t *bitmap, dev_t *rdev){ uint32_t major = 0, minor = 0, *p; *rdev = MKDEV(0,0); if (unlikely(bitmap[1] & (FATTR4_WORD1_RAWDEV - 1U))) return -EIO; if (likely(bitmap[1] & FATTR4_WORD1_RAWDEV)) { dev_t tmp; READ_BUF(8); READ32(major); READ32(minor); tmp = MKDEV(major, minor); if (MAJOR(tmp) == major && MINOR(tmp) == minor) *rdev = tmp; bitmap[1] &= ~ FATTR4_WORD1_RAWDEV; } dprintk("%s: rdev=(0x%x:0x%x)\n", __FUNCTION__, major, minor); return 0;}static int decode_attr_space_avail(struct xdr_stream *xdr, uint32_t *bitmap, uint64_t *res){ uint32_t *p; int status = 0; *res = 0; if (unlikely(bitmap[1] & (FATTR4_WORD1_SPACE_AVAIL - 1U))) return -EIO; if (likely(bitmap[1] & FATTR4_WORD1_SPACE_AVAIL)) { READ_BUF(8); READ64(*res); bitmap[1] &= ~FATTR4_WORD1_SPACE_AVAIL; } dprintk("%s: space avail=%Lu\n", __FUNCTION__, (unsigned long long)*res); return status;}static int decode_attr_space_free(struct xdr_stream *xdr, uint32_t *bitmap, uint64_t *res){ uint32_t *p; int status = 0; *res = 0; if (unlikely(bitmap[1] & (FATTR4_WORD1_SPACE_FREE - 1U))) return -EIO; if (likely(bitmap[1] & FATTR4_WORD1_SPACE_FREE)) { READ_BUF(8); READ64(*res); bitmap[1] &= ~FATTR4_WORD1_SPACE_FREE; } dprintk("%s: space free=%Lu\n", __FUNCTION__, (unsigned long long)*res); return status;}static int decode_attr_space_total(struct xdr_stream *xdr, uint32_t *bitmap, uint64_t *res){ uint32_t *p; int status = 0; *res = 0; if (unlikely(bitmap[1] & (FATTR4_WORD1_SPACE_TOTAL - 1U))) return -EIO; if (likely(bitmap[1] & FATTR4_WORD1_SPACE_TOTAL)) { READ_BUF(8); READ64(*res); bitmap[1] &= ~FATTR4_WORD1_SPACE_TOTAL; } dprintk("%s: space total=%Lu\n", __FUNCTION__, (unsigned long long)*res); return status;}static int decode_attr_space_used(struct xdr_stream *xdr, uint32_t *bitmap, uint64_t *used){ uint32_t *p; *used = 0; if (unlikely(bitmap[1] & (FATTR4_WORD1_SPACE_USED - 1U))) return -EIO; if (likely(bitmap[1] & FATTR4_WORD1_SPACE_USED)) { READ_BUF(8); READ64(*used); bitmap[1] &= ~FATTR4_WORD1_SPACE_USED; } dprintk("%s: space used=%Lu\n", __FUNCTION__, (unsigned long long)*used); return 0;}static int decode_attr_time(struct xdr_stream *xdr, struct timespec *time){ uint32_t *p; uint64_t sec; uint32_t nsec; READ_BUF(12); READ64(sec); READ32(nsec); time->tv_sec = (time_t)sec; time->tv_nsec = (long)nsec; return 0;}static int decode_attr_time_access(struct xdr_stream *xdr, uint32_t *bitmap, struct timespec *time){ int status = 0; time->tv_sec = 0; time->tv_nsec = 0; if (unlikely(bitmap[1] & (FATTR4_WORD1_TIME_ACCESS - 1U))) return -EIO; if (likely(bitmap[1] & FATTR4_WORD1_TIME_ACCESS)) { status = decode_attr_time(xdr, time); bitmap[1] &= ~FATTR4_WORD1_TIME_ACCESS; } dprintk("%s: atime=%ld\n", __FUNCTION__, (long)time->tv_sec); return status;}static int decode_attr_time_metadata(struct xdr_stream *xdr, uint32_t *bitmap, struct timespec *time){ int status = 0; time->tv_sec = 0; time->tv_nsec = 0; if (unlikely(bitmap[1] & (FATTR4_WORD1_TIME_METADATA - 1U))) return -EIO; if (likely(bitmap[1] & FATTR4_WORD1_TIME_METADATA)) { status = decode_attr_time(xdr, time); bitmap[1] &= ~FATTR4_WORD1_TIME_METADATA; } dprintk("%s: ctime=%ld\n", __FUNCTION__, (long)time->tv_sec); return status;}static int decode_attr_time_modify(struct xdr_stream *xdr, uint32_t *bitmap, struct timespec *time){ int status = 0; time->tv_sec = 0; time->tv_nsec = 0; if (unlikely(bitmap[1] & (FATTR4_WORD1_TIME_MODIFY - 1U))) return -EIO; if (likely(bitmap[1] & FATTR4_WORD1_TIME_MODIFY)) { status = decode_attr_time(xdr, time); bitmap[1] &= ~FATTR4_WORD1_TIME_MODIFY; } dprintk("%s: mtime=%ld\n", __FUNCTION__, (long)time->tv_sec); return status;}static int verify_attr_len(struct xdr_stream *xdr, uint32_t *savep, uint32_t attrlen){ unsigned int attrwords = XDR_QUADLEN(attrlen); unsigned int nwords = xdr->p - savep; if (unlikely(attrwords != nwords)) { printk(KERN_WARNING "%s: server returned incorrect attribute length: %u %c %u\n", __FUNCTION__, attrwords << 2, (attrwords < nwords) ? '<' : '>', nwords << 2); return -EIO; } return 0;}static int decode_change_info(struct xdr_stream *xdr, struct nfs4_change_info *cinfo){ uint32_t *p; READ_BUF(20); READ32(cinfo->atomic); READ64(cinfo->before); READ64(cinfo->after); return 0;}static int decode_access(struct xdr_stream *xdr, struct nfs4_accessres *access){ uint32_t *p; uint32_t supp, acc; int status; status = decode_op_hdr(xdr, OP_ACCESS); if (status) return status; READ_BUF(8); READ32(supp); READ32(acc); access->supported = supp; access->access = acc; return 0;}static int decode_close(struct xdr_stream *xdr, struct nfs_closeres *res){ uint32_t *p; int status; status = decode_op_hdr(xdr, OP_CLOSE); if (status) return status; READ_BUF(sizeof(res->stateid.data)); COPYMEM(res->stateid.data, sizeof(res->stateid.data)); return 0;}static int decode_commit(struct xdr_stream *xdr, struct nfs_writeres *res){ uint32_t *p; int status; status = decode_op_hdr(xdr, OP
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -