Commit a73588fe481ffe39e3021decdc73a5b358f0776c

Authored by Joe Hershberger
1 parent 16f416661e

Revert "net: nfs: Use the tx buffer to construct rpc msgs"

This reverts commit 998372b4798fd7ebb666f571950df925b8d80f69.

This caused a data abort on some platform.

Signed-off-by: Joe Hershberger <joe.hershberger@ni.com>
Reported-by: Guillaume GARDET <guillaume.gardet@free.fr>

Showing 1 changed file with 43 additions and 45 deletions Side-by-side Diff

... ... @@ -170,42 +170,42 @@
170 170 /**************************************************************************
171 171 RPC_LOOKUP - Lookup RPC Port numbers
172 172 **************************************************************************/
173   -static struct rpc_t *rpc_req_prep(void)
  173 +static void rpc_req(int rpc_prog, int rpc_proc, uint32_t *data, int datalen)
174 174 {
175   - return (struct rpc_t *)(net_tx_packet + net_eth_hdr_size() +
176   - IP_UDP_HDR_SIZE);
177   -}
178   -
179   -static void rpc_req(int rpc_prog, int rpc_proc, struct rpc_t *rpc_pkt,
180   - int datalen)
181   -{
  175 + struct rpc_t rpc_pkt;
182 176 unsigned long id;
  177 + uint32_t *p;
183 178 int pktlen;
184 179 int sport;
185 180  
186 181 id = ++rpc_id;
187   - rpc_pkt->u.call.id = htonl(id);
188   - rpc_pkt->u.call.type = htonl(MSG_CALL);
189   - rpc_pkt->u.call.rpcvers = htonl(2); /* use RPC version 2 */
190   - rpc_pkt->u.call.prog = htonl(rpc_prog);
  182 + rpc_pkt.u.call.id = htonl(id);
  183 + rpc_pkt.u.call.type = htonl(MSG_CALL);
  184 + rpc_pkt.u.call.rpcvers = htonl(2); /* use RPC version 2 */
  185 + rpc_pkt.u.call.prog = htonl(rpc_prog);
191 186 switch (rpc_prog) {
192 187 case PROG_NFS:
193 188 if (supported_nfs_versions & NFSV2_FLAG)
194   - rpc_pkt->u.call.vers = htonl(2); /* NFS v2 */
  189 + rpc_pkt.u.call.vers = htonl(2); /* NFS v2 */
195 190 else /* NFSV3_FLAG */
196   - rpc_pkt->u.call.vers = htonl(3); /* NFS v3 */
  191 + rpc_pkt.u.call.vers = htonl(3); /* NFS v3 */
197 192 break;
198 193 case PROG_PORTMAP:
199 194 case PROG_MOUNT:
200 195 default:
201   - /* portmapper is version 2 */
202   - rpc_pkt->u.call.vers = htonl(2);
  196 + rpc_pkt.u.call.vers = htonl(2); /* portmapper is version 2 */
203 197 }
204   - rpc_pkt->u.call.proc = htonl(rpc_proc);
  198 + rpc_pkt.u.call.proc = htonl(rpc_proc);
  199 + p = (uint32_t *)&(rpc_pkt.u.call.data);
205 200  
206   - pktlen = ((char *)&rpc_pkt->u.call.data - (char *)&rpc_pkt) +
207   - datalen * sizeof(uint32_t);
  201 + if (datalen)
  202 + memcpy((char *)p, (char *)data, datalen*sizeof(uint32_t));
208 203  
  204 + pktlen = (char *)p + datalen * sizeof(uint32_t) - (char *)&rpc_pkt;
  205 +
  206 + memcpy((char *)net_tx_packet + net_eth_hdr_size() + IP_UDP_HDR_SIZE,
  207 + &rpc_pkt.u.data[0], pktlen);
  208 +
209 209 if (rpc_prog == PROG_PORTMAP)
210 210 sport = SUNRPC_PORT;
211 211 else if (rpc_prog == PROG_MOUNT)
212 212  
213 213  
... ... @@ -222,17 +222,15 @@
222 222 **************************************************************************/
223 223 static void rpc_lookup_req(int prog, int ver)
224 224 {
225   - uint32_t *data;
226   - struct rpc_t *rpc_pkt = rpc_req_prep();
  225 + uint32_t data[16];
227 226  
228   - data = rpc_pkt->u.call.data;
229 227 data[0] = 0; data[1] = 0; /* auth credential */
230 228 data[2] = 0; data[3] = 0; /* auth verifier */
231 229 data[4] = htonl(prog);
232 230 data[5] = htonl(ver);
233 231 data[6] = htonl(17); /* IP_UDP */
234 232 data[7] = 0;
235   - rpc_req(PROG_PORTMAP, PORTMAP_GETPORT, rpc_pkt, 8);
  233 + rpc_req(PROG_PORTMAP, PORTMAP_GETPORT, data, 8);
236 234 }
237 235  
238 236 /**************************************************************************
239 237  
240 238  
... ... @@ -240,14 +238,14 @@
240 238 **************************************************************************/
241 239 static void nfs_mount_req(char *path)
242 240 {
  241 + uint32_t data[1024];
243 242 uint32_t *p;
244 243 int len;
245 244 int pathlen;
246   - struct rpc_t *rpc_pkt = rpc_req_prep();
247 245  
248 246 pathlen = strlen(path);
249 247  
250   - p = rpc_pkt->u.call.data;
  248 + p = &(data[0]);
251 249 p = rpc_add_credentials(p);
252 250  
253 251 *p++ = htonl(pathlen);
254 252  
... ... @@ -256,9 +254,9 @@
256 254 memcpy(p, path, pathlen);
257 255 p += (pathlen + 3) / 4;
258 256  
259   - len = (uint32_t *)p - (uint32_t *)&(rpc_pkt->u.call.data);
  257 + len = (uint32_t *)p - (uint32_t *)&(data[0]);
260 258  
261   - rpc_req(PROG_MOUNT, MOUNT_ADDENTRY, rpc_pkt, len);
  259 + rpc_req(PROG_MOUNT, MOUNT_ADDENTRY, data, len);
262 260 }
263 261  
264 262 /**************************************************************************
265 263  
266 264  
267 265  
268 266  
... ... @@ -266,20 +264,20 @@
266 264 **************************************************************************/
267 265 static void nfs_umountall_req(void)
268 266 {
  267 + uint32_t data[1024];
269 268 uint32_t *p;
270 269 int len;
271   - struct rpc_t *rpc_pkt = rpc_req_prep();
272 270  
273 271 if ((nfs_server_mount_port == -1) || (!fs_mounted))
274 272 /* Nothing mounted, nothing to umount */
275 273 return;
276 274  
277   - p = rpc_pkt->u.call.data;
  275 + p = &(data[0]);
278 276 p = rpc_add_credentials(p);
279 277  
280   - len = (uint32_t *)p - (uint32_t *)&(rpc_pkt->u.call.data);
  278 + len = (uint32_t *)p - (uint32_t *)&(data[0]);
281 279  
282   - rpc_req(PROG_MOUNT, MOUNT_UMOUNTALL, rpc_pkt, len);
  280 + rpc_req(PROG_MOUNT, MOUNT_UMOUNTALL, data, len);
283 281 }
284 282  
285 283 /***************************************************************************
286 284  
287 285  
... ... @@ -291,11 +289,11 @@
291 289 **************************************************************************/
292 290 static void nfs_readlink_req(void)
293 291 {
  292 + uint32_t data[1024];
294 293 uint32_t *p;
295 294 int len;
296   - struct rpc_t *rpc_pkt = rpc_req_prep();
297 295  
298   - p = rpc_pkt->u.call.data;
  296 + p = &(data[0]);
299 297 p = rpc_add_credentials(p);
300 298  
301 299 if (supported_nfs_versions & NFSV2_FLAG) {
302 300  
... ... @@ -307,9 +305,9 @@
307 305 p += (filefh3_length / 4);
308 306 }
309 307  
310   - len = (uint32_t *)p - (uint32_t *)&(rpc_pkt->u.call.data);
  308 + len = (uint32_t *)p - (uint32_t *)&(data[0]);
311 309  
312   - rpc_req(PROG_NFS, NFS_READLINK, rpc_pkt, len);
  310 + rpc_req(PROG_NFS, NFS_READLINK, data, len);
313 311 }
314 312  
315 313 /**************************************************************************
316 314  
317 315  
... ... @@ -317,14 +315,14 @@
317 315 **************************************************************************/
318 316 static void nfs_lookup_req(char *fname)
319 317 {
  318 + uint32_t data[1024];
320 319 uint32_t *p;
321 320 int len;
322 321 int fnamelen;
323   - struct rpc_t *rpc_pkt = rpc_req_prep();
324 322  
325 323 fnamelen = strlen(fname);
326 324  
327   - p = rpc_pkt->u.call.data;
  325 + p = &(data[0]);
328 326 p = rpc_add_credentials(p);
329 327  
330 328 if (supported_nfs_versions & NFSV2_FLAG) {
331 329  
... ... @@ -336,9 +334,9 @@
336 334 memcpy(p, fname, fnamelen);
337 335 p += (fnamelen + 3) / 4;
338 336  
339   - len = (uint32_t *)p - (uint32_t *)&(rpc_pkt->u.call.data);
  337 + len = (uint32_t *)p - (uint32_t *)&(data[0]);
340 338  
341   - rpc_req(PROG_NFS, NFS_LOOKUP, rpc_pkt, len);
  339 + rpc_req(PROG_NFS, NFS_LOOKUP, data, len);
342 340 } else { /* NFSV3_FLAG */
343 341 *p++ = htonl(NFS_FHSIZE); /* Dir handle length */
344 342 memcpy(p, dirfh, NFS_FHSIZE);
345 343  
... ... @@ -349,9 +347,9 @@
349 347 memcpy(p, fname, fnamelen);
350 348 p += (fnamelen + 3) / 4;
351 349  
352   - len = (uint32_t *)p - (uint32_t *)&(rpc_pkt->u.call.data);
  350 + len = (uint32_t *)p - (uint32_t *)&(data[0]);
353 351  
354   - rpc_req(PROG_NFS, NFS3PROC_LOOKUP, rpc_pkt, len);
  352 + rpc_req(PROG_NFS, NFS3PROC_LOOKUP, data, len);
355 353 }
356 354 }
357 355  
358 356  
359 357  
... ... @@ -360,11 +358,11 @@
360 358 **************************************************************************/
361 359 static void nfs_read_req(int offset, int readlen)
362 360 {
  361 + uint32_t data[1024];
363 362 uint32_t *p;
364 363 int len;
365   - struct rpc_t *rpc_pkt = rpc_req_prep();
366 364  
367   - p = rpc_pkt->u.call.data;
  365 + p = &(data[0]);
368 366 p = rpc_add_credentials(p);
369 367  
370 368 if (supported_nfs_versions & NFSV2_FLAG) {
371 369  
... ... @@ -383,9 +381,9 @@
383 381 *p++ = 0;
384 382 }
385 383  
386   - len = (uint32_t *)p - (uint32_t *)&(rpc_pkt->u.call.data);
  384 + len = (uint32_t *)p - (uint32_t *)&(data[0]);
387 385  
388   - rpc_req(PROG_NFS, NFS_READ, rpc_pkt, len);
  386 + rpc_req(PROG_NFS, NFS_READ, data, len);
389 387 }
390 388  
391 389 /**************************************************************************