2874c5fd28426 (Thomas Gleixner 2019-05-27 08:55:01 +0200 1) // SPDX-License-Identifier: GPL-2.0-or-later
ec26815ad847d (David Howells 2007-04-26 15:49:28 -0700 2) /* AFS Cache Manager Service
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 3) *
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 4) * Copyright (C) 2002 Red Hat, Inc. All Rights Reserved.
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 5) * Written by David Howells (dhowells@redhat.com)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 6) */
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 7)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 8) #include <linux/module.h>
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 9) #include <linux/init.h>
5a0e3ad6af866 (Tejun Heo 2010-03-24 17:04:11 +0900 10) #include <linux/slab.h>
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 11) #include <linux/sched.h>
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 12) #include <linux/ip.h>
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 13) #include "internal.h"
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 14) #include "afs_cm.h"
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 15) #include "protocol_yfs.h"
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 16)
d001648ec7cf8 (David Howells 2016-08-30 20:42:14 +0100 17) static int afs_deliver_cb_init_call_back_state(struct afs_call *);
d001648ec7cf8 (David Howells 2016-08-30 20:42:14 +0100 18) static int afs_deliver_cb_init_call_back_state3(struct afs_call *);
d001648ec7cf8 (David Howells 2016-08-30 20:42:14 +0100 19) static int afs_deliver_cb_probe(struct afs_call *);
d001648ec7cf8 (David Howells 2016-08-30 20:42:14 +0100 20) static int afs_deliver_cb_callback(struct afs_call *);
d001648ec7cf8 (David Howells 2016-08-30 20:42:14 +0100 21) static int afs_deliver_cb_probe_uuid(struct afs_call *);
d001648ec7cf8 (David Howells 2016-08-30 20:42:14 +0100 22) static int afs_deliver_cb_tell_me_about_yourself(struct afs_call *);
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 23) static void afs_cm_destructor(struct afs_call *);
341f741f04bec (David Howells 2017-01-05 10:38:36 +0000 24) static void SRXAFSCB_CallBack(struct work_struct *);
341f741f04bec (David Howells 2017-01-05 10:38:36 +0000 25) static void SRXAFSCB_InitCallBackState(struct work_struct *);
341f741f04bec (David Howells 2017-01-05 10:38:36 +0000 26) static void SRXAFSCB_Probe(struct work_struct *);
341f741f04bec (David Howells 2017-01-05 10:38:36 +0000 27) static void SRXAFSCB_ProbeUuid(struct work_struct *);
341f741f04bec (David Howells 2017-01-05 10:38:36 +0000 28) static void SRXAFSCB_TellMeAboutYourself(struct work_struct *);
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 29)
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 30) static int afs_deliver_yfs_cb_callback(struct afs_call *);
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 31)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 32) /*
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 33) * CB.CallBack operation type
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 34) */
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 35) static const struct afs_call_type afs_SRXCBCallBack = {
3d888afffcf38 (David Howells 2021-06-15 11:57:26 +0100 36) .name = "CB.CallBack",
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 37) .deliver = afs_deliver_cb_callback,
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 38) .destructor = afs_cm_destructor,
341f741f04bec (David Howells 2017-01-05 10:38:36 +0000 39) .work = SRXAFSCB_CallBack,
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 40) };
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 41)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 42) /*
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 43) * CB.InitCallBackState operation type
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 44) */
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 45) static const struct afs_call_type afs_SRXCBInitCallBackState = {
3d888afffcf38 (David Howells 2021-06-15 11:57:26 +0100 46) .name = "CB.InitCallBackState",
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 47) .deliver = afs_deliver_cb_init_call_back_state,
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 48) .destructor = afs_cm_destructor,
341f741f04bec (David Howells 2017-01-05 10:38:36 +0000 49) .work = SRXAFSCB_InitCallBackState,
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 50) };
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 51)
c35eccb1f6149 (David Howells 2007-04-26 15:58:49 -0700 52) /*
c35eccb1f6149 (David Howells 2007-04-26 15:58:49 -0700 53) * CB.InitCallBackState3 operation type
c35eccb1f6149 (David Howells 2007-04-26 15:58:49 -0700 54) */
c35eccb1f6149 (David Howells 2007-04-26 15:58:49 -0700 55) static const struct afs_call_type afs_SRXCBInitCallBackState3 = {
3d888afffcf38 (David Howells 2021-06-15 11:57:26 +0100 56) .name = "CB.InitCallBackState3",
c35eccb1f6149 (David Howells 2007-04-26 15:58:49 -0700 57) .deliver = afs_deliver_cb_init_call_back_state3,
c35eccb1f6149 (David Howells 2007-04-26 15:58:49 -0700 58) .destructor = afs_cm_destructor,
341f741f04bec (David Howells 2017-01-05 10:38:36 +0000 59) .work = SRXAFSCB_InitCallBackState,
c35eccb1f6149 (David Howells 2007-04-26 15:58:49 -0700 60) };
c35eccb1f6149 (David Howells 2007-04-26 15:58:49 -0700 61)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 62) /*
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 63) * CB.Probe operation type
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 64) */
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 65) static const struct afs_call_type afs_SRXCBProbe = {
3d888afffcf38 (David Howells 2021-06-15 11:57:26 +0100 66) .name = "CB.Probe",
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 67) .deliver = afs_deliver_cb_probe,
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 68) .destructor = afs_cm_destructor,
341f741f04bec (David Howells 2017-01-05 10:38:36 +0000 69) .work = SRXAFSCB_Probe,
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 70) };
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 71)
9396d496d7458 (David Howells 2008-04-29 01:03:22 -0700 72) /*
9396d496d7458 (David Howells 2008-04-29 01:03:22 -0700 73) * CB.ProbeUuid operation type
9396d496d7458 (David Howells 2008-04-29 01:03:22 -0700 74) */
9396d496d7458 (David Howells 2008-04-29 01:03:22 -0700 75) static const struct afs_call_type afs_SRXCBProbeUuid = {
3d888afffcf38 (David Howells 2021-06-15 11:57:26 +0100 76) .name = "CB.ProbeUuid",
9396d496d7458 (David Howells 2008-04-29 01:03:22 -0700 77) .deliver = afs_deliver_cb_probe_uuid,
9396d496d7458 (David Howells 2008-04-29 01:03:22 -0700 78) .destructor = afs_cm_destructor,
341f741f04bec (David Howells 2017-01-05 10:38:36 +0000 79) .work = SRXAFSCB_ProbeUuid,
9396d496d7458 (David Howells 2008-04-29 01:03:22 -0700 80) };
9396d496d7458 (David Howells 2008-04-29 01:03:22 -0700 81)
b908fe6b2d129 (David Howells 2007-04-26 15:58:17 -0700 82) /*
7c80bcce34a35 (David Howells 2008-04-29 01:03:21 -0700 83) * CB.TellMeAboutYourself operation type
b908fe6b2d129 (David Howells 2007-04-26 15:58:17 -0700 84) */
7c80bcce34a35 (David Howells 2008-04-29 01:03:21 -0700 85) static const struct afs_call_type afs_SRXCBTellMeAboutYourself = {
3d888afffcf38 (David Howells 2021-06-15 11:57:26 +0100 86) .name = "CB.TellMeAboutYourself",
7c80bcce34a35 (David Howells 2008-04-29 01:03:21 -0700 87) .deliver = afs_deliver_cb_tell_me_about_yourself,
b908fe6b2d129 (David Howells 2007-04-26 15:58:17 -0700 88) .destructor = afs_cm_destructor,
341f741f04bec (David Howells 2017-01-05 10:38:36 +0000 89) .work = SRXAFSCB_TellMeAboutYourself,
b908fe6b2d129 (David Howells 2007-04-26 15:58:17 -0700 90) };
b908fe6b2d129 (David Howells 2007-04-26 15:58:17 -0700 91)
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 92) /*
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 93) * YFS CB.CallBack operation type
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 94) */
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 95) static const struct afs_call_type afs_SRXYFSCB_CallBack = {
3d888afffcf38 (David Howells 2021-06-15 11:57:26 +0100 96) .name = "YFSCB.CallBack",
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 97) .deliver = afs_deliver_yfs_cb_callback,
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 98) .destructor = afs_cm_destructor,
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 99) .work = SRXAFSCB_CallBack,
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 100) };
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 101)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 102) /*
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 103) * route an incoming cache manager call
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 104) * - return T if supported, F if not
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 105) */
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 106) bool afs_cm_incoming_call(struct afs_call *call)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 107) {
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 108) _enter("{%u, CB.OP %u}", call->service_id, call->operation_ID);
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 109)
50a2c95381a7d (David Howells 2016-10-13 08:27:10 +0100 110) switch (call->operation_ID) {
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 111) case CBCallBack:
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 112) call->type = &afs_SRXCBCallBack;
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 113) return true;
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 114) case CBInitCallBackState:
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 115) call->type = &afs_SRXCBInitCallBackState;
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 116) return true;
c35eccb1f6149 (David Howells 2007-04-26 15:58:49 -0700 117) case CBInitCallBackState3:
c35eccb1f6149 (David Howells 2007-04-26 15:58:49 -0700 118) call->type = &afs_SRXCBInitCallBackState3;
c35eccb1f6149 (David Howells 2007-04-26 15:58:49 -0700 119) return true;
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 120) case CBProbe:
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 121) call->type = &afs_SRXCBProbe;
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 122) return true;
f4b3526d83c40 (David Howells 2017-11-02 15:27:48 +0000 123) case CBProbeUuid:
f4b3526d83c40 (David Howells 2017-11-02 15:27:48 +0000 124) call->type = &afs_SRXCBProbeUuid;
f4b3526d83c40 (David Howells 2017-11-02 15:27:48 +0000 125) return true;
7c80bcce34a35 (David Howells 2008-04-29 01:03:21 -0700 126) case CBTellMeAboutYourself:
7c80bcce34a35 (David Howells 2008-04-29 01:03:21 -0700 127) call->type = &afs_SRXCBTellMeAboutYourself;
b908fe6b2d129 (David Howells 2007-04-26 15:58:17 -0700 128) return true;
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 129) case YFSCBCallBack:
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 130) if (call->service_id != YFS_CM_SERVICE)
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 131) return false;
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 132) call->type = &afs_SRXYFSCB_CallBack;
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 133) return true;
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 134) default:
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 135) return false;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 136) }
ec26815ad847d (David Howells 2007-04-26 15:49:28 -0700 137) }
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 138)
3bf0fb6f33dd5 (David Howells 2018-10-20 00:57:59 +0100 139) /*
3bf0fb6f33dd5 (David Howells 2018-10-20 00:57:59 +0100 140) * Find the server record by peer address and record a probe to the cache
3bf0fb6f33dd5 (David Howells 2018-10-20 00:57:59 +0100 141) * manager from a server.
3bf0fb6f33dd5 (David Howells 2018-10-20 00:57:59 +0100 142) */
3bf0fb6f33dd5 (David Howells 2018-10-20 00:57:59 +0100 143) static int afs_find_cm_server_by_peer(struct afs_call *call)
3bf0fb6f33dd5 (David Howells 2018-10-20 00:57:59 +0100 144) {
3bf0fb6f33dd5 (David Howells 2018-10-20 00:57:59 +0100 145) struct sockaddr_rxrpc srx;
3bf0fb6f33dd5 (David Howells 2018-10-20 00:57:59 +0100 146) struct afs_server *server;
3bf0fb6f33dd5 (David Howells 2018-10-20 00:57:59 +0100 147)
3bf0fb6f33dd5 (David Howells 2018-10-20 00:57:59 +0100 148) rxrpc_kernel_get_peer(call->net->socket, call->rxcall, &srx);
3bf0fb6f33dd5 (David Howells 2018-10-20 00:57:59 +0100 149)
3bf0fb6f33dd5 (David Howells 2018-10-20 00:57:59 +0100 150) server = afs_find_server(call->net, &srx);
3bf0fb6f33dd5 (David Howells 2018-10-20 00:57:59 +0100 151) if (!server) {
3bf0fb6f33dd5 (David Howells 2018-10-20 00:57:59 +0100 152) trace_afs_cm_no_server(call, &srx);
3bf0fb6f33dd5 (David Howells 2018-10-20 00:57:59 +0100 153) return 0;
3bf0fb6f33dd5 (David Howells 2018-10-20 00:57:59 +0100 154) }
3bf0fb6f33dd5 (David Howells 2018-10-20 00:57:59 +0100 155)
ffba718e93540 (David Howells 2019-05-09 22:22:50 +0100 156) call->server = server;
44746355ccb14 (David Howells 2020-05-27 15:52:02 +0100 157) return 0;
3bf0fb6f33dd5 (David Howells 2018-10-20 00:57:59 +0100 158) }
3bf0fb6f33dd5 (David Howells 2018-10-20 00:57:59 +0100 159)
3bf0fb6f33dd5 (David Howells 2018-10-20 00:57:59 +0100 160) /*
3bf0fb6f33dd5 (David Howells 2018-10-20 00:57:59 +0100 161) * Find the server record by server UUID and record a probe to the cache
3bf0fb6f33dd5 (David Howells 2018-10-20 00:57:59 +0100 162) * manager from a server.
3bf0fb6f33dd5 (David Howells 2018-10-20 00:57:59 +0100 163) */
3bf0fb6f33dd5 (David Howells 2018-10-20 00:57:59 +0100 164) static int afs_find_cm_server_by_uuid(struct afs_call *call,
3bf0fb6f33dd5 (David Howells 2018-10-20 00:57:59 +0100 165) struct afs_uuid *uuid)
3bf0fb6f33dd5 (David Howells 2018-10-20 00:57:59 +0100 166) {
3bf0fb6f33dd5 (David Howells 2018-10-20 00:57:59 +0100 167) struct afs_server *server;
3bf0fb6f33dd5 (David Howells 2018-10-20 00:57:59 +0100 168)
3bf0fb6f33dd5 (David Howells 2018-10-20 00:57:59 +0100 169) rcu_read_lock();
3bf0fb6f33dd5 (David Howells 2018-10-20 00:57:59 +0100 170) server = afs_find_server_by_uuid(call->net, call->request);
3bf0fb6f33dd5 (David Howells 2018-10-20 00:57:59 +0100 171) rcu_read_unlock();
3bf0fb6f33dd5 (David Howells 2018-10-20 00:57:59 +0100 172) if (!server) {
3bf0fb6f33dd5 (David Howells 2018-10-20 00:57:59 +0100 173) trace_afs_cm_no_server_u(call, call->request);
3bf0fb6f33dd5 (David Howells 2018-10-20 00:57:59 +0100 174) return 0;
3bf0fb6f33dd5 (David Howells 2018-10-20 00:57:59 +0100 175) }
3bf0fb6f33dd5 (David Howells 2018-10-20 00:57:59 +0100 176)
ffba718e93540 (David Howells 2019-05-09 22:22:50 +0100 177) call->server = server;
44746355ccb14 (David Howells 2020-05-27 15:52:02 +0100 178) return 0;
3bf0fb6f33dd5 (David Howells 2018-10-20 00:57:59 +0100 179) }
3bf0fb6f33dd5 (David Howells 2018-10-20 00:57:59 +0100 180)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 181) /*
428edade4e6c7 (David Howells 2018-05-12 00:28:58 +0100 182) * Clean up a cache manager call.
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 183) */
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 184) static void afs_cm_destructor(struct afs_call *call)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 185) {
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 186) kfree(call->buffer);
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 187) call->buffer = NULL;
ec26815ad847d (David Howells 2007-04-26 15:49:28 -0700 188) }
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 189)
dde9f095583b3 (David Howells 2020-03-13 13:46:08 +0000 190) /*
dde9f095583b3 (David Howells 2020-03-13 13:46:08 +0000 191) * Abort a service call from within an action function.
dde9f095583b3 (David Howells 2020-03-13 13:46:08 +0000 192) */
dde9f095583b3 (David Howells 2020-03-13 13:46:08 +0000 193) static void afs_abort_service_call(struct afs_call *call, u32 abort_code, int error,
dde9f095583b3 (David Howells 2020-03-13 13:46:08 +0000 194) const char *why)
dde9f095583b3 (David Howells 2020-03-13 13:46:08 +0000 195) {
dde9f095583b3 (David Howells 2020-03-13 13:46:08 +0000 196) rxrpc_kernel_abort_call(call->net->socket, call->rxcall,
dde9f095583b3 (David Howells 2020-03-13 13:46:08 +0000 197) abort_code, error, why);
dde9f095583b3 (David Howells 2020-03-13 13:46:08 +0000 198) afs_set_call_complete(call, error, 0);
dde9f095583b3 (David Howells 2020-03-13 13:46:08 +0000 199) }
dde9f095583b3 (David Howells 2020-03-13 13:46:08 +0000 200)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 201) /*
c435ee34551e1 (David Howells 2017-11-02 15:27:49 +0000 202) * The server supplied a list of callbacks that it wanted to break.
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 203) */
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 204) static void SRXAFSCB_CallBack(struct work_struct *work)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 205) {
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 206) struct afs_call *call = container_of(work, struct afs_call, work);
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 207)
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 208) _enter("");
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 209)
428edade4e6c7 (David Howells 2018-05-12 00:28:58 +0100 210) /* We need to break the callbacks before sending the reply as the
428edade4e6c7 (David Howells 2018-05-12 00:28:58 +0100 211) * server holds up change visibility till it receives our reply so as
428edade4e6c7 (David Howells 2018-05-12 00:28:58 +0100 212) * to maintain cache coherency.
428edade4e6c7 (David Howells 2018-05-12 00:28:58 +0100 213) */
452181936931f (David Howells 2019-06-20 18:12:17 +0100 214) if (call->server) {
977e5f8ed0ab2 (David Howells 2020-04-17 17:31:26 +0100 215) trace_afs_server(call->server,
977e5f8ed0ab2 (David Howells 2020-04-17 17:31:26 +0100 216) atomic_read(&call->server->ref),
977e5f8ed0ab2 (David Howells 2020-04-17 17:31:26 +0100 217) atomic_read(&call->server->active),
452181936931f (David Howells 2019-06-20 18:12:17 +0100 218) afs_server_trace_callback);
ffba718e93540 (David Howells 2019-05-09 22:22:50 +0100 219) afs_break_callbacks(call->server, call->count, call->request);
452181936931f (David Howells 2019-06-20 18:12:17 +0100 220) }
428edade4e6c7 (David Howells 2018-05-12 00:28:58 +0100 221)
428edade4e6c7 (David Howells 2018-05-12 00:28:58 +0100 222) afs_send_empty_reply(call);
341f741f04bec (David Howells 2017-01-05 10:38:36 +0000 223) afs_put_call(call);
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 224) _leave("");
ec26815ad847d (David Howells 2007-04-26 15:49:28 -0700 225) }
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 226)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 227) /*
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 228) * deliver request data to a CB.CallBack call
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 229) */
d001648ec7cf8 (David Howells 2016-08-30 20:42:14 +0100 230) static int afs_deliver_cb_callback(struct afs_call *call)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 231) {
5cf9dd55a0ec2 (David Howells 2018-04-09 21:12:31 +0100 232) struct afs_callback_break *cb;
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 233) __be32 *bp;
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 234) int ret, loop;
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 235)
d001648ec7cf8 (David Howells 2016-08-30 20:42:14 +0100 236) _enter("{%u}", call->unmarshall);
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 237)
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 238) switch (call->unmarshall) {
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 239) case 0:
12bdcf333fe13 (David Howells 2018-10-20 00:57:56 +0100 240) afs_extract_to_tmp(call);
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 241) call->unmarshall++;
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 242)
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 243) /* extract the FID array and its count in two steps */
df561f6688fef (Gustavo A. R. Silva 2020-08-23 17:36:59 -0500 244) fallthrough;
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 245) case 1:
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 246) _debug("extract FID count");
12bdcf333fe13 (David Howells 2018-10-20 00:57:56 +0100 247) ret = afs_extract_data(call, true);
372ee16386bbf (David Howells 2016-08-03 14:11:40 +0100 248) if (ret < 0)
372ee16386bbf (David Howells 2016-08-03 14:11:40 +0100 249) return ret;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 250)
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 251) call->count = ntohl(call->tmp);
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 252) _debug("FID count: %u", call->count);
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 253) if (call->count > AFSCBMAX)
7126ead910aa9 (David Howells 2020-04-08 16:49:08 +0100 254) return afs_protocol_error(call, afs_eproto_cb_fid_count);
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 255)
6da2ec56059c3 (Kees Cook 2018-06-12 13:55:00 -0700 256) call->buffer = kmalloc(array3_size(call->count, 3, 4),
6da2ec56059c3 (Kees Cook 2018-06-12 13:55:00 -0700 257) GFP_KERNEL);
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 258) if (!call->buffer)
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 259) return -ENOMEM;
12bdcf333fe13 (David Howells 2018-10-20 00:57:56 +0100 260) afs_extract_to_buf(call, call->count * 3 * 4);
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 261) call->unmarshall++;
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 262)
df561f6688fef (Gustavo A. R. Silva 2020-08-23 17:36:59 -0500 263) fallthrough;
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 264) case 2:
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 265) _debug("extract FID array");
12bdcf333fe13 (David Howells 2018-10-20 00:57:56 +0100 266) ret = afs_extract_data(call, true);
372ee16386bbf (David Howells 2016-08-03 14:11:40 +0100 267) if (ret < 0)
372ee16386bbf (David Howells 2016-08-03 14:11:40 +0100 268) return ret;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 269)
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 270) _debug("unmarshall FID array");
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 271) call->request = kcalloc(call->count,
5cf9dd55a0ec2 (David Howells 2018-04-09 21:12:31 +0100 272) sizeof(struct afs_callback_break),
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 273) GFP_KERNEL);
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 274) if (!call->request)
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 275) return -ENOMEM;
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 276)
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 277) cb = call->request;
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 278) bp = call->buffer;
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 279) for (loop = call->count; loop > 0; loop--, cb++) {
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 280) cb->fid.vid = ntohl(*bp++);
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 281) cb->fid.vnode = ntohl(*bp++);
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 282) cb->fid.unique = ntohl(*bp++);
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 283) }
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 284)
12bdcf333fe13 (David Howells 2018-10-20 00:57:56 +0100 285) afs_extract_to_tmp(call);
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 286) call->unmarshall++;
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 287)
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 288) /* extract the callback array and its count in two steps */
df561f6688fef (Gustavo A. R. Silva 2020-08-23 17:36:59 -0500 289) fallthrough;
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 290) case 3:
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 291) _debug("extract CB count");
12bdcf333fe13 (David Howells 2018-10-20 00:57:56 +0100 292) ret = afs_extract_data(call, true);
372ee16386bbf (David Howells 2016-08-03 14:11:40 +0100 293) if (ret < 0)
372ee16386bbf (David Howells 2016-08-03 14:11:40 +0100 294) return ret;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 295)
bcd89270d93b7 (Marc Dionne 2017-03-16 16:27:44 +0000 296) call->count2 = ntohl(call->tmp);
bcd89270d93b7 (Marc Dionne 2017-03-16 16:27:44 +0000 297) _debug("CB count: %u", call->count2);
bcd89270d93b7 (Marc Dionne 2017-03-16 16:27:44 +0000 298) if (call->count2 != call->count && call->count2 != 0)
7126ead910aa9 (David Howells 2020-04-08 16:49:08 +0100 299) return afs_protocol_error(call, afs_eproto_cb_count);
fc276122496df (David Howells 2019-11-21 09:12:17 +0000 300) call->iter = &call->def_iter;
fc276122496df (David Howells 2019-11-21 09:12:17 +0000 301) iov_iter_discard(&call->def_iter, READ, call->count2 * 3 * 4);
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 302) call->unmarshall++;
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 303)
df561f6688fef (Gustavo A. R. Silva 2020-08-23 17:36:59 -0500 304) fallthrough;
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 305) case 4:
06aeb2971457b (David Howells 2018-10-20 00:57:58 +0100 306) _debug("extract discard %zu/%u",
fc276122496df (David Howells 2019-11-21 09:12:17 +0000 307) iov_iter_count(call->iter), call->count2 * 3 * 4);
06aeb2971457b (David Howells 2018-10-20 00:57:58 +0100 308)
12bdcf333fe13 (David Howells 2018-10-20 00:57:56 +0100 309) ret = afs_extract_data(call, false);
372ee16386bbf (David Howells 2016-08-03 14:11:40 +0100 310) if (ret < 0)
372ee16386bbf (David Howells 2016-08-03 14:11:40 +0100 311) return ret;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 312)
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 313) call->unmarshall++;
b2db6c35ba986 (Gustavo A. R. Silva 2021-05-25 15:40:22 +0100 314) fallthrough;
b2db6c35ba986 (Gustavo A. R. Silva 2021-05-25 15:40:22 +0100 315)
d001648ec7cf8 (David Howells 2016-08-30 20:42:14 +0100 316) case 5:
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 317) break;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 318) }
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 319)
98bf40cd99fcf (David Howells 2017-11-02 15:27:53 +0000 320) if (!afs_check_call_state(call, AFS_CALL_SV_REPLYING))
f51375cd9e1ad (David Howells 2018-10-20 00:57:57 +0100 321) return afs_io_error(call, afs_io_error_cm_reply);
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 322)
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 323) /* we'll need the file server record as that tells us which set of
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 324) * vnodes to operate upon */
3bf0fb6f33dd5 (David Howells 2018-10-20 00:57:59 +0100 325) return afs_find_cm_server_by_peer(call);
ec26815ad847d (David Howells 2007-04-26 15:49:28 -0700 326) }
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 327)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 328) /*
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 329) * allow the fileserver to request callback state (re-)initialisation
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 330) */
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 331) static void SRXAFSCB_InitCallBackState(struct work_struct *work)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 332) {
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 333) struct afs_call *call = container_of(work, struct afs_call, work);
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 334)
ffba718e93540 (David Howells 2019-05-09 22:22:50 +0100 335) _enter("{%p}", call->server);
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 336)
ffba718e93540 (David Howells 2019-05-09 22:22:50 +0100 337) if (call->server)
ffba718e93540 (David Howells 2019-05-09 22:22:50 +0100 338) afs_init_callback_state(call->server);
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 339) afs_send_empty_reply(call);
341f741f04bec (David Howells 2017-01-05 10:38:36 +0000 340) afs_put_call(call);
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 341) _leave("");
ec26815ad847d (David Howells 2007-04-26 15:49:28 -0700 342) }
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 343)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 344) /*
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 345) * deliver request data to a CB.InitCallBackState call
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 346) */
d001648ec7cf8 (David Howells 2016-08-30 20:42:14 +0100 347) static int afs_deliver_cb_init_call_back_state(struct afs_call *call)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 348) {
372ee16386bbf (David Howells 2016-08-03 14:11:40 +0100 349) int ret;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 350)
d001648ec7cf8 (David Howells 2016-08-30 20:42:14 +0100 351) _enter("");
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 352)
12bdcf333fe13 (David Howells 2018-10-20 00:57:56 +0100 353) afs_extract_discard(call, 0);
12bdcf333fe13 (David Howells 2018-10-20 00:57:56 +0100 354) ret = afs_extract_data(call, false);
372ee16386bbf (David Howells 2016-08-03 14:11:40 +0100 355) if (ret < 0)
372ee16386bbf (David Howells 2016-08-03 14:11:40 +0100 356) return ret;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 357)
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 358) /* we'll need the file server record as that tells us which set of
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 359) * vnodes to operate upon */
3bf0fb6f33dd5 (David Howells 2018-10-20 00:57:59 +0100 360) return afs_find_cm_server_by_peer(call);
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 361) }
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 362)
c35eccb1f6149 (David Howells 2007-04-26 15:58:49 -0700 363) /*
c35eccb1f6149 (David Howells 2007-04-26 15:58:49 -0700 364) * deliver request data to a CB.InitCallBackState3 call
c35eccb1f6149 (David Howells 2007-04-26 15:58:49 -0700 365) */
d001648ec7cf8 (David Howells 2016-08-30 20:42:14 +0100 366) static int afs_deliver_cb_init_call_back_state3(struct afs_call *call)
c35eccb1f6149 (David Howells 2007-04-26 15:58:49 -0700 367) {
41bb26f8db3ad (Christoph Hellwig 2017-05-28 08:56:46 +0300 368) struct afs_uuid *r;
d001648ec7cf8 (David Howells 2016-08-30 20:42:14 +0100 369) unsigned loop;
d001648ec7cf8 (David Howells 2016-08-30 20:42:14 +0100 370) __be32 *b;
d001648ec7cf8 (David Howells 2016-08-30 20:42:14 +0100 371) int ret;
c35eccb1f6149 (David Howells 2007-04-26 15:58:49 -0700 372)
d001648ec7cf8 (David Howells 2016-08-30 20:42:14 +0100 373) _enter("");
c35eccb1f6149 (David Howells 2007-04-26 15:58:49 -0700 374)
d001648ec7cf8 (David Howells 2016-08-30 20:42:14 +0100 375) _enter("{%u}", call->unmarshall);
d001648ec7cf8 (David Howells 2016-08-30 20:42:14 +0100 376)
d001648ec7cf8 (David Howells 2016-08-30 20:42:14 +0100 377) switch (call->unmarshall) {
d001648ec7cf8 (David Howells 2016-08-30 20:42:14 +0100 378) case 0:
6da2ec56059c3 (Kees Cook 2018-06-12 13:55:00 -0700 379) call->buffer = kmalloc_array(11, sizeof(__be32), GFP_KERNEL);
d001648ec7cf8 (David Howells 2016-08-30 20:42:14 +0100 380) if (!call->buffer)
d001648ec7cf8 (David Howells 2016-08-30 20:42:14 +0100 381) return -ENOMEM;
12bdcf333fe13 (David Howells 2018-10-20 00:57:56 +0100 382) afs_extract_to_buf(call, 11 * sizeof(__be32));
d001648ec7cf8 (David Howells 2016-08-30 20:42:14 +0100 383) call->unmarshall++;
d001648ec7cf8 (David Howells 2016-08-30 20:42:14 +0100 384)
df561f6688fef (Gustavo A. R. Silva 2020-08-23 17:36:59 -0500 385) fallthrough;
d001648ec7cf8 (David Howells 2016-08-30 20:42:14 +0100 386) case 1:
d001648ec7cf8 (David Howells 2016-08-30 20:42:14 +0100 387) _debug("extract UUID");
12bdcf333fe13 (David Howells 2018-10-20 00:57:56 +0100 388) ret = afs_extract_data(call, false);
d001648ec7cf8 (David Howells 2016-08-30 20:42:14 +0100 389) switch (ret) {
d001648ec7cf8 (David Howells 2016-08-30 20:42:14 +0100 390) case 0: break;
d001648ec7cf8 (David Howells 2016-08-30 20:42:14 +0100 391) case -EAGAIN: return 0;
d001648ec7cf8 (David Howells 2016-08-30 20:42:14 +0100 392) default: return ret;
d001648ec7cf8 (David Howells 2016-08-30 20:42:14 +0100 393) }
d001648ec7cf8 (David Howells 2016-08-30 20:42:14 +0100 394)
d001648ec7cf8 (David Howells 2016-08-30 20:42:14 +0100 395) _debug("unmarshall UUID");
41bb26f8db3ad (Christoph Hellwig 2017-05-28 08:56:46 +0300 396) call->request = kmalloc(sizeof(struct afs_uuid), GFP_KERNEL);
d001648ec7cf8 (David Howells 2016-08-30 20:42:14 +0100 397) if (!call->request)
d001648ec7cf8 (David Howells 2016-08-30 20:42:14 +0100 398) return -ENOMEM;
d001648ec7cf8 (David Howells 2016-08-30 20:42:14 +0100 399)
d001648ec7cf8 (David Howells 2016-08-30 20:42:14 +0100 400) b = call->buffer;
d001648ec7cf8 (David Howells 2016-08-30 20:42:14 +0100 401) r = call->request;
ff548773106ec (David Howells 2017-02-10 16:34:07 +0000 402) r->time_low = b[0];
ff548773106ec (David Howells 2017-02-10 16:34:07 +0000 403) r->time_mid = htons(ntohl(b[1]));
ff548773106ec (David Howells 2017-02-10 16:34:07 +0000 404) r->time_hi_and_version = htons(ntohl(b[2]));
d001648ec7cf8 (David Howells 2016-08-30 20:42:14 +0100 405) r->clock_seq_hi_and_reserved = ntohl(b[3]);
d001648ec7cf8 (David Howells 2016-08-30 20:42:14 +0100 406) r->clock_seq_low = ntohl(b[4]);
d001648ec7cf8 (David Howells 2016-08-30 20:42:14 +0100 407)
d001648ec7cf8 (David Howells 2016-08-30 20:42:14 +0100 408) for (loop = 0; loop < 6; loop++)
d001648ec7cf8 (David Howells 2016-08-30 20:42:14 +0100 409) r->node[loop] = ntohl(b[loop + 5]);
d001648ec7cf8 (David Howells 2016-08-30 20:42:14 +0100 410)
d001648ec7cf8 (David Howells 2016-08-30 20:42:14 +0100 411) call->unmarshall++;
b2db6c35ba986 (Gustavo A. R. Silva 2021-05-25 15:40:22 +0100 412) fallthrough;
d001648ec7cf8 (David Howells 2016-08-30 20:42:14 +0100 413)
d001648ec7cf8 (David Howells 2016-08-30 20:42:14 +0100 414) case 2:
d001648ec7cf8 (David Howells 2016-08-30 20:42:14 +0100 415) break;
d001648ec7cf8 (David Howells 2016-08-30 20:42:14 +0100 416) }
c35eccb1f6149 (David Howells 2007-04-26 15:58:49 -0700 417)
98bf40cd99fcf (David Howells 2017-11-02 15:27:53 +0000 418) if (!afs_check_call_state(call, AFS_CALL_SV_REPLYING))
f51375cd9e1ad (David Howells 2018-10-20 00:57:57 +0100 419) return afs_io_error(call, afs_io_error_cm_reply);
c35eccb1f6149 (David Howells 2007-04-26 15:58:49 -0700 420)
c35eccb1f6149 (David Howells 2007-04-26 15:58:49 -0700 421) /* we'll need the file server record as that tells us which set of
c35eccb1f6149 (David Howells 2007-04-26 15:58:49 -0700 422) * vnodes to operate upon */
3bf0fb6f33dd5 (David Howells 2018-10-20 00:57:59 +0100 423) return afs_find_cm_server_by_uuid(call, call->request);
c35eccb1f6149 (David Howells 2007-04-26 15:58:49 -0700 424) }
c35eccb1f6149 (David Howells 2007-04-26 15:58:49 -0700 425)
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 426) /*
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 427) * allow the fileserver to see if the cache manager is still alive
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 428) */
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 429) static void SRXAFSCB_Probe(struct work_struct *work)
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 430) {
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 431) struct afs_call *call = container_of(work, struct afs_call, work);
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 432)
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 433) _enter("");
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 434) afs_send_empty_reply(call);
341f741f04bec (David Howells 2017-01-05 10:38:36 +0000 435) afs_put_call(call);
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 436) _leave("");
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 437) }
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 438)
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 439) /*
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 440) * deliver request data to a CB.Probe call
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 441) */
d001648ec7cf8 (David Howells 2016-08-30 20:42:14 +0100 442) static int afs_deliver_cb_probe(struct afs_call *call)
08e0e7c82eead (David Howells 2007-04-26 15:55:03 -0700 443) {
372ee16386bbf (David Howells 2016-08-03 14:11:40 +0100 444) int ret;
372ee16386bbf (David Howells 2016-08-03 14:11:40 +0100 445)
d001648ec7cf8 (David Howells 2016-08-30 20:42:14 +0100 446) _enter("");
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 447)
12bdcf333fe13 (David Howells 2018-10-20 00:57:56 +0100 448) afs_extract_discard(call, 0);
12bdcf333fe13 (David Howells 2018-10-20 00:57:56 +0100 449) ret = afs_extract_data(call, false);
372ee16386bbf (David Howells 2016-08-03 14:11:40 +0100 450) if (ret < 0)
372ee16386bbf (David Howells 2016-08-03 14:11:40 +0100 451) return ret;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 452)
98bf40cd99fcf (David Howells 2017-11-02 15:27:53 +0000 453) if (!afs_check_call_state(call, AFS_CALL_SV_REPLYING))
f51375cd9e1ad (David Howells 2018-10-20 00:57:57 +0100 454) return afs_io_error(call, afs_io_error_cm_reply);
3bf0fb6f33dd5 (David Howells 2018-10-20 00:57:59 +0100 455) return afs_find_cm_server_by_peer(call);
ec26815ad847d (David Howells 2007-04-26 15:49:28 -0700 456) }
b908fe6b2d129 (David Howells 2007-04-26 15:58:17 -0700 457)
9396d496d7458 (David Howells 2008-04-29 01:03:22 -0700 458) /*
3120c170ef35c (David Howells 2020-05-27 16:44:02 +0100 459) * Allow the fileserver to quickly find out if the cache manager has been
3120c170ef35c (David Howells 2020-05-27 16:44:02 +0100 460) * rebooted.
9396d496d7458 (David Howells 2008-04-29 01:03:22 -0700 461) */
9396d496d7458 (David Howells 2008-04-29 01:03:22 -0700 462) static void SRXAFSCB_ProbeUuid(struct work_struct *work)
9396d496d7458 (David Howells 2008-04-29 01:03:22 -0700 463) {
9396d496d7458 (David Howells 2008-04-29 01:03:22 -0700 464) struct afs_call *call = container_of(work, struct afs_call, work);
41bb26f8db3ad (Christoph Hellwig 2017-05-28 08:56:46 +0300 465) struct afs_uuid *r = call->request;
9396d496d7458 (David Howells 2008-04-29 01:03:22 -0700 466)
9396d496d7458 (David Howells 2008-04-29 01:03:22 -0700 467) _enter("");
9396d496d7458 (David Howells 2008-04-29 01:03:22 -0700 468)
f044c8847bb61 (David Howells 2017-11-02 15:27:45 +0000 469) if (memcmp(r, &call->net->uuid, sizeof(call->net->uuid)) == 0)
2067b2b3f4846 (David Howells 2019-07-30 14:38:51 +0100 470) afs_send_empty_reply(call);
9396d496d7458 (David Howells 2008-04-29 01:03:22 -0700 471) else
dde9f095583b3 (David Howells 2020-03-13 13:46:08 +0000 472) afs_abort_service_call(call, 1, 1, "K-1");
9396d496d7458 (David Howells 2008-04-29 01:03:22 -0700 473)
341f741f04bec (David Howells 2017-01-05 10:38:36 +0000 474) afs_put_call(call);
9396d496d7458 (David Howells 2008-04-29 01:03:22 -0700 475) _leave("");
9396d496d7458 (David Howells 2008-04-29 01:03:22 -0700 476) }
9396d496d7458 (David Howells 2008-04-29 01:03:22 -0700 477)
9396d496d7458 (David Howells 2008-04-29 01:03:22 -0700 478) /*
9396d496d7458 (David Howells 2008-04-29 01:03:22 -0700 479) * deliver request data to a CB.ProbeUuid call
9396d496d7458 (David Howells 2008-04-29 01:03:22 -0700 480) */
d001648ec7cf8 (David Howells 2016-08-30 20:42:14 +0100 481) static int afs_deliver_cb_probe_uuid(struct afs_call *call)
9396d496d7458 (David Howells 2008-04-29 01:03:22 -0700 482) {
41bb26f8db3ad (Christoph Hellwig 2017-05-28 08:56:46 +0300 483) struct afs_uuid *r;
9396d496d7458 (David Howells 2008-04-29 01:03:22 -0700 484) unsigned loop;
9396d496d7458 (David Howells 2008-04-29 01:03:22 -0700 485) __be32 *b;
9396d496d7458 (David Howells 2008-04-29 01:03:22 -0700 486) int ret;
9396d496d7458 (David Howells 2008-04-29 01:03:22 -0700 487)
d001648ec7cf8 (David Howells 2016-08-30 20:42:14 +0100 488) _enter("{%u}", call->unmarshall);
9396d496d7458 (David Howells 2008-04-29 01:03:22 -0700 489)
9396d496d7458 (David Howells 2008-04-29 01:03:22 -0700 490) switch (call->unmarshall) {
9396d496d7458 (David Howells 2008-04-29 01:03:22 -0700 491) case 0:
6da2ec56059c3 (Kees Cook 2018-06-12 13:55:00 -0700 492) call->buffer = kmalloc_array(11, sizeof(__be32), GFP_KERNEL);
9396d496d7458 (David Howells 2008-04-29 01:03:22 -0700 493) if (!call->buffer)
9396d496d7458 (David Howells 2008-04-29 01:03:22 -0700 494) return -ENOMEM;
12bdcf333fe13 (David Howells 2018-10-20 00:57:56 +0100 495) afs_extract_to_buf(call, 11 * sizeof(__be32));
9396d496d7458 (David Howells 2008-04-29 01:03:22 -0700 496) call->unmarshall++;
9396d496d7458 (David Howells 2008-04-29 01:03:22 -0700 497)
df561f6688fef (Gustavo A. R. Silva 2020-08-23 17:36:59 -0500 498) fallthrough;
9396d496d7458 (David Howells 2008-04-29 01:03:22 -0700 499) case 1:
9396d496d7458 (David Howells 2008-04-29 01:03:22 -0700 500) _debug("extract UUID");
12bdcf333fe13 (David Howells 2018-10-20 00:57:56 +0100 501) ret = afs_extract_data(call, false);
9396d496d7458 (David Howells 2008-04-29 01:03:22 -0700 502) switch (ret) {
9396d496d7458 (David Howells 2008-04-29 01:03:22 -0700 503) case 0: break;
9396d496d7458 (David Howells 2008-04-29 01:03:22 -0700 504) case -EAGAIN: return 0;
9396d496d7458 (David Howells 2008-04-29 01:03:22 -0700 505) default: return ret;
9396d496d7458 (David Howells 2008-04-29 01:03:22 -0700 506) }
9396d496d7458 (David Howells 2008-04-29 01:03:22 -0700 507)
9396d496d7458 (David Howells 2008-04-29 01:03:22 -0700 508) _debug("unmarshall UUID");
41bb26f8db3ad (Christoph Hellwig 2017-05-28 08:56:46 +0300 509) call->request = kmalloc(sizeof(struct afs_uuid), GFP_KERNEL);
9396d496d7458 (David Howells 2008-04-29 01:03:22 -0700 510) if (!call->request)
9396d496d7458 (David Howells 2008-04-29 01:03:22 -0700 511) return -ENOMEM;
9396d496d7458 (David Howells 2008-04-29 01:03:22 -0700 512)
9396d496d7458 (David Howells 2008-04-29 01:03:22 -0700 513) b = call->buffer;
9396d496d7458 (David Howells 2008-04-29 01:03:22 -0700 514) r = call->request;
fe342cf77bc3c (David Howells 2018-04-09 21:12:31 +0100 515) r->time_low = b[0];
fe342cf77bc3c (David Howells 2018-04-09 21:12:31 +0100 516) r->time_mid = htons(ntohl(b[1]));
fe342cf77bc3c (David Howells 2018-04-09 21:12:31 +0100 517) r->time_hi_and_version = htons(ntohl(b[2]));
9396d496d7458 (David Howells 2008-04-29 01:03:22 -0700 518) r->clock_seq_hi_and_reserved = ntohl(b[3]);
9396d496d7458 (David Howells 2008-04-29 01:03:22 -0700 519) r->clock_seq_low = ntohl(b[4]);
9396d496d7458 (David Howells 2008-04-29 01:03:22 -0700 520)
9396d496d7458 (David Howells 2008-04-29 01:03:22 -0700 521) for (loop = 0; loop < 6; loop++)
9396d496d7458 (David Howells 2008-04-29 01:03:22 -0700 522) r->node[loop] = ntohl(b[loop + 5]);
9396d496d7458 (David Howells 2008-04-29 01:03:22 -0700 523)
9396d496d7458 (David Howells 2008-04-29 01:03:22 -0700 524) call->unmarshall++;
b2db6c35ba986 (Gustavo A. R. Silva 2021-05-25 15:40:22 +0100 525) fallthrough;
9396d496d7458 (David Howells 2008-04-29 01:03:22 -0700 526)
9396d496d7458 (David Howells 2008-04-29 01:03:22 -0700 527) case 2:
9396d496d7458 (David Howells 2008-04-29 01:03:22 -0700 528) break;
9396d496d7458 (David Howells 2008-04-29 01:03:22 -0700 529) }
9396d496d7458 (David Howells 2008-04-29 01:03:22 -0700 530)
98bf40cd99fcf (David Howells 2017-11-02 15:27:53 +0000 531) if (!afs_check_call_state(call, AFS_CALL_SV_REPLYING))
f51375cd9e1ad (David Howells 2018-10-20 00:57:57 +0100 532) return afs_io_error(call, afs_io_error_cm_reply);
3120c170ef35c (David Howells 2020-05-27 16:44:02 +0100 533) return afs_find_cm_server_by_peer(call);
9396d496d7458 (David Howells 2008-04-29 01:03:22 -0700 534) }
9396d496d7458 (David Howells 2008-04-29 01:03:22 -0700 535)
b908fe6b2d129 (David Howells 2007-04-26 15:58:17 -0700 536) /*
b908fe6b2d129 (David Howells 2007-04-26 15:58:17 -0700 537) * allow the fileserver to ask about the cache manager's capabilities
b908fe6b2d129 (David Howells 2007-04-26 15:58:17 -0700 538) */
7c80bcce34a35 (David Howells 2008-04-29 01:03:21 -0700 539) static void SRXAFSCB_TellMeAboutYourself(struct work_struct *work)
b908fe6b2d129 (David Howells 2007-04-26 15:58:17 -0700 540) {
b908fe6b2d129 (David Howells 2007-04-26 15:58:17 -0700 541) struct afs_call *call = container_of(work, struct afs_call, work);
35ebfc22fe991 (Florian Westphal 2019-05-31 18:27:03 +0200 542) int loop;
b908fe6b2d129 (David Howells 2007-04-26 15:58:17 -0700 543)
b908fe6b2d129 (David Howells 2007-04-26 15:58:17 -0700 544) struct {
b908fe6b2d129 (David Howells 2007-04-26 15:58:17 -0700 545) struct /* InterfaceAddr */ {
b908fe6b2d129 (David Howells 2007-04-26 15:58:17 -0700 546) __be32 nifs;
b908fe6b2d129 (David Howells 2007-04-26 15:58:17 -0700 547) __be32 uuid[11];
b908fe6b2d129 (David Howells 2007-04-26 15:58:17 -0700 548) __be32 ifaddr[32];
b908fe6b2d129 (David Howells 2007-04-26 15:58:17 -0700 549) __be32 netmask[32];
b908fe6b2d129 (David Howells 2007-04-26 15:58:17 -0700 550) __be32 mtu[32];
b908fe6b2d129 (David Howells 2007-04-26 15:58:17 -0700 551) } ia;
b908fe6b2d129 (David Howells 2007-04-26 15:58:17 -0700 552) struct /* Capabilities */ {
b908fe6b2d129 (David Howells 2007-04-26 15:58:17 -0700 553) __be32 capcount;
b908fe6b2d129 (David Howells 2007-04-26 15:58:17 -0700 554) __be32 caps[1];
b908fe6b2d129 (David Howells 2007-04-26 15:58:17 -0700 555) } cap;
b908fe6b2d129 (David Howells 2007-04-26 15:58:17 -0700 556) } reply;
b908fe6b2d129 (David Howells 2007-04-26 15:58:17 -0700 557)
b908fe6b2d129 (David Howells 2007-04-26 15:58:17 -0700 558) _enter("");
b908fe6b2d129 (David Howells 2007-04-26 15:58:17 -0700 559)
b908fe6b2d129 (David Howells 2007-04-26 15:58:17 -0700 560) memset(&reply, 0, sizeof(reply));
b908fe6b2d129 (David Howells 2007-04-26 15:58:17 -0700 561)
f044c8847bb61 (David Howells 2017-11-02 15:27:45 +0000 562) reply.ia.uuid[0] = call->net->uuid.time_low;
f044c8847bb61 (David Howells 2017-11-02 15:27:45 +0000 563) reply.ia.uuid[1] = htonl(ntohs(call->net->uuid.time_mid));
f044c8847bb61 (David Howells 2017-11-02 15:27:45 +0000 564) reply.ia.uuid[2] = htonl(ntohs(call->net->uuid.time_hi_and_version));
f044c8847bb61 (David Howells 2017-11-02 15:27:45 +0000 565) reply.ia.uuid[3] = htonl((s8) call->net->uuid.clock_seq_hi_and_reserved);
f044c8847bb61 (David Howells 2017-11-02 15:27:45 +0000 566) reply.ia.uuid[4] = htonl((s8) call->net->uuid.clock_seq_low);
b908fe6b2d129 (David Howells 2007-04-26 15:58:17 -0700 567) for (loop = 0; loop < 6; loop++)
f044c8847bb61 (David Howells 2017-11-02 15:27:45 +0000 568) reply.ia.uuid[loop + 5] = htonl((s8) call->net->uuid.node[loop]);
b908fe6b2d129 (David Howells 2007-04-26 15:58:17 -0700 569)
b908fe6b2d129 (David Howells 2007-04-26 15:58:17 -0700 570) reply.cap.capcount = htonl(1);
b908fe6b2d129 (David Howells 2007-04-26 15:58:17 -0700 571) reply.cap.caps[0] = htonl(AFS_CAP_ERROR_TRANSLATION);
b908fe6b2d129 (David Howells 2007-04-26 15:58:17 -0700 572) afs_send_simple_reply(call, &reply, sizeof(reply));
341f741f04bec (David Howells 2017-01-05 10:38:36 +0000 573) afs_put_call(call);
b908fe6b2d129 (David Howells 2007-04-26 15:58:17 -0700 574) _leave("");
b908fe6b2d129 (David Howells 2007-04-26 15:58:17 -0700 575) }
b908fe6b2d129 (David Howells 2007-04-26 15:58:17 -0700 576)
b908fe6b2d129 (David Howells 2007-04-26 15:58:17 -0700 577) /*
7c80bcce34a35 (David Howells 2008-04-29 01:03:21 -0700 578) * deliver request data to a CB.TellMeAboutYourself call
b908fe6b2d129 (David Howells 2007-04-26 15:58:17 -0700 579) */
d001648ec7cf8 (David Howells 2016-08-30 20:42:14 +0100 580) static int afs_deliver_cb_tell_me_about_yourself(struct afs_call *call)
b908fe6b2d129 (David Howells 2007-04-26 15:58:17 -0700 581) {
372ee16386bbf (David Howells 2016-08-03 14:11:40 +0100 582) int ret;
372ee16386bbf (David Howells 2016-08-03 14:11:40 +0100 583)
d001648ec7cf8 (David Howells 2016-08-30 20:42:14 +0100 584) _enter("");
b908fe6b2d129 (David Howells 2007-04-26 15:58:17 -0700 585)
12bdcf333fe13 (David Howells 2018-10-20 00:57:56 +0100 586) afs_extract_discard(call, 0);
12bdcf333fe13 (David Howells 2018-10-20 00:57:56 +0100 587) ret = afs_extract_data(call, false);
372ee16386bbf (David Howells 2016-08-03 14:11:40 +0100 588) if (ret < 0)
372ee16386bbf (David Howells 2016-08-03 14:11:40 +0100 589) return ret;
b908fe6b2d129 (David Howells 2007-04-26 15:58:17 -0700 590)
98bf40cd99fcf (David Howells 2017-11-02 15:27:53 +0000 591) if (!afs_check_call_state(call, AFS_CALL_SV_REPLYING))
f51375cd9e1ad (David Howells 2018-10-20 00:57:57 +0100 592) return afs_io_error(call, afs_io_error_cm_reply);
3bf0fb6f33dd5 (David Howells 2018-10-20 00:57:59 +0100 593) return afs_find_cm_server_by_peer(call);
b908fe6b2d129 (David Howells 2007-04-26 15:58:17 -0700 594) }
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 595)
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 596) /*
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 597) * deliver request data to a YFS CB.CallBack call
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 598) */
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 599) static int afs_deliver_yfs_cb_callback(struct afs_call *call)
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 600) {
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 601) struct afs_callback_break *cb;
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 602) struct yfs_xdr_YFSFid *bp;
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 603) size_t size;
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 604) int ret, loop;
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 605)
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 606) _enter("{%u}", call->unmarshall);
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 607)
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 608) switch (call->unmarshall) {
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 609) case 0:
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 610) afs_extract_to_tmp(call);
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 611) call->unmarshall++;
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 612)
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 613) /* extract the FID array and its count in two steps */
df561f6688fef (Gustavo A. R. Silva 2020-08-23 17:36:59 -0500 614) fallthrough;
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 615) case 1:
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 616) _debug("extract FID count");
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 617) ret = afs_extract_data(call, true);
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 618) if (ret < 0)
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 619) return ret;
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 620)
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 621) call->count = ntohl(call->tmp);
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 622) _debug("FID count: %u", call->count);
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 623) if (call->count > YFSCBMAX)
7126ead910aa9 (David Howells 2020-04-08 16:49:08 +0100 624) return afs_protocol_error(call, afs_eproto_cb_fid_count);
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 625)
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 626) size = array_size(call->count, sizeof(struct yfs_xdr_YFSFid));
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 627) call->buffer = kmalloc(size, GFP_KERNEL);
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 628) if (!call->buffer)
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 629) return -ENOMEM;
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 630) afs_extract_to_buf(call, size);
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 631) call->unmarshall++;
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 632)
df561f6688fef (Gustavo A. R. Silva 2020-08-23 17:36:59 -0500 633) fallthrough;
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 634) case 2:
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 635) _debug("extract FID array");
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 636) ret = afs_extract_data(call, false);
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 637) if (ret < 0)
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 638) return ret;
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 639)
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 640) _debug("unmarshall FID array");
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 641) call->request = kcalloc(call->count,
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 642) sizeof(struct afs_callback_break),
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 643) GFP_KERNEL);
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 644) if (!call->request)
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 645) return -ENOMEM;
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 646)
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 647) cb = call->request;
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 648) bp = call->buffer;
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 649) for (loop = call->count; loop > 0; loop--, cb++) {
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 650) cb->fid.vid = xdr_to_u64(bp->volume);
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 651) cb->fid.vnode = xdr_to_u64(bp->vnode.lo);
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 652) cb->fid.vnode_hi = ntohl(bp->vnode.hi);
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 653) cb->fid.unique = ntohl(bp->vnode.unique);
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 654) bp++;
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 655) }
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 656)
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 657) afs_extract_to_tmp(call);
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 658) call->unmarshall++;
b2db6c35ba986 (Gustavo A. R. Silva 2021-05-25 15:40:22 +0100 659) fallthrough;
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 660)
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 661) case 3:
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 662) break;
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 663) }
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 664)
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 665) if (!afs_check_call_state(call, AFS_CALL_SV_REPLYING))
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 666) return afs_io_error(call, afs_io_error_cm_reply);
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 667)
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 668) /* We'll need the file server record as that tells us which set of
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 669) * vnodes to operate upon.
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 670) */
3bf0fb6f33dd5 (David Howells 2018-10-20 00:57:59 +0100 671) return afs_find_cm_server_by_peer(call);
35dbfba3111a5 (David Howells 2018-10-20 00:57:58 +0100 672) }