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