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