diff options
Diffstat (limited to 'fs/afs/fsclient.c')
-rw-r--r-- | fs/afs/fsclient.c | 221 |
1 files changed, 72 insertions, 149 deletions
diff --git a/fs/afs/fsclient.c b/fs/afs/fsclient.c index c2e930ec2888..9312b92e54be 100644 --- a/fs/afs/fsclient.c +++ b/fs/afs/fsclient.c | |||
@@ -240,15 +240,13 @@ static int afs_deliver_fs_fetch_status(struct afs_call *call, | |||
240 | { | 240 | { |
241 | struct afs_vnode *vnode = call->reply; | 241 | struct afs_vnode *vnode = call->reply; |
242 | const __be32 *bp; | 242 | const __be32 *bp; |
243 | int ret; | ||
243 | 244 | ||
244 | _enter(",,%u", last); | 245 | _enter(",,%u", last); |
245 | 246 | ||
246 | afs_transfer_reply(call, skb); | 247 | ret = afs_transfer_reply(call, skb, last); |
247 | if (!last) | 248 | if (ret < 0) |
248 | return 0; | 249 | return ret; |
249 | |||
250 | if (call->reply_size != call->reply_max) | ||
251 | return -EBADMSG; | ||
252 | 250 | ||
253 | /* unmarshall the reply once we've received all of it */ | 251 | /* unmarshall the reply once we've received all of it */ |
254 | bp = call->buffer; | 252 | bp = call->buffer; |
@@ -335,11 +333,8 @@ static int afs_deliver_fs_fetch_data(struct afs_call *call, | |||
335 | case 1: | 333 | case 1: |
336 | _debug("extract data length (MSW)"); | 334 | _debug("extract data length (MSW)"); |
337 | ret = afs_extract_data(call, skb, last, &call->tmp, 4); | 335 | ret = afs_extract_data(call, skb, last, &call->tmp, 4); |
338 | switch (ret) { | 336 | if (ret < 0) |
339 | case 0: break; | 337 | return ret; |
340 | case -EAGAIN: return 0; | ||
341 | default: return ret; | ||
342 | } | ||
343 | 338 | ||
344 | call->count = ntohl(call->tmp); | 339 | call->count = ntohl(call->tmp); |
345 | _debug("DATA length MSW: %u", call->count); | 340 | _debug("DATA length MSW: %u", call->count); |
@@ -353,11 +348,8 @@ static int afs_deliver_fs_fetch_data(struct afs_call *call, | |||
353 | case 2: | 348 | case 2: |
354 | _debug("extract data length"); | 349 | _debug("extract data length"); |
355 | ret = afs_extract_data(call, skb, last, &call->tmp, 4); | 350 | ret = afs_extract_data(call, skb, last, &call->tmp, 4); |
356 | switch (ret) { | 351 | if (ret < 0) |
357 | case 0: break; | 352 | return ret; |
358 | case -EAGAIN: return 0; | ||
359 | default: return ret; | ||
360 | } | ||
361 | 353 | ||
362 | call->count = ntohl(call->tmp); | 354 | call->count = ntohl(call->tmp); |
363 | _debug("DATA length: %u", call->count); | 355 | _debug("DATA length: %u", call->count); |
@@ -375,11 +367,8 @@ static int afs_deliver_fs_fetch_data(struct afs_call *call, | |||
375 | ret = afs_extract_data(call, skb, last, buffer, | 367 | ret = afs_extract_data(call, skb, last, buffer, |
376 | call->count); | 368 | call->count); |
377 | kunmap_atomic(buffer); | 369 | kunmap_atomic(buffer); |
378 | switch (ret) { | 370 | if (ret < 0) |
379 | case 0: break; | 371 | return ret; |
380 | case -EAGAIN: return 0; | ||
381 | default: return ret; | ||
382 | } | ||
383 | } | 372 | } |
384 | 373 | ||
385 | call->offset = 0; | 374 | call->offset = 0; |
@@ -389,11 +378,8 @@ static int afs_deliver_fs_fetch_data(struct afs_call *call, | |||
389 | case 4: | 378 | case 4: |
390 | ret = afs_extract_data(call, skb, last, call->buffer, | 379 | ret = afs_extract_data(call, skb, last, call->buffer, |
391 | (21 + 3 + 6) * 4); | 380 | (21 + 3 + 6) * 4); |
392 | switch (ret) { | 381 | if (ret < 0) |
393 | case 0: break; | 382 | return ret; |
394 | case -EAGAIN: return 0; | ||
395 | default: return ret; | ||
396 | } | ||
397 | 383 | ||
398 | bp = call->buffer; | 384 | bp = call->buffer; |
399 | xdr_decode_AFSFetchStatus(&bp, &vnode->status, vnode, NULL); | 385 | xdr_decode_AFSFetchStatus(&bp, &vnode->status, vnode, NULL); |
@@ -405,15 +391,12 @@ static int afs_deliver_fs_fetch_data(struct afs_call *call, | |||
405 | call->unmarshall++; | 391 | call->unmarshall++; |
406 | 392 | ||
407 | case 5: | 393 | case 5: |
408 | _debug("trailer"); | 394 | ret = afs_data_complete(call, skb, last); |
409 | if (skb->len != 0) | 395 | if (ret < 0) |
410 | return -EBADMSG; | 396 | return ret; |
411 | break; | 397 | break; |
412 | } | 398 | } |
413 | 399 | ||
414 | if (!last) | ||
415 | return 0; | ||
416 | |||
417 | if (call->count < PAGE_SIZE) { | 400 | if (call->count < PAGE_SIZE) { |
418 | _debug("clear"); | 401 | _debug("clear"); |
419 | page = call->reply3; | 402 | page = call->reply3; |
@@ -537,9 +520,8 @@ static int afs_deliver_fs_give_up_callbacks(struct afs_call *call, | |||
537 | { | 520 | { |
538 | _enter(",{%u},%d", skb->len, last); | 521 | _enter(",{%u},%d", skb->len, last); |
539 | 522 | ||
540 | if (skb->len > 0) | 523 | /* shouldn't be any reply data */ |
541 | return -EBADMSG; /* shouldn't be any reply data */ | 524 | return afs_data_complete(call, skb, last); |
542 | return 0; | ||
543 | } | 525 | } |
544 | 526 | ||
545 | /* | 527 | /* |
@@ -622,15 +604,13 @@ static int afs_deliver_fs_create_vnode(struct afs_call *call, | |||
622 | { | 604 | { |
623 | struct afs_vnode *vnode = call->reply; | 605 | struct afs_vnode *vnode = call->reply; |
624 | const __be32 *bp; | 606 | const __be32 *bp; |
607 | int ret; | ||
625 | 608 | ||
626 | _enter("{%u},{%u},%d", call->unmarshall, skb->len, last); | 609 | _enter("{%u},{%u},%d", call->unmarshall, skb->len, last); |
627 | 610 | ||
628 | afs_transfer_reply(call, skb); | 611 | ret = afs_transfer_reply(call, skb, last); |
629 | if (!last) | 612 | if (ret < 0) |
630 | return 0; | 613 | return ret; |
631 | |||
632 | if (call->reply_size != call->reply_max) | ||
633 | return -EBADMSG; | ||
634 | 614 | ||
635 | /* unmarshall the reply once we've received all of it */ | 615 | /* unmarshall the reply once we've received all of it */ |
636 | bp = call->buffer; | 616 | bp = call->buffer; |
@@ -721,15 +701,13 @@ static int afs_deliver_fs_remove(struct afs_call *call, | |||
721 | { | 701 | { |
722 | struct afs_vnode *vnode = call->reply; | 702 | struct afs_vnode *vnode = call->reply; |
723 | const __be32 *bp; | 703 | const __be32 *bp; |
704 | int ret; | ||
724 | 705 | ||
725 | _enter("{%u},{%u},%d", call->unmarshall, skb->len, last); | 706 | _enter("{%u},{%u},%d", call->unmarshall, skb->len, last); |
726 | 707 | ||
727 | afs_transfer_reply(call, skb); | 708 | ret = afs_transfer_reply(call, skb, last); |
728 | if (!last) | 709 | if (ret < 0) |
729 | return 0; | 710 | return ret; |
730 | |||
731 | if (call->reply_size != call->reply_max) | ||
732 | return -EBADMSG; | ||
733 | 711 | ||
734 | /* unmarshall the reply once we've received all of it */ | 712 | /* unmarshall the reply once we've received all of it */ |
735 | bp = call->buffer; | 713 | bp = call->buffer; |
@@ -804,15 +782,13 @@ static int afs_deliver_fs_link(struct afs_call *call, | |||
804 | { | 782 | { |
805 | struct afs_vnode *dvnode = call->reply, *vnode = call->reply2; | 783 | struct afs_vnode *dvnode = call->reply, *vnode = call->reply2; |
806 | const __be32 *bp; | 784 | const __be32 *bp; |
785 | int ret; | ||
807 | 786 | ||
808 | _enter("{%u},{%u},%d", call->unmarshall, skb->len, last); | 787 | _enter("{%u},{%u},%d", call->unmarshall, skb->len, last); |
809 | 788 | ||
810 | afs_transfer_reply(call, skb); | 789 | ret = afs_transfer_reply(call, skb, last); |
811 | if (!last) | 790 | if (ret < 0) |
812 | return 0; | 791 | return ret; |
813 | |||
814 | if (call->reply_size != call->reply_max) | ||
815 | return -EBADMSG; | ||
816 | 792 | ||
817 | /* unmarshall the reply once we've received all of it */ | 793 | /* unmarshall the reply once we've received all of it */ |
818 | bp = call->buffer; | 794 | bp = call->buffer; |
@@ -892,15 +868,13 @@ static int afs_deliver_fs_symlink(struct afs_call *call, | |||
892 | { | 868 | { |
893 | struct afs_vnode *vnode = call->reply; | 869 | struct afs_vnode *vnode = call->reply; |
894 | const __be32 *bp; | 870 | const __be32 *bp; |
871 | int ret; | ||
895 | 872 | ||
896 | _enter("{%u},{%u},%d", call->unmarshall, skb->len, last); | 873 | _enter("{%u},{%u},%d", call->unmarshall, skb->len, last); |
897 | 874 | ||
898 | afs_transfer_reply(call, skb); | 875 | ret = afs_transfer_reply(call, skb, last); |
899 | if (!last) | 876 | if (ret < 0) |
900 | return 0; | 877 | return ret; |
901 | |||
902 | if (call->reply_size != call->reply_max) | ||
903 | return -EBADMSG; | ||
904 | 878 | ||
905 | /* unmarshall the reply once we've received all of it */ | 879 | /* unmarshall the reply once we've received all of it */ |
906 | bp = call->buffer; | 880 | bp = call->buffer; |
@@ -999,15 +973,13 @@ static int afs_deliver_fs_rename(struct afs_call *call, | |||
999 | { | 973 | { |
1000 | struct afs_vnode *orig_dvnode = call->reply, *new_dvnode = call->reply2; | 974 | struct afs_vnode *orig_dvnode = call->reply, *new_dvnode = call->reply2; |
1001 | const __be32 *bp; | 975 | const __be32 *bp; |
976 | int ret; | ||
1002 | 977 | ||
1003 | _enter("{%u},{%u},%d", call->unmarshall, skb->len, last); | 978 | _enter("{%u},{%u},%d", call->unmarshall, skb->len, last); |
1004 | 979 | ||
1005 | afs_transfer_reply(call, skb); | 980 | ret = afs_transfer_reply(call, skb, last); |
1006 | if (!last) | 981 | if (ret < 0) |
1007 | return 0; | 982 | return ret; |
1008 | |||
1009 | if (call->reply_size != call->reply_max) | ||
1010 | return -EBADMSG; | ||
1011 | 983 | ||
1012 | /* unmarshall the reply once we've received all of it */ | 984 | /* unmarshall the reply once we've received all of it */ |
1013 | bp = call->buffer; | 985 | bp = call->buffer; |
@@ -1105,20 +1077,13 @@ static int afs_deliver_fs_store_data(struct afs_call *call, | |||
1105 | { | 1077 | { |
1106 | struct afs_vnode *vnode = call->reply; | 1078 | struct afs_vnode *vnode = call->reply; |
1107 | const __be32 *bp; | 1079 | const __be32 *bp; |
1080 | int ret; | ||
1108 | 1081 | ||
1109 | _enter(",,%u", last); | 1082 | _enter(",,%u", last); |
1110 | 1083 | ||
1111 | afs_transfer_reply(call, skb); | 1084 | ret = afs_transfer_reply(call, skb, last); |
1112 | if (!last) { | 1085 | if (ret < 0) |
1113 | _leave(" = 0 [more]"); | 1086 | return ret; |
1114 | return 0; | ||
1115 | } | ||
1116 | |||
1117 | if (call->reply_size != call->reply_max) { | ||
1118 | _leave(" = -EBADMSG [%u != %u]", | ||
1119 | call->reply_size, call->reply_max); | ||
1120 | return -EBADMSG; | ||
1121 | } | ||
1122 | 1087 | ||
1123 | /* unmarshall the reply once we've received all of it */ | 1088 | /* unmarshall the reply once we've received all of it */ |
1124 | bp = call->buffer; | 1089 | bp = call->buffer; |
@@ -1292,20 +1257,13 @@ static int afs_deliver_fs_store_status(struct afs_call *call, | |||
1292 | afs_dataversion_t *store_version; | 1257 | afs_dataversion_t *store_version; |
1293 | struct afs_vnode *vnode = call->reply; | 1258 | struct afs_vnode *vnode = call->reply; |
1294 | const __be32 *bp; | 1259 | const __be32 *bp; |
1260 | int ret; | ||
1295 | 1261 | ||
1296 | _enter(",,%u", last); | 1262 | _enter(",,%u", last); |
1297 | 1263 | ||
1298 | afs_transfer_reply(call, skb); | 1264 | ret = afs_transfer_reply(call, skb, last); |
1299 | if (!last) { | 1265 | if (ret < 0) |
1300 | _leave(" = 0 [more]"); | 1266 | return ret; |
1301 | return 0; | ||
1302 | } | ||
1303 | |||
1304 | if (call->reply_size != call->reply_max) { | ||
1305 | _leave(" = -EBADMSG [%u != %u]", | ||
1306 | call->reply_size, call->reply_max); | ||
1307 | return -EBADMSG; | ||
1308 | } | ||
1309 | 1267 | ||
1310 | /* unmarshall the reply once we've received all of it */ | 1268 | /* unmarshall the reply once we've received all of it */ |
1311 | store_version = NULL; | 1269 | store_version = NULL; |
@@ -1504,11 +1462,8 @@ static int afs_deliver_fs_get_volume_status(struct afs_call *call, | |||
1504 | _debug("extract status"); | 1462 | _debug("extract status"); |
1505 | ret = afs_extract_data(call, skb, last, call->buffer, | 1463 | ret = afs_extract_data(call, skb, last, call->buffer, |
1506 | 12 * 4); | 1464 | 12 * 4); |
1507 | switch (ret) { | 1465 | if (ret < 0) |
1508 | case 0: break; | 1466 | return ret; |
1509 | case -EAGAIN: return 0; | ||
1510 | default: return ret; | ||
1511 | } | ||
1512 | 1467 | ||
1513 | bp = call->buffer; | 1468 | bp = call->buffer; |
1514 | xdr_decode_AFSFetchVolumeStatus(&bp, call->reply2); | 1469 | xdr_decode_AFSFetchVolumeStatus(&bp, call->reply2); |
@@ -1518,11 +1473,8 @@ static int afs_deliver_fs_get_volume_status(struct afs_call *call, | |||
1518 | /* extract the volume name length */ | 1473 | /* extract the volume name length */ |
1519 | case 2: | 1474 | case 2: |
1520 | ret = afs_extract_data(call, skb, last, &call->tmp, 4); | 1475 | ret = afs_extract_data(call, skb, last, &call->tmp, 4); |
1521 | switch (ret) { | 1476 | if (ret < 0) |
1522 | case 0: break; | 1477 | return ret; |
1523 | case -EAGAIN: return 0; | ||
1524 | default: return ret; | ||
1525 | } | ||
1526 | 1478 | ||
1527 | call->count = ntohl(call->tmp); | 1479 | call->count = ntohl(call->tmp); |
1528 | _debug("volname length: %u", call->count); | 1480 | _debug("volname length: %u", call->count); |
@@ -1537,11 +1489,8 @@ static int afs_deliver_fs_get_volume_status(struct afs_call *call, | |||
1537 | if (call->count > 0) { | 1489 | if (call->count > 0) { |
1538 | ret = afs_extract_data(call, skb, last, call->reply3, | 1490 | ret = afs_extract_data(call, skb, last, call->reply3, |
1539 | call->count); | 1491 | call->count); |
1540 | switch (ret) { | 1492 | if (ret < 0) |
1541 | case 0: break; | 1493 | return ret; |
1542 | case -EAGAIN: return 0; | ||
1543 | default: return ret; | ||
1544 | } | ||
1545 | } | 1494 | } |
1546 | 1495 | ||
1547 | p = call->reply3; | 1496 | p = call->reply3; |
@@ -1561,11 +1510,8 @@ static int afs_deliver_fs_get_volume_status(struct afs_call *call, | |||
1561 | case 4: | 1510 | case 4: |
1562 | ret = afs_extract_data(call, skb, last, call->buffer, | 1511 | ret = afs_extract_data(call, skb, last, call->buffer, |
1563 | call->count); | 1512 | call->count); |
1564 | switch (ret) { | 1513 | if (ret < 0) |
1565 | case 0: break; | 1514 | return ret; |
1566 | case -EAGAIN: return 0; | ||
1567 | default: return ret; | ||
1568 | } | ||
1569 | 1515 | ||
1570 | call->offset = 0; | 1516 | call->offset = 0; |
1571 | call->unmarshall++; | 1517 | call->unmarshall++; |
@@ -1574,11 +1520,8 @@ static int afs_deliver_fs_get_volume_status(struct afs_call *call, | |||
1574 | /* extract the offline message length */ | 1520 | /* extract the offline message length */ |
1575 | case 5: | 1521 | case 5: |
1576 | ret = afs_extract_data(call, skb, last, &call->tmp, 4); | 1522 | ret = afs_extract_data(call, skb, last, &call->tmp, 4); |
1577 | switch (ret) { | 1523 | if (ret < 0) |
1578 | case 0: break; | 1524 | return ret; |
1579 | case -EAGAIN: return 0; | ||
1580 | default: return ret; | ||
1581 | } | ||
1582 | 1525 | ||
1583 | call->count = ntohl(call->tmp); | 1526 | call->count = ntohl(call->tmp); |
1584 | _debug("offline msg length: %u", call->count); | 1527 | _debug("offline msg length: %u", call->count); |
@@ -1593,11 +1536,8 @@ static int afs_deliver_fs_get_volume_status(struct afs_call *call, | |||
1593 | if (call->count > 0) { | 1536 | if (call->count > 0) { |
1594 | ret = afs_extract_data(call, skb, last, call->reply3, | 1537 | ret = afs_extract_data(call, skb, last, call->reply3, |
1595 | call->count); | 1538 | call->count); |
1596 | switch (ret) { | 1539 | if (ret < 0) |
1597 | case 0: break; | 1540 | return ret; |
1598 | case -EAGAIN: return 0; | ||
1599 | default: return ret; | ||
1600 | } | ||
1601 | } | 1541 | } |
1602 | 1542 | ||
1603 | p = call->reply3; | 1543 | p = call->reply3; |
@@ -1617,11 +1557,8 @@ static int afs_deliver_fs_get_volume_status(struct afs_call *call, | |||
1617 | case 7: | 1557 | case 7: |
1618 | ret = afs_extract_data(call, skb, last, call->buffer, | 1558 | ret = afs_extract_data(call, skb, last, call->buffer, |
1619 | call->count); | 1559 | call->count); |
1620 | switch (ret) { | 1560 | if (ret < 0) |
1621 | case 0: break; | 1561 | return ret; |
1622 | case -EAGAIN: return 0; | ||
1623 | default: return ret; | ||
1624 | } | ||
1625 | 1562 | ||
1626 | call->offset = 0; | 1563 | call->offset = 0; |
1627 | call->unmarshall++; | 1564 | call->unmarshall++; |
@@ -1630,11 +1567,8 @@ static int afs_deliver_fs_get_volume_status(struct afs_call *call, | |||
1630 | /* extract the message of the day length */ | 1567 | /* extract the message of the day length */ |
1631 | case 8: | 1568 | case 8: |
1632 | ret = afs_extract_data(call, skb, last, &call->tmp, 4); | 1569 | ret = afs_extract_data(call, skb, last, &call->tmp, 4); |
1633 | switch (ret) { | 1570 | if (ret < 0) |
1634 | case 0: break; | 1571 | return ret; |
1635 | case -EAGAIN: return 0; | ||
1636 | default: return ret; | ||
1637 | } | ||
1638 | 1572 | ||
1639 | call->count = ntohl(call->tmp); | 1573 | call->count = ntohl(call->tmp); |
1640 | _debug("motd length: %u", call->count); | 1574 | _debug("motd length: %u", call->count); |
@@ -1649,11 +1583,8 @@ static int afs_deliver_fs_get_volume_status(struct afs_call *call, | |||
1649 | if (call->count > 0) { | 1583 | if (call->count > 0) { |
1650 | ret = afs_extract_data(call, skb, last, call->reply3, | 1584 | ret = afs_extract_data(call, skb, last, call->reply3, |
1651 | call->count); | 1585 | call->count); |
1652 | switch (ret) { | 1586 | if (ret < 0) |
1653 | case 0: break; | 1587 | return ret; |
1654 | case -EAGAIN: return 0; | ||
1655 | default: return ret; | ||
1656 | } | ||
1657 | } | 1588 | } |
1658 | 1589 | ||
1659 | p = call->reply3; | 1590 | p = call->reply3; |
@@ -1673,26 +1604,20 @@ static int afs_deliver_fs_get_volume_status(struct afs_call *call, | |||
1673 | case 10: | 1604 | case 10: |
1674 | ret = afs_extract_data(call, skb, last, call->buffer, | 1605 | ret = afs_extract_data(call, skb, last, call->buffer, |
1675 | call->count); | 1606 | call->count); |
1676 | switch (ret) { | 1607 | if (ret < 0) |
1677 | case 0: break; | 1608 | return ret; |
1678 | case -EAGAIN: return 0; | ||
1679 | default: return ret; | ||
1680 | } | ||
1681 | 1609 | ||
1682 | call->offset = 0; | 1610 | call->offset = 0; |
1683 | call->unmarshall++; | 1611 | call->unmarshall++; |
1684 | no_motd_padding: | 1612 | no_motd_padding: |
1685 | 1613 | ||
1686 | case 11: | 1614 | case 11: |
1687 | _debug("trailer %d", skb->len); | 1615 | ret = afs_data_complete(call, skb, last); |
1688 | if (skb->len != 0) | 1616 | if (ret < 0) |
1689 | return -EBADMSG; | 1617 | return ret; |
1690 | break; | 1618 | break; |
1691 | } | 1619 | } |
1692 | 1620 | ||
1693 | if (!last) | ||
1694 | return 0; | ||
1695 | |||
1696 | _leave(" = 0 [done]"); | 1621 | _leave(" = 0 [done]"); |
1697 | return 0; | 1622 | return 0; |
1698 | } | 1623 | } |
@@ -1764,15 +1689,13 @@ static int afs_deliver_fs_xxxx_lock(struct afs_call *call, | |||
1764 | struct sk_buff *skb, bool last) | 1689 | struct sk_buff *skb, bool last) |
1765 | { | 1690 | { |
1766 | const __be32 *bp; | 1691 | const __be32 *bp; |
1692 | int ret; | ||
1767 | 1693 | ||
1768 | _enter("{%u},{%u},%d", call->unmarshall, skb->len, last); | 1694 | _enter("{%u},{%u},%d", call->unmarshall, skb->len, last); |
1769 | 1695 | ||
1770 | afs_transfer_reply(call, skb); | 1696 | ret = afs_transfer_reply(call, skb, last); |
1771 | if (!last) | 1697 | if (ret < 0) |
1772 | return 0; | 1698 | return ret; |
1773 | |||
1774 | if (call->reply_size != call->reply_max) | ||
1775 | return -EBADMSG; | ||
1776 | 1699 | ||
1777 | /* unmarshall the reply once we've received all of it */ | 1700 | /* unmarshall the reply once we've received all of it */ |
1778 | bp = call->buffer; | 1701 | bp = call->buffer; |