diff options
Diffstat (limited to 'fs/nfs/nfs4xdr.c')
-rw-r--r-- | fs/nfs/nfs4xdr.c | 138 |
1 files changed, 65 insertions, 73 deletions
diff --git a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c index 7c2b162dd845..3bcde49fbea8 100644 --- a/fs/nfs/nfs4xdr.c +++ b/fs/nfs/nfs4xdr.c | |||
@@ -702,20 +702,12 @@ struct compound_hdr { | |||
702 | u32 minorversion; | 702 | u32 minorversion; |
703 | }; | 703 | }; |
704 | 704 | ||
705 | /* | 705 | static __be32 *reserve_space(struct xdr_stream *xdr, size_t nbytes) |
706 | * START OF "GENERIC" ENCODE ROUTINES. | 706 | { |
707 | * These may look a little ugly since they are imported from a "generic" | 707 | __be32 *p = xdr_reserve_space(xdr, nbytes); |
708 | * set of XDR encode/decode routines which are intended to be shared by | 708 | BUG_ON(!p); |
709 | * all of our NFSv4 implementations (OpenBSD, MacOS X...). | 709 | return p; |
710 | * | 710 | } |
711 | * If the pain of reading these is too great, it should be a straightforward | ||
712 | * task to translate them into Linux-specific versions which are more | ||
713 | * consistent with the style used in NFSv2/v3... | ||
714 | */ | ||
715 | #define RESERVE_SPACE(nbytes) do { \ | ||
716 | p = xdr_reserve_space(xdr, nbytes); \ | ||
717 | BUG_ON(!p); \ | ||
718 | } while (0) | ||
719 | 711 | ||
720 | static void encode_string(struct xdr_stream *xdr, unsigned int len, const char *str) | 712 | static void encode_string(struct xdr_stream *xdr, unsigned int len, const char *str) |
721 | { | 713 | { |
@@ -740,7 +732,7 @@ static void encode_compound_hdr(struct xdr_stream *xdr, | |||
740 | 732 | ||
741 | dprintk("encode_compound: tag=%.*s\n", (int)hdr->taglen, hdr->tag); | 733 | dprintk("encode_compound: tag=%.*s\n", (int)hdr->taglen, hdr->tag); |
742 | BUG_ON(hdr->taglen > NFS4_MAXTAGLEN); | 734 | BUG_ON(hdr->taglen > NFS4_MAXTAGLEN); |
743 | RESERVE_SPACE(12 + hdr->taglen); | 735 | p = reserve_space(xdr, 12 + hdr->taglen); |
744 | *p++ = cpu_to_be32(hdr->taglen); | 736 | *p++ = cpu_to_be32(hdr->taglen); |
745 | p = xdr_encode_opaque_fixed(p, hdr->tag, hdr->taglen); | 737 | p = xdr_encode_opaque_fixed(p, hdr->tag, hdr->taglen); |
746 | *p++ = cpu_to_be32(hdr->minorversion); | 738 | *p++ = cpu_to_be32(hdr->minorversion); |
@@ -820,7 +812,7 @@ static void encode_attrs(struct xdr_stream *xdr, const struct iattr *iap, const | |||
820 | len += 16; | 812 | len += 16; |
821 | else if (iap->ia_valid & ATTR_MTIME) | 813 | else if (iap->ia_valid & ATTR_MTIME) |
822 | len += 4; | 814 | len += 4; |
823 | RESERVE_SPACE(len); | 815 | p = reserve_space(xdr, len); |
824 | 816 | ||
825 | /* | 817 | /* |
826 | * We write the bitmap length now, but leave the bitmap and the attribute | 818 | * We write the bitmap length now, but leave the bitmap and the attribute |
@@ -891,7 +883,7 @@ static void encode_access(struct xdr_stream *xdr, u32 access, struct compound_hd | |||
891 | { | 883 | { |
892 | __be32 *p; | 884 | __be32 *p; |
893 | 885 | ||
894 | RESERVE_SPACE(8); | 886 | p = reserve_space(xdr, 8); |
895 | *p++ = cpu_to_be32(OP_ACCESS); | 887 | *p++ = cpu_to_be32(OP_ACCESS); |
896 | *p++ = cpu_to_be32(access); | 888 | *p++ = cpu_to_be32(access); |
897 | hdr->nops++; | 889 | hdr->nops++; |
@@ -902,7 +894,7 @@ static void encode_close(struct xdr_stream *xdr, const struct nfs_closeargs *arg | |||
902 | { | 894 | { |
903 | __be32 *p; | 895 | __be32 *p; |
904 | 896 | ||
905 | RESERVE_SPACE(8+NFS4_STATEID_SIZE); | 897 | p = reserve_space(xdr, 8+NFS4_STATEID_SIZE); |
906 | *p++ = cpu_to_be32(OP_CLOSE); | 898 | *p++ = cpu_to_be32(OP_CLOSE); |
907 | *p++ = cpu_to_be32(arg->seqid->sequence->counter); | 899 | *p++ = cpu_to_be32(arg->seqid->sequence->counter); |
908 | p = xdr_encode_opaque_fixed(p, arg->stateid->data, NFS4_STATEID_SIZE); | 900 | p = xdr_encode_opaque_fixed(p, arg->stateid->data, NFS4_STATEID_SIZE); |
@@ -914,7 +906,7 @@ static void encode_commit(struct xdr_stream *xdr, const struct nfs_writeargs *ar | |||
914 | { | 906 | { |
915 | __be32 *p; | 907 | __be32 *p; |
916 | 908 | ||
917 | RESERVE_SPACE(16); | 909 | p = reserve_space(xdr, 16); |
918 | *p++ = cpu_to_be32(OP_COMMIT); | 910 | *p++ = cpu_to_be32(OP_COMMIT); |
919 | p = xdr_encode_hyper(p, args->offset); | 911 | p = xdr_encode_hyper(p, args->offset); |
920 | *p++ = cpu_to_be32(args->count); | 912 | *p++ = cpu_to_be32(args->count); |
@@ -926,19 +918,19 @@ static void encode_create(struct xdr_stream *xdr, const struct nfs4_create_arg * | |||
926 | { | 918 | { |
927 | __be32 *p; | 919 | __be32 *p; |
928 | 920 | ||
929 | RESERVE_SPACE(8); | 921 | p = reserve_space(xdr, 8); |
930 | *p++ = cpu_to_be32(OP_CREATE); | 922 | *p++ = cpu_to_be32(OP_CREATE); |
931 | *p++ = cpu_to_be32(create->ftype); | 923 | *p++ = cpu_to_be32(create->ftype); |
932 | 924 | ||
933 | switch (create->ftype) { | 925 | switch (create->ftype) { |
934 | case NF4LNK: | 926 | case NF4LNK: |
935 | RESERVE_SPACE(4); | 927 | p = reserve_space(xdr, 4); |
936 | *p++ = cpu_to_be32(create->u.symlink.len); | 928 | *p++ = cpu_to_be32(create->u.symlink.len); |
937 | xdr_write_pages(xdr, create->u.symlink.pages, 0, create->u.symlink.len); | 929 | xdr_write_pages(xdr, create->u.symlink.pages, 0, create->u.symlink.len); |
938 | break; | 930 | break; |
939 | 931 | ||
940 | case NF4BLK: case NF4CHR: | 932 | case NF4BLK: case NF4CHR: |
941 | RESERVE_SPACE(8); | 933 | p = reserve_space(xdr, 8); |
942 | *p++ = cpu_to_be32(create->u.device.specdata1); | 934 | *p++ = cpu_to_be32(create->u.device.specdata1); |
943 | *p++ = cpu_to_be32(create->u.device.specdata2); | 935 | *p++ = cpu_to_be32(create->u.device.specdata2); |
944 | break; | 936 | break; |
@@ -947,7 +939,7 @@ static void encode_create(struct xdr_stream *xdr, const struct nfs4_create_arg * | |||
947 | break; | 939 | break; |
948 | } | 940 | } |
949 | 941 | ||
950 | RESERVE_SPACE(4 + create->name->len); | 942 | p = reserve_space(xdr, 4 + create->name->len); |
951 | *p++ = cpu_to_be32(create->name->len); | 943 | *p++ = cpu_to_be32(create->name->len); |
952 | p = xdr_encode_opaque_fixed(p, create->name->name, create->name->len); | 944 | p = xdr_encode_opaque_fixed(p, create->name->name, create->name->len); |
953 | hdr->nops++; | 945 | hdr->nops++; |
@@ -960,7 +952,7 @@ static void encode_getattr_one(struct xdr_stream *xdr, uint32_t bitmap, struct c | |||
960 | { | 952 | { |
961 | __be32 *p; | 953 | __be32 *p; |
962 | 954 | ||
963 | RESERVE_SPACE(12); | 955 | p = reserve_space(xdr, 12); |
964 | *p++ = cpu_to_be32(OP_GETATTR); | 956 | *p++ = cpu_to_be32(OP_GETATTR); |
965 | *p++ = cpu_to_be32(1); | 957 | *p++ = cpu_to_be32(1); |
966 | *p++ = cpu_to_be32(bitmap); | 958 | *p++ = cpu_to_be32(bitmap); |
@@ -972,7 +964,7 @@ static void encode_getattr_two(struct xdr_stream *xdr, uint32_t bm0, uint32_t bm | |||
972 | { | 964 | { |
973 | __be32 *p; | 965 | __be32 *p; |
974 | 966 | ||
975 | RESERVE_SPACE(16); | 967 | p = reserve_space(xdr, 16); |
976 | *p++ = cpu_to_be32(OP_GETATTR); | 968 | *p++ = cpu_to_be32(OP_GETATTR); |
977 | *p++ = cpu_to_be32(2); | 969 | *p++ = cpu_to_be32(2); |
978 | *p++ = cpu_to_be32(bm0); | 970 | *p++ = cpu_to_be32(bm0); |
@@ -1003,7 +995,7 @@ static void encode_getfh(struct xdr_stream *xdr, struct compound_hdr *hdr) | |||
1003 | { | 995 | { |
1004 | __be32 *p; | 996 | __be32 *p; |
1005 | 997 | ||
1006 | RESERVE_SPACE(4); | 998 | p = reserve_space(xdr, 4); |
1007 | *p++ = cpu_to_be32(OP_GETFH); | 999 | *p++ = cpu_to_be32(OP_GETFH); |
1008 | hdr->nops++; | 1000 | hdr->nops++; |
1009 | hdr->replen += decode_getfh_maxsz; | 1001 | hdr->replen += decode_getfh_maxsz; |
@@ -1013,7 +1005,7 @@ static void encode_link(struct xdr_stream *xdr, const struct qstr *name, struct | |||
1013 | { | 1005 | { |
1014 | __be32 *p; | 1006 | __be32 *p; |
1015 | 1007 | ||
1016 | RESERVE_SPACE(8 + name->len); | 1008 | p = reserve_space(xdr, 8 + name->len); |
1017 | *p++ = cpu_to_be32(OP_LINK); | 1009 | *p++ = cpu_to_be32(OP_LINK); |
1018 | *p++ = cpu_to_be32(name->len); | 1010 | *p++ = cpu_to_be32(name->len); |
1019 | p = xdr_encode_opaque_fixed(p, name->name, name->len); | 1011 | p = xdr_encode_opaque_fixed(p, name->name, name->len); |
@@ -1043,7 +1035,7 @@ static void encode_lock(struct xdr_stream *xdr, const struct nfs_lock_args *args | |||
1043 | { | 1035 | { |
1044 | __be32 *p; | 1036 | __be32 *p; |
1045 | 1037 | ||
1046 | RESERVE_SPACE(32); | 1038 | p = reserve_space(xdr, 32); |
1047 | *p++ = cpu_to_be32(OP_LOCK); | 1039 | *p++ = cpu_to_be32(OP_LOCK); |
1048 | *p++ = cpu_to_be32(nfs4_lock_type(args->fl, args->block)); | 1040 | *p++ = cpu_to_be32(nfs4_lock_type(args->fl, args->block)); |
1049 | *p++ = cpu_to_be32(args->reclaim); | 1041 | *p++ = cpu_to_be32(args->reclaim); |
@@ -1051,7 +1043,7 @@ static void encode_lock(struct xdr_stream *xdr, const struct nfs_lock_args *args | |||
1051 | p = xdr_encode_hyper(p, nfs4_lock_length(args->fl)); | 1043 | p = xdr_encode_hyper(p, nfs4_lock_length(args->fl)); |
1052 | *p++ = cpu_to_be32(args->new_lock_owner); | 1044 | *p++ = cpu_to_be32(args->new_lock_owner); |
1053 | if (args->new_lock_owner){ | 1045 | if (args->new_lock_owner){ |
1054 | RESERVE_SPACE(4+NFS4_STATEID_SIZE+32); | 1046 | p = reserve_space(xdr, 4+NFS4_STATEID_SIZE+32); |
1055 | *p++ = cpu_to_be32(args->open_seqid->sequence->counter); | 1047 | *p++ = cpu_to_be32(args->open_seqid->sequence->counter); |
1056 | p = xdr_encode_opaque_fixed(p, args->open_stateid->data, NFS4_STATEID_SIZE); | 1048 | p = xdr_encode_opaque_fixed(p, args->open_stateid->data, NFS4_STATEID_SIZE); |
1057 | *p++ = cpu_to_be32(args->lock_seqid->sequence->counter); | 1049 | *p++ = cpu_to_be32(args->lock_seqid->sequence->counter); |
@@ -1061,7 +1053,7 @@ static void encode_lock(struct xdr_stream *xdr, const struct nfs_lock_args *args | |||
1061 | p = xdr_encode_hyper(p, args->lock_owner.id); | 1053 | p = xdr_encode_hyper(p, args->lock_owner.id); |
1062 | } | 1054 | } |
1063 | else { | 1055 | else { |
1064 | RESERVE_SPACE(NFS4_STATEID_SIZE+4); | 1056 | p = reserve_space(xdr, NFS4_STATEID_SIZE+4); |
1065 | p = xdr_encode_opaque_fixed(p, args->lock_stateid->data, NFS4_STATEID_SIZE); | 1057 | p = xdr_encode_opaque_fixed(p, args->lock_stateid->data, NFS4_STATEID_SIZE); |
1066 | *p++ = cpu_to_be32(args->lock_seqid->sequence->counter); | 1058 | *p++ = cpu_to_be32(args->lock_seqid->sequence->counter); |
1067 | } | 1059 | } |
@@ -1073,7 +1065,7 @@ static void encode_lockt(struct xdr_stream *xdr, const struct nfs_lockt_args *ar | |||
1073 | { | 1065 | { |
1074 | __be32 *p; | 1066 | __be32 *p; |
1075 | 1067 | ||
1076 | RESERVE_SPACE(52); | 1068 | p = reserve_space(xdr, 52); |
1077 | *p++ = cpu_to_be32(OP_LOCKT); | 1069 | *p++ = cpu_to_be32(OP_LOCKT); |
1078 | *p++ = cpu_to_be32(nfs4_lock_type(args->fl, 0)); | 1070 | *p++ = cpu_to_be32(nfs4_lock_type(args->fl, 0)); |
1079 | p = xdr_encode_hyper(p, args->fl->fl_start); | 1071 | p = xdr_encode_hyper(p, args->fl->fl_start); |
@@ -1090,7 +1082,7 @@ static void encode_locku(struct xdr_stream *xdr, const struct nfs_locku_args *ar | |||
1090 | { | 1082 | { |
1091 | __be32 *p; | 1083 | __be32 *p; |
1092 | 1084 | ||
1093 | RESERVE_SPACE(12+NFS4_STATEID_SIZE+16); | 1085 | p = reserve_space(xdr, 12+NFS4_STATEID_SIZE+16); |
1094 | *p++ = cpu_to_be32(OP_LOCKU); | 1086 | *p++ = cpu_to_be32(OP_LOCKU); |
1095 | *p++ = cpu_to_be32(nfs4_lock_type(args->fl, 0)); | 1087 | *p++ = cpu_to_be32(nfs4_lock_type(args->fl, 0)); |
1096 | *p++ = cpu_to_be32(args->seqid->sequence->counter); | 1088 | *p++ = cpu_to_be32(args->seqid->sequence->counter); |
@@ -1106,7 +1098,7 @@ static void encode_lookup(struct xdr_stream *xdr, const struct qstr *name, struc | |||
1106 | int len = name->len; | 1098 | int len = name->len; |
1107 | __be32 *p; | 1099 | __be32 *p; |
1108 | 1100 | ||
1109 | RESERVE_SPACE(8 + len); | 1101 | p = reserve_space(xdr, 8 + len); |
1110 | *p++ = cpu_to_be32(OP_LOOKUP); | 1102 | *p++ = cpu_to_be32(OP_LOOKUP); |
1111 | *p++ = cpu_to_be32(len); | 1103 | *p++ = cpu_to_be32(len); |
1112 | p = xdr_encode_opaque_fixed(p, name->name, len); | 1104 | p = xdr_encode_opaque_fixed(p, name->name, len); |
@@ -1118,7 +1110,7 @@ static void encode_share_access(struct xdr_stream *xdr, fmode_t fmode) | |||
1118 | { | 1110 | { |
1119 | __be32 *p; | 1111 | __be32 *p; |
1120 | 1112 | ||
1121 | RESERVE_SPACE(8); | 1113 | p = reserve_space(xdr, 8); |
1122 | switch (fmode & (FMODE_READ|FMODE_WRITE)) { | 1114 | switch (fmode & (FMODE_READ|FMODE_WRITE)) { |
1123 | case FMODE_READ: | 1115 | case FMODE_READ: |
1124 | *p++ = cpu_to_be32(NFS4_SHARE_ACCESS_READ); | 1116 | *p++ = cpu_to_be32(NFS4_SHARE_ACCESS_READ); |
@@ -1142,11 +1134,11 @@ static inline void encode_openhdr(struct xdr_stream *xdr, const struct nfs_opena | |||
1142 | * opcode 4, seqid 4, share_access 4, share_deny 4, clientid 8, ownerlen 4, | 1134 | * opcode 4, seqid 4, share_access 4, share_deny 4, clientid 8, ownerlen 4, |
1143 | * owner 4 = 32 | 1135 | * owner 4 = 32 |
1144 | */ | 1136 | */ |
1145 | RESERVE_SPACE(8); | 1137 | p = reserve_space(xdr, 8); |
1146 | *p++ = cpu_to_be32(OP_OPEN); | 1138 | *p++ = cpu_to_be32(OP_OPEN); |
1147 | *p++ = cpu_to_be32(arg->seqid->sequence->counter); | 1139 | *p++ = cpu_to_be32(arg->seqid->sequence->counter); |
1148 | encode_share_access(xdr, arg->fmode); | 1140 | encode_share_access(xdr, arg->fmode); |
1149 | RESERVE_SPACE(28); | 1141 | p = reserve_space(xdr, 28); |
1150 | p = xdr_encode_hyper(p, arg->clientid); | 1142 | p = xdr_encode_hyper(p, arg->clientid); |
1151 | *p++ = cpu_to_be32(16); | 1143 | *p++ = cpu_to_be32(16); |
1152 | p = xdr_encode_opaque_fixed(p, "open id:", 8); | 1144 | p = xdr_encode_opaque_fixed(p, "open id:", 8); |
@@ -1157,7 +1149,7 @@ static inline void encode_createmode(struct xdr_stream *xdr, const struct nfs_op | |||
1157 | { | 1149 | { |
1158 | __be32 *p; | 1150 | __be32 *p; |
1159 | 1151 | ||
1160 | RESERVE_SPACE(4); | 1152 | p = reserve_space(xdr, 4); |
1161 | switch(arg->open_flags & O_EXCL) { | 1153 | switch(arg->open_flags & O_EXCL) { |
1162 | case 0: | 1154 | case 0: |
1163 | *p++ = cpu_to_be32(NFS4_CREATE_UNCHECKED); | 1155 | *p++ = cpu_to_be32(NFS4_CREATE_UNCHECKED); |
@@ -1173,7 +1165,7 @@ static void encode_opentype(struct xdr_stream *xdr, const struct nfs_openargs *a | |||
1173 | { | 1165 | { |
1174 | __be32 *p; | 1166 | __be32 *p; |
1175 | 1167 | ||
1176 | RESERVE_SPACE(4); | 1168 | p = reserve_space(xdr, 4); |
1177 | switch (arg->open_flags & O_CREAT) { | 1169 | switch (arg->open_flags & O_CREAT) { |
1178 | case 0: | 1170 | case 0: |
1179 | *p++ = cpu_to_be32(NFS4_OPEN_NOCREATE); | 1171 | *p++ = cpu_to_be32(NFS4_OPEN_NOCREATE); |
@@ -1189,7 +1181,7 @@ static inline void encode_delegation_type(struct xdr_stream *xdr, fmode_t delega | |||
1189 | { | 1181 | { |
1190 | __be32 *p; | 1182 | __be32 *p; |
1191 | 1183 | ||
1192 | RESERVE_SPACE(4); | 1184 | p = reserve_space(xdr, 4); |
1193 | switch (delegation_type) { | 1185 | switch (delegation_type) { |
1194 | case 0: | 1186 | case 0: |
1195 | *p++ = cpu_to_be32(NFS4_OPEN_DELEGATE_NONE); | 1187 | *p++ = cpu_to_be32(NFS4_OPEN_DELEGATE_NONE); |
@@ -1209,7 +1201,7 @@ static inline void encode_claim_null(struct xdr_stream *xdr, const struct qstr * | |||
1209 | { | 1201 | { |
1210 | __be32 *p; | 1202 | __be32 *p; |
1211 | 1203 | ||
1212 | RESERVE_SPACE(4); | 1204 | p = reserve_space(xdr, 4); |
1213 | *p++ = cpu_to_be32(NFS4_OPEN_CLAIM_NULL); | 1205 | *p++ = cpu_to_be32(NFS4_OPEN_CLAIM_NULL); |
1214 | encode_string(xdr, name->len, name->name); | 1206 | encode_string(xdr, name->len, name->name); |
1215 | } | 1207 | } |
@@ -1218,7 +1210,7 @@ static inline void encode_claim_previous(struct xdr_stream *xdr, fmode_t type) | |||
1218 | { | 1210 | { |
1219 | __be32 *p; | 1211 | __be32 *p; |
1220 | 1212 | ||
1221 | RESERVE_SPACE(4); | 1213 | p = reserve_space(xdr, 4); |
1222 | *p++ = cpu_to_be32(NFS4_OPEN_CLAIM_PREVIOUS); | 1214 | *p++ = cpu_to_be32(NFS4_OPEN_CLAIM_PREVIOUS); |
1223 | encode_delegation_type(xdr, type); | 1215 | encode_delegation_type(xdr, type); |
1224 | } | 1216 | } |
@@ -1227,7 +1219,7 @@ static inline void encode_claim_delegate_cur(struct xdr_stream *xdr, const struc | |||
1227 | { | 1219 | { |
1228 | __be32 *p; | 1220 | __be32 *p; |
1229 | 1221 | ||
1230 | RESERVE_SPACE(4+NFS4_STATEID_SIZE); | 1222 | p = reserve_space(xdr, 4+NFS4_STATEID_SIZE); |
1231 | *p++ = cpu_to_be32(NFS4_OPEN_CLAIM_DELEGATE_CUR); | 1223 | *p++ = cpu_to_be32(NFS4_OPEN_CLAIM_DELEGATE_CUR); |
1232 | p = xdr_encode_opaque_fixed(p, stateid->data, NFS4_STATEID_SIZE); | 1224 | p = xdr_encode_opaque_fixed(p, stateid->data, NFS4_STATEID_SIZE); |
1233 | encode_string(xdr, name->len, name->name); | 1225 | encode_string(xdr, name->len, name->name); |
@@ -1258,7 +1250,7 @@ static void encode_open_confirm(struct xdr_stream *xdr, const struct nfs_open_co | |||
1258 | { | 1250 | { |
1259 | __be32 *p; | 1251 | __be32 *p; |
1260 | 1252 | ||
1261 | RESERVE_SPACE(4+NFS4_STATEID_SIZE+4); | 1253 | p = reserve_space(xdr, 4+NFS4_STATEID_SIZE+4); |
1262 | *p++ = cpu_to_be32(OP_OPEN_CONFIRM); | 1254 | *p++ = cpu_to_be32(OP_OPEN_CONFIRM); |
1263 | p = xdr_encode_opaque_fixed(p, arg->stateid->data, NFS4_STATEID_SIZE); | 1255 | p = xdr_encode_opaque_fixed(p, arg->stateid->data, NFS4_STATEID_SIZE); |
1264 | *p++ = cpu_to_be32(arg->seqid->sequence->counter); | 1256 | *p++ = cpu_to_be32(arg->seqid->sequence->counter); |
@@ -1270,7 +1262,7 @@ static void encode_open_downgrade(struct xdr_stream *xdr, const struct nfs_close | |||
1270 | { | 1262 | { |
1271 | __be32 *p; | 1263 | __be32 *p; |
1272 | 1264 | ||
1273 | RESERVE_SPACE(4+NFS4_STATEID_SIZE+4); | 1265 | p = reserve_space(xdr, 4+NFS4_STATEID_SIZE+4); |
1274 | *p++ = cpu_to_be32(OP_OPEN_DOWNGRADE); | 1266 | *p++ = cpu_to_be32(OP_OPEN_DOWNGRADE); |
1275 | p = xdr_encode_opaque_fixed(p, arg->stateid->data, NFS4_STATEID_SIZE); | 1267 | p = xdr_encode_opaque_fixed(p, arg->stateid->data, NFS4_STATEID_SIZE); |
1276 | *p++ = cpu_to_be32(arg->seqid->sequence->counter); | 1268 | *p++ = cpu_to_be32(arg->seqid->sequence->counter); |
@@ -1285,7 +1277,7 @@ encode_putfh(struct xdr_stream *xdr, const struct nfs_fh *fh, struct compound_hd | |||
1285 | int len = fh->size; | 1277 | int len = fh->size; |
1286 | __be32 *p; | 1278 | __be32 *p; |
1287 | 1279 | ||
1288 | RESERVE_SPACE(8 + len); | 1280 | p = reserve_space(xdr, 8 + len); |
1289 | *p++ = cpu_to_be32(OP_PUTFH); | 1281 | *p++ = cpu_to_be32(OP_PUTFH); |
1290 | *p++ = cpu_to_be32(len); | 1282 | *p++ = cpu_to_be32(len); |
1291 | p = xdr_encode_opaque_fixed(p, fh->data, len); | 1283 | p = xdr_encode_opaque_fixed(p, fh->data, len); |
@@ -1297,7 +1289,7 @@ static void encode_putrootfh(struct xdr_stream *xdr, struct compound_hdr *hdr) | |||
1297 | { | 1289 | { |
1298 | __be32 *p; | 1290 | __be32 *p; |
1299 | 1291 | ||
1300 | RESERVE_SPACE(4); | 1292 | p = reserve_space(xdr, 4); |
1301 | *p++ = cpu_to_be32(OP_PUTROOTFH); | 1293 | *p++ = cpu_to_be32(OP_PUTROOTFH); |
1302 | hdr->nops++; | 1294 | hdr->nops++; |
1303 | hdr->replen += decode_putrootfh_maxsz; | 1295 | hdr->replen += decode_putrootfh_maxsz; |
@@ -1308,7 +1300,7 @@ static void encode_stateid(struct xdr_stream *xdr, const struct nfs_open_context | |||
1308 | nfs4_stateid stateid; | 1300 | nfs4_stateid stateid; |
1309 | __be32 *p; | 1301 | __be32 *p; |
1310 | 1302 | ||
1311 | RESERVE_SPACE(NFS4_STATEID_SIZE); | 1303 | p = reserve_space(xdr, NFS4_STATEID_SIZE); |
1312 | if (ctx->state != NULL) { | 1304 | if (ctx->state != NULL) { |
1313 | nfs4_copy_stateid(&stateid, ctx->state, ctx->lockowner); | 1305 | nfs4_copy_stateid(&stateid, ctx->state, ctx->lockowner); |
1314 | p = xdr_encode_opaque_fixed(p, stateid.data, NFS4_STATEID_SIZE); | 1306 | p = xdr_encode_opaque_fixed(p, stateid.data, NFS4_STATEID_SIZE); |
@@ -1320,12 +1312,12 @@ static void encode_read(struct xdr_stream *xdr, const struct nfs_readargs *args, | |||
1320 | { | 1312 | { |
1321 | __be32 *p; | 1313 | __be32 *p; |
1322 | 1314 | ||
1323 | RESERVE_SPACE(4); | 1315 | p = reserve_space(xdr, 4); |
1324 | *p++ = cpu_to_be32(OP_READ); | 1316 | *p++ = cpu_to_be32(OP_READ); |
1325 | 1317 | ||
1326 | encode_stateid(xdr, args->context); | 1318 | encode_stateid(xdr, args->context); |
1327 | 1319 | ||
1328 | RESERVE_SPACE(12); | 1320 | p = reserve_space(xdr, 12); |
1329 | p = xdr_encode_hyper(p, args->offset); | 1321 | p = xdr_encode_hyper(p, args->offset); |
1330 | *p++ = cpu_to_be32(args->count); | 1322 | *p++ = cpu_to_be32(args->count); |
1331 | hdr->nops++; | 1323 | hdr->nops++; |
@@ -1340,7 +1332,7 @@ static void encode_readdir(struct xdr_stream *xdr, const struct nfs4_readdir_arg | |||
1340 | }; | 1332 | }; |
1341 | __be32 *p; | 1333 | __be32 *p; |
1342 | 1334 | ||
1343 | RESERVE_SPACE(12+NFS4_VERIFIER_SIZE+20); | 1335 | p = reserve_space(xdr, 12+NFS4_VERIFIER_SIZE+20); |
1344 | *p++ = cpu_to_be32(OP_READDIR); | 1336 | *p++ = cpu_to_be32(OP_READDIR); |
1345 | p = xdr_encode_hyper(p, readdir->cookie); | 1337 | p = xdr_encode_hyper(p, readdir->cookie); |
1346 | p = xdr_encode_opaque_fixed(p, readdir->verifier.data, NFS4_VERIFIER_SIZE); | 1338 | p = xdr_encode_opaque_fixed(p, readdir->verifier.data, NFS4_VERIFIER_SIZE); |
@@ -1369,7 +1361,7 @@ static void encode_readlink(struct xdr_stream *xdr, const struct nfs4_readlink * | |||
1369 | { | 1361 | { |
1370 | __be32 *p; | 1362 | __be32 *p; |
1371 | 1363 | ||
1372 | RESERVE_SPACE(4); | 1364 | p = reserve_space(xdr, 4); |
1373 | *p++ = cpu_to_be32(OP_READLINK); | 1365 | *p++ = cpu_to_be32(OP_READLINK); |
1374 | hdr->nops++; | 1366 | hdr->nops++; |
1375 | hdr->replen += decode_readlink_maxsz; | 1367 | hdr->replen += decode_readlink_maxsz; |
@@ -1379,7 +1371,7 @@ static void encode_remove(struct xdr_stream *xdr, const struct qstr *name, struc | |||
1379 | { | 1371 | { |
1380 | __be32 *p; | 1372 | __be32 *p; |
1381 | 1373 | ||
1382 | RESERVE_SPACE(8 + name->len); | 1374 | p = reserve_space(xdr, 8 + name->len); |
1383 | *p++ = cpu_to_be32(OP_REMOVE); | 1375 | *p++ = cpu_to_be32(OP_REMOVE); |
1384 | *p++ = cpu_to_be32(name->len); | 1376 | *p++ = cpu_to_be32(name->len); |
1385 | p = xdr_encode_opaque_fixed(p, name->name, name->len); | 1377 | p = xdr_encode_opaque_fixed(p, name->name, name->len); |
@@ -1391,12 +1383,12 @@ static void encode_rename(struct xdr_stream *xdr, const struct qstr *oldname, co | |||
1391 | { | 1383 | { |
1392 | __be32 *p; | 1384 | __be32 *p; |
1393 | 1385 | ||
1394 | RESERVE_SPACE(8 + oldname->len); | 1386 | p = reserve_space(xdr, 8 + oldname->len); |
1395 | *p++ = cpu_to_be32(OP_RENAME); | 1387 | *p++ = cpu_to_be32(OP_RENAME); |
1396 | *p++ = cpu_to_be32(oldname->len); | 1388 | *p++ = cpu_to_be32(oldname->len); |
1397 | p = xdr_encode_opaque_fixed(p, oldname->name, oldname->len); | 1389 | p = xdr_encode_opaque_fixed(p, oldname->name, oldname->len); |
1398 | 1390 | ||
1399 | RESERVE_SPACE(4 + newname->len); | 1391 | p = reserve_space(xdr, 4 + newname->len); |
1400 | *p++ = cpu_to_be32(newname->len); | 1392 | *p++ = cpu_to_be32(newname->len); |
1401 | p = xdr_encode_opaque_fixed(p, newname->name, newname->len); | 1393 | p = xdr_encode_opaque_fixed(p, newname->name, newname->len); |
1402 | hdr->nops++; | 1394 | hdr->nops++; |
@@ -1407,7 +1399,7 @@ static void encode_renew(struct xdr_stream *xdr, const struct nfs_client *client | |||
1407 | { | 1399 | { |
1408 | __be32 *p; | 1400 | __be32 *p; |
1409 | 1401 | ||
1410 | RESERVE_SPACE(12); | 1402 | p = reserve_space(xdr, 12); |
1411 | *p++ = cpu_to_be32(OP_RENEW); | 1403 | *p++ = cpu_to_be32(OP_RENEW); |
1412 | p = xdr_encode_hyper(p, client_stateid->cl_clientid); | 1404 | p = xdr_encode_hyper(p, client_stateid->cl_clientid); |
1413 | hdr->nops++; | 1405 | hdr->nops++; |
@@ -1419,7 +1411,7 @@ encode_restorefh(struct xdr_stream *xdr, struct compound_hdr *hdr) | |||
1419 | { | 1411 | { |
1420 | __be32 *p; | 1412 | __be32 *p; |
1421 | 1413 | ||
1422 | RESERVE_SPACE(4); | 1414 | p = reserve_space(xdr, 4); |
1423 | *p++ = cpu_to_be32(OP_RESTOREFH); | 1415 | *p++ = cpu_to_be32(OP_RESTOREFH); |
1424 | hdr->nops++; | 1416 | hdr->nops++; |
1425 | hdr->replen += decode_restorefh_maxsz; | 1417 | hdr->replen += decode_restorefh_maxsz; |
@@ -1430,15 +1422,15 @@ encode_setacl(struct xdr_stream *xdr, struct nfs_setaclargs *arg, struct compoun | |||
1430 | { | 1422 | { |
1431 | __be32 *p; | 1423 | __be32 *p; |
1432 | 1424 | ||
1433 | RESERVE_SPACE(4+NFS4_STATEID_SIZE); | 1425 | p = reserve_space(xdr, 4+NFS4_STATEID_SIZE); |
1434 | *p++ = cpu_to_be32(OP_SETATTR); | 1426 | *p++ = cpu_to_be32(OP_SETATTR); |
1435 | p = xdr_encode_opaque_fixed(p, zero_stateid.data, NFS4_STATEID_SIZE); | 1427 | p = xdr_encode_opaque_fixed(p, zero_stateid.data, NFS4_STATEID_SIZE); |
1436 | RESERVE_SPACE(2*4); | 1428 | p = reserve_space(xdr, 2*4); |
1437 | *p++ = cpu_to_be32(1); | 1429 | *p++ = cpu_to_be32(1); |
1438 | *p++ = cpu_to_be32(FATTR4_WORD0_ACL); | 1430 | *p++ = cpu_to_be32(FATTR4_WORD0_ACL); |
1439 | if (arg->acl_len % 4) | 1431 | if (arg->acl_len % 4) |
1440 | return -EINVAL; | 1432 | return -EINVAL; |
1441 | RESERVE_SPACE(4); | 1433 | p = reserve_space(xdr, 4); |
1442 | *p++ = cpu_to_be32(arg->acl_len); | 1434 | *p++ = cpu_to_be32(arg->acl_len); |
1443 | xdr_write_pages(xdr, arg->acl_pages, arg->acl_pgbase, arg->acl_len); | 1435 | xdr_write_pages(xdr, arg->acl_pages, arg->acl_pgbase, arg->acl_len); |
1444 | hdr->nops++; | 1436 | hdr->nops++; |
@@ -1451,7 +1443,7 @@ encode_savefh(struct xdr_stream *xdr, struct compound_hdr *hdr) | |||
1451 | { | 1443 | { |
1452 | __be32 *p; | 1444 | __be32 *p; |
1453 | 1445 | ||
1454 | RESERVE_SPACE(4); | 1446 | p = reserve_space(xdr, 4); |
1455 | *p++ = cpu_to_be32(OP_SAVEFH); | 1447 | *p++ = cpu_to_be32(OP_SAVEFH); |
1456 | hdr->nops++; | 1448 | hdr->nops++; |
1457 | hdr->replen += decode_savefh_maxsz; | 1449 | hdr->replen += decode_savefh_maxsz; |
@@ -1461,7 +1453,7 @@ static void encode_setattr(struct xdr_stream *xdr, const struct nfs_setattrargs | |||
1461 | { | 1453 | { |
1462 | __be32 *p; | 1454 | __be32 *p; |
1463 | 1455 | ||
1464 | RESERVE_SPACE(4+NFS4_STATEID_SIZE); | 1456 | p = reserve_space(xdr, 4+NFS4_STATEID_SIZE); |
1465 | *p++ = cpu_to_be32(OP_SETATTR); | 1457 | *p++ = cpu_to_be32(OP_SETATTR); |
1466 | p = xdr_encode_opaque_fixed(p, arg->stateid.data, NFS4_STATEID_SIZE); | 1458 | p = xdr_encode_opaque_fixed(p, arg->stateid.data, NFS4_STATEID_SIZE); |
1467 | hdr->nops++; | 1459 | hdr->nops++; |
@@ -1473,16 +1465,16 @@ static void encode_setclientid(struct xdr_stream *xdr, const struct nfs4_setclie | |||
1473 | { | 1465 | { |
1474 | __be32 *p; | 1466 | __be32 *p; |
1475 | 1467 | ||
1476 | RESERVE_SPACE(4 + NFS4_VERIFIER_SIZE); | 1468 | p = reserve_space(xdr, 4 + NFS4_VERIFIER_SIZE); |
1477 | *p++ = cpu_to_be32(OP_SETCLIENTID); | 1469 | *p++ = cpu_to_be32(OP_SETCLIENTID); |
1478 | p = xdr_encode_opaque_fixed(p, setclientid->sc_verifier->data, NFS4_VERIFIER_SIZE); | 1470 | p = xdr_encode_opaque_fixed(p, setclientid->sc_verifier->data, NFS4_VERIFIER_SIZE); |
1479 | 1471 | ||
1480 | encode_string(xdr, setclientid->sc_name_len, setclientid->sc_name); | 1472 | encode_string(xdr, setclientid->sc_name_len, setclientid->sc_name); |
1481 | RESERVE_SPACE(4); | 1473 | p = reserve_space(xdr, 4); |
1482 | *p++ = cpu_to_be32(setclientid->sc_prog); | 1474 | *p++ = cpu_to_be32(setclientid->sc_prog); |
1483 | encode_string(xdr, setclientid->sc_netid_len, setclientid->sc_netid); | 1475 | encode_string(xdr, setclientid->sc_netid_len, setclientid->sc_netid); |
1484 | encode_string(xdr, setclientid->sc_uaddr_len, setclientid->sc_uaddr); | 1476 | encode_string(xdr, setclientid->sc_uaddr_len, setclientid->sc_uaddr); |
1485 | RESERVE_SPACE(4); | 1477 | p = reserve_space(xdr, 4); |
1486 | *p++ = cpu_to_be32(setclientid->sc_cb_ident); | 1478 | *p++ = cpu_to_be32(setclientid->sc_cb_ident); |
1487 | hdr->nops++; | 1479 | hdr->nops++; |
1488 | hdr->replen += decode_setclientid_maxsz; | 1480 | hdr->replen += decode_setclientid_maxsz; |
@@ -1492,7 +1484,7 @@ static void encode_setclientid_confirm(struct xdr_stream *xdr, const struct nfs_ | |||
1492 | { | 1484 | { |
1493 | __be32 *p; | 1485 | __be32 *p; |
1494 | 1486 | ||
1495 | RESERVE_SPACE(12 + NFS4_VERIFIER_SIZE); | 1487 | p = reserve_space(xdr, 12 + NFS4_VERIFIER_SIZE); |
1496 | *p++ = cpu_to_be32(OP_SETCLIENTID_CONFIRM); | 1488 | *p++ = cpu_to_be32(OP_SETCLIENTID_CONFIRM); |
1497 | p = xdr_encode_hyper(p, client_state->cl_clientid); | 1489 | p = xdr_encode_hyper(p, client_state->cl_clientid); |
1498 | p = xdr_encode_opaque_fixed(p, client_state->cl_confirm.data, NFS4_VERIFIER_SIZE); | 1490 | p = xdr_encode_opaque_fixed(p, client_state->cl_confirm.data, NFS4_VERIFIER_SIZE); |
@@ -1504,12 +1496,12 @@ static void encode_write(struct xdr_stream *xdr, const struct nfs_writeargs *arg | |||
1504 | { | 1496 | { |
1505 | __be32 *p; | 1497 | __be32 *p; |
1506 | 1498 | ||
1507 | RESERVE_SPACE(4); | 1499 | p = reserve_space(xdr, 4); |
1508 | *p++ = cpu_to_be32(OP_WRITE); | 1500 | *p++ = cpu_to_be32(OP_WRITE); |
1509 | 1501 | ||
1510 | encode_stateid(xdr, args->context); | 1502 | encode_stateid(xdr, args->context); |
1511 | 1503 | ||
1512 | RESERVE_SPACE(16); | 1504 | p = reserve_space(xdr, 16); |
1513 | p = xdr_encode_hyper(p, args->offset); | 1505 | p = xdr_encode_hyper(p, args->offset); |
1514 | *p++ = cpu_to_be32(args->stable); | 1506 | *p++ = cpu_to_be32(args->stable); |
1515 | *p++ = cpu_to_be32(args->count); | 1507 | *p++ = cpu_to_be32(args->count); |
@@ -1523,7 +1515,7 @@ static void encode_delegreturn(struct xdr_stream *xdr, const nfs4_stateid *state | |||
1523 | { | 1515 | { |
1524 | __be32 *p; | 1516 | __be32 *p; |
1525 | 1517 | ||
1526 | RESERVE_SPACE(4+NFS4_STATEID_SIZE); | 1518 | p = reserve_space(xdr, 4+NFS4_STATEID_SIZE); |
1527 | 1519 | ||
1528 | *p++ = cpu_to_be32(OP_DELEGRETURN); | 1520 | *p++ = cpu_to_be32(OP_DELEGRETURN); |
1529 | p = xdr_encode_opaque_fixed(p, stateid->data, NFS4_STATEID_SIZE); | 1521 | p = xdr_encode_opaque_fixed(p, stateid->data, NFS4_STATEID_SIZE); |
@@ -1539,13 +1531,13 @@ static void encode_exchange_id(struct xdr_stream *xdr, | |||
1539 | { | 1531 | { |
1540 | __be32 *p; | 1532 | __be32 *p; |
1541 | 1533 | ||
1542 | RESERVE_SPACE(4 + sizeof(args->verifier->data)); | 1534 | p = reserve_space(xdr, 4 + sizeof(args->verifier->data)); |
1543 | *p++ = cpu_to_be32(OP_EXCHANGE_ID); | 1535 | *p++ = cpu_to_be32(OP_EXCHANGE_ID); |
1544 | p = xdr_encode_opaque_fixed(p, args->verifier->data, sizeof(args->verifier->data)); | 1536 | p = xdr_encode_opaque_fixed(p, args->verifier->data, sizeof(args->verifier->data)); |
1545 | 1537 | ||
1546 | encode_string(xdr, args->id_len, args->id); | 1538 | encode_string(xdr, args->id_len, args->id); |
1547 | 1539 | ||
1548 | RESERVE_SPACE(12); | 1540 | p = reserve_space(xdr, 12); |
1549 | *p++ = cpu_to_be32(args->flags); | 1541 | *p++ = cpu_to_be32(args->flags); |
1550 | *p++ = cpu_to_be32(0); /* zero length state_protect4_a */ | 1542 | *p++ = cpu_to_be32(0); /* zero length state_protect4_a */ |
1551 | *p++ = cpu_to_be32(0); /* zero length implementation id array */ | 1543 | *p++ = cpu_to_be32(0); /* zero length implementation id array */ |
@@ -1565,7 +1557,7 @@ static void encode_create_session(struct xdr_stream *xdr, | |||
1565 | len = scnprintf(machine_name, sizeof(machine_name), "%s", | 1557 | len = scnprintf(machine_name, sizeof(machine_name), "%s", |
1566 | clp->cl_ipaddr); | 1558 | clp->cl_ipaddr); |
1567 | 1559 | ||
1568 | RESERVE_SPACE(20 + 2*28 + 20 + len + 12); | 1560 | p = reserve_space(xdr, 20 + 2*28 + 20 + len + 12); |
1569 | *p++ = cpu_to_be32(OP_CREATE_SESSION); | 1561 | *p++ = cpu_to_be32(OP_CREATE_SESSION); |
1570 | p = xdr_encode_hyper(p, clp->cl_ex_clid); | 1562 | p = xdr_encode_hyper(p, clp->cl_ex_clid); |
1571 | *p++ = cpu_to_be32(clp->cl_seqid); /*Sequence id */ | 1563 | *p++ = cpu_to_be32(clp->cl_seqid); /*Sequence id */ |
@@ -1609,7 +1601,7 @@ static void encode_destroy_session(struct xdr_stream *xdr, | |||
1609 | struct compound_hdr *hdr) | 1601 | struct compound_hdr *hdr) |
1610 | { | 1602 | { |
1611 | __be32 *p; | 1603 | __be32 *p; |
1612 | RESERVE_SPACE(4 + NFS4_MAX_SESSIONID_LEN); | 1604 | p = reserve_space(xdr, 4 + NFS4_MAX_SESSIONID_LEN); |
1613 | *p++ = cpu_to_be32(OP_DESTROY_SESSION); | 1605 | *p++ = cpu_to_be32(OP_DESTROY_SESSION); |
1614 | p = xdr_encode_opaque_fixed(p, session->sess_id.data, NFS4_MAX_SESSIONID_LEN); | 1606 | p = xdr_encode_opaque_fixed(p, session->sess_id.data, NFS4_MAX_SESSIONID_LEN); |
1615 | hdr->nops++; | 1607 | hdr->nops++; |
@@ -1635,7 +1627,7 @@ static void encode_sequence(struct xdr_stream *xdr, | |||
1635 | WARN_ON(args->sa_slotid == NFS4_MAX_SLOT_TABLE); | 1627 | WARN_ON(args->sa_slotid == NFS4_MAX_SLOT_TABLE); |
1636 | slot = tp->slots + args->sa_slotid; | 1628 | slot = tp->slots + args->sa_slotid; |
1637 | 1629 | ||
1638 | RESERVE_SPACE(4 + NFS4_MAX_SESSIONID_LEN + 16); | 1630 | p = reserve_space(xdr, 4 + NFS4_MAX_SESSIONID_LEN + 16); |
1639 | *p++ = cpu_to_be32(OP_SEQUENCE); | 1631 | *p++ = cpu_to_be32(OP_SEQUENCE); |
1640 | 1632 | ||
1641 | /* | 1633 | /* |