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