xref: /kernel/linux/linux-6.6/fs/afs/fsclient.c (revision 62306a36)
1// SPDX-License-Identifier: GPL-2.0-or-later
2/* AFS File Server client stubs
3 *
4 * Copyright (C) 2002, 2007 Red Hat, Inc. All Rights Reserved.
5 * Written by David Howells (dhowells@redhat.com)
6 */
7
8#include <linux/init.h>
9#include <linux/slab.h>
10#include <linux/sched.h>
11#include <linux/circ_buf.h>
12#include <linux/iversion.h>
13#include <linux/netfs.h>
14#include "internal.h"
15#include "afs_fs.h"
16#include "xdr_fs.h"
17
18/*
19 * decode an AFSFid block
20 */
21static void xdr_decode_AFSFid(const __be32 **_bp, struct afs_fid *fid)
22{
23	const __be32 *bp = *_bp;
24
25	fid->vid		= ntohl(*bp++);
26	fid->vnode		= ntohl(*bp++);
27	fid->unique		= ntohl(*bp++);
28	*_bp = bp;
29}
30
31/*
32 * Dump a bad file status record.
33 */
34static void xdr_dump_bad(const __be32 *bp)
35{
36	__be32 x[4];
37	int i;
38
39	pr_notice("AFS XDR: Bad status record\n");
40	for (i = 0; i < 5 * 4 * 4; i += 16) {
41		memcpy(x, bp, 16);
42		bp += 4;
43		pr_notice("%03x: %08x %08x %08x %08x\n",
44			  i, ntohl(x[0]), ntohl(x[1]), ntohl(x[2]), ntohl(x[3]));
45	}
46
47	memcpy(x, bp, 4);
48	pr_notice("0x50: %08x\n", ntohl(x[0]));
49}
50
51/*
52 * decode an AFSFetchStatus block
53 */
54static void xdr_decode_AFSFetchStatus(const __be32 **_bp,
55				      struct afs_call *call,
56				      struct afs_status_cb *scb)
57{
58	const struct afs_xdr_AFSFetchStatus *xdr = (const void *)*_bp;
59	struct afs_file_status *status = &scb->status;
60	bool inline_error = (call->operation_ID == afs_FS_InlineBulkStatus);
61	u64 data_version, size;
62	u32 type, abort_code;
63
64	abort_code = ntohl(xdr->abort_code);
65
66	if (xdr->if_version != htonl(AFS_FSTATUS_VERSION)) {
67		if (xdr->if_version == htonl(0) &&
68		    abort_code != 0 &&
69		    inline_error) {
70			/* The OpenAFS fileserver has a bug in FS.InlineBulkStatus
71			 * whereby it doesn't set the interface version in the error
72			 * case.
73			 */
74			status->abort_code = abort_code;
75			scb->have_error = true;
76			goto advance;
77		}
78
79		pr_warn("Unknown AFSFetchStatus version %u\n", ntohl(xdr->if_version));
80		goto bad;
81	}
82
83	if (abort_code != 0 && inline_error) {
84		status->abort_code = abort_code;
85		scb->have_error = true;
86		goto advance;
87	}
88
89	type = ntohl(xdr->type);
90	switch (type) {
91	case AFS_FTYPE_FILE:
92	case AFS_FTYPE_DIR:
93	case AFS_FTYPE_SYMLINK:
94		status->type = type;
95		break;
96	default:
97		goto bad;
98	}
99
100	status->nlink		= ntohl(xdr->nlink);
101	status->author		= ntohl(xdr->author);
102	status->owner		= ntohl(xdr->owner);
103	status->caller_access	= ntohl(xdr->caller_access); /* Ticket dependent */
104	status->anon_access	= ntohl(xdr->anon_access);
105	status->mode		= ntohl(xdr->mode) & S_IALLUGO;
106	status->group		= ntohl(xdr->group);
107	status->lock_count	= ntohl(xdr->lock_count);
108
109	status->mtime_client.tv_sec = ntohl(xdr->mtime_client);
110	status->mtime_client.tv_nsec = 0;
111	status->mtime_server.tv_sec = ntohl(xdr->mtime_server);
112	status->mtime_server.tv_nsec = 0;
113
114	size  = (u64)ntohl(xdr->size_lo);
115	size |= (u64)ntohl(xdr->size_hi) << 32;
116	status->size = size;
117
118	data_version  = (u64)ntohl(xdr->data_version_lo);
119	data_version |= (u64)ntohl(xdr->data_version_hi) << 32;
120	status->data_version = data_version;
121	scb->have_status = true;
122advance:
123	*_bp = (const void *)*_bp + sizeof(*xdr);
124	return;
125
126bad:
127	xdr_dump_bad(*_bp);
128	afs_protocol_error(call, afs_eproto_bad_status);
129	goto advance;
130}
131
132static time64_t xdr_decode_expiry(struct afs_call *call, u32 expiry)
133{
134	return ktime_divns(call->issue_time, NSEC_PER_SEC) + expiry;
135}
136
137static void xdr_decode_AFSCallBack(const __be32 **_bp,
138				   struct afs_call *call,
139				   struct afs_status_cb *scb)
140{
141	struct afs_callback *cb = &scb->callback;
142	const __be32 *bp = *_bp;
143
144	bp++; /* version */
145	cb->expires_at	= xdr_decode_expiry(call, ntohl(*bp++));
146	bp++; /* type */
147	scb->have_cb	= true;
148	*_bp = bp;
149}
150
151/*
152 * decode an AFSVolSync block
153 */
154static void xdr_decode_AFSVolSync(const __be32 **_bp,
155				  struct afs_volsync *volsync)
156{
157	const __be32 *bp = *_bp;
158	u32 creation;
159
160	creation = ntohl(*bp++);
161	bp++; /* spare2 */
162	bp++; /* spare3 */
163	bp++; /* spare4 */
164	bp++; /* spare5 */
165	bp++; /* spare6 */
166	*_bp = bp;
167
168	if (volsync)
169		volsync->creation = creation;
170}
171
172/*
173 * encode the requested attributes into an AFSStoreStatus block
174 */
175static void xdr_encode_AFS_StoreStatus(__be32 **_bp, struct iattr *attr)
176{
177	__be32 *bp = *_bp;
178	u32 mask = 0, mtime = 0, owner = 0, group = 0, mode = 0;
179
180	mask = 0;
181	if (attr->ia_valid & ATTR_MTIME) {
182		mask |= AFS_SET_MTIME;
183		mtime = attr->ia_mtime.tv_sec;
184	}
185
186	if (attr->ia_valid & ATTR_UID) {
187		mask |= AFS_SET_OWNER;
188		owner = from_kuid(&init_user_ns, attr->ia_uid);
189	}
190
191	if (attr->ia_valid & ATTR_GID) {
192		mask |= AFS_SET_GROUP;
193		group = from_kgid(&init_user_ns, attr->ia_gid);
194	}
195
196	if (attr->ia_valid & ATTR_MODE) {
197		mask |= AFS_SET_MODE;
198		mode = attr->ia_mode & S_IALLUGO;
199	}
200
201	*bp++ = htonl(mask);
202	*bp++ = htonl(mtime);
203	*bp++ = htonl(owner);
204	*bp++ = htonl(group);
205	*bp++ = htonl(mode);
206	*bp++ = 0;		/* segment size */
207	*_bp = bp;
208}
209
210/*
211 * decode an AFSFetchVolumeStatus block
212 */
213static void xdr_decode_AFSFetchVolumeStatus(const __be32 **_bp,
214					    struct afs_volume_status *vs)
215{
216	const __be32 *bp = *_bp;
217
218	vs->vid			= ntohl(*bp++);
219	vs->parent_id		= ntohl(*bp++);
220	vs->online		= ntohl(*bp++);
221	vs->in_service		= ntohl(*bp++);
222	vs->blessed		= ntohl(*bp++);
223	vs->needs_salvage	= ntohl(*bp++);
224	vs->type		= ntohl(*bp++);
225	vs->min_quota		= ntohl(*bp++);
226	vs->max_quota		= ntohl(*bp++);
227	vs->blocks_in_use	= ntohl(*bp++);
228	vs->part_blocks_avail	= ntohl(*bp++);
229	vs->part_max_blocks	= ntohl(*bp++);
230	vs->vol_copy_date	= 0;
231	vs->vol_backup_date	= 0;
232	*_bp = bp;
233}
234
235/*
236 * deliver reply data to an FS.FetchStatus
237 */
238static int afs_deliver_fs_fetch_status(struct afs_call *call)
239{
240	struct afs_operation *op = call->op;
241	struct afs_vnode_param *vp = &op->file[op->fetch_status.which];
242	const __be32 *bp;
243	int ret;
244
245	ret = afs_transfer_reply(call);
246	if (ret < 0)
247		return ret;
248
249	/* unmarshall the reply once we've received all of it */
250	bp = call->buffer;
251	xdr_decode_AFSFetchStatus(&bp, call, &vp->scb);
252	xdr_decode_AFSCallBack(&bp, call, &vp->scb);
253	xdr_decode_AFSVolSync(&bp, &op->volsync);
254
255	_leave(" = 0 [done]");
256	return 0;
257}
258
259/*
260 * FS.FetchStatus operation type
261 */
262static const struct afs_call_type afs_RXFSFetchStatus = {
263	.name		= "FS.FetchStatus",
264	.op		= afs_FS_FetchStatus,
265	.deliver	= afs_deliver_fs_fetch_status,
266	.destructor	= afs_flat_call_destructor,
267};
268
269/*
270 * fetch the status information for a file
271 */
272void afs_fs_fetch_status(struct afs_operation *op)
273{
274	struct afs_vnode_param *vp = &op->file[op->fetch_status.which];
275	struct afs_call *call;
276	__be32 *bp;
277
278	_enter(",%x,{%llx:%llu},,",
279	       key_serial(op->key), vp->fid.vid, vp->fid.vnode);
280
281	call = afs_alloc_flat_call(op->net, &afs_RXFSFetchStatus,
282				   16, (21 + 3 + 6) * 4);
283	if (!call)
284		return afs_op_nomem(op);
285
286	/* marshall the parameters */
287	bp = call->request;
288	bp[0] = htonl(FSFETCHSTATUS);
289	bp[1] = htonl(vp->fid.vid);
290	bp[2] = htonl(vp->fid.vnode);
291	bp[3] = htonl(vp->fid.unique);
292
293	trace_afs_make_fs_call(call, &vp->fid);
294	afs_make_op_call(op, call, GFP_NOFS);
295}
296
297/*
298 * deliver reply data to an FS.FetchData
299 */
300static int afs_deliver_fs_fetch_data(struct afs_call *call)
301{
302	struct afs_operation *op = call->op;
303	struct afs_vnode_param *vp = &op->file[0];
304	struct afs_read *req = op->fetch.req;
305	const __be32 *bp;
306	int ret;
307
308	_enter("{%u,%zu,%zu/%llu}",
309	       call->unmarshall, call->iov_len, iov_iter_count(call->iter),
310	       req->actual_len);
311
312	switch (call->unmarshall) {
313	case 0:
314		req->actual_len = 0;
315		call->unmarshall++;
316		if (call->operation_ID == FSFETCHDATA64) {
317			afs_extract_to_tmp64(call);
318		} else {
319			call->tmp_u = htonl(0);
320			afs_extract_to_tmp(call);
321		}
322		fallthrough;
323
324		/* Extract the returned data length into
325		 * ->actual_len.  This may indicate more or less data than was
326		 * requested will be returned.
327		 */
328	case 1:
329		_debug("extract data length");
330		ret = afs_extract_data(call, true);
331		if (ret < 0)
332			return ret;
333
334		req->actual_len = be64_to_cpu(call->tmp64);
335		_debug("DATA length: %llu", req->actual_len);
336
337		if (req->actual_len == 0)
338			goto no_more_data;
339
340		call->iter = req->iter;
341		call->iov_len = min(req->actual_len, req->len);
342		call->unmarshall++;
343		fallthrough;
344
345		/* extract the returned data */
346	case 2:
347		_debug("extract data %zu/%llu",
348		       iov_iter_count(call->iter), req->actual_len);
349
350		ret = afs_extract_data(call, true);
351		if (ret < 0)
352			return ret;
353
354		call->iter = &call->def_iter;
355		if (req->actual_len <= req->len)
356			goto no_more_data;
357
358		/* Discard any excess data the server gave us */
359		afs_extract_discard(call, req->actual_len - req->len);
360		call->unmarshall = 3;
361		fallthrough;
362
363	case 3:
364		_debug("extract discard %zu/%llu",
365		       iov_iter_count(call->iter), req->actual_len - req->len);
366
367		ret = afs_extract_data(call, true);
368		if (ret < 0)
369			return ret;
370
371	no_more_data:
372		call->unmarshall = 4;
373		afs_extract_to_buf(call, (21 + 3 + 6) * 4);
374		fallthrough;
375
376		/* extract the metadata */
377	case 4:
378		ret = afs_extract_data(call, false);
379		if (ret < 0)
380			return ret;
381
382		bp = call->buffer;
383		xdr_decode_AFSFetchStatus(&bp, call, &vp->scb);
384		xdr_decode_AFSCallBack(&bp, call, &vp->scb);
385		xdr_decode_AFSVolSync(&bp, &op->volsync);
386
387		req->data_version = vp->scb.status.data_version;
388		req->file_size = vp->scb.status.size;
389
390		call->unmarshall++;
391		fallthrough;
392
393	case 5:
394		break;
395	}
396
397	_leave(" = 0 [done]");
398	return 0;
399}
400
401/*
402 * FS.FetchData operation type
403 */
404static const struct afs_call_type afs_RXFSFetchData = {
405	.name		= "FS.FetchData",
406	.op		= afs_FS_FetchData,
407	.deliver	= afs_deliver_fs_fetch_data,
408	.destructor	= afs_flat_call_destructor,
409};
410
411static const struct afs_call_type afs_RXFSFetchData64 = {
412	.name		= "FS.FetchData64",
413	.op		= afs_FS_FetchData64,
414	.deliver	= afs_deliver_fs_fetch_data,
415	.destructor	= afs_flat_call_destructor,
416};
417
418/*
419 * fetch data from a very large file
420 */
421static void afs_fs_fetch_data64(struct afs_operation *op)
422{
423	struct afs_vnode_param *vp = &op->file[0];
424	struct afs_read *req = op->fetch.req;
425	struct afs_call *call;
426	__be32 *bp;
427
428	_enter("");
429
430	call = afs_alloc_flat_call(op->net, &afs_RXFSFetchData64, 32, (21 + 3 + 6) * 4);
431	if (!call)
432		return afs_op_nomem(op);
433
434	/* marshall the parameters */
435	bp = call->request;
436	bp[0] = htonl(FSFETCHDATA64);
437	bp[1] = htonl(vp->fid.vid);
438	bp[2] = htonl(vp->fid.vnode);
439	bp[3] = htonl(vp->fid.unique);
440	bp[4] = htonl(upper_32_bits(req->pos));
441	bp[5] = htonl(lower_32_bits(req->pos));
442	bp[6] = 0;
443	bp[7] = htonl(lower_32_bits(req->len));
444
445	trace_afs_make_fs_call(call, &vp->fid);
446	afs_make_op_call(op, call, GFP_NOFS);
447}
448
449/*
450 * fetch data from a file
451 */
452void afs_fs_fetch_data(struct afs_operation *op)
453{
454	struct afs_vnode_param *vp = &op->file[0];
455	struct afs_call *call;
456	struct afs_read *req = op->fetch.req;
457	__be32 *bp;
458
459	if (test_bit(AFS_SERVER_FL_HAS_FS64, &op->server->flags))
460		return afs_fs_fetch_data64(op);
461
462	_enter("");
463
464	call = afs_alloc_flat_call(op->net, &afs_RXFSFetchData, 24, (21 + 3 + 6) * 4);
465	if (!call)
466		return afs_op_nomem(op);
467
468	req->call_debug_id = call->debug_id;
469
470	/* marshall the parameters */
471	bp = call->request;
472	bp[0] = htonl(FSFETCHDATA);
473	bp[1] = htonl(vp->fid.vid);
474	bp[2] = htonl(vp->fid.vnode);
475	bp[3] = htonl(vp->fid.unique);
476	bp[4] = htonl(lower_32_bits(req->pos));
477	bp[5] = htonl(lower_32_bits(req->len));
478
479	trace_afs_make_fs_call(call, &vp->fid);
480	afs_make_op_call(op, call, GFP_NOFS);
481}
482
483/*
484 * deliver reply data to an FS.CreateFile or an FS.MakeDir
485 */
486static int afs_deliver_fs_create_vnode(struct afs_call *call)
487{
488	struct afs_operation *op = call->op;
489	struct afs_vnode_param *dvp = &op->file[0];
490	struct afs_vnode_param *vp = &op->file[1];
491	const __be32 *bp;
492	int ret;
493
494	ret = afs_transfer_reply(call);
495	if (ret < 0)
496		return ret;
497
498	/* unmarshall the reply once we've received all of it */
499	bp = call->buffer;
500	xdr_decode_AFSFid(&bp, &op->file[1].fid);
501	xdr_decode_AFSFetchStatus(&bp, call, &vp->scb);
502	xdr_decode_AFSFetchStatus(&bp, call, &dvp->scb);
503	xdr_decode_AFSCallBack(&bp, call, &vp->scb);
504	xdr_decode_AFSVolSync(&bp, &op->volsync);
505
506	_leave(" = 0 [done]");
507	return 0;
508}
509
510/*
511 * FS.CreateFile and FS.MakeDir operation type
512 */
513static const struct afs_call_type afs_RXFSCreateFile = {
514	.name		= "FS.CreateFile",
515	.op		= afs_FS_CreateFile,
516	.deliver	= afs_deliver_fs_create_vnode,
517	.destructor	= afs_flat_call_destructor,
518};
519
520/*
521 * Create a file.
522 */
523void afs_fs_create_file(struct afs_operation *op)
524{
525	const struct qstr *name = &op->dentry->d_name;
526	struct afs_vnode_param *dvp = &op->file[0];
527	struct afs_call *call;
528	size_t namesz, reqsz, padsz;
529	__be32 *bp;
530
531	_enter("");
532
533	namesz = name->len;
534	padsz = (4 - (namesz & 3)) & 3;
535	reqsz = (5 * 4) + namesz + padsz + (6 * 4);
536
537	call = afs_alloc_flat_call(op->net, &afs_RXFSCreateFile,
538				   reqsz, (3 + 21 + 21 + 3 + 6) * 4);
539	if (!call)
540		return afs_op_nomem(op);
541
542	/* marshall the parameters */
543	bp = call->request;
544	*bp++ = htonl(FSCREATEFILE);
545	*bp++ = htonl(dvp->fid.vid);
546	*bp++ = htonl(dvp->fid.vnode);
547	*bp++ = htonl(dvp->fid.unique);
548	*bp++ = htonl(namesz);
549	memcpy(bp, name->name, namesz);
550	bp = (void *) bp + namesz;
551	if (padsz > 0) {
552		memset(bp, 0, padsz);
553		bp = (void *) bp + padsz;
554	}
555	*bp++ = htonl(AFS_SET_MODE | AFS_SET_MTIME);
556	*bp++ = htonl(op->mtime.tv_sec); /* mtime */
557	*bp++ = 0; /* owner */
558	*bp++ = 0; /* group */
559	*bp++ = htonl(op->create.mode & S_IALLUGO); /* unix mode */
560	*bp++ = 0; /* segment size */
561
562	trace_afs_make_fs_call1(call, &dvp->fid, name);
563	afs_make_op_call(op, call, GFP_NOFS);
564}
565
566static const struct afs_call_type afs_RXFSMakeDir = {
567	.name		= "FS.MakeDir",
568	.op		= afs_FS_MakeDir,
569	.deliver	= afs_deliver_fs_create_vnode,
570	.destructor	= afs_flat_call_destructor,
571};
572
573/*
574 * Create a new directory
575 */
576void afs_fs_make_dir(struct afs_operation *op)
577{
578	const struct qstr *name = &op->dentry->d_name;
579	struct afs_vnode_param *dvp = &op->file[0];
580	struct afs_call *call;
581	size_t namesz, reqsz, padsz;
582	__be32 *bp;
583
584	_enter("");
585
586	namesz = name->len;
587	padsz = (4 - (namesz & 3)) & 3;
588	reqsz = (5 * 4) + namesz + padsz + (6 * 4);
589
590	call = afs_alloc_flat_call(op->net, &afs_RXFSMakeDir,
591				   reqsz, (3 + 21 + 21 + 3 + 6) * 4);
592	if (!call)
593		return afs_op_nomem(op);
594
595	/* marshall the parameters */
596	bp = call->request;
597	*bp++ = htonl(FSMAKEDIR);
598	*bp++ = htonl(dvp->fid.vid);
599	*bp++ = htonl(dvp->fid.vnode);
600	*bp++ = htonl(dvp->fid.unique);
601	*bp++ = htonl(namesz);
602	memcpy(bp, name->name, namesz);
603	bp = (void *) bp + namesz;
604	if (padsz > 0) {
605		memset(bp, 0, padsz);
606		bp = (void *) bp + padsz;
607	}
608	*bp++ = htonl(AFS_SET_MODE | AFS_SET_MTIME);
609	*bp++ = htonl(op->mtime.tv_sec); /* mtime */
610	*bp++ = 0; /* owner */
611	*bp++ = 0; /* group */
612	*bp++ = htonl(op->create.mode & S_IALLUGO); /* unix mode */
613	*bp++ = 0; /* segment size */
614
615	trace_afs_make_fs_call1(call, &dvp->fid, name);
616	afs_make_op_call(op, call, GFP_NOFS);
617}
618
619/*
620 * Deliver reply data to any operation that returns status and volume sync.
621 */
622static int afs_deliver_fs_file_status_and_vol(struct afs_call *call)
623{
624	struct afs_operation *op = call->op;
625	struct afs_vnode_param *vp = &op->file[0];
626	const __be32 *bp;
627	int ret;
628
629	ret = afs_transfer_reply(call);
630	if (ret < 0)
631		return ret;
632
633	/* unmarshall the reply once we've received all of it */
634	bp = call->buffer;
635	xdr_decode_AFSFetchStatus(&bp, call, &vp->scb);
636	xdr_decode_AFSVolSync(&bp, &op->volsync);
637
638	_leave(" = 0 [done]");
639	return 0;
640}
641
642/*
643 * FS.RemoveFile operation type
644 */
645static const struct afs_call_type afs_RXFSRemoveFile = {
646	.name		= "FS.RemoveFile",
647	.op		= afs_FS_RemoveFile,
648	.deliver	= afs_deliver_fs_file_status_and_vol,
649	.destructor	= afs_flat_call_destructor,
650};
651
652/*
653 * Remove a file.
654 */
655void afs_fs_remove_file(struct afs_operation *op)
656{
657	const struct qstr *name = &op->dentry->d_name;
658	struct afs_vnode_param *dvp = &op->file[0];
659	struct afs_call *call;
660	size_t namesz, reqsz, padsz;
661	__be32 *bp;
662
663	_enter("");
664
665	namesz = name->len;
666	padsz = (4 - (namesz & 3)) & 3;
667	reqsz = (5 * 4) + namesz + padsz;
668
669	call = afs_alloc_flat_call(op->net, &afs_RXFSRemoveFile,
670				   reqsz, (21 + 6) * 4);
671	if (!call)
672		return afs_op_nomem(op);
673
674	/* marshall the parameters */
675	bp = call->request;
676	*bp++ = htonl(FSREMOVEFILE);
677	*bp++ = htonl(dvp->fid.vid);
678	*bp++ = htonl(dvp->fid.vnode);
679	*bp++ = htonl(dvp->fid.unique);
680	*bp++ = htonl(namesz);
681	memcpy(bp, name->name, namesz);
682	bp = (void *) bp + namesz;
683	if (padsz > 0) {
684		memset(bp, 0, padsz);
685		bp = (void *) bp + padsz;
686	}
687
688	trace_afs_make_fs_call1(call, &dvp->fid, name);
689	afs_make_op_call(op, call, GFP_NOFS);
690}
691
692static const struct afs_call_type afs_RXFSRemoveDir = {
693	.name		= "FS.RemoveDir",
694	.op		= afs_FS_RemoveDir,
695	.deliver	= afs_deliver_fs_file_status_and_vol,
696	.destructor	= afs_flat_call_destructor,
697};
698
699/*
700 * Remove a directory.
701 */
702void afs_fs_remove_dir(struct afs_operation *op)
703{
704	const struct qstr *name = &op->dentry->d_name;
705	struct afs_vnode_param *dvp = &op->file[0];
706	struct afs_call *call;
707	size_t namesz, reqsz, padsz;
708	__be32 *bp;
709
710	_enter("");
711
712	namesz = name->len;
713	padsz = (4 - (namesz & 3)) & 3;
714	reqsz = (5 * 4) + namesz + padsz;
715
716	call = afs_alloc_flat_call(op->net, &afs_RXFSRemoveDir,
717				   reqsz, (21 + 6) * 4);
718	if (!call)
719		return afs_op_nomem(op);
720
721	/* marshall the parameters */
722	bp = call->request;
723	*bp++ = htonl(FSREMOVEDIR);
724	*bp++ = htonl(dvp->fid.vid);
725	*bp++ = htonl(dvp->fid.vnode);
726	*bp++ = htonl(dvp->fid.unique);
727	*bp++ = htonl(namesz);
728	memcpy(bp, name->name, namesz);
729	bp = (void *) bp + namesz;
730	if (padsz > 0) {
731		memset(bp, 0, padsz);
732		bp = (void *) bp + padsz;
733	}
734
735	trace_afs_make_fs_call1(call, &dvp->fid, name);
736	afs_make_op_call(op, call, GFP_NOFS);
737}
738
739/*
740 * deliver reply data to an FS.Link
741 */
742static int afs_deliver_fs_link(struct afs_call *call)
743{
744	struct afs_operation *op = call->op;
745	struct afs_vnode_param *dvp = &op->file[0];
746	struct afs_vnode_param *vp = &op->file[1];
747	const __be32 *bp;
748	int ret;
749
750	_enter("{%u}", call->unmarshall);
751
752	ret = afs_transfer_reply(call);
753	if (ret < 0)
754		return ret;
755
756	/* unmarshall the reply once we've received all of it */
757	bp = call->buffer;
758	xdr_decode_AFSFetchStatus(&bp, call, &vp->scb);
759	xdr_decode_AFSFetchStatus(&bp, call, &dvp->scb);
760	xdr_decode_AFSVolSync(&bp, &op->volsync);
761
762	_leave(" = 0 [done]");
763	return 0;
764}
765
766/*
767 * FS.Link operation type
768 */
769static const struct afs_call_type afs_RXFSLink = {
770	.name		= "FS.Link",
771	.op		= afs_FS_Link,
772	.deliver	= afs_deliver_fs_link,
773	.destructor	= afs_flat_call_destructor,
774};
775
776/*
777 * make a hard link
778 */
779void afs_fs_link(struct afs_operation *op)
780{
781	const struct qstr *name = &op->dentry->d_name;
782	struct afs_vnode_param *dvp = &op->file[0];
783	struct afs_vnode_param *vp = &op->file[1];
784	struct afs_call *call;
785	size_t namesz, reqsz, padsz;
786	__be32 *bp;
787
788	_enter("");
789
790	namesz = name->len;
791	padsz = (4 - (namesz & 3)) & 3;
792	reqsz = (5 * 4) + namesz + padsz + (3 * 4);
793
794	call = afs_alloc_flat_call(op->net, &afs_RXFSLink, reqsz, (21 + 21 + 6) * 4);
795	if (!call)
796		return afs_op_nomem(op);
797
798	/* marshall the parameters */
799	bp = call->request;
800	*bp++ = htonl(FSLINK);
801	*bp++ = htonl(dvp->fid.vid);
802	*bp++ = htonl(dvp->fid.vnode);
803	*bp++ = htonl(dvp->fid.unique);
804	*bp++ = htonl(namesz);
805	memcpy(bp, name->name, namesz);
806	bp = (void *) bp + namesz;
807	if (padsz > 0) {
808		memset(bp, 0, padsz);
809		bp = (void *) bp + padsz;
810	}
811	*bp++ = htonl(vp->fid.vid);
812	*bp++ = htonl(vp->fid.vnode);
813	*bp++ = htonl(vp->fid.unique);
814
815	trace_afs_make_fs_call1(call, &vp->fid, name);
816	afs_make_op_call(op, call, GFP_NOFS);
817}
818
819/*
820 * deliver reply data to an FS.Symlink
821 */
822static int afs_deliver_fs_symlink(struct afs_call *call)
823{
824	struct afs_operation *op = call->op;
825	struct afs_vnode_param *dvp = &op->file[0];
826	struct afs_vnode_param *vp = &op->file[1];
827	const __be32 *bp;
828	int ret;
829
830	_enter("{%u}", call->unmarshall);
831
832	ret = afs_transfer_reply(call);
833	if (ret < 0)
834		return ret;
835
836	/* unmarshall the reply once we've received all of it */
837	bp = call->buffer;
838	xdr_decode_AFSFid(&bp, &vp->fid);
839	xdr_decode_AFSFetchStatus(&bp, call, &vp->scb);
840	xdr_decode_AFSFetchStatus(&bp, call, &dvp->scb);
841	xdr_decode_AFSVolSync(&bp, &op->volsync);
842
843	_leave(" = 0 [done]");
844	return 0;
845}
846
847/*
848 * FS.Symlink operation type
849 */
850static const struct afs_call_type afs_RXFSSymlink = {
851	.name		= "FS.Symlink",
852	.op		= afs_FS_Symlink,
853	.deliver	= afs_deliver_fs_symlink,
854	.destructor	= afs_flat_call_destructor,
855};
856
857/*
858 * create a symbolic link
859 */
860void afs_fs_symlink(struct afs_operation *op)
861{
862	const struct qstr *name = &op->dentry->d_name;
863	struct afs_vnode_param *dvp = &op->file[0];
864	struct afs_call *call;
865	size_t namesz, reqsz, padsz, c_namesz, c_padsz;
866	__be32 *bp;
867
868	_enter("");
869
870	namesz = name->len;
871	padsz = (4 - (namesz & 3)) & 3;
872
873	c_namesz = strlen(op->create.symlink);
874	c_padsz = (4 - (c_namesz & 3)) & 3;
875
876	reqsz = (6 * 4) + namesz + padsz + c_namesz + c_padsz + (6 * 4);
877
878	call = afs_alloc_flat_call(op->net, &afs_RXFSSymlink, reqsz,
879				   (3 + 21 + 21 + 6) * 4);
880	if (!call)
881		return afs_op_nomem(op);
882
883	/* marshall the parameters */
884	bp = call->request;
885	*bp++ = htonl(FSSYMLINK);
886	*bp++ = htonl(dvp->fid.vid);
887	*bp++ = htonl(dvp->fid.vnode);
888	*bp++ = htonl(dvp->fid.unique);
889	*bp++ = htonl(namesz);
890	memcpy(bp, name->name, namesz);
891	bp = (void *) bp + namesz;
892	if (padsz > 0) {
893		memset(bp, 0, padsz);
894		bp = (void *) bp + padsz;
895	}
896	*bp++ = htonl(c_namesz);
897	memcpy(bp, op->create.symlink, c_namesz);
898	bp = (void *) bp + c_namesz;
899	if (c_padsz > 0) {
900		memset(bp, 0, c_padsz);
901		bp = (void *) bp + c_padsz;
902	}
903	*bp++ = htonl(AFS_SET_MODE | AFS_SET_MTIME);
904	*bp++ = htonl(op->mtime.tv_sec); /* mtime */
905	*bp++ = 0; /* owner */
906	*bp++ = 0; /* group */
907	*bp++ = htonl(S_IRWXUGO); /* unix mode */
908	*bp++ = 0; /* segment size */
909
910	trace_afs_make_fs_call1(call, &dvp->fid, name);
911	afs_make_op_call(op, call, GFP_NOFS);
912}
913
914/*
915 * deliver reply data to an FS.Rename
916 */
917static int afs_deliver_fs_rename(struct afs_call *call)
918{
919	struct afs_operation *op = call->op;
920	struct afs_vnode_param *orig_dvp = &op->file[0];
921	struct afs_vnode_param *new_dvp = &op->file[1];
922	const __be32 *bp;
923	int ret;
924
925	ret = afs_transfer_reply(call);
926	if (ret < 0)
927		return ret;
928
929	bp = call->buffer;
930	/* If the two dirs are the same, we have two copies of the same status
931	 * report, so we just decode it twice.
932	 */
933	xdr_decode_AFSFetchStatus(&bp, call, &orig_dvp->scb);
934	xdr_decode_AFSFetchStatus(&bp, call, &new_dvp->scb);
935	xdr_decode_AFSVolSync(&bp, &op->volsync);
936
937	_leave(" = 0 [done]");
938	return 0;
939}
940
941/*
942 * FS.Rename operation type
943 */
944static const struct afs_call_type afs_RXFSRename = {
945	.name		= "FS.Rename",
946	.op		= afs_FS_Rename,
947	.deliver	= afs_deliver_fs_rename,
948	.destructor	= afs_flat_call_destructor,
949};
950
951/*
952 * Rename/move a file or directory.
953 */
954void afs_fs_rename(struct afs_operation *op)
955{
956	struct afs_vnode_param *orig_dvp = &op->file[0];
957	struct afs_vnode_param *new_dvp = &op->file[1];
958	const struct qstr *orig_name = &op->dentry->d_name;
959	const struct qstr *new_name = &op->dentry_2->d_name;
960	struct afs_call *call;
961	size_t reqsz, o_namesz, o_padsz, n_namesz, n_padsz;
962	__be32 *bp;
963
964	_enter("");
965
966	o_namesz = orig_name->len;
967	o_padsz = (4 - (o_namesz & 3)) & 3;
968
969	n_namesz = new_name->len;
970	n_padsz = (4 - (n_namesz & 3)) & 3;
971
972	reqsz = (4 * 4) +
973		4 + o_namesz + o_padsz +
974		(3 * 4) +
975		4 + n_namesz + n_padsz;
976
977	call = afs_alloc_flat_call(op->net, &afs_RXFSRename, reqsz, (21 + 21 + 6) * 4);
978	if (!call)
979		return afs_op_nomem(op);
980
981	/* marshall the parameters */
982	bp = call->request;
983	*bp++ = htonl(FSRENAME);
984	*bp++ = htonl(orig_dvp->fid.vid);
985	*bp++ = htonl(orig_dvp->fid.vnode);
986	*bp++ = htonl(orig_dvp->fid.unique);
987	*bp++ = htonl(o_namesz);
988	memcpy(bp, orig_name->name, o_namesz);
989	bp = (void *) bp + o_namesz;
990	if (o_padsz > 0) {
991		memset(bp, 0, o_padsz);
992		bp = (void *) bp + o_padsz;
993	}
994
995	*bp++ = htonl(new_dvp->fid.vid);
996	*bp++ = htonl(new_dvp->fid.vnode);
997	*bp++ = htonl(new_dvp->fid.unique);
998	*bp++ = htonl(n_namesz);
999	memcpy(bp, new_name->name, n_namesz);
1000	bp = (void *) bp + n_namesz;
1001	if (n_padsz > 0) {
1002		memset(bp, 0, n_padsz);
1003		bp = (void *) bp + n_padsz;
1004	}
1005
1006	trace_afs_make_fs_call2(call, &orig_dvp->fid, orig_name, new_name);
1007	afs_make_op_call(op, call, GFP_NOFS);
1008}
1009
1010/*
1011 * Deliver reply data to FS.StoreData or FS.StoreStatus
1012 */
1013static int afs_deliver_fs_store_data(struct afs_call *call)
1014{
1015	struct afs_operation *op = call->op;
1016	struct afs_vnode_param *vp = &op->file[0];
1017	const __be32 *bp;
1018	int ret;
1019
1020	_enter("");
1021
1022	ret = afs_transfer_reply(call);
1023	if (ret < 0)
1024		return ret;
1025
1026	/* unmarshall the reply once we've received all of it */
1027	bp = call->buffer;
1028	xdr_decode_AFSFetchStatus(&bp, call, &vp->scb);
1029	xdr_decode_AFSVolSync(&bp, &op->volsync);
1030
1031	_leave(" = 0 [done]");
1032	return 0;
1033}
1034
1035/*
1036 * FS.StoreData operation type
1037 */
1038static const struct afs_call_type afs_RXFSStoreData = {
1039	.name		= "FS.StoreData",
1040	.op		= afs_FS_StoreData,
1041	.deliver	= afs_deliver_fs_store_data,
1042	.destructor	= afs_flat_call_destructor,
1043};
1044
1045static const struct afs_call_type afs_RXFSStoreData64 = {
1046	.name		= "FS.StoreData64",
1047	.op		= afs_FS_StoreData64,
1048	.deliver	= afs_deliver_fs_store_data,
1049	.destructor	= afs_flat_call_destructor,
1050};
1051
1052/*
1053 * store a set of pages to a very large file
1054 */
1055static void afs_fs_store_data64(struct afs_operation *op)
1056{
1057	struct afs_vnode_param *vp = &op->file[0];
1058	struct afs_call *call;
1059	__be32 *bp;
1060
1061	_enter(",%x,{%llx:%llu},,",
1062	       key_serial(op->key), vp->fid.vid, vp->fid.vnode);
1063
1064	call = afs_alloc_flat_call(op->net, &afs_RXFSStoreData64,
1065				   (4 + 6 + 3 * 2) * 4,
1066				   (21 + 6) * 4);
1067	if (!call)
1068		return afs_op_nomem(op);
1069
1070	call->write_iter = op->store.write_iter;
1071
1072	/* marshall the parameters */
1073	bp = call->request;
1074	*bp++ = htonl(FSSTOREDATA64);
1075	*bp++ = htonl(vp->fid.vid);
1076	*bp++ = htonl(vp->fid.vnode);
1077	*bp++ = htonl(vp->fid.unique);
1078
1079	*bp++ = htonl(AFS_SET_MTIME); /* mask */
1080	*bp++ = htonl(op->mtime.tv_sec); /* mtime */
1081	*bp++ = 0; /* owner */
1082	*bp++ = 0; /* group */
1083	*bp++ = 0; /* unix mode */
1084	*bp++ = 0; /* segment size */
1085
1086	*bp++ = htonl(upper_32_bits(op->store.pos));
1087	*bp++ = htonl(lower_32_bits(op->store.pos));
1088	*bp++ = htonl(upper_32_bits(op->store.size));
1089	*bp++ = htonl(lower_32_bits(op->store.size));
1090	*bp++ = htonl(upper_32_bits(op->store.i_size));
1091	*bp++ = htonl(lower_32_bits(op->store.i_size));
1092
1093	trace_afs_make_fs_call(call, &vp->fid);
1094	afs_make_op_call(op, call, GFP_NOFS);
1095}
1096
1097/*
1098 * Write data to a file on the server.
1099 */
1100void afs_fs_store_data(struct afs_operation *op)
1101{
1102	struct afs_vnode_param *vp = &op->file[0];
1103	struct afs_call *call;
1104	__be32 *bp;
1105
1106	_enter(",%x,{%llx:%llu},,",
1107	       key_serial(op->key), vp->fid.vid, vp->fid.vnode);
1108
1109	_debug("size %llx, at %llx, i_size %llx",
1110	       (unsigned long long)op->store.size,
1111	       (unsigned long long)op->store.pos,
1112	       (unsigned long long)op->store.i_size);
1113
1114	if (test_bit(AFS_SERVER_FL_HAS_FS64, &op->server->flags))
1115		return afs_fs_store_data64(op);
1116
1117	call = afs_alloc_flat_call(op->net, &afs_RXFSStoreData,
1118				   (4 + 6 + 3) * 4,
1119				   (21 + 6) * 4);
1120	if (!call)
1121		return afs_op_nomem(op);
1122
1123	call->write_iter = op->store.write_iter;
1124
1125	/* marshall the parameters */
1126	bp = call->request;
1127	*bp++ = htonl(FSSTOREDATA);
1128	*bp++ = htonl(vp->fid.vid);
1129	*bp++ = htonl(vp->fid.vnode);
1130	*bp++ = htonl(vp->fid.unique);
1131
1132	*bp++ = htonl(AFS_SET_MTIME); /* mask */
1133	*bp++ = htonl(op->mtime.tv_sec); /* mtime */
1134	*bp++ = 0; /* owner */
1135	*bp++ = 0; /* group */
1136	*bp++ = 0; /* unix mode */
1137	*bp++ = 0; /* segment size */
1138
1139	*bp++ = htonl(lower_32_bits(op->store.pos));
1140	*bp++ = htonl(lower_32_bits(op->store.size));
1141	*bp++ = htonl(lower_32_bits(op->store.i_size));
1142
1143	trace_afs_make_fs_call(call, &vp->fid);
1144	afs_make_op_call(op, call, GFP_NOFS);
1145}
1146
1147/*
1148 * FS.StoreStatus operation type
1149 */
1150static const struct afs_call_type afs_RXFSStoreStatus = {
1151	.name		= "FS.StoreStatus",
1152	.op		= afs_FS_StoreStatus,
1153	.deliver	= afs_deliver_fs_store_data,
1154	.destructor	= afs_flat_call_destructor,
1155};
1156
1157static const struct afs_call_type afs_RXFSStoreData_as_Status = {
1158	.name		= "FS.StoreData",
1159	.op		= afs_FS_StoreData,
1160	.deliver	= afs_deliver_fs_store_data,
1161	.destructor	= afs_flat_call_destructor,
1162};
1163
1164static const struct afs_call_type afs_RXFSStoreData64_as_Status = {
1165	.name		= "FS.StoreData64",
1166	.op		= afs_FS_StoreData64,
1167	.deliver	= afs_deliver_fs_store_data,
1168	.destructor	= afs_flat_call_destructor,
1169};
1170
1171/*
1172 * set the attributes on a very large file, using FS.StoreData rather than
1173 * FS.StoreStatus so as to alter the file size also
1174 */
1175static void afs_fs_setattr_size64(struct afs_operation *op)
1176{
1177	struct afs_vnode_param *vp = &op->file[0];
1178	struct afs_call *call;
1179	struct iattr *attr = op->setattr.attr;
1180	__be32 *bp;
1181
1182	_enter(",%x,{%llx:%llu},,",
1183	       key_serial(op->key), vp->fid.vid, vp->fid.vnode);
1184
1185	ASSERT(attr->ia_valid & ATTR_SIZE);
1186
1187	call = afs_alloc_flat_call(op->net, &afs_RXFSStoreData64_as_Status,
1188				   (4 + 6 + 3 * 2) * 4,
1189				   (21 + 6) * 4);
1190	if (!call)
1191		return afs_op_nomem(op);
1192
1193	/* marshall the parameters */
1194	bp = call->request;
1195	*bp++ = htonl(FSSTOREDATA64);
1196	*bp++ = htonl(vp->fid.vid);
1197	*bp++ = htonl(vp->fid.vnode);
1198	*bp++ = htonl(vp->fid.unique);
1199
1200	xdr_encode_AFS_StoreStatus(&bp, attr);
1201
1202	*bp++ = htonl(upper_32_bits(attr->ia_size));	/* position of start of write */
1203	*bp++ = htonl(lower_32_bits(attr->ia_size));
1204	*bp++ = 0;					/* size of write */
1205	*bp++ = 0;
1206	*bp++ = htonl(upper_32_bits(attr->ia_size));	/* new file length */
1207	*bp++ = htonl(lower_32_bits(attr->ia_size));
1208
1209	trace_afs_make_fs_call(call, &vp->fid);
1210	afs_make_op_call(op, call, GFP_NOFS);
1211}
1212
1213/*
1214 * set the attributes on a file, using FS.StoreData rather than FS.StoreStatus
1215 * so as to alter the file size also
1216 */
1217static void afs_fs_setattr_size(struct afs_operation *op)
1218{
1219	struct afs_vnode_param *vp = &op->file[0];
1220	struct afs_call *call;
1221	struct iattr *attr = op->setattr.attr;
1222	__be32 *bp;
1223
1224	_enter(",%x,{%llx:%llu},,",
1225	       key_serial(op->key), vp->fid.vid, vp->fid.vnode);
1226
1227	ASSERT(attr->ia_valid & ATTR_SIZE);
1228	if (test_bit(AFS_SERVER_FL_HAS_FS64, &op->server->flags))
1229		return afs_fs_setattr_size64(op);
1230
1231	call = afs_alloc_flat_call(op->net, &afs_RXFSStoreData_as_Status,
1232				   (4 + 6 + 3) * 4,
1233				   (21 + 6) * 4);
1234	if (!call)
1235		return afs_op_nomem(op);
1236
1237	/* marshall the parameters */
1238	bp = call->request;
1239	*bp++ = htonl(FSSTOREDATA);
1240	*bp++ = htonl(vp->fid.vid);
1241	*bp++ = htonl(vp->fid.vnode);
1242	*bp++ = htonl(vp->fid.unique);
1243
1244	xdr_encode_AFS_StoreStatus(&bp, attr);
1245
1246	*bp++ = htonl(attr->ia_size);		/* position of start of write */
1247	*bp++ = 0;				/* size of write */
1248	*bp++ = htonl(attr->ia_size);		/* new file length */
1249
1250	trace_afs_make_fs_call(call, &vp->fid);
1251	afs_make_op_call(op, call, GFP_NOFS);
1252}
1253
1254/*
1255 * set the attributes on a file, using FS.StoreData if there's a change in file
1256 * size, and FS.StoreStatus otherwise
1257 */
1258void afs_fs_setattr(struct afs_operation *op)
1259{
1260	struct afs_vnode_param *vp = &op->file[0];
1261	struct afs_call *call;
1262	struct iattr *attr = op->setattr.attr;
1263	__be32 *bp;
1264
1265	if (attr->ia_valid & ATTR_SIZE)
1266		return afs_fs_setattr_size(op);
1267
1268	_enter(",%x,{%llx:%llu},,",
1269	       key_serial(op->key), vp->fid.vid, vp->fid.vnode);
1270
1271	call = afs_alloc_flat_call(op->net, &afs_RXFSStoreStatus,
1272				   (4 + 6) * 4,
1273				   (21 + 6) * 4);
1274	if (!call)
1275		return afs_op_nomem(op);
1276
1277	/* marshall the parameters */
1278	bp = call->request;
1279	*bp++ = htonl(FSSTORESTATUS);
1280	*bp++ = htonl(vp->fid.vid);
1281	*bp++ = htonl(vp->fid.vnode);
1282	*bp++ = htonl(vp->fid.unique);
1283
1284	xdr_encode_AFS_StoreStatus(&bp, op->setattr.attr);
1285
1286	trace_afs_make_fs_call(call, &vp->fid);
1287	afs_make_op_call(op, call, GFP_NOFS);
1288}
1289
1290/*
1291 * deliver reply data to an FS.GetVolumeStatus
1292 */
1293static int afs_deliver_fs_get_volume_status(struct afs_call *call)
1294{
1295	struct afs_operation *op = call->op;
1296	const __be32 *bp;
1297	char *p;
1298	u32 size;
1299	int ret;
1300
1301	_enter("{%u}", call->unmarshall);
1302
1303	switch (call->unmarshall) {
1304	case 0:
1305		call->unmarshall++;
1306		afs_extract_to_buf(call, 12 * 4);
1307		fallthrough;
1308
1309		/* extract the returned status record */
1310	case 1:
1311		_debug("extract status");
1312		ret = afs_extract_data(call, true);
1313		if (ret < 0)
1314			return ret;
1315
1316		bp = call->buffer;
1317		xdr_decode_AFSFetchVolumeStatus(&bp, &op->volstatus.vs);
1318		call->unmarshall++;
1319		afs_extract_to_tmp(call);
1320		fallthrough;
1321
1322		/* extract the volume name length */
1323	case 2:
1324		ret = afs_extract_data(call, true);
1325		if (ret < 0)
1326			return ret;
1327
1328		call->count = ntohl(call->tmp);
1329		_debug("volname length: %u", call->count);
1330		if (call->count >= AFSNAMEMAX)
1331			return afs_protocol_error(call, afs_eproto_volname_len);
1332		size = (call->count + 3) & ~3; /* It's padded */
1333		afs_extract_to_buf(call, size);
1334		call->unmarshall++;
1335		fallthrough;
1336
1337		/* extract the volume name */
1338	case 3:
1339		_debug("extract volname");
1340		ret = afs_extract_data(call, true);
1341		if (ret < 0)
1342			return ret;
1343
1344		p = call->buffer;
1345		p[call->count] = 0;
1346		_debug("volname '%s'", p);
1347		afs_extract_to_tmp(call);
1348		call->unmarshall++;
1349		fallthrough;
1350
1351		/* extract the offline message length */
1352	case 4:
1353		ret = afs_extract_data(call, true);
1354		if (ret < 0)
1355			return ret;
1356
1357		call->count = ntohl(call->tmp);
1358		_debug("offline msg length: %u", call->count);
1359		if (call->count >= AFSNAMEMAX)
1360			return afs_protocol_error(call, afs_eproto_offline_msg_len);
1361		size = (call->count + 3) & ~3; /* It's padded */
1362		afs_extract_to_buf(call, size);
1363		call->unmarshall++;
1364		fallthrough;
1365
1366		/* extract the offline message */
1367	case 5:
1368		_debug("extract offline");
1369		ret = afs_extract_data(call, true);
1370		if (ret < 0)
1371			return ret;
1372
1373		p = call->buffer;
1374		p[call->count] = 0;
1375		_debug("offline '%s'", p);
1376
1377		afs_extract_to_tmp(call);
1378		call->unmarshall++;
1379		fallthrough;
1380
1381		/* extract the message of the day length */
1382	case 6:
1383		ret = afs_extract_data(call, true);
1384		if (ret < 0)
1385			return ret;
1386
1387		call->count = ntohl(call->tmp);
1388		_debug("motd length: %u", call->count);
1389		if (call->count >= AFSNAMEMAX)
1390			return afs_protocol_error(call, afs_eproto_motd_len);
1391		size = (call->count + 3) & ~3; /* It's padded */
1392		afs_extract_to_buf(call, size);
1393		call->unmarshall++;
1394		fallthrough;
1395
1396		/* extract the message of the day */
1397	case 7:
1398		_debug("extract motd");
1399		ret = afs_extract_data(call, false);
1400		if (ret < 0)
1401			return ret;
1402
1403		p = call->buffer;
1404		p[call->count] = 0;
1405		_debug("motd '%s'", p);
1406
1407		call->unmarshall++;
1408		fallthrough;
1409
1410	case 8:
1411		break;
1412	}
1413
1414	_leave(" = 0 [done]");
1415	return 0;
1416}
1417
1418/*
1419 * FS.GetVolumeStatus operation type
1420 */
1421static const struct afs_call_type afs_RXFSGetVolumeStatus = {
1422	.name		= "FS.GetVolumeStatus",
1423	.op		= afs_FS_GetVolumeStatus,
1424	.deliver	= afs_deliver_fs_get_volume_status,
1425	.destructor	= afs_flat_call_destructor,
1426};
1427
1428/*
1429 * fetch the status of a volume
1430 */
1431void afs_fs_get_volume_status(struct afs_operation *op)
1432{
1433	struct afs_vnode_param *vp = &op->file[0];
1434	struct afs_call *call;
1435	__be32 *bp;
1436
1437	_enter("");
1438
1439	call = afs_alloc_flat_call(op->net, &afs_RXFSGetVolumeStatus, 2 * 4,
1440				   max(12 * 4, AFSOPAQUEMAX + 1));
1441	if (!call)
1442		return afs_op_nomem(op);
1443
1444	/* marshall the parameters */
1445	bp = call->request;
1446	bp[0] = htonl(FSGETVOLUMESTATUS);
1447	bp[1] = htonl(vp->fid.vid);
1448
1449	trace_afs_make_fs_call(call, &vp->fid);
1450	afs_make_op_call(op, call, GFP_NOFS);
1451}
1452
1453/*
1454 * deliver reply data to an FS.SetLock, FS.ExtendLock or FS.ReleaseLock
1455 */
1456static int afs_deliver_fs_xxxx_lock(struct afs_call *call)
1457{
1458	struct afs_operation *op = call->op;
1459	const __be32 *bp;
1460	int ret;
1461
1462	_enter("{%u}", call->unmarshall);
1463
1464	ret = afs_transfer_reply(call);
1465	if (ret < 0)
1466		return ret;
1467
1468	/* unmarshall the reply once we've received all of it */
1469	bp = call->buffer;
1470	xdr_decode_AFSVolSync(&bp, &op->volsync);
1471
1472	_leave(" = 0 [done]");
1473	return 0;
1474}
1475
1476/*
1477 * FS.SetLock operation type
1478 */
1479static const struct afs_call_type afs_RXFSSetLock = {
1480	.name		= "FS.SetLock",
1481	.op		= afs_FS_SetLock,
1482	.deliver	= afs_deliver_fs_xxxx_lock,
1483	.done		= afs_lock_op_done,
1484	.destructor	= afs_flat_call_destructor,
1485};
1486
1487/*
1488 * FS.ExtendLock operation type
1489 */
1490static const struct afs_call_type afs_RXFSExtendLock = {
1491	.name		= "FS.ExtendLock",
1492	.op		= afs_FS_ExtendLock,
1493	.deliver	= afs_deliver_fs_xxxx_lock,
1494	.done		= afs_lock_op_done,
1495	.destructor	= afs_flat_call_destructor,
1496};
1497
1498/*
1499 * FS.ReleaseLock operation type
1500 */
1501static const struct afs_call_type afs_RXFSReleaseLock = {
1502	.name		= "FS.ReleaseLock",
1503	.op		= afs_FS_ReleaseLock,
1504	.deliver	= afs_deliver_fs_xxxx_lock,
1505	.destructor	= afs_flat_call_destructor,
1506};
1507
1508/*
1509 * Set a lock on a file
1510 */
1511void afs_fs_set_lock(struct afs_operation *op)
1512{
1513	struct afs_vnode_param *vp = &op->file[0];
1514	struct afs_call *call;
1515	__be32 *bp;
1516
1517	_enter("");
1518
1519	call = afs_alloc_flat_call(op->net, &afs_RXFSSetLock, 5 * 4, 6 * 4);
1520	if (!call)
1521		return afs_op_nomem(op);
1522
1523	/* marshall the parameters */
1524	bp = call->request;
1525	*bp++ = htonl(FSSETLOCK);
1526	*bp++ = htonl(vp->fid.vid);
1527	*bp++ = htonl(vp->fid.vnode);
1528	*bp++ = htonl(vp->fid.unique);
1529	*bp++ = htonl(op->lock.type);
1530
1531	trace_afs_make_fs_calli(call, &vp->fid, op->lock.type);
1532	afs_make_op_call(op, call, GFP_NOFS);
1533}
1534
1535/*
1536 * extend a lock on a file
1537 */
1538void afs_fs_extend_lock(struct afs_operation *op)
1539{
1540	struct afs_vnode_param *vp = &op->file[0];
1541	struct afs_call *call;
1542	__be32 *bp;
1543
1544	_enter("");
1545
1546	call = afs_alloc_flat_call(op->net, &afs_RXFSExtendLock, 4 * 4, 6 * 4);
1547	if (!call)
1548		return afs_op_nomem(op);
1549
1550	/* marshall the parameters */
1551	bp = call->request;
1552	*bp++ = htonl(FSEXTENDLOCK);
1553	*bp++ = htonl(vp->fid.vid);
1554	*bp++ = htonl(vp->fid.vnode);
1555	*bp++ = htonl(vp->fid.unique);
1556
1557	trace_afs_make_fs_call(call, &vp->fid);
1558	afs_make_op_call(op, call, GFP_NOFS);
1559}
1560
1561/*
1562 * release a lock on a file
1563 */
1564void afs_fs_release_lock(struct afs_operation *op)
1565{
1566	struct afs_vnode_param *vp = &op->file[0];
1567	struct afs_call *call;
1568	__be32 *bp;
1569
1570	_enter("");
1571
1572	call = afs_alloc_flat_call(op->net, &afs_RXFSReleaseLock, 4 * 4, 6 * 4);
1573	if (!call)
1574		return afs_op_nomem(op);
1575
1576	/* marshall the parameters */
1577	bp = call->request;
1578	*bp++ = htonl(FSRELEASELOCK);
1579	*bp++ = htonl(vp->fid.vid);
1580	*bp++ = htonl(vp->fid.vnode);
1581	*bp++ = htonl(vp->fid.unique);
1582
1583	trace_afs_make_fs_call(call, &vp->fid);
1584	afs_make_op_call(op, call, GFP_NOFS);
1585}
1586
1587/*
1588 * Deliver reply data to an FS.GiveUpAllCallBacks operation.
1589 */
1590static int afs_deliver_fs_give_up_all_callbacks(struct afs_call *call)
1591{
1592	return afs_transfer_reply(call);
1593}
1594
1595/*
1596 * FS.GiveUpAllCallBacks operation type
1597 */
1598static const struct afs_call_type afs_RXFSGiveUpAllCallBacks = {
1599	.name		= "FS.GiveUpAllCallBacks",
1600	.op		= afs_FS_GiveUpAllCallBacks,
1601	.deliver	= afs_deliver_fs_give_up_all_callbacks,
1602	.destructor	= afs_flat_call_destructor,
1603};
1604
1605/*
1606 * Flush all the callbacks we have on a server.
1607 */
1608int afs_fs_give_up_all_callbacks(struct afs_net *net,
1609				 struct afs_server *server,
1610				 struct afs_addr_cursor *ac,
1611				 struct key *key)
1612{
1613	struct afs_call *call;
1614	__be32 *bp;
1615
1616	_enter("");
1617
1618	call = afs_alloc_flat_call(net, &afs_RXFSGiveUpAllCallBacks, 1 * 4, 0);
1619	if (!call)
1620		return -ENOMEM;
1621
1622	call->key = key;
1623
1624	/* marshall the parameters */
1625	bp = call->request;
1626	*bp++ = htonl(FSGIVEUPALLCALLBACKS);
1627
1628	call->server = afs_use_server(server, afs_server_trace_give_up_cb);
1629	afs_make_call(ac, call, GFP_NOFS);
1630	return afs_wait_for_call_to_complete(call, ac);
1631}
1632
1633/*
1634 * Deliver reply data to an FS.GetCapabilities operation.
1635 */
1636static int afs_deliver_fs_get_capabilities(struct afs_call *call)
1637{
1638	u32 count;
1639	int ret;
1640
1641	_enter("{%u,%zu}", call->unmarshall, iov_iter_count(call->iter));
1642
1643	switch (call->unmarshall) {
1644	case 0:
1645		afs_extract_to_tmp(call);
1646		call->unmarshall++;
1647		fallthrough;
1648
1649		/* Extract the capabilities word count */
1650	case 1:
1651		ret = afs_extract_data(call, true);
1652		if (ret < 0)
1653			return ret;
1654
1655		count = ntohl(call->tmp);
1656		call->count = count;
1657		call->count2 = count;
1658		if (count == 0) {
1659			call->unmarshall = 4;
1660			call->tmp = 0;
1661			break;
1662		}
1663
1664		/* Extract the first word of the capabilities to call->tmp */
1665		afs_extract_to_tmp(call);
1666		call->unmarshall++;
1667		fallthrough;
1668
1669	case 2:
1670		ret = afs_extract_data(call, false);
1671		if (ret < 0)
1672			return ret;
1673
1674		afs_extract_discard(call, (count - 1) * sizeof(__be32));
1675		call->unmarshall++;
1676		fallthrough;
1677
1678		/* Extract remaining capabilities words */
1679	case 3:
1680		ret = afs_extract_data(call, false);
1681		if (ret < 0)
1682			return ret;
1683
1684		call->unmarshall++;
1685		break;
1686	}
1687
1688	_leave(" = 0 [done]");
1689	return 0;
1690}
1691
1692/*
1693 * FS.GetCapabilities operation type
1694 */
1695static const struct afs_call_type afs_RXFSGetCapabilities = {
1696	.name		= "FS.GetCapabilities",
1697	.op		= afs_FS_GetCapabilities,
1698	.deliver	= afs_deliver_fs_get_capabilities,
1699	.done		= afs_fileserver_probe_result,
1700	.destructor	= afs_flat_call_destructor,
1701};
1702
1703/*
1704 * Probe a fileserver for the capabilities that it supports.  This RPC can
1705 * reply with up to 196 words.  The operation is asynchronous and if we managed
1706 * to allocate a call, true is returned the result is delivered through the
1707 * ->done() - otherwise we return false to indicate we didn't even try.
1708 */
1709bool afs_fs_get_capabilities(struct afs_net *net, struct afs_server *server,
1710			     struct afs_addr_cursor *ac, struct key *key)
1711{
1712	struct afs_call *call;
1713	__be32 *bp;
1714
1715	_enter("");
1716
1717	call = afs_alloc_flat_call(net, &afs_RXFSGetCapabilities, 1 * 4, 16 * 4);
1718	if (!call)
1719		return false;
1720
1721	call->key = key;
1722	call->server = afs_use_server(server, afs_server_trace_get_caps);
1723	call->upgrade = true;
1724	call->async = true;
1725	call->max_lifespan = AFS_PROBE_MAX_LIFESPAN;
1726
1727	/* marshall the parameters */
1728	bp = call->request;
1729	*bp++ = htonl(FSGETCAPABILITIES);
1730
1731	trace_afs_make_fs_call(call, NULL);
1732	afs_make_call(ac, call, GFP_NOFS);
1733	afs_put_call(call);
1734	return true;
1735}
1736
1737/*
1738 * Deliver reply data to an FS.InlineBulkStatus call
1739 */
1740static int afs_deliver_fs_inline_bulk_status(struct afs_call *call)
1741{
1742	struct afs_operation *op = call->op;
1743	struct afs_status_cb *scb;
1744	const __be32 *bp;
1745	u32 tmp;
1746	int ret;
1747
1748	_enter("{%u}", call->unmarshall);
1749
1750	switch (call->unmarshall) {
1751	case 0:
1752		afs_extract_to_tmp(call);
1753		call->unmarshall++;
1754		fallthrough;
1755
1756		/* Extract the file status count and array in two steps */
1757	case 1:
1758		_debug("extract status count");
1759		ret = afs_extract_data(call, true);
1760		if (ret < 0)
1761			return ret;
1762
1763		tmp = ntohl(call->tmp);
1764		_debug("status count: %u/%u", tmp, op->nr_files);
1765		if (tmp != op->nr_files)
1766			return afs_protocol_error(call, afs_eproto_ibulkst_count);
1767
1768		call->count = 0;
1769		call->unmarshall++;
1770	more_counts:
1771		afs_extract_to_buf(call, 21 * sizeof(__be32));
1772		fallthrough;
1773
1774	case 2:
1775		_debug("extract status array %u", call->count);
1776		ret = afs_extract_data(call, true);
1777		if (ret < 0)
1778			return ret;
1779
1780		switch (call->count) {
1781		case 0:
1782			scb = &op->file[0].scb;
1783			break;
1784		case 1:
1785			scb = &op->file[1].scb;
1786			break;
1787		default:
1788			scb = &op->more_files[call->count - 2].scb;
1789			break;
1790		}
1791
1792		bp = call->buffer;
1793		xdr_decode_AFSFetchStatus(&bp, call, scb);
1794
1795		call->count++;
1796		if (call->count < op->nr_files)
1797			goto more_counts;
1798
1799		call->count = 0;
1800		call->unmarshall++;
1801		afs_extract_to_tmp(call);
1802		fallthrough;
1803
1804		/* Extract the callback count and array in two steps */
1805	case 3:
1806		_debug("extract CB count");
1807		ret = afs_extract_data(call, true);
1808		if (ret < 0)
1809			return ret;
1810
1811		tmp = ntohl(call->tmp);
1812		_debug("CB count: %u", tmp);
1813		if (tmp != op->nr_files)
1814			return afs_protocol_error(call, afs_eproto_ibulkst_cb_count);
1815		call->count = 0;
1816		call->unmarshall++;
1817	more_cbs:
1818		afs_extract_to_buf(call, 3 * sizeof(__be32));
1819		fallthrough;
1820
1821	case 4:
1822		_debug("extract CB array");
1823		ret = afs_extract_data(call, true);
1824		if (ret < 0)
1825			return ret;
1826
1827		_debug("unmarshall CB array");
1828		switch (call->count) {
1829		case 0:
1830			scb = &op->file[0].scb;
1831			break;
1832		case 1:
1833			scb = &op->file[1].scb;
1834			break;
1835		default:
1836			scb = &op->more_files[call->count - 2].scb;
1837			break;
1838		}
1839
1840		bp = call->buffer;
1841		xdr_decode_AFSCallBack(&bp, call, scb);
1842		call->count++;
1843		if (call->count < op->nr_files)
1844			goto more_cbs;
1845
1846		afs_extract_to_buf(call, 6 * sizeof(__be32));
1847		call->unmarshall++;
1848		fallthrough;
1849
1850	case 5:
1851		ret = afs_extract_data(call, false);
1852		if (ret < 0)
1853			return ret;
1854
1855		bp = call->buffer;
1856		xdr_decode_AFSVolSync(&bp, &op->volsync);
1857
1858		call->unmarshall++;
1859		fallthrough;
1860
1861	case 6:
1862		break;
1863	}
1864
1865	_leave(" = 0 [done]");
1866	return 0;
1867}
1868
1869static void afs_done_fs_inline_bulk_status(struct afs_call *call)
1870{
1871	if (call->error == -ECONNABORTED &&
1872	    call->abort_code == RX_INVALID_OPERATION) {
1873		set_bit(AFS_SERVER_FL_NO_IBULK, &call->server->flags);
1874		if (call->op)
1875			set_bit(AFS_VOLUME_MAYBE_NO_IBULK, &call->op->volume->flags);
1876	}
1877}
1878
1879/*
1880 * FS.InlineBulkStatus operation type
1881 */
1882static const struct afs_call_type afs_RXFSInlineBulkStatus = {
1883	.name		= "FS.InlineBulkStatus",
1884	.op		= afs_FS_InlineBulkStatus,
1885	.deliver	= afs_deliver_fs_inline_bulk_status,
1886	.done		= afs_done_fs_inline_bulk_status,
1887	.destructor	= afs_flat_call_destructor,
1888};
1889
1890/*
1891 * Fetch the status information for up to 50 files
1892 */
1893void afs_fs_inline_bulk_status(struct afs_operation *op)
1894{
1895	struct afs_vnode_param *dvp = &op->file[0];
1896	struct afs_vnode_param *vp = &op->file[1];
1897	struct afs_call *call;
1898	__be32 *bp;
1899	int i;
1900
1901	if (test_bit(AFS_SERVER_FL_NO_IBULK, &op->server->flags)) {
1902		op->error = -ENOTSUPP;
1903		return;
1904	}
1905
1906	_enter(",%x,{%llx:%llu},%u",
1907	       key_serial(op->key), vp->fid.vid, vp->fid.vnode, op->nr_files);
1908
1909	call = afs_alloc_flat_call(op->net, &afs_RXFSInlineBulkStatus,
1910				   (2 + op->nr_files * 3) * 4,
1911				   21 * 4);
1912	if (!call)
1913		return afs_op_nomem(op);
1914
1915	/* marshall the parameters */
1916	bp = call->request;
1917	*bp++ = htonl(FSINLINEBULKSTATUS);
1918	*bp++ = htonl(op->nr_files);
1919	*bp++ = htonl(dvp->fid.vid);
1920	*bp++ = htonl(dvp->fid.vnode);
1921	*bp++ = htonl(dvp->fid.unique);
1922	*bp++ = htonl(vp->fid.vid);
1923	*bp++ = htonl(vp->fid.vnode);
1924	*bp++ = htonl(vp->fid.unique);
1925	for (i = 0; i < op->nr_files - 2; i++) {
1926		*bp++ = htonl(op->more_files[i].fid.vid);
1927		*bp++ = htonl(op->more_files[i].fid.vnode);
1928		*bp++ = htonl(op->more_files[i].fid.unique);
1929	}
1930
1931	trace_afs_make_fs_call(call, &vp->fid);
1932	afs_make_op_call(op, call, GFP_NOFS);
1933}
1934
1935/*
1936 * deliver reply data to an FS.FetchACL
1937 */
1938static int afs_deliver_fs_fetch_acl(struct afs_call *call)
1939{
1940	struct afs_operation *op = call->op;
1941	struct afs_vnode_param *vp = &op->file[0];
1942	struct afs_acl *acl;
1943	const __be32 *bp;
1944	unsigned int size;
1945	int ret;
1946
1947	_enter("{%u}", call->unmarshall);
1948
1949	switch (call->unmarshall) {
1950	case 0:
1951		afs_extract_to_tmp(call);
1952		call->unmarshall++;
1953		fallthrough;
1954
1955		/* extract the returned data length */
1956	case 1:
1957		ret = afs_extract_data(call, true);
1958		if (ret < 0)
1959			return ret;
1960
1961		size = call->count2 = ntohl(call->tmp);
1962		size = round_up(size, 4);
1963
1964		acl = kmalloc(struct_size(acl, data, size), GFP_KERNEL);
1965		if (!acl)
1966			return -ENOMEM;
1967		op->acl = acl;
1968		acl->size = call->count2;
1969		afs_extract_begin(call, acl->data, size);
1970		call->unmarshall++;
1971		fallthrough;
1972
1973		/* extract the returned data */
1974	case 2:
1975		ret = afs_extract_data(call, true);
1976		if (ret < 0)
1977			return ret;
1978
1979		afs_extract_to_buf(call, (21 + 6) * 4);
1980		call->unmarshall++;
1981		fallthrough;
1982
1983		/* extract the metadata */
1984	case 3:
1985		ret = afs_extract_data(call, false);
1986		if (ret < 0)
1987			return ret;
1988
1989		bp = call->buffer;
1990		xdr_decode_AFSFetchStatus(&bp, call, &vp->scb);
1991		xdr_decode_AFSVolSync(&bp, &op->volsync);
1992
1993		call->unmarshall++;
1994		fallthrough;
1995
1996	case 4:
1997		break;
1998	}
1999
2000	_leave(" = 0 [done]");
2001	return 0;
2002}
2003
2004/*
2005 * FS.FetchACL operation type
2006 */
2007static const struct afs_call_type afs_RXFSFetchACL = {
2008	.name		= "FS.FetchACL",
2009	.op		= afs_FS_FetchACL,
2010	.deliver	= afs_deliver_fs_fetch_acl,
2011};
2012
2013/*
2014 * Fetch the ACL for a file.
2015 */
2016void afs_fs_fetch_acl(struct afs_operation *op)
2017{
2018	struct afs_vnode_param *vp = &op->file[0];
2019	struct afs_call *call;
2020	__be32 *bp;
2021
2022	_enter(",%x,{%llx:%llu},,",
2023	       key_serial(op->key), vp->fid.vid, vp->fid.vnode);
2024
2025	call = afs_alloc_flat_call(op->net, &afs_RXFSFetchACL, 16, (21 + 6) * 4);
2026	if (!call)
2027		return afs_op_nomem(op);
2028
2029	/* marshall the parameters */
2030	bp = call->request;
2031	bp[0] = htonl(FSFETCHACL);
2032	bp[1] = htonl(vp->fid.vid);
2033	bp[2] = htonl(vp->fid.vnode);
2034	bp[3] = htonl(vp->fid.unique);
2035
2036	trace_afs_make_fs_call(call, &vp->fid);
2037	afs_make_op_call(op, call, GFP_KERNEL);
2038}
2039
2040/*
2041 * FS.StoreACL operation type
2042 */
2043static const struct afs_call_type afs_RXFSStoreACL = {
2044	.name		= "FS.StoreACL",
2045	.op		= afs_FS_StoreACL,
2046	.deliver	= afs_deliver_fs_file_status_and_vol,
2047	.destructor	= afs_flat_call_destructor,
2048};
2049
2050/*
2051 * Fetch the ACL for a file.
2052 */
2053void afs_fs_store_acl(struct afs_operation *op)
2054{
2055	struct afs_vnode_param *vp = &op->file[0];
2056	struct afs_call *call;
2057	const struct afs_acl *acl = op->acl;
2058	size_t size;
2059	__be32 *bp;
2060
2061	_enter(",%x,{%llx:%llu},,",
2062	       key_serial(op->key), vp->fid.vid, vp->fid.vnode);
2063
2064	size = round_up(acl->size, 4);
2065	call = afs_alloc_flat_call(op->net, &afs_RXFSStoreACL,
2066				   5 * 4 + size, (21 + 6) * 4);
2067	if (!call)
2068		return afs_op_nomem(op);
2069
2070	/* marshall the parameters */
2071	bp = call->request;
2072	bp[0] = htonl(FSSTOREACL);
2073	bp[1] = htonl(vp->fid.vid);
2074	bp[2] = htonl(vp->fid.vnode);
2075	bp[3] = htonl(vp->fid.unique);
2076	bp[4] = htonl(acl->size);
2077	memcpy(&bp[5], acl->data, acl->size);
2078	if (acl->size != size)
2079		memset((void *)&bp[5] + acl->size, 0, size - acl->size);
2080
2081	trace_afs_make_fs_call(call, &vp->fid);
2082	afs_make_op_call(op, call, GFP_KERNEL);
2083}
2084