VisionFive2 Linux kernel

StarFive Tech Linux Kernel for VisionFive (JH7110) boards (mirror)

More than 9999 Commits   32 Branches   54 Tags
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) }