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