diff options
author | David Howells <dhowells@redhat.com> | 2019-05-09 17:22:50 -0400 |
---|---|---|
committer | David Howells <dhowells@redhat.com> | 2019-05-16 11:25:21 -0400 |
commit | ffba718e935402e7f42b8cd5d1e00e4a3907d361 (patch) | |
tree | a77dadcb55b3cc56cbb1f8a583448944214ba163 /fs/afs/fsclient.c | |
parent | fefb2483dc10c736e4235984fed4f3a61c99e1c2 (diff) |
afs: Get rid of afs_call::reply[]
Replace the afs_call::reply[] array with a bunch of typed members so that
the compiler can use type-checking on them. It's also easier for the eye
to see what's going on.
Signed-off-by: David Howells <dhowells@redhat.com>
Diffstat (limited to 'fs/afs/fsclient.c')
-rw-r--r-- | fs/afs/fsclient.c | 287 |
1 files changed, 144 insertions, 143 deletions
diff --git a/fs/afs/fsclient.c b/fs/afs/fsclient.c index dc6f8da0dfa0..16bcc578e3b2 100644 --- a/fs/afs/fsclient.c +++ b/fs/afs/fsclient.c | |||
@@ -392,7 +392,7 @@ static void xdr_decode_AFSFetchVolumeStatus(const __be32 **_bp, | |||
392 | */ | 392 | */ |
393 | static int afs_deliver_fs_fetch_status_vnode(struct afs_call *call) | 393 | static int afs_deliver_fs_fetch_status_vnode(struct afs_call *call) |
394 | { | 394 | { |
395 | struct afs_vnode *vnode = call->reply[0]; | 395 | struct afs_vnode *vnode = call->xvnode; |
396 | const __be32 *bp; | 396 | const __be32 *bp; |
397 | int ret; | 397 | int ret; |
398 | 398 | ||
@@ -409,7 +409,7 @@ static int afs_deliver_fs_fetch_status_vnode(struct afs_call *call) | |||
409 | if (ret < 0) | 409 | if (ret < 0) |
410 | return ret; | 410 | return ret; |
411 | xdr_decode_AFSCallBack(call, vnode, &bp); | 411 | xdr_decode_AFSCallBack(call, vnode, &bp); |
412 | xdr_decode_AFSVolSync(&bp, call->reply[1]); | 412 | xdr_decode_AFSVolSync(&bp, call->out_volsync); |
413 | 413 | ||
414 | _leave(" = 0 [done]"); | 414 | _leave(" = 0 [done]"); |
415 | return 0; | 415 | return 0; |
@@ -450,8 +450,8 @@ int afs_fs_fetch_file_status(struct afs_fs_cursor *fc, struct afs_volsync *volsy | |||
450 | } | 450 | } |
451 | 451 | ||
452 | call->key = fc->key; | 452 | call->key = fc->key; |
453 | call->reply[0] = vnode; | 453 | call->xvnode = vnode; |
454 | call->reply[1] = volsync; | 454 | call->out_volsync = volsync; |
455 | call->expected_version = new_inode ? 1 : vnode->status.data_version; | 455 | call->expected_version = new_inode ? 1 : vnode->status.data_version; |
456 | call->want_reply_time = true; | 456 | call->want_reply_time = true; |
457 | 457 | ||
@@ -476,8 +476,8 @@ int afs_fs_fetch_file_status(struct afs_fs_cursor *fc, struct afs_volsync *volsy | |||
476 | */ | 476 | */ |
477 | static int afs_deliver_fs_fetch_data(struct afs_call *call) | 477 | static int afs_deliver_fs_fetch_data(struct afs_call *call) |
478 | { | 478 | { |
479 | struct afs_vnode *vnode = call->reply[0]; | 479 | struct afs_vnode *vnode = call->xvnode; |
480 | struct afs_read *req = call->reply[2]; | 480 | struct afs_read *req = call->read_request; |
481 | const __be32 *bp; | 481 | const __be32 *bp; |
482 | unsigned int size; | 482 | unsigned int size; |
483 | int ret; | 483 | int ret; |
@@ -578,7 +578,7 @@ static int afs_deliver_fs_fetch_data(struct afs_call *call) | |||
578 | if (ret < 0) | 578 | if (ret < 0) |
579 | return ret; | 579 | return ret; |
580 | xdr_decode_AFSCallBack(call, vnode, &bp); | 580 | xdr_decode_AFSCallBack(call, vnode, &bp); |
581 | xdr_decode_AFSVolSync(&bp, call->reply[1]); | 581 | xdr_decode_AFSVolSync(&bp, call->out_volsync); |
582 | 582 | ||
583 | call->unmarshall++; | 583 | call->unmarshall++; |
584 | 584 | ||
@@ -601,7 +601,7 @@ static int afs_deliver_fs_fetch_data(struct afs_call *call) | |||
601 | 601 | ||
602 | static void afs_fetch_data_destructor(struct afs_call *call) | 602 | static void afs_fetch_data_destructor(struct afs_call *call) |
603 | { | 603 | { |
604 | struct afs_read *req = call->reply[2]; | 604 | struct afs_read *req = call->read_request; |
605 | 605 | ||
606 | afs_put_read(req); | 606 | afs_put_read(req); |
607 | afs_flat_call_destructor(call); | 607 | afs_flat_call_destructor(call); |
@@ -641,9 +641,9 @@ static int afs_fs_fetch_data64(struct afs_fs_cursor *fc, struct afs_read *req) | |||
641 | return -ENOMEM; | 641 | return -ENOMEM; |
642 | 642 | ||
643 | call->key = fc->key; | 643 | call->key = fc->key; |
644 | call->reply[0] = vnode; | 644 | call->xvnode = vnode; |
645 | call->reply[1] = NULL; /* volsync */ | 645 | call->out_volsync = NULL; |
646 | call->reply[2] = req; | 646 | call->read_request = req; |
647 | call->expected_version = vnode->status.data_version; | 647 | call->expected_version = vnode->status.data_version; |
648 | call->want_reply_time = true; | 648 | call->want_reply_time = true; |
649 | 649 | ||
@@ -692,9 +692,9 @@ int afs_fs_fetch_data(struct afs_fs_cursor *fc, struct afs_read *req) | |||
692 | return -ENOMEM; | 692 | return -ENOMEM; |
693 | 693 | ||
694 | call->key = fc->key; | 694 | call->key = fc->key; |
695 | call->reply[0] = vnode; | 695 | call->xvnode = vnode; |
696 | call->reply[1] = NULL; /* volsync */ | 696 | call->out_volsync = NULL; |
697 | call->reply[2] = req; | 697 | call->read_request = req; |
698 | call->expected_version = vnode->status.data_version; | 698 | call->expected_version = vnode->status.data_version; |
699 | call->want_reply_time = true; | 699 | call->want_reply_time = true; |
700 | 700 | ||
@@ -721,7 +721,7 @@ int afs_fs_fetch_data(struct afs_fs_cursor *fc, struct afs_read *req) | |||
721 | */ | 721 | */ |
722 | static int afs_deliver_fs_create_vnode(struct afs_call *call) | 722 | static int afs_deliver_fs_create_vnode(struct afs_call *call) |
723 | { | 723 | { |
724 | struct afs_vnode *vnode = call->reply[0]; | 724 | struct afs_vnode *dvnode = call->dvnode; |
725 | const __be32 *bp; | 725 | const __be32 *bp; |
726 | int ret; | 726 | int ret; |
727 | 727 | ||
@@ -733,16 +733,16 @@ static int afs_deliver_fs_create_vnode(struct afs_call *call) | |||
733 | 733 | ||
734 | /* unmarshall the reply once we've received all of it */ | 734 | /* unmarshall the reply once we've received all of it */ |
735 | bp = call->buffer; | 735 | bp = call->buffer; |
736 | xdr_decode_AFSFid(&bp, call->reply[1]); | 736 | xdr_decode_AFSFid(&bp, call->out_fid); |
737 | ret = afs_decode_status(call, &bp, call->reply[2], NULL, NULL, NULL); | 737 | ret = afs_decode_status(call, &bp, call->out_extra_status, NULL, NULL, NULL); |
738 | if (ret < 0) | 738 | if (ret < 0) |
739 | return ret; | 739 | return ret; |
740 | ret = afs_decode_status(call, &bp, &vnode->status, vnode, | 740 | ret = afs_decode_status(call, &bp, &dvnode->status, dvnode, |
741 | &call->expected_version, NULL); | 741 | &call->expected_version, NULL); |
742 | if (ret < 0) | 742 | if (ret < 0) |
743 | return ret; | 743 | return ret; |
744 | xdr_decode_AFSCallBack_raw(call, call->reply[3], &bp); | 744 | xdr_decode_AFSCallBack_raw(call, call->out_cb, &bp); |
745 | /* xdr_decode_AFSVolSync(&bp, call->reply[X]); */ | 745 | xdr_decode_AFSVolSync(&bp, call->out_volsync); |
746 | 746 | ||
747 | _leave(" = 0 [done]"); | 747 | _leave(" = 0 [done]"); |
748 | return 0; | 748 | return 0; |
@@ -776,9 +776,9 @@ int afs_fs_create(struct afs_fs_cursor *fc, | |||
776 | struct afs_file_status *newstatus, | 776 | struct afs_file_status *newstatus, |
777 | struct afs_callback *newcb) | 777 | struct afs_callback *newcb) |
778 | { | 778 | { |
779 | struct afs_vnode *vnode = fc->vnode; | 779 | struct afs_vnode *dvnode = fc->vnode; |
780 | struct afs_call *call; | 780 | struct afs_call *call; |
781 | struct afs_net *net = afs_v2net(vnode); | 781 | struct afs_net *net = afs_v2net(dvnode); |
782 | size_t namesz, reqsz, padsz; | 782 | size_t namesz, reqsz, padsz; |
783 | __be32 *bp; | 783 | __be32 *bp; |
784 | 784 | ||
@@ -804,19 +804,19 @@ int afs_fs_create(struct afs_fs_cursor *fc, | |||
804 | return -ENOMEM; | 804 | return -ENOMEM; |
805 | 805 | ||
806 | call->key = fc->key; | 806 | call->key = fc->key; |
807 | call->reply[0] = vnode; | 807 | call->dvnode = dvnode; |
808 | call->reply[1] = newfid; | 808 | call->out_fid = newfid; |
809 | call->reply[2] = newstatus; | 809 | call->out_extra_status = newstatus; |
810 | call->reply[3] = newcb; | 810 | call->out_cb = newcb; |
811 | call->expected_version = current_data_version + 1; | 811 | call->expected_version = current_data_version + 1; |
812 | call->want_reply_time = true; | 812 | call->want_reply_time = true; |
813 | 813 | ||
814 | /* marshall the parameters */ | 814 | /* marshall the parameters */ |
815 | bp = call->request; | 815 | bp = call->request; |
816 | *bp++ = htonl(S_ISDIR(mode) ? FSMAKEDIR : FSCREATEFILE); | 816 | *bp++ = htonl(S_ISDIR(mode) ? FSMAKEDIR : FSCREATEFILE); |
817 | *bp++ = htonl(vnode->fid.vid); | 817 | *bp++ = htonl(dvnode->fid.vid); |
818 | *bp++ = htonl(vnode->fid.vnode); | 818 | *bp++ = htonl(dvnode->fid.vnode); |
819 | *bp++ = htonl(vnode->fid.unique); | 819 | *bp++ = htonl(dvnode->fid.unique); |
820 | *bp++ = htonl(namesz); | 820 | *bp++ = htonl(namesz); |
821 | memcpy(bp, name, namesz); | 821 | memcpy(bp, name, namesz); |
822 | bp = (void *) bp + namesz; | 822 | bp = (void *) bp + namesz; |
@@ -825,26 +825,26 @@ int afs_fs_create(struct afs_fs_cursor *fc, | |||
825 | bp = (void *) bp + padsz; | 825 | bp = (void *) bp + padsz; |
826 | } | 826 | } |
827 | *bp++ = htonl(AFS_SET_MODE | AFS_SET_MTIME); | 827 | *bp++ = htonl(AFS_SET_MODE | AFS_SET_MTIME); |
828 | *bp++ = htonl(vnode->vfs_inode.i_mtime.tv_sec); /* mtime */ | 828 | *bp++ = htonl(dvnode->vfs_inode.i_mtime.tv_sec); /* mtime */ |
829 | *bp++ = 0; /* owner */ | 829 | *bp++ = 0; /* owner */ |
830 | *bp++ = 0; /* group */ | 830 | *bp++ = 0; /* group */ |
831 | *bp++ = htonl(mode & S_IALLUGO); /* unix mode */ | 831 | *bp++ = htonl(mode & S_IALLUGO); /* unix mode */ |
832 | *bp++ = 0; /* segment size */ | 832 | *bp++ = 0; /* segment size */ |
833 | 833 | ||
834 | afs_use_fs_server(call, fc->cbi); | 834 | afs_use_fs_server(call, fc->cbi); |
835 | trace_afs_make_fs_call1(call, &vnode->fid, name); | 835 | trace_afs_make_fs_call1(call, &dvnode->fid, name); |
836 | afs_set_fc_call(call, fc); | 836 | afs_set_fc_call(call, fc); |
837 | afs_make_call(&fc->ac, call, GFP_NOFS); | 837 | afs_make_call(&fc->ac, call, GFP_NOFS); |
838 | return afs_wait_for_call_to_complete(call, &fc->ac); | 838 | return afs_wait_for_call_to_complete(call, &fc->ac); |
839 | } | 839 | } |
840 | 840 | ||
841 | /* | 841 | /* |
842 | * Deliver reply data to any operation that returns file status and volume | 842 | * Deliver reply data to any operation that returns directory status and volume |
843 | * sync. | 843 | * sync. |
844 | */ | 844 | */ |
845 | static int afs_deliver_fs_status_and_vol(struct afs_call *call) | 845 | static int afs_deliver_fs_dir_status_and_vol(struct afs_call *call) |
846 | { | 846 | { |
847 | struct afs_vnode *vnode = call->reply[0]; | 847 | struct afs_vnode *dvnode = call->dvnode; |
848 | const __be32 *bp; | 848 | const __be32 *bp; |
849 | int ret; | 849 | int ret; |
850 | 850 | ||
@@ -856,11 +856,11 @@ static int afs_deliver_fs_status_and_vol(struct afs_call *call) | |||
856 | 856 | ||
857 | /* unmarshall the reply once we've received all of it */ | 857 | /* unmarshall the reply once we've received all of it */ |
858 | bp = call->buffer; | 858 | bp = call->buffer; |
859 | ret = afs_decode_status(call, &bp, &vnode->status, vnode, | 859 | ret = afs_decode_status(call, &bp, &dvnode->status, dvnode, |
860 | &call->expected_version, NULL); | 860 | &call->expected_version, NULL); |
861 | if (ret < 0) | 861 | if (ret < 0) |
862 | return ret; | 862 | return ret; |
863 | /* xdr_decode_AFSVolSync(&bp, call->reply[X]); */ | 863 | xdr_decode_AFSVolSync(&bp, call->out_volsync); |
864 | 864 | ||
865 | _leave(" = 0 [done]"); | 865 | _leave(" = 0 [done]"); |
866 | return 0; | 866 | return 0; |
@@ -872,14 +872,14 @@ static int afs_deliver_fs_status_and_vol(struct afs_call *call) | |||
872 | static const struct afs_call_type afs_RXFSRemoveFile = { | 872 | static const struct afs_call_type afs_RXFSRemoveFile = { |
873 | .name = "FS.RemoveFile", | 873 | .name = "FS.RemoveFile", |
874 | .op = afs_FS_RemoveFile, | 874 | .op = afs_FS_RemoveFile, |
875 | .deliver = afs_deliver_fs_status_and_vol, | 875 | .deliver = afs_deliver_fs_dir_status_and_vol, |
876 | .destructor = afs_flat_call_destructor, | 876 | .destructor = afs_flat_call_destructor, |
877 | }; | 877 | }; |
878 | 878 | ||
879 | static const struct afs_call_type afs_RXFSRemoveDir = { | 879 | static const struct afs_call_type afs_RXFSRemoveDir = { |
880 | .name = "FS.RemoveDir", | 880 | .name = "FS.RemoveDir", |
881 | .op = afs_FS_RemoveDir, | 881 | .op = afs_FS_RemoveDir, |
882 | .deliver = afs_deliver_fs_status_and_vol, | 882 | .deliver = afs_deliver_fs_dir_status_and_vol, |
883 | .destructor = afs_flat_call_destructor, | 883 | .destructor = afs_flat_call_destructor, |
884 | }; | 884 | }; |
885 | 885 | ||
@@ -911,8 +911,8 @@ int afs_fs_remove(struct afs_fs_cursor *fc, struct afs_vnode *vnode, | |||
911 | return -ENOMEM; | 911 | return -ENOMEM; |
912 | 912 | ||
913 | call->key = fc->key; | 913 | call->key = fc->key; |
914 | call->reply[0] = dvnode; | 914 | call->dvnode = dvnode; |
915 | call->reply[1] = vnode; | 915 | call->xvnode = vnode; |
916 | call->expected_version = current_data_version + 1; | 916 | call->expected_version = current_data_version + 1; |
917 | 917 | ||
918 | /* marshall the parameters */ | 918 | /* marshall the parameters */ |
@@ -941,7 +941,7 @@ int afs_fs_remove(struct afs_fs_cursor *fc, struct afs_vnode *vnode, | |||
941 | */ | 941 | */ |
942 | static int afs_deliver_fs_link(struct afs_call *call) | 942 | static int afs_deliver_fs_link(struct afs_call *call) |
943 | { | 943 | { |
944 | struct afs_vnode *dvnode = call->reply[0], *vnode = call->reply[1]; | 944 | struct afs_vnode *dvnode = call->dvnode, *vnode = call->xvnode; |
945 | const __be32 *bp; | 945 | const __be32 *bp; |
946 | int ret; | 946 | int ret; |
947 | 947 | ||
@@ -960,7 +960,7 @@ static int afs_deliver_fs_link(struct afs_call *call) | |||
960 | &call->expected_version, NULL); | 960 | &call->expected_version, NULL); |
961 | if (ret < 0) | 961 | if (ret < 0) |
962 | return ret; | 962 | return ret; |
963 | /* xdr_decode_AFSVolSync(&bp, call->reply[X]); */ | 963 | xdr_decode_AFSVolSync(&bp, call->out_volsync); |
964 | 964 | ||
965 | _leave(" = 0 [done]"); | 965 | _leave(" = 0 [done]"); |
966 | return 0; | 966 | return 0; |
@@ -1002,8 +1002,8 @@ int afs_fs_link(struct afs_fs_cursor *fc, struct afs_vnode *vnode, | |||
1002 | return -ENOMEM; | 1002 | return -ENOMEM; |
1003 | 1003 | ||
1004 | call->key = fc->key; | 1004 | call->key = fc->key; |
1005 | call->reply[0] = dvnode; | 1005 | call->dvnode = dvnode; |
1006 | call->reply[1] = vnode; | 1006 | call->xvnode = vnode; |
1007 | call->expected_version = current_data_version + 1; | 1007 | call->expected_version = current_data_version + 1; |
1008 | 1008 | ||
1009 | /* marshall the parameters */ | 1009 | /* marshall the parameters */ |
@@ -1035,7 +1035,7 @@ int afs_fs_link(struct afs_fs_cursor *fc, struct afs_vnode *vnode, | |||
1035 | */ | 1035 | */ |
1036 | static int afs_deliver_fs_symlink(struct afs_call *call) | 1036 | static int afs_deliver_fs_symlink(struct afs_call *call) |
1037 | { | 1037 | { |
1038 | struct afs_vnode *vnode = call->reply[0]; | 1038 | struct afs_vnode *dvnode = call->dvnode; |
1039 | const __be32 *bp; | 1039 | const __be32 *bp; |
1040 | int ret; | 1040 | int ret; |
1041 | 1041 | ||
@@ -1047,15 +1047,15 @@ static int afs_deliver_fs_symlink(struct afs_call *call) | |||
1047 | 1047 | ||
1048 | /* unmarshall the reply once we've received all of it */ | 1048 | /* unmarshall the reply once we've received all of it */ |
1049 | bp = call->buffer; | 1049 | bp = call->buffer; |
1050 | xdr_decode_AFSFid(&bp, call->reply[1]); | 1050 | xdr_decode_AFSFid(&bp, call->out_fid); |
1051 | ret = afs_decode_status(call, &bp, call->reply[2], NULL, NULL, NULL); | 1051 | ret = afs_decode_status(call, &bp, call->out_extra_status, NULL, NULL, NULL); |
1052 | if (ret < 0) | 1052 | if (ret < 0) |
1053 | return ret; | 1053 | return ret; |
1054 | ret = afs_decode_status(call, &bp, &vnode->status, vnode, | 1054 | ret = afs_decode_status(call, &bp, &dvnode->status, dvnode, |
1055 | &call->expected_version, NULL); | 1055 | &call->expected_version, NULL); |
1056 | if (ret < 0) | 1056 | if (ret < 0) |
1057 | return ret; | 1057 | return ret; |
1058 | /* xdr_decode_AFSVolSync(&bp, call->reply[X]); */ | 1058 | xdr_decode_AFSVolSync(&bp, call->out_volsync); |
1059 | 1059 | ||
1060 | _leave(" = 0 [done]"); | 1060 | _leave(" = 0 [done]"); |
1061 | return 0; | 1061 | return 0; |
@@ -1081,9 +1081,9 @@ int afs_fs_symlink(struct afs_fs_cursor *fc, | |||
1081 | struct afs_fid *newfid, | 1081 | struct afs_fid *newfid, |
1082 | struct afs_file_status *newstatus) | 1082 | struct afs_file_status *newstatus) |
1083 | { | 1083 | { |
1084 | struct afs_vnode *vnode = fc->vnode; | 1084 | struct afs_vnode *dvnode = fc->vnode; |
1085 | struct afs_call *call; | 1085 | struct afs_call *call; |
1086 | struct afs_net *net = afs_v2net(vnode); | 1086 | struct afs_net *net = afs_v2net(dvnode); |
1087 | size_t namesz, reqsz, padsz, c_namesz, c_padsz; | 1087 | size_t namesz, reqsz, padsz, c_namesz, c_padsz; |
1088 | __be32 *bp; | 1088 | __be32 *bp; |
1089 | 1089 | ||
@@ -1107,17 +1107,17 @@ int afs_fs_symlink(struct afs_fs_cursor *fc, | |||
1107 | return -ENOMEM; | 1107 | return -ENOMEM; |
1108 | 1108 | ||
1109 | call->key = fc->key; | 1109 | call->key = fc->key; |
1110 | call->reply[0] = vnode; | 1110 | call->dvnode = dvnode; |
1111 | call->reply[1] = newfid; | 1111 | call->out_fid = newfid; |
1112 | call->reply[2] = newstatus; | 1112 | call->out_extra_status = newstatus; |
1113 | call->expected_version = current_data_version + 1; | 1113 | call->expected_version = current_data_version + 1; |
1114 | 1114 | ||
1115 | /* marshall the parameters */ | 1115 | /* marshall the parameters */ |
1116 | bp = call->request; | 1116 | bp = call->request; |
1117 | *bp++ = htonl(FSSYMLINK); | 1117 | *bp++ = htonl(FSSYMLINK); |
1118 | *bp++ = htonl(vnode->fid.vid); | 1118 | *bp++ = htonl(dvnode->fid.vid); |
1119 | *bp++ = htonl(vnode->fid.vnode); | 1119 | *bp++ = htonl(dvnode->fid.vnode); |
1120 | *bp++ = htonl(vnode->fid.unique); | 1120 | *bp++ = htonl(dvnode->fid.unique); |
1121 | *bp++ = htonl(namesz); | 1121 | *bp++ = htonl(namesz); |
1122 | memcpy(bp, name, namesz); | 1122 | memcpy(bp, name, namesz); |
1123 | bp = (void *) bp + namesz; | 1123 | bp = (void *) bp + namesz; |
@@ -1133,14 +1133,14 @@ int afs_fs_symlink(struct afs_fs_cursor *fc, | |||
1133 | bp = (void *) bp + c_padsz; | 1133 | bp = (void *) bp + c_padsz; |
1134 | } | 1134 | } |
1135 | *bp++ = htonl(AFS_SET_MODE | AFS_SET_MTIME); | 1135 | *bp++ = htonl(AFS_SET_MODE | AFS_SET_MTIME); |
1136 | *bp++ = htonl(vnode->vfs_inode.i_mtime.tv_sec); /* mtime */ | 1136 | *bp++ = htonl(dvnode->vfs_inode.i_mtime.tv_sec); /* mtime */ |
1137 | *bp++ = 0; /* owner */ | 1137 | *bp++ = 0; /* owner */ |
1138 | *bp++ = 0; /* group */ | 1138 | *bp++ = 0; /* group */ |
1139 | *bp++ = htonl(S_IRWXUGO); /* unix mode */ | 1139 | *bp++ = htonl(S_IRWXUGO); /* unix mode */ |
1140 | *bp++ = 0; /* segment size */ | 1140 | *bp++ = 0; /* segment size */ |
1141 | 1141 | ||
1142 | afs_use_fs_server(call, fc->cbi); | 1142 | afs_use_fs_server(call, fc->cbi); |
1143 | trace_afs_make_fs_call1(call, &vnode->fid, name); | 1143 | trace_afs_make_fs_call1(call, &dvnode->fid, name); |
1144 | afs_set_fc_call(call, fc); | 1144 | afs_set_fc_call(call, fc); |
1145 | afs_make_call(&fc->ac, call, GFP_NOFS); | 1145 | afs_make_call(&fc->ac, call, GFP_NOFS); |
1146 | return afs_wait_for_call_to_complete(call, &fc->ac); | 1146 | return afs_wait_for_call_to_complete(call, &fc->ac); |
@@ -1151,7 +1151,7 @@ int afs_fs_symlink(struct afs_fs_cursor *fc, | |||
1151 | */ | 1151 | */ |
1152 | static int afs_deliver_fs_rename(struct afs_call *call) | 1152 | static int afs_deliver_fs_rename(struct afs_call *call) |
1153 | { | 1153 | { |
1154 | struct afs_vnode *orig_dvnode = call->reply[0], *new_dvnode = call->reply[1]; | 1154 | struct afs_vnode *orig_dvnode = call->dvnode, *new_dvnode = call->xvnode; |
1155 | const __be32 *bp; | 1155 | const __be32 *bp; |
1156 | int ret; | 1156 | int ret; |
1157 | 1157 | ||
@@ -1173,7 +1173,7 @@ static int afs_deliver_fs_rename(struct afs_call *call) | |||
1173 | if (ret < 0) | 1173 | if (ret < 0) |
1174 | return ret; | 1174 | return ret; |
1175 | } | 1175 | } |
1176 | /* xdr_decode_AFSVolSync(&bp, call->reply[X]); */ | 1176 | xdr_decode_AFSVolSync(&bp, call->out_volsync); |
1177 | 1177 | ||
1178 | _leave(" = 0 [done]"); | 1178 | _leave(" = 0 [done]"); |
1179 | return 0; | 1179 | return 0; |
@@ -1229,8 +1229,8 @@ int afs_fs_rename(struct afs_fs_cursor *fc, | |||
1229 | return -ENOMEM; | 1229 | return -ENOMEM; |
1230 | 1230 | ||
1231 | call->key = fc->key; | 1231 | call->key = fc->key; |
1232 | call->reply[0] = orig_dvnode; | 1232 | call->dvnode = orig_dvnode; |
1233 | call->reply[1] = new_dvnode; | 1233 | call->xvnode = new_dvnode; |
1234 | call->expected_version = current_orig_data_version + 1; | 1234 | call->expected_version = current_orig_data_version + 1; |
1235 | call->expected_version_2 = current_new_data_version + 1; | 1235 | call->expected_version_2 = current_new_data_version + 1; |
1236 | 1236 | ||
@@ -1271,7 +1271,7 @@ int afs_fs_rename(struct afs_fs_cursor *fc, | |||
1271 | */ | 1271 | */ |
1272 | static int afs_deliver_fs_store_data(struct afs_call *call) | 1272 | static int afs_deliver_fs_store_data(struct afs_call *call) |
1273 | { | 1273 | { |
1274 | struct afs_vnode *vnode = call->reply[0]; | 1274 | struct afs_vnode *vnode = call->xvnode; |
1275 | const __be32 *bp; | 1275 | const __be32 *bp; |
1276 | int ret; | 1276 | int ret; |
1277 | 1277 | ||
@@ -1287,7 +1287,7 @@ static int afs_deliver_fs_store_data(struct afs_call *call) | |||
1287 | &call->expected_version, NULL); | 1287 | &call->expected_version, NULL); |
1288 | if (ret < 0) | 1288 | if (ret < 0) |
1289 | return ret; | 1289 | return ret; |
1290 | /* xdr_decode_AFSVolSync(&bp, call->reply[X]); */ | 1290 | xdr_decode_AFSVolSync(&bp, call->out_volsync); |
1291 | 1291 | ||
1292 | afs_pages_written_back(vnode, call); | 1292 | afs_pages_written_back(vnode, call); |
1293 | 1293 | ||
@@ -1337,7 +1337,7 @@ static int afs_fs_store_data64(struct afs_fs_cursor *fc, | |||
1337 | 1337 | ||
1338 | call->key = fc->key; | 1338 | call->key = fc->key; |
1339 | call->mapping = mapping; | 1339 | call->mapping = mapping; |
1340 | call->reply[0] = vnode; | 1340 | call->xvnode = vnode; |
1341 | call->first = first; | 1341 | call->first = first; |
1342 | call->last = last; | 1342 | call->last = last; |
1343 | call->first_offset = offset; | 1343 | call->first_offset = offset; |
@@ -1417,7 +1417,7 @@ int afs_fs_store_data(struct afs_fs_cursor *fc, struct address_space *mapping, | |||
1417 | 1417 | ||
1418 | call->key = fc->key; | 1418 | call->key = fc->key; |
1419 | call->mapping = mapping; | 1419 | call->mapping = mapping; |
1420 | call->reply[0] = vnode; | 1420 | call->xvnode = vnode; |
1421 | call->first = first; | 1421 | call->first = first; |
1422 | call->last = last; | 1422 | call->last = last; |
1423 | call->first_offset = offset; | 1423 | call->first_offset = offset; |
@@ -1455,7 +1455,7 @@ int afs_fs_store_data(struct afs_fs_cursor *fc, struct address_space *mapping, | |||
1455 | */ | 1455 | */ |
1456 | static int afs_deliver_fs_store_status(struct afs_call *call) | 1456 | static int afs_deliver_fs_store_status(struct afs_call *call) |
1457 | { | 1457 | { |
1458 | struct afs_vnode *vnode = call->reply[0]; | 1458 | struct afs_vnode *vnode = call->xvnode; |
1459 | const __be32 *bp; | 1459 | const __be32 *bp; |
1460 | int ret; | 1460 | int ret; |
1461 | 1461 | ||
@@ -1471,7 +1471,7 @@ static int afs_deliver_fs_store_status(struct afs_call *call) | |||
1471 | &call->expected_version, NULL); | 1471 | &call->expected_version, NULL); |
1472 | if (ret < 0) | 1472 | if (ret < 0) |
1473 | return ret; | 1473 | return ret; |
1474 | /* xdr_decode_AFSVolSync(&bp, call->reply[X]); */ | 1474 | xdr_decode_AFSVolSync(&bp, call->out_volsync); |
1475 | 1475 | ||
1476 | _leave(" = 0 [done]"); | 1476 | _leave(" = 0 [done]"); |
1477 | return 0; | 1477 | return 0; |
@@ -1524,7 +1524,7 @@ static int afs_fs_setattr_size64(struct afs_fs_cursor *fc, struct iattr *attr) | |||
1524 | return -ENOMEM; | 1524 | return -ENOMEM; |
1525 | 1525 | ||
1526 | call->key = fc->key; | 1526 | call->key = fc->key; |
1527 | call->reply[0] = vnode; | 1527 | call->xvnode = vnode; |
1528 | call->expected_version = vnode->status.data_version + 1; | 1528 | call->expected_version = vnode->status.data_version + 1; |
1529 | 1529 | ||
1530 | /* marshall the parameters */ | 1530 | /* marshall the parameters */ |
@@ -1575,7 +1575,7 @@ static int afs_fs_setattr_size(struct afs_fs_cursor *fc, struct iattr *attr) | |||
1575 | return -ENOMEM; | 1575 | return -ENOMEM; |
1576 | 1576 | ||
1577 | call->key = fc->key; | 1577 | call->key = fc->key; |
1578 | call->reply[0] = vnode; | 1578 | call->xvnode = vnode; |
1579 | call->expected_version = vnode->status.data_version + 1; | 1579 | call->expected_version = vnode->status.data_version + 1; |
1580 | 1580 | ||
1581 | /* marshall the parameters */ | 1581 | /* marshall the parameters */ |
@@ -1625,7 +1625,7 @@ int afs_fs_setattr(struct afs_fs_cursor *fc, struct iattr *attr) | |||
1625 | return -ENOMEM; | 1625 | return -ENOMEM; |
1626 | 1626 | ||
1627 | call->key = fc->key; | 1627 | call->key = fc->key; |
1628 | call->reply[0] = vnode; | 1628 | call->xvnode = vnode; |
1629 | call->expected_version = vnode->status.data_version; | 1629 | call->expected_version = vnode->status.data_version; |
1630 | 1630 | ||
1631 | /* marshall the parameters */ | 1631 | /* marshall the parameters */ |
@@ -1669,7 +1669,7 @@ static int afs_deliver_fs_get_volume_status(struct afs_call *call) | |||
1669 | return ret; | 1669 | return ret; |
1670 | 1670 | ||
1671 | bp = call->buffer; | 1671 | bp = call->buffer; |
1672 | xdr_decode_AFSFetchVolumeStatus(&bp, call->reply[1]); | 1672 | xdr_decode_AFSFetchVolumeStatus(&bp, call->out_volstatus); |
1673 | call->unmarshall++; | 1673 | call->unmarshall++; |
1674 | afs_extract_to_tmp(call); | 1674 | afs_extract_to_tmp(call); |
1675 | 1675 | ||
@@ -1685,7 +1685,7 @@ static int afs_deliver_fs_get_volume_status(struct afs_call *call) | |||
1685 | return afs_protocol_error(call, -EBADMSG, | 1685 | return afs_protocol_error(call, -EBADMSG, |
1686 | afs_eproto_volname_len); | 1686 | afs_eproto_volname_len); |
1687 | size = (call->count + 3) & ~3; /* It's padded */ | 1687 | size = (call->count + 3) & ~3; /* It's padded */ |
1688 | afs_extract_begin(call, call->reply[2], size); | 1688 | afs_extract_to_buf(call, size); |
1689 | call->unmarshall++; | 1689 | call->unmarshall++; |
1690 | 1690 | ||
1691 | /* Fall through - and extract the volume name */ | 1691 | /* Fall through - and extract the volume name */ |
@@ -1695,7 +1695,7 @@ static int afs_deliver_fs_get_volume_status(struct afs_call *call) | |||
1695 | if (ret < 0) | 1695 | if (ret < 0) |
1696 | return ret; | 1696 | return ret; |
1697 | 1697 | ||
1698 | p = call->reply[2]; | 1698 | p = call->buffer; |
1699 | p[call->count] = 0; | 1699 | p[call->count] = 0; |
1700 | _debug("volname '%s'", p); | 1700 | _debug("volname '%s'", p); |
1701 | afs_extract_to_tmp(call); | 1701 | afs_extract_to_tmp(call); |
@@ -1713,7 +1713,7 @@ static int afs_deliver_fs_get_volume_status(struct afs_call *call) | |||
1713 | return afs_protocol_error(call, -EBADMSG, | 1713 | return afs_protocol_error(call, -EBADMSG, |
1714 | afs_eproto_offline_msg_len); | 1714 | afs_eproto_offline_msg_len); |
1715 | size = (call->count + 3) & ~3; /* It's padded */ | 1715 | size = (call->count + 3) & ~3; /* It's padded */ |
1716 | afs_extract_begin(call, call->reply[2], size); | 1716 | afs_extract_to_buf(call, size); |
1717 | call->unmarshall++; | 1717 | call->unmarshall++; |
1718 | 1718 | ||
1719 | /* Fall through - and extract the offline message */ | 1719 | /* Fall through - and extract the offline message */ |
@@ -1723,7 +1723,7 @@ static int afs_deliver_fs_get_volume_status(struct afs_call *call) | |||
1723 | if (ret < 0) | 1723 | if (ret < 0) |
1724 | return ret; | 1724 | return ret; |
1725 | 1725 | ||
1726 | p = call->reply[2]; | 1726 | p = call->buffer; |
1727 | p[call->count] = 0; | 1727 | p[call->count] = 0; |
1728 | _debug("offline '%s'", p); | 1728 | _debug("offline '%s'", p); |
1729 | 1729 | ||
@@ -1742,7 +1742,7 @@ static int afs_deliver_fs_get_volume_status(struct afs_call *call) | |||
1742 | return afs_protocol_error(call, -EBADMSG, | 1742 | return afs_protocol_error(call, -EBADMSG, |
1743 | afs_eproto_motd_len); | 1743 | afs_eproto_motd_len); |
1744 | size = (call->count + 3) & ~3; /* It's padded */ | 1744 | size = (call->count + 3) & ~3; /* It's padded */ |
1745 | afs_extract_begin(call, call->reply[2], size); | 1745 | afs_extract_to_buf(call, size); |
1746 | call->unmarshall++; | 1746 | call->unmarshall++; |
1747 | 1747 | ||
1748 | /* Fall through - and extract the message of the day */ | 1748 | /* Fall through - and extract the message of the day */ |
@@ -1752,7 +1752,7 @@ static int afs_deliver_fs_get_volume_status(struct afs_call *call) | |||
1752 | if (ret < 0) | 1752 | if (ret < 0) |
1753 | return ret; | 1753 | return ret; |
1754 | 1754 | ||
1755 | p = call->reply[2]; | 1755 | p = call->buffer; |
1756 | p[call->count] = 0; | 1756 | p[call->count] = 0; |
1757 | _debug("motd '%s'", p); | 1757 | _debug("motd '%s'", p); |
1758 | 1758 | ||
@@ -1767,23 +1767,13 @@ static int afs_deliver_fs_get_volume_status(struct afs_call *call) | |||
1767 | } | 1767 | } |
1768 | 1768 | ||
1769 | /* | 1769 | /* |
1770 | * destroy an FS.GetVolumeStatus call | ||
1771 | */ | ||
1772 | static void afs_get_volume_status_call_destructor(struct afs_call *call) | ||
1773 | { | ||
1774 | kfree(call->reply[2]); | ||
1775 | call->reply[2] = NULL; | ||
1776 | afs_flat_call_destructor(call); | ||
1777 | } | ||
1778 | |||
1779 | /* | ||
1780 | * FS.GetVolumeStatus operation type | 1770 | * FS.GetVolumeStatus operation type |
1781 | */ | 1771 | */ |
1782 | static const struct afs_call_type afs_RXFSGetVolumeStatus = { | 1772 | static const struct afs_call_type afs_RXFSGetVolumeStatus = { |
1783 | .name = "FS.GetVolumeStatus", | 1773 | .name = "FS.GetVolumeStatus", |
1784 | .op = afs_FS_GetVolumeStatus, | 1774 | .op = afs_FS_GetVolumeStatus, |
1785 | .deliver = afs_deliver_fs_get_volume_status, | 1775 | .deliver = afs_deliver_fs_get_volume_status, |
1786 | .destructor = afs_get_volume_status_call_destructor, | 1776 | .destructor = afs_flat_call_destructor, |
1787 | }; | 1777 | }; |
1788 | 1778 | ||
1789 | /* | 1779 | /* |
@@ -1796,27 +1786,19 @@ int afs_fs_get_volume_status(struct afs_fs_cursor *fc, | |||
1796 | struct afs_call *call; | 1786 | struct afs_call *call; |
1797 | struct afs_net *net = afs_v2net(vnode); | 1787 | struct afs_net *net = afs_v2net(vnode); |
1798 | __be32 *bp; | 1788 | __be32 *bp; |
1799 | void *tmpbuf; | ||
1800 | 1789 | ||
1801 | if (test_bit(AFS_SERVER_FL_IS_YFS, &fc->cbi->server->flags)) | 1790 | if (test_bit(AFS_SERVER_FL_IS_YFS, &fc->cbi->server->flags)) |
1802 | return yfs_fs_get_volume_status(fc, vs); | 1791 | return yfs_fs_get_volume_status(fc, vs); |
1803 | 1792 | ||
1804 | _enter(""); | 1793 | _enter(""); |
1805 | 1794 | ||
1806 | tmpbuf = kmalloc(AFSOPAQUEMAX, GFP_KERNEL); | 1795 | call = afs_alloc_flat_call(net, &afs_RXFSGetVolumeStatus, 2 * 4, |
1807 | if (!tmpbuf) | 1796 | max(12 * 4, AFSOPAQUEMAX + 1)); |
1808 | return -ENOMEM; | 1797 | if (!call) |
1809 | |||
1810 | call = afs_alloc_flat_call(net, &afs_RXFSGetVolumeStatus, 2 * 4, 12 * 4); | ||
1811 | if (!call) { | ||
1812 | kfree(tmpbuf); | ||
1813 | return -ENOMEM; | 1798 | return -ENOMEM; |
1814 | } | ||
1815 | 1799 | ||
1816 | call->key = fc->key; | 1800 | call->key = fc->key; |
1817 | call->reply[0] = vnode; | 1801 | call->out_volstatus = vs; |
1818 | call->reply[1] = vs; | ||
1819 | call->reply[2] = tmpbuf; | ||
1820 | 1802 | ||
1821 | /* marshall the parameters */ | 1803 | /* marshall the parameters */ |
1822 | bp = call->request; | 1804 | bp = call->request; |
@@ -1846,7 +1828,7 @@ static int afs_deliver_fs_xxxx_lock(struct afs_call *call) | |||
1846 | 1828 | ||
1847 | /* unmarshall the reply once we've received all of it */ | 1829 | /* unmarshall the reply once we've received all of it */ |
1848 | bp = call->buffer; | 1830 | bp = call->buffer; |
1849 | /* xdr_decode_AFSVolSync(&bp, call->reply[X]); */ | 1831 | xdr_decode_AFSVolSync(&bp, call->out_volsync); |
1850 | 1832 | ||
1851 | _leave(" = 0 [done]"); | 1833 | _leave(" = 0 [done]"); |
1852 | return 0; | 1834 | return 0; |
@@ -1904,7 +1886,7 @@ int afs_fs_set_lock(struct afs_fs_cursor *fc, afs_lock_type_t type) | |||
1904 | return -ENOMEM; | 1886 | return -ENOMEM; |
1905 | 1887 | ||
1906 | call->key = fc->key; | 1888 | call->key = fc->key; |
1907 | call->reply[0] = vnode; | 1889 | call->xvnode = vnode; |
1908 | call->want_reply_time = true; | 1890 | call->want_reply_time = true; |
1909 | 1891 | ||
1910 | /* marshall the parameters */ | 1892 | /* marshall the parameters */ |
@@ -1942,7 +1924,7 @@ int afs_fs_extend_lock(struct afs_fs_cursor *fc) | |||
1942 | return -ENOMEM; | 1924 | return -ENOMEM; |
1943 | 1925 | ||
1944 | call->key = fc->key; | 1926 | call->key = fc->key; |
1945 | call->reply[0] = vnode; | 1927 | call->xvnode = vnode; |
1946 | call->want_reply_time = true; | 1928 | call->want_reply_time = true; |
1947 | 1929 | ||
1948 | /* marshall the parameters */ | 1930 | /* marshall the parameters */ |
@@ -1979,7 +1961,7 @@ int afs_fs_release_lock(struct afs_fs_cursor *fc) | |||
1979 | return -ENOMEM; | 1961 | return -ENOMEM; |
1980 | 1962 | ||
1981 | call->key = fc->key; | 1963 | call->key = fc->key; |
1982 | call->reply[0] = vnode; | 1964 | call->xvnode = vnode; |
1983 | 1965 | ||
1984 | /* marshall the parameters */ | 1966 | /* marshall the parameters */ |
1985 | bp = call->request; | 1967 | bp = call->request; |
@@ -2085,14 +2067,6 @@ static int afs_deliver_fs_get_capabilities(struct afs_call *call) | |||
2085 | return 0; | 2067 | return 0; |
2086 | } | 2068 | } |
2087 | 2069 | ||
2088 | static void afs_destroy_fs_get_capabilities(struct afs_call *call) | ||
2089 | { | ||
2090 | struct afs_server *server = call->reply[0]; | ||
2091 | |||
2092 | afs_put_server(call->net, server); | ||
2093 | afs_flat_call_destructor(call); | ||
2094 | } | ||
2095 | |||
2096 | /* | 2070 | /* |
2097 | * FS.GetCapabilities operation type | 2071 | * FS.GetCapabilities operation type |
2098 | */ | 2072 | */ |
@@ -2101,7 +2075,7 @@ static const struct afs_call_type afs_RXFSGetCapabilities = { | |||
2101 | .op = afs_FS_GetCapabilities, | 2075 | .op = afs_FS_GetCapabilities, |
2102 | .deliver = afs_deliver_fs_get_capabilities, | 2076 | .deliver = afs_deliver_fs_get_capabilities, |
2103 | .done = afs_fileserver_probe_result, | 2077 | .done = afs_fileserver_probe_result, |
2104 | .destructor = afs_destroy_fs_get_capabilities, | 2078 | .destructor = afs_flat_call_destructor, |
2105 | }; | 2079 | }; |
2106 | 2080 | ||
2107 | /* | 2081 | /* |
@@ -2124,8 +2098,8 @@ struct afs_call *afs_fs_get_capabilities(struct afs_net *net, | |||
2124 | return ERR_PTR(-ENOMEM); | 2098 | return ERR_PTR(-ENOMEM); |
2125 | 2099 | ||
2126 | call->key = key; | 2100 | call->key = key; |
2127 | call->reply[0] = afs_get_server(server); | 2101 | call->server = afs_get_server(server); |
2128 | call->reply[1] = (void *)(long)server_index; | 2102 | call->server_index = server_index; |
2129 | call->upgrade = true; | 2103 | call->upgrade = true; |
2130 | call->want_reply_time = true; | 2104 | call->want_reply_time = true; |
2131 | call->async = true; | 2105 | call->async = true; |
@@ -2146,10 +2120,10 @@ struct afs_call *afs_fs_get_capabilities(struct afs_net *net, | |||
2146 | */ | 2120 | */ |
2147 | static int afs_deliver_fs_fetch_status(struct afs_call *call) | 2121 | static int afs_deliver_fs_fetch_status(struct afs_call *call) |
2148 | { | 2122 | { |
2149 | struct afs_file_status *status = call->reply[1]; | 2123 | struct afs_file_status *status = call->out_vnode_status; |
2150 | struct afs_callback *callback = call->reply[2]; | 2124 | struct afs_callback *callback = call->out_cb; |
2151 | struct afs_volsync *volsync = call->reply[3]; | 2125 | struct afs_volsync *volsync = call->out_volsync; |
2152 | struct afs_fid *fid = call->reply[0]; | 2126 | struct afs_fid *fid = call->out_fid; |
2153 | const __be32 *bp; | 2127 | const __be32 *bp; |
2154 | int ret; | 2128 | int ret; |
2155 | 2129 | ||
@@ -2208,10 +2182,10 @@ int afs_fs_fetch_status(struct afs_fs_cursor *fc, | |||
2208 | } | 2182 | } |
2209 | 2183 | ||
2210 | call->key = fc->key; | 2184 | call->key = fc->key; |
2211 | call->reply[0] = fid; | 2185 | call->out_fid = fid; |
2212 | call->reply[1] = status; | 2186 | call->out_vnode_status = status; |
2213 | call->reply[2] = callback; | 2187 | call->out_cb = callback; |
2214 | call->reply[3] = volsync; | 2188 | call->out_volsync = volsync; |
2215 | call->expected_version = 1; /* vnode->status.data_version */ | 2189 | call->expected_version = 1; /* vnode->status.data_version */ |
2216 | call->want_reply_time = true; | 2190 | call->want_reply_time = true; |
2217 | 2191 | ||
@@ -2275,7 +2249,7 @@ static int afs_deliver_fs_inline_bulk_status(struct afs_call *call) | |||
2275 | return ret; | 2249 | return ret; |
2276 | 2250 | ||
2277 | bp = call->buffer; | 2251 | bp = call->buffer; |
2278 | statuses = call->reply[1]; | 2252 | statuses = call->out_extra_status; |
2279 | ret = afs_decode_status(call, &bp, &statuses[call->count], | 2253 | ret = afs_decode_status(call, &bp, &statuses[call->count], |
2280 | NULL, NULL, NULL); | 2254 | NULL, NULL, NULL); |
2281 | if (ret < 0) | 2255 | if (ret < 0) |
@@ -2316,9 +2290,9 @@ static int afs_deliver_fs_inline_bulk_status(struct afs_call *call) | |||
2316 | 2290 | ||
2317 | _debug("unmarshall CB array"); | 2291 | _debug("unmarshall CB array"); |
2318 | bp = call->buffer; | 2292 | bp = call->buffer; |
2319 | callbacks = call->reply[2]; | 2293 | callbacks = call->out_cb; |
2320 | xdr_decode_AFSCallBack_raw(call, &callbacks[call->count], &bp); | 2294 | xdr_decode_AFSCallBack_raw(call, &callbacks[call->count], &bp); |
2321 | statuses = call->reply[1]; | 2295 | statuses = call->out_extra_status; |
2322 | call->count++; | 2296 | call->count++; |
2323 | if (call->count < call->count2) | 2297 | if (call->count < call->count2) |
2324 | goto more_cbs; | 2298 | goto more_cbs; |
@@ -2333,7 +2307,7 @@ static int afs_deliver_fs_inline_bulk_status(struct afs_call *call) | |||
2333 | return ret; | 2307 | return ret; |
2334 | 2308 | ||
2335 | bp = call->buffer; | 2309 | bp = call->buffer; |
2336 | xdr_decode_AFSVolSync(&bp, call->reply[3]); | 2310 | xdr_decode_AFSVolSync(&bp, call->out_volsync); |
2337 | 2311 | ||
2338 | call->unmarshall++; | 2312 | call->unmarshall++; |
2339 | 2313 | ||
@@ -2386,9 +2360,9 @@ int afs_fs_inline_bulk_status(struct afs_fs_cursor *fc, | |||
2386 | } | 2360 | } |
2387 | 2361 | ||
2388 | call->key = fc->key; | 2362 | call->key = fc->key; |
2389 | call->reply[1] = statuses; | 2363 | call->out_extra_status = statuses; |
2390 | call->reply[2] = callbacks; | 2364 | call->out_cb = callbacks; |
2391 | call->reply[3] = volsync; | 2365 | call->out_volsync = volsync; |
2392 | call->count2 = nr_fids; | 2366 | call->count2 = nr_fids; |
2393 | call->want_reply_time = true; | 2367 | call->want_reply_time = true; |
2394 | 2368 | ||
@@ -2415,7 +2389,7 @@ int afs_fs_inline_bulk_status(struct afs_fs_cursor *fc, | |||
2415 | */ | 2389 | */ |
2416 | static int afs_deliver_fs_fetch_acl(struct afs_call *call) | 2390 | static int afs_deliver_fs_fetch_acl(struct afs_call *call) |
2417 | { | 2391 | { |
2418 | struct afs_vnode *vnode = call->reply[1]; | 2392 | struct afs_vnode *vnode = call->xvnode; |
2419 | struct afs_acl *acl; | 2393 | struct afs_acl *acl; |
2420 | const __be32 *bp; | 2394 | const __be32 *bp; |
2421 | unsigned int size; | 2395 | unsigned int size; |
@@ -2440,7 +2414,7 @@ static int afs_deliver_fs_fetch_acl(struct afs_call *call) | |||
2440 | acl = kmalloc(struct_size(acl, data, size), GFP_KERNEL); | 2414 | acl = kmalloc(struct_size(acl, data, size), GFP_KERNEL); |
2441 | if (!acl) | 2415 | if (!acl) |
2442 | return -ENOMEM; | 2416 | return -ENOMEM; |
2443 | call->reply[0] = acl; | 2417 | call->ret_acl = acl; |
2444 | acl->size = call->count2; | 2418 | acl->size = call->count2; |
2445 | afs_extract_begin(call, acl->data, size); | 2419 | afs_extract_begin(call, acl->data, size); |
2446 | call->unmarshall++; | 2420 | call->unmarshall++; |
@@ -2465,7 +2439,7 @@ static int afs_deliver_fs_fetch_acl(struct afs_call *call) | |||
2465 | &vnode->status.data_version, NULL); | 2439 | &vnode->status.data_version, NULL); |
2466 | if (ret < 0) | 2440 | if (ret < 0) |
2467 | return ret; | 2441 | return ret; |
2468 | xdr_decode_AFSVolSync(&bp, call->reply[2]); | 2442 | xdr_decode_AFSVolSync(&bp, call->out_volsync); |
2469 | 2443 | ||
2470 | call->unmarshall++; | 2444 | call->unmarshall++; |
2471 | 2445 | ||
@@ -2479,7 +2453,7 @@ static int afs_deliver_fs_fetch_acl(struct afs_call *call) | |||
2479 | 2453 | ||
2480 | static void afs_destroy_fs_fetch_acl(struct afs_call *call) | 2454 | static void afs_destroy_fs_fetch_acl(struct afs_call *call) |
2481 | { | 2455 | { |
2482 | kfree(call->reply[0]); | 2456 | kfree(call->ret_acl); |
2483 | afs_flat_call_destructor(call); | 2457 | afs_flat_call_destructor(call); |
2484 | } | 2458 | } |
2485 | 2459 | ||
@@ -2513,10 +2487,9 @@ struct afs_acl *afs_fs_fetch_acl(struct afs_fs_cursor *fc) | |||
2513 | } | 2487 | } |
2514 | 2488 | ||
2515 | call->key = fc->key; | 2489 | call->key = fc->key; |
2516 | call->reply[0] = NULL; | 2490 | call->ret_acl = NULL; |
2517 | call->reply[1] = vnode; | 2491 | call->xvnode = vnode; |
2518 | call->reply[2] = NULL; /* volsync */ | 2492 | call->out_volsync = NULL; |
2519 | call->ret_reply0 = true; | ||
2520 | 2493 | ||
2521 | /* marshall the parameters */ | 2494 | /* marshall the parameters */ |
2522 | bp = call->request; | 2495 | bp = call->request; |
@@ -2533,12 +2506,40 @@ struct afs_acl *afs_fs_fetch_acl(struct afs_fs_cursor *fc) | |||
2533 | } | 2506 | } |
2534 | 2507 | ||
2535 | /* | 2508 | /* |
2509 | * Deliver reply data to any operation that returns file status and volume | ||
2510 | * sync. | ||
2511 | */ | ||
2512 | static int afs_deliver_fs_file_status_and_vol(struct afs_call *call) | ||
2513 | { | ||
2514 | struct afs_vnode *vnode = call->xvnode; | ||
2515 | const __be32 *bp; | ||
2516 | int ret; | ||
2517 | |||
2518 | _enter("{%u}", call->unmarshall); | ||
2519 | |||
2520 | ret = afs_transfer_reply(call); | ||
2521 | if (ret < 0) | ||
2522 | return ret; | ||
2523 | |||
2524 | /* unmarshall the reply once we've received all of it */ | ||
2525 | bp = call->buffer; | ||
2526 | ret = afs_decode_status(call, &bp, &vnode->status, vnode, | ||
2527 | &call->expected_version, NULL); | ||
2528 | if (ret < 0) | ||
2529 | return ret; | ||
2530 | xdr_decode_AFSVolSync(&bp, call->out_volsync); | ||
2531 | |||
2532 | _leave(" = 0 [done]"); | ||
2533 | return 0; | ||
2534 | } | ||
2535 | |||
2536 | /* | ||
2536 | * FS.StoreACL operation type | 2537 | * FS.StoreACL operation type |
2537 | */ | 2538 | */ |
2538 | static const struct afs_call_type afs_RXFSStoreACL = { | 2539 | static const struct afs_call_type afs_RXFSStoreACL = { |
2539 | .name = "FS.StoreACL", | 2540 | .name = "FS.StoreACL", |
2540 | .op = afs_FS_StoreACL, | 2541 | .op = afs_FS_StoreACL, |
2541 | .deliver = afs_deliver_fs_status_and_vol, | 2542 | .deliver = afs_deliver_fs_file_status_and_vol, |
2542 | .destructor = afs_flat_call_destructor, | 2543 | .destructor = afs_flat_call_destructor, |
2543 | }; | 2544 | }; |
2544 | 2545 | ||
@@ -2565,8 +2566,8 @@ int afs_fs_store_acl(struct afs_fs_cursor *fc, const struct afs_acl *acl) | |||
2565 | } | 2566 | } |
2566 | 2567 | ||
2567 | call->key = fc->key; | 2568 | call->key = fc->key; |
2568 | call->reply[0] = vnode; | 2569 | call->xvnode = vnode; |
2569 | call->reply[2] = NULL; /* volsync */ | 2570 | call->out_volsync = NULL; |
2570 | 2571 | ||
2571 | /* marshall the parameters */ | 2572 | /* marshall the parameters */ |
2572 | bp = call->request; | 2573 | bp = call->request; |