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