summaryrefslogtreecommitdiffstats
path: root/fs/afs/fsclient.c
diff options
context:
space:
mode:
authorDavid Howells <dhowells@redhat.com>2019-05-09 17:22:50 -0400
committerDavid Howells <dhowells@redhat.com>2019-05-16 11:25:21 -0400
commitffba718e935402e7f42b8cd5d1e00e4a3907d361 (patch)
treea77dadcb55b3cc56cbb1f8a583448944214ba163 /fs/afs/fsclient.c
parentfefb2483dc10c736e4235984fed4f3a61c99e1c2 (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.c287
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 */
393static int afs_deliver_fs_fetch_status_vnode(struct afs_call *call) 393static 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 */
477static int afs_deliver_fs_fetch_data(struct afs_call *call) 477static 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
602static void afs_fetch_data_destructor(struct afs_call *call) 602static 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 */
722static int afs_deliver_fs_create_vnode(struct afs_call *call) 722static 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 */
845static int afs_deliver_fs_status_and_vol(struct afs_call *call) 845static 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)
872static const struct afs_call_type afs_RXFSRemoveFile = { 872static 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
879static const struct afs_call_type afs_RXFSRemoveDir = { 879static 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 */
942static int afs_deliver_fs_link(struct afs_call *call) 942static 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 */
1036static int afs_deliver_fs_symlink(struct afs_call *call) 1036static 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 */
1152static int afs_deliver_fs_rename(struct afs_call *call) 1152static 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 */
1272static int afs_deliver_fs_store_data(struct afs_call *call) 1272static 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 */
1456static int afs_deliver_fs_store_status(struct afs_call *call) 1456static 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 */
1772static 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 */
1782static const struct afs_call_type afs_RXFSGetVolumeStatus = { 1772static 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
2088static 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 */
2147static int afs_deliver_fs_fetch_status(struct afs_call *call) 2121static 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 */
2416static int afs_deliver_fs_fetch_acl(struct afs_call *call) 2390static 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
2480static void afs_destroy_fs_fetch_acl(struct afs_call *call) 2454static 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 */
2512static 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 */
2538static const struct afs_call_type afs_RXFSStoreACL = { 2539static 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;