OSDN Git Service

Merge tag 'sched-urgent-2020-05-24' of git://git.kernel.org/pub/scm/linux/kernel...
[tomoyo/tomoyo-test1.git] / fs / afs / fsclient.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /* AFS File Server client stubs
3  *
4  * Copyright (C) 2002, 2007 Red Hat, Inc. All Rights Reserved.
5  * Written by David Howells (dhowells@redhat.com)
6  */
7
8 #include <linux/init.h>
9 #include <linux/slab.h>
10 #include <linux/sched.h>
11 #include <linux/circ_buf.h>
12 #include <linux/iversion.h>
13 #include "internal.h"
14 #include "afs_fs.h"
15 #include "xdr_fs.h"
16 #include "protocol_yfs.h"
17
18 static inline void afs_use_fs_server(struct afs_call *call, struct afs_cb_interest *cbi)
19 {
20         call->cbi = afs_get_cb_interest(cbi);
21 }
22
23 /*
24  * decode an AFSFid block
25  */
26 static void xdr_decode_AFSFid(const __be32 **_bp, struct afs_fid *fid)
27 {
28         const __be32 *bp = *_bp;
29
30         fid->vid                = ntohl(*bp++);
31         fid->vnode              = ntohl(*bp++);
32         fid->unique             = ntohl(*bp++);
33         *_bp = bp;
34 }
35
36 /*
37  * Dump a bad file status record.
38  */
39 static void xdr_dump_bad(const __be32 *bp)
40 {
41         __be32 x[4];
42         int i;
43
44         pr_notice("AFS XDR: Bad status record\n");
45         for (i = 0; i < 5 * 4 * 4; i += 16) {
46                 memcpy(x, bp, 16);
47                 bp += 4;
48                 pr_notice("%03x: %08x %08x %08x %08x\n",
49                           i, ntohl(x[0]), ntohl(x[1]), ntohl(x[2]), ntohl(x[3]));
50         }
51
52         memcpy(x, bp, 4);
53         pr_notice("0x50: %08x\n", ntohl(x[0]));
54 }
55
56 /*
57  * decode an AFSFetchStatus block
58  */
59 static int xdr_decode_AFSFetchStatus(const __be32 **_bp,
60                                      struct afs_call *call,
61                                      struct afs_status_cb *scb)
62 {
63         const struct afs_xdr_AFSFetchStatus *xdr = (const void *)*_bp;
64         struct afs_file_status *status = &scb->status;
65         bool inline_error = (call->operation_ID == afs_FS_InlineBulkStatus);
66         u64 data_version, size;
67         u32 type, abort_code;
68         int ret;
69
70         abort_code = ntohl(xdr->abort_code);
71
72         if (xdr->if_version != htonl(AFS_FSTATUS_VERSION)) {
73                 if (xdr->if_version == htonl(0) &&
74                     abort_code != 0 &&
75                     inline_error) {
76                         /* The OpenAFS fileserver has a bug in FS.InlineBulkStatus
77                          * whereby it doesn't set the interface version in the error
78                          * case.
79                          */
80                         status->abort_code = abort_code;
81                         scb->have_error = true;
82                         goto good;
83                 }
84
85                 pr_warn("Unknown AFSFetchStatus version %u\n", ntohl(xdr->if_version));
86                 goto bad;
87         }
88
89         if (abort_code != 0 && inline_error) {
90                 status->abort_code = abort_code;
91                 scb->have_error = true;
92                 goto good;
93         }
94
95         type = ntohl(xdr->type);
96         switch (type) {
97         case AFS_FTYPE_FILE:
98         case AFS_FTYPE_DIR:
99         case AFS_FTYPE_SYMLINK:
100                 status->type = type;
101                 break;
102         default:
103                 goto bad;
104         }
105
106         status->nlink           = ntohl(xdr->nlink);
107         status->author          = ntohl(xdr->author);
108         status->owner           = ntohl(xdr->owner);
109         status->caller_access   = ntohl(xdr->caller_access); /* Ticket dependent */
110         status->anon_access     = ntohl(xdr->anon_access);
111         status->mode            = ntohl(xdr->mode) & S_IALLUGO;
112         status->group           = ntohl(xdr->group);
113         status->lock_count      = ntohl(xdr->lock_count);
114
115         status->mtime_client.tv_sec = ntohl(xdr->mtime_client);
116         status->mtime_client.tv_nsec = 0;
117         status->mtime_server.tv_sec = ntohl(xdr->mtime_server);
118         status->mtime_server.tv_nsec = 0;
119
120         size  = (u64)ntohl(xdr->size_lo);
121         size |= (u64)ntohl(xdr->size_hi) << 32;
122         status->size = size;
123
124         data_version  = (u64)ntohl(xdr->data_version_lo);
125         data_version |= (u64)ntohl(xdr->data_version_hi) << 32;
126         status->data_version = data_version;
127         scb->have_status = true;
128 good:
129         ret = 0;
130 advance:
131         *_bp = (const void *)*_bp + sizeof(*xdr);
132         return ret;
133
134 bad:
135         xdr_dump_bad(*_bp);
136         ret = afs_protocol_error(call, -EBADMSG, afs_eproto_bad_status);
137         goto advance;
138 }
139
140 static time64_t xdr_decode_expiry(struct afs_call *call, u32 expiry)
141 {
142         return ktime_divns(call->reply_time, NSEC_PER_SEC) + expiry;
143 }
144
145 static void xdr_decode_AFSCallBack(const __be32 **_bp,
146                                    struct afs_call *call,
147                                    struct afs_status_cb *scb)
148 {
149         struct afs_callback *cb = &scb->callback;
150         const __be32 *bp = *_bp;
151
152         bp++; /* version */
153         cb->expires_at  = xdr_decode_expiry(call, ntohl(*bp++));
154         bp++; /* type */
155         scb->have_cb    = true;
156         *_bp = bp;
157 }
158
159 /*
160  * decode an AFSVolSync block
161  */
162 static void xdr_decode_AFSVolSync(const __be32 **_bp,
163                                   struct afs_volsync *volsync)
164 {
165         const __be32 *bp = *_bp;
166         u32 creation;
167
168         creation = ntohl(*bp++);
169         bp++; /* spare2 */
170         bp++; /* spare3 */
171         bp++; /* spare4 */
172         bp++; /* spare5 */
173         bp++; /* spare6 */
174         *_bp = bp;
175
176         if (volsync)
177                 volsync->creation = creation;
178 }
179
180 /*
181  * encode the requested attributes into an AFSStoreStatus block
182  */
183 static void xdr_encode_AFS_StoreStatus(__be32 **_bp, struct iattr *attr)
184 {
185         __be32 *bp = *_bp;
186         u32 mask = 0, mtime = 0, owner = 0, group = 0, mode = 0;
187
188         mask = 0;
189         if (attr->ia_valid & ATTR_MTIME) {
190                 mask |= AFS_SET_MTIME;
191                 mtime = attr->ia_mtime.tv_sec;
192         }
193
194         if (attr->ia_valid & ATTR_UID) {
195                 mask |= AFS_SET_OWNER;
196                 owner = from_kuid(&init_user_ns, attr->ia_uid);
197         }
198
199         if (attr->ia_valid & ATTR_GID) {
200                 mask |= AFS_SET_GROUP;
201                 group = from_kgid(&init_user_ns, attr->ia_gid);
202         }
203
204         if (attr->ia_valid & ATTR_MODE) {
205                 mask |= AFS_SET_MODE;
206                 mode = attr->ia_mode & S_IALLUGO;
207         }
208
209         *bp++ = htonl(mask);
210         *bp++ = htonl(mtime);
211         *bp++ = htonl(owner);
212         *bp++ = htonl(group);
213         *bp++ = htonl(mode);
214         *bp++ = 0;              /* segment size */
215         *_bp = bp;
216 }
217
218 /*
219  * decode an AFSFetchVolumeStatus block
220  */
221 static void xdr_decode_AFSFetchVolumeStatus(const __be32 **_bp,
222                                             struct afs_volume_status *vs)
223 {
224         const __be32 *bp = *_bp;
225
226         vs->vid                 = ntohl(*bp++);
227         vs->parent_id           = ntohl(*bp++);
228         vs->online              = ntohl(*bp++);
229         vs->in_service          = ntohl(*bp++);
230         vs->blessed             = ntohl(*bp++);
231         vs->needs_salvage       = ntohl(*bp++);
232         vs->type                = ntohl(*bp++);
233         vs->min_quota           = ntohl(*bp++);
234         vs->max_quota           = ntohl(*bp++);
235         vs->blocks_in_use       = ntohl(*bp++);
236         vs->part_blocks_avail   = ntohl(*bp++);
237         vs->part_max_blocks     = ntohl(*bp++);
238         vs->vol_copy_date       = 0;
239         vs->vol_backup_date     = 0;
240         *_bp = bp;
241 }
242
243 /*
244  * deliver reply data to an FS.FetchStatus
245  */
246 static int afs_deliver_fs_fetch_status_vnode(struct afs_call *call)
247 {
248         const __be32 *bp;
249         int ret;
250
251         ret = afs_transfer_reply(call);
252         if (ret < 0)
253                 return ret;
254
255         /* unmarshall the reply once we've received all of it */
256         bp = call->buffer;
257         ret = xdr_decode_AFSFetchStatus(&bp, call, call->out_scb);
258         if (ret < 0)
259                 return ret;
260         xdr_decode_AFSCallBack(&bp, call, call->out_scb);
261         xdr_decode_AFSVolSync(&bp, call->out_volsync);
262
263         _leave(" = 0 [done]");
264         return 0;
265 }
266
267 /*
268  * FS.FetchStatus operation type
269  */
270 static const struct afs_call_type afs_RXFSFetchStatus_vnode = {
271         .name           = "FS.FetchStatus(vnode)",
272         .op             = afs_FS_FetchStatus,
273         .deliver        = afs_deliver_fs_fetch_status_vnode,
274         .destructor     = afs_flat_call_destructor,
275 };
276
277 /*
278  * fetch the status information for a file
279  */
280 int afs_fs_fetch_file_status(struct afs_fs_cursor *fc, struct afs_status_cb *scb,
281                              struct afs_volsync *volsync)
282 {
283         struct afs_vnode *vnode = fc->vnode;
284         struct afs_call *call;
285         struct afs_net *net = afs_v2net(vnode);
286         __be32 *bp;
287
288         if (test_bit(AFS_SERVER_FL_IS_YFS, &fc->cbi->server->flags))
289                 return yfs_fs_fetch_file_status(fc, scb, volsync);
290
291         _enter(",%x,{%llx:%llu},,",
292                key_serial(fc->key), vnode->fid.vid, vnode->fid.vnode);
293
294         call = afs_alloc_flat_call(net, &afs_RXFSFetchStatus_vnode,
295                                    16, (21 + 3 + 6) * 4);
296         if (!call) {
297                 fc->ac.error = -ENOMEM;
298                 return -ENOMEM;
299         }
300
301         call->key = fc->key;
302         call->out_scb = scb;
303         call->out_volsync = volsync;
304
305         /* marshall the parameters */
306         bp = call->request;
307         bp[0] = htonl(FSFETCHSTATUS);
308         bp[1] = htonl(vnode->fid.vid);
309         bp[2] = htonl(vnode->fid.vnode);
310         bp[3] = htonl(vnode->fid.unique);
311
312         afs_use_fs_server(call, fc->cbi);
313         trace_afs_make_fs_call(call, &vnode->fid);
314
315         afs_set_fc_call(call, fc);
316         afs_make_call(&fc->ac, call, GFP_NOFS);
317         return afs_wait_for_call_to_complete(call, &fc->ac);
318 }
319
320 /*
321  * deliver reply data to an FS.FetchData
322  */
323 static int afs_deliver_fs_fetch_data(struct afs_call *call)
324 {
325         struct afs_read *req = call->read_request;
326         const __be32 *bp;
327         unsigned int size;
328         int ret;
329
330         _enter("{%u,%zu/%llu}",
331                call->unmarshall, iov_iter_count(call->iter), req->actual_len);
332
333         switch (call->unmarshall) {
334         case 0:
335                 req->actual_len = 0;
336                 req->index = 0;
337                 req->offset = req->pos & (PAGE_SIZE - 1);
338                 call->unmarshall++;
339                 if (call->operation_ID == FSFETCHDATA64) {
340                         afs_extract_to_tmp64(call);
341                 } else {
342                         call->tmp_u = htonl(0);
343                         afs_extract_to_tmp(call);
344                 }
345                 /* Fall through */
346
347                 /* 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->def_iter, READ, call->bvec, 1, size);
372                 ASSERTCMP(size, <=, PAGE_SIZE);
373                 /* Fall through */
374
375                 /* extract the returned data */
376         case 2:
377                 _debug("extract data %zu/%llu",
378                        iov_iter_count(call->iter), req->remain);
379
380                 ret = afs_extract_data(call, true);
381                 if (ret < 0)
382                         return ret;
383                 req->remain -= call->bvec[0].bv_len;
384                 req->offset += call->bvec[0].bv_len;
385                 ASSERTCMP(req->offset, <=, PAGE_SIZE);
386                 if (req->offset == PAGE_SIZE) {
387                         req->offset = 0;
388                         req->index++;
389                         if (req->remain > 0)
390                                 goto begin_page;
391                 }
392
393                 ASSERTCMP(req->remain, ==, 0);
394                 if (req->actual_len <= req->len)
395                         goto no_more_data;
396
397                 /* Discard any excess data the server gave us */
398                 afs_extract_discard(call, req->actual_len - req->len);
399                 call->unmarshall = 3;
400                 /* Fall through */
401
402         case 3:
403                 _debug("extract discard %zu/%llu",
404                        iov_iter_count(call->iter), req->actual_len - req->len);
405
406                 ret = afs_extract_data(call, true);
407                 if (ret < 0)
408                         return ret;
409
410         no_more_data:
411                 call->unmarshall = 4;
412                 afs_extract_to_buf(call, (21 + 3 + 6) * 4);
413                 /* Fall through */
414
415                 /* 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                 req->offset = 0;
442         }
443
444         if (req->page_done)
445                 for (req->index = 0; req->index < req->nr_pages; req->index++)
446                         req->page_done(req);
447
448         _leave(" = 0 [done]");
449         return 0;
450 }
451
452 static void afs_fetch_data_destructor(struct afs_call *call)
453 {
454         struct afs_read *req = call->read_request;
455
456         afs_put_read(req);
457         afs_flat_call_destructor(call);
458 }
459
460 /*
461  * FS.FetchData operation type
462  */
463 static const struct afs_call_type afs_RXFSFetchData = {
464         .name           = "FS.FetchData",
465         .op             = afs_FS_FetchData,
466         .deliver        = afs_deliver_fs_fetch_data,
467         .destructor     = afs_fetch_data_destructor,
468 };
469
470 static const struct afs_call_type afs_RXFSFetchData64 = {
471         .name           = "FS.FetchData64",
472         .op             = afs_FS_FetchData64,
473         .deliver        = afs_deliver_fs_fetch_data,
474         .destructor     = afs_fetch_data_destructor,
475 };
476
477 /*
478  * fetch data from a very large file
479  */
480 static int afs_fs_fetch_data64(struct afs_fs_cursor *fc,
481                                struct afs_status_cb *scb,
482                                struct afs_read *req)
483 {
484         struct afs_vnode *vnode = fc->vnode;
485         struct afs_call *call;
486         struct afs_net *net = afs_v2net(vnode);
487         __be32 *bp;
488
489         _enter("");
490
491         call = afs_alloc_flat_call(net, &afs_RXFSFetchData64, 32, (21 + 3 + 6) * 4);
492         if (!call)
493                 return -ENOMEM;
494
495         call->key = fc->key;
496         call->out_scb = scb;
497         call->out_volsync = NULL;
498         call->read_request = afs_get_read(req);
499
500         /* marshall the parameters */
501         bp = call->request;
502         bp[0] = htonl(FSFETCHDATA64);
503         bp[1] = htonl(vnode->fid.vid);
504         bp[2] = htonl(vnode->fid.vnode);
505         bp[3] = htonl(vnode->fid.unique);
506         bp[4] = htonl(upper_32_bits(req->pos));
507         bp[5] = htonl(lower_32_bits(req->pos));
508         bp[6] = 0;
509         bp[7] = htonl(lower_32_bits(req->len));
510
511         afs_use_fs_server(call, fc->cbi);
512         trace_afs_make_fs_call(call, &vnode->fid);
513         afs_set_fc_call(call, fc);
514         afs_make_call(&fc->ac, call, GFP_NOFS);
515         return afs_wait_for_call_to_complete(call, &fc->ac);
516 }
517
518 /*
519  * fetch data from a file
520  */
521 int afs_fs_fetch_data(struct afs_fs_cursor *fc,
522                       struct afs_status_cb *scb,
523                       struct afs_read *req)
524 {
525         struct afs_vnode *vnode = fc->vnode;
526         struct afs_call *call;
527         struct afs_net *net = afs_v2net(vnode);
528         __be32 *bp;
529
530         if (test_bit(AFS_SERVER_FL_IS_YFS, &fc->cbi->server->flags))
531                 return yfs_fs_fetch_data(fc, scb, req);
532
533         if (upper_32_bits(req->pos) ||
534             upper_32_bits(req->len) ||
535             upper_32_bits(req->pos + req->len))
536                 return afs_fs_fetch_data64(fc, scb, req);
537
538         _enter("");
539
540         call = afs_alloc_flat_call(net, &afs_RXFSFetchData, 24, (21 + 3 + 6) * 4);
541         if (!call)
542                 return -ENOMEM;
543
544         call->key = fc->key;
545         call->out_scb = scb;
546         call->out_volsync = NULL;
547         call->read_request = afs_get_read(req);
548
549         /* marshall the parameters */
550         bp = call->request;
551         bp[0] = htonl(FSFETCHDATA);
552         bp[1] = htonl(vnode->fid.vid);
553         bp[2] = htonl(vnode->fid.vnode);
554         bp[3] = htonl(vnode->fid.unique);
555         bp[4] = htonl(lower_32_bits(req->pos));
556         bp[5] = htonl(lower_32_bits(req->len));
557
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         /* If the two dirs are the same, we have two copies of the same status
990          * report, so we just decode it twice.
991          */
992         bp = call->buffer;
993         ret = xdr_decode_AFSFetchStatus(&bp, call, call->out_dir_scb);
994         if (ret < 0)
995                 return ret;
996         ret = xdr_decode_AFSFetchStatus(&bp, call, call->out_scb);
997         if (ret < 0)
998                 return ret;
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                 /* Fall through */
1479
1480                 /* extract the returned status record */
1481         case 1:
1482                 _debug("extract status");
1483                 ret = afs_extract_data(call, true);
1484                 if (ret < 0)
1485                         return ret;
1486
1487                 bp = call->buffer;
1488                 xdr_decode_AFSFetchVolumeStatus(&bp, call->out_volstatus);
1489                 call->unmarshall++;
1490                 afs_extract_to_tmp(call);
1491                 /* Fall through */
1492
1493                 /* extract the volume name length */
1494         case 2:
1495                 ret = afs_extract_data(call, true);
1496                 if (ret < 0)
1497                         return ret;
1498
1499                 call->count = ntohl(call->tmp);
1500                 _debug("volname length: %u", call->count);
1501                 if (call->count >= AFSNAMEMAX)
1502                         return afs_protocol_error(call, -EBADMSG,
1503                                                   afs_eproto_volname_len);
1504                 size = (call->count + 3) & ~3; /* It's padded */
1505                 afs_extract_to_buf(call, size);
1506                 call->unmarshall++;
1507                 /* Fall through */
1508
1509                 /* extract the volume name */
1510         case 3:
1511                 _debug("extract volname");
1512                 ret = afs_extract_data(call, true);
1513                 if (ret < 0)
1514                         return ret;
1515
1516                 p = call->buffer;
1517                 p[call->count] = 0;
1518                 _debug("volname '%s'", p);
1519                 afs_extract_to_tmp(call);
1520                 call->unmarshall++;
1521                 /* Fall through */
1522
1523                 /* extract the offline message length */
1524         case 4:
1525                 ret = afs_extract_data(call, true);
1526                 if (ret < 0)
1527                         return ret;
1528
1529                 call->count = ntohl(call->tmp);
1530                 _debug("offline msg length: %u", call->count);
1531                 if (call->count >= AFSNAMEMAX)
1532                         return afs_protocol_error(call, -EBADMSG,
1533                                                   afs_eproto_offline_msg_len);
1534                 size = (call->count + 3) & ~3; /* It's padded */
1535                 afs_extract_to_buf(call, size);
1536                 call->unmarshall++;
1537                 /* Fall through */
1538
1539                 /* extract the offline message */
1540         case 5:
1541                 _debug("extract offline");
1542                 ret = afs_extract_data(call, true);
1543                 if (ret < 0)
1544                         return ret;
1545
1546                 p = call->buffer;
1547                 p[call->count] = 0;
1548                 _debug("offline '%s'", p);
1549
1550                 afs_extract_to_tmp(call);
1551                 call->unmarshall++;
1552                 /* Fall through */
1553
1554                 /* extract the message of the day length */
1555         case 6:
1556                 ret = afs_extract_data(call, true);
1557                 if (ret < 0)
1558                         return ret;
1559
1560                 call->count = ntohl(call->tmp);
1561                 _debug("motd length: %u", call->count);
1562                 if (call->count >= AFSNAMEMAX)
1563                         return afs_protocol_error(call, -EBADMSG,
1564                                                   afs_eproto_motd_len);
1565                 size = (call->count + 3) & ~3; /* It's padded */
1566                 afs_extract_to_buf(call, size);
1567                 call->unmarshall++;
1568                 /* Fall through */
1569
1570                 /* extract the message of the day */
1571         case 7:
1572                 _debug("extract motd");
1573                 ret = afs_extract_data(call, false);
1574                 if (ret < 0)
1575                         return ret;
1576
1577                 p = call->buffer;
1578                 p[call->count] = 0;
1579                 _debug("motd '%s'", p);
1580
1581                 call->unmarshall++;
1582
1583         case 8:
1584                 break;
1585         }
1586
1587         _leave(" = 0 [done]");
1588         return 0;
1589 }
1590
1591 /*
1592  * FS.GetVolumeStatus operation type
1593  */
1594 static const struct afs_call_type afs_RXFSGetVolumeStatus = {
1595         .name           = "FS.GetVolumeStatus",
1596         .op             = afs_FS_GetVolumeStatus,
1597         .deliver        = afs_deliver_fs_get_volume_status,
1598         .destructor     = afs_flat_call_destructor,
1599 };
1600
1601 /*
1602  * fetch the status of a volume
1603  */
1604 int afs_fs_get_volume_status(struct afs_fs_cursor *fc,
1605                              struct afs_volume_status *vs)
1606 {
1607         struct afs_vnode *vnode = fc->vnode;
1608         struct afs_call *call;
1609         struct afs_net *net = afs_v2net(vnode);
1610         __be32 *bp;
1611
1612         if (test_bit(AFS_SERVER_FL_IS_YFS, &fc->cbi->server->flags))
1613                 return yfs_fs_get_volume_status(fc, vs);
1614
1615         _enter("");
1616
1617         call = afs_alloc_flat_call(net, &afs_RXFSGetVolumeStatus, 2 * 4,
1618                                    max(12 * 4, AFSOPAQUEMAX + 1));
1619         if (!call)
1620                 return -ENOMEM;
1621
1622         call->key = fc->key;
1623         call->out_volstatus = vs;
1624
1625         /* marshall the parameters */
1626         bp = call->request;
1627         bp[0] = htonl(FSGETVOLUMESTATUS);
1628         bp[1] = htonl(vnode->fid.vid);
1629
1630         afs_use_fs_server(call, fc->cbi);
1631         trace_afs_make_fs_call(call, &vnode->fid);
1632         afs_set_fc_call(call, fc);
1633         afs_make_call(&fc->ac, call, GFP_NOFS);
1634         return afs_wait_for_call_to_complete(call, &fc->ac);
1635 }
1636
1637 /*
1638  * deliver reply data to an FS.SetLock, FS.ExtendLock or FS.ReleaseLock
1639  */
1640 static int afs_deliver_fs_xxxx_lock(struct afs_call *call)
1641 {
1642         const __be32 *bp;
1643         int ret;
1644
1645         _enter("{%u}", call->unmarshall);
1646
1647         ret = afs_transfer_reply(call);
1648         if (ret < 0)
1649                 return ret;
1650
1651         /* unmarshall the reply once we've received all of it */
1652         bp = call->buffer;
1653         xdr_decode_AFSVolSync(&bp, call->out_volsync);
1654
1655         _leave(" = 0 [done]");
1656         return 0;
1657 }
1658
1659 /*
1660  * FS.SetLock operation type
1661  */
1662 static const struct afs_call_type afs_RXFSSetLock = {
1663         .name           = "FS.SetLock",
1664         .op             = afs_FS_SetLock,
1665         .deliver        = afs_deliver_fs_xxxx_lock,
1666         .done           = afs_lock_op_done,
1667         .destructor     = afs_flat_call_destructor,
1668 };
1669
1670 /*
1671  * FS.ExtendLock operation type
1672  */
1673 static const struct afs_call_type afs_RXFSExtendLock = {
1674         .name           = "FS.ExtendLock",
1675         .op             = afs_FS_ExtendLock,
1676         .deliver        = afs_deliver_fs_xxxx_lock,
1677         .done           = afs_lock_op_done,
1678         .destructor     = afs_flat_call_destructor,
1679 };
1680
1681 /*
1682  * FS.ReleaseLock operation type
1683  */
1684 static const struct afs_call_type afs_RXFSReleaseLock = {
1685         .name           = "FS.ReleaseLock",
1686         .op             = afs_FS_ReleaseLock,
1687         .deliver        = afs_deliver_fs_xxxx_lock,
1688         .destructor     = afs_flat_call_destructor,
1689 };
1690
1691 /*
1692  * Set a lock on a file
1693  */
1694 int afs_fs_set_lock(struct afs_fs_cursor *fc, afs_lock_type_t type,
1695                     struct afs_status_cb *scb)
1696 {
1697         struct afs_vnode *vnode = fc->vnode;
1698         struct afs_call *call;
1699         struct afs_net *net = afs_v2net(vnode);
1700         __be32 *bp;
1701
1702         if (test_bit(AFS_SERVER_FL_IS_YFS, &fc->cbi->server->flags))
1703                 return yfs_fs_set_lock(fc, type, scb);
1704
1705         _enter("");
1706
1707         call = afs_alloc_flat_call(net, &afs_RXFSSetLock, 5 * 4, 6 * 4);
1708         if (!call)
1709                 return -ENOMEM;
1710
1711         call->key = fc->key;
1712         call->lvnode = vnode;
1713         call->out_scb = scb;
1714
1715         /* marshall the parameters */
1716         bp = call->request;
1717         *bp++ = htonl(FSSETLOCK);
1718         *bp++ = htonl(vnode->fid.vid);
1719         *bp++ = htonl(vnode->fid.vnode);
1720         *bp++ = htonl(vnode->fid.unique);
1721         *bp++ = htonl(type);
1722
1723         afs_use_fs_server(call, fc->cbi);
1724         trace_afs_make_fs_calli(call, &vnode->fid, type);
1725         afs_set_fc_call(call, fc);
1726         afs_make_call(&fc->ac, call, GFP_NOFS);
1727         return afs_wait_for_call_to_complete(call, &fc->ac);
1728 }
1729
1730 /*
1731  * extend a lock on a file
1732  */
1733 int afs_fs_extend_lock(struct afs_fs_cursor *fc, struct afs_status_cb *scb)
1734 {
1735         struct afs_vnode *vnode = fc->vnode;
1736         struct afs_call *call;
1737         struct afs_net *net = afs_v2net(vnode);
1738         __be32 *bp;
1739
1740         if (test_bit(AFS_SERVER_FL_IS_YFS, &fc->cbi->server->flags))
1741                 return yfs_fs_extend_lock(fc, scb);
1742
1743         _enter("");
1744
1745         call = afs_alloc_flat_call(net, &afs_RXFSExtendLock, 4 * 4, 6 * 4);
1746         if (!call)
1747                 return -ENOMEM;
1748
1749         call->key = fc->key;
1750         call->lvnode = vnode;
1751         call->out_scb = scb;
1752
1753         /* marshall the parameters */
1754         bp = call->request;
1755         *bp++ = htonl(FSEXTENDLOCK);
1756         *bp++ = htonl(vnode->fid.vid);
1757         *bp++ = htonl(vnode->fid.vnode);
1758         *bp++ = htonl(vnode->fid.unique);
1759
1760         afs_use_fs_server(call, fc->cbi);
1761         trace_afs_make_fs_call(call, &vnode->fid);
1762         afs_set_fc_call(call, fc);
1763         afs_make_call(&fc->ac, call, GFP_NOFS);
1764         return afs_wait_for_call_to_complete(call, &fc->ac);
1765 }
1766
1767 /*
1768  * release a lock on a file
1769  */
1770 int afs_fs_release_lock(struct afs_fs_cursor *fc, struct afs_status_cb *scb)
1771 {
1772         struct afs_vnode *vnode = fc->vnode;
1773         struct afs_call *call;
1774         struct afs_net *net = afs_v2net(vnode);
1775         __be32 *bp;
1776
1777         if (test_bit(AFS_SERVER_FL_IS_YFS, &fc->cbi->server->flags))
1778                 return yfs_fs_release_lock(fc, scb);
1779
1780         _enter("");
1781
1782         call = afs_alloc_flat_call(net, &afs_RXFSReleaseLock, 4 * 4, 6 * 4);
1783         if (!call)
1784                 return -ENOMEM;
1785
1786         call->key = fc->key;
1787         call->lvnode = vnode;
1788         call->out_scb = scb;
1789
1790         /* marshall the parameters */
1791         bp = call->request;
1792         *bp++ = htonl(FSRELEASELOCK);
1793         *bp++ = htonl(vnode->fid.vid);
1794         *bp++ = htonl(vnode->fid.vnode);
1795         *bp++ = htonl(vnode->fid.unique);
1796
1797         afs_use_fs_server(call, fc->cbi);
1798         trace_afs_make_fs_call(call, &vnode->fid);
1799         afs_set_fc_call(call, fc);
1800         afs_make_call(&fc->ac, call, GFP_NOFS);
1801         return afs_wait_for_call_to_complete(call, &fc->ac);
1802 }
1803
1804 /*
1805  * Deliver reply data to an FS.GiveUpAllCallBacks operation.
1806  */
1807 static int afs_deliver_fs_give_up_all_callbacks(struct afs_call *call)
1808 {
1809         return afs_transfer_reply(call);
1810 }
1811
1812 /*
1813  * FS.GiveUpAllCallBacks operation type
1814  */
1815 static const struct afs_call_type afs_RXFSGiveUpAllCallBacks = {
1816         .name           = "FS.GiveUpAllCallBacks",
1817         .op             = afs_FS_GiveUpAllCallBacks,
1818         .deliver        = afs_deliver_fs_give_up_all_callbacks,
1819         .destructor     = afs_flat_call_destructor,
1820 };
1821
1822 /*
1823  * Flush all the callbacks we have on a server.
1824  */
1825 int afs_fs_give_up_all_callbacks(struct afs_net *net,
1826                                  struct afs_server *server,
1827                                  struct afs_addr_cursor *ac,
1828                                  struct key *key)
1829 {
1830         struct afs_call *call;
1831         __be32 *bp;
1832
1833         _enter("");
1834
1835         call = afs_alloc_flat_call(net, &afs_RXFSGiveUpAllCallBacks, 1 * 4, 0);
1836         if (!call)
1837                 return -ENOMEM;
1838
1839         call->key = key;
1840
1841         /* marshall the parameters */
1842         bp = call->request;
1843         *bp++ = htonl(FSGIVEUPALLCALLBACKS);
1844
1845         /* Can't take a ref on server */
1846         afs_make_call(ac, call, GFP_NOFS);
1847         return afs_wait_for_call_to_complete(call, ac);
1848 }
1849
1850 /*
1851  * Deliver reply data to an FS.GetCapabilities operation.
1852  */
1853 static int afs_deliver_fs_get_capabilities(struct afs_call *call)
1854 {
1855         u32 count;
1856         int ret;
1857
1858         _enter("{%u,%zu}", call->unmarshall, iov_iter_count(call->iter));
1859
1860         switch (call->unmarshall) {
1861         case 0:
1862                 afs_extract_to_tmp(call);
1863                 call->unmarshall++;
1864                 /* Fall through */
1865
1866                 /* Extract the capabilities word count */
1867         case 1:
1868                 ret = afs_extract_data(call, true);
1869                 if (ret < 0)
1870                         return ret;
1871
1872                 count = ntohl(call->tmp);
1873
1874                 call->count = count;
1875                 call->count2 = count;
1876                 afs_extract_discard(call, count * sizeof(__be32));
1877                 call->unmarshall++;
1878                 /* Fall through */
1879
1880                 /* Extract capabilities words */
1881         case 2:
1882                 ret = afs_extract_data(call, false);
1883                 if (ret < 0)
1884                         return ret;
1885
1886                 /* TODO: Examine capabilities */
1887
1888                 call->unmarshall++;
1889                 break;
1890         }
1891
1892         _leave(" = 0 [done]");
1893         return 0;
1894 }
1895
1896 /*
1897  * FS.GetCapabilities operation type
1898  */
1899 static const struct afs_call_type afs_RXFSGetCapabilities = {
1900         .name           = "FS.GetCapabilities",
1901         .op             = afs_FS_GetCapabilities,
1902         .deliver        = afs_deliver_fs_get_capabilities,
1903         .done           = afs_fileserver_probe_result,
1904         .destructor     = afs_flat_call_destructor,
1905 };
1906
1907 /*
1908  * Probe a fileserver for the capabilities that it supports.  This can
1909  * return up to 196 words.
1910  */
1911 struct afs_call *afs_fs_get_capabilities(struct afs_net *net,
1912                                          struct afs_server *server,
1913                                          struct afs_addr_cursor *ac,
1914                                          struct key *key,
1915                                          unsigned int server_index)
1916 {
1917         struct afs_call *call;
1918         __be32 *bp;
1919
1920         _enter("");
1921
1922         call = afs_alloc_flat_call(net, &afs_RXFSGetCapabilities, 1 * 4, 16 * 4);
1923         if (!call)
1924                 return ERR_PTR(-ENOMEM);
1925
1926         call->key = key;
1927         call->server = afs_get_server(server, afs_server_trace_get_caps);
1928         call->server_index = server_index;
1929         call->upgrade = true;
1930         call->async = true;
1931         call->max_lifespan = AFS_PROBE_MAX_LIFESPAN;
1932
1933         /* marshall the parameters */
1934         bp = call->request;
1935         *bp++ = htonl(FSGETCAPABILITIES);
1936
1937         /* Can't take a ref on server */
1938         trace_afs_make_fs_call(call, NULL);
1939         afs_make_call(ac, call, GFP_NOFS);
1940         return call;
1941 }
1942
1943 /*
1944  * Deliver reply data to an FS.FetchStatus with no vnode.
1945  */
1946 static int afs_deliver_fs_fetch_status(struct afs_call *call)
1947 {
1948         const __be32 *bp;
1949         int ret;
1950
1951         ret = afs_transfer_reply(call);
1952         if (ret < 0)
1953                 return ret;
1954
1955         /* unmarshall the reply once we've received all of it */
1956         bp = call->buffer;
1957         ret = xdr_decode_AFSFetchStatus(&bp, call, call->out_scb);
1958         if (ret < 0)
1959                 return ret;
1960         xdr_decode_AFSCallBack(&bp, call, call->out_scb);
1961         xdr_decode_AFSVolSync(&bp, call->out_volsync);
1962
1963         _leave(" = 0 [done]");
1964         return 0;
1965 }
1966
1967 /*
1968  * FS.FetchStatus operation type
1969  */
1970 static const struct afs_call_type afs_RXFSFetchStatus = {
1971         .name           = "FS.FetchStatus",
1972         .op             = afs_FS_FetchStatus,
1973         .deliver        = afs_deliver_fs_fetch_status,
1974         .destructor     = afs_flat_call_destructor,
1975 };
1976
1977 /*
1978  * Fetch the status information for a fid without needing a vnode handle.
1979  */
1980 int afs_fs_fetch_status(struct afs_fs_cursor *fc,
1981                         struct afs_net *net,
1982                         struct afs_fid *fid,
1983                         struct afs_status_cb *scb,
1984                         struct afs_volsync *volsync)
1985 {
1986         struct afs_call *call;
1987         __be32 *bp;
1988
1989         if (test_bit(AFS_SERVER_FL_IS_YFS, &fc->cbi->server->flags))
1990                 return yfs_fs_fetch_status(fc, net, fid, scb, volsync);
1991
1992         _enter(",%x,{%llx:%llu},,",
1993                key_serial(fc->key), fid->vid, fid->vnode);
1994
1995         call = afs_alloc_flat_call(net, &afs_RXFSFetchStatus, 16, (21 + 3 + 6) * 4);
1996         if (!call) {
1997                 fc->ac.error = -ENOMEM;
1998                 return -ENOMEM;
1999         }
2000
2001         call->key = fc->key;
2002         call->out_fid = fid;
2003         call->out_scb = scb;
2004         call->out_volsync = volsync;
2005
2006         /* marshall the parameters */
2007         bp = call->request;
2008         bp[0] = htonl(FSFETCHSTATUS);
2009         bp[1] = htonl(fid->vid);
2010         bp[2] = htonl(fid->vnode);
2011         bp[3] = htonl(fid->unique);
2012
2013         afs_use_fs_server(call, fc->cbi);
2014         trace_afs_make_fs_call(call, fid);
2015         afs_set_fc_call(call, fc);
2016         afs_make_call(&fc->ac, call, GFP_NOFS);
2017         return afs_wait_for_call_to_complete(call, &fc->ac);
2018 }
2019
2020 /*
2021  * Deliver reply data to an FS.InlineBulkStatus call
2022  */
2023 static int afs_deliver_fs_inline_bulk_status(struct afs_call *call)
2024 {
2025         struct afs_status_cb *scb;
2026         const __be32 *bp;
2027         u32 tmp;
2028         int ret;
2029
2030         _enter("{%u}", call->unmarshall);
2031
2032         switch (call->unmarshall) {
2033         case 0:
2034                 afs_extract_to_tmp(call);
2035                 call->unmarshall++;
2036                 /* Fall through */
2037
2038                 /* Extract the file status count and array in two steps */
2039         case 1:
2040                 _debug("extract status count");
2041                 ret = afs_extract_data(call, true);
2042                 if (ret < 0)
2043                         return ret;
2044
2045                 tmp = ntohl(call->tmp);
2046                 _debug("status count: %u/%u", tmp, call->count2);
2047                 if (tmp != call->count2)
2048                         return afs_protocol_error(call, -EBADMSG,
2049                                                   afs_eproto_ibulkst_count);
2050
2051                 call->count = 0;
2052                 call->unmarshall++;
2053         more_counts:
2054                 afs_extract_to_buf(call, 21 * sizeof(__be32));
2055                 /* Fall through */
2056
2057         case 2:
2058                 _debug("extract status array %u", call->count);
2059                 ret = afs_extract_data(call, true);
2060                 if (ret < 0)
2061                         return ret;
2062
2063                 bp = call->buffer;
2064                 scb = &call->out_scb[call->count];
2065                 ret = xdr_decode_AFSFetchStatus(&bp, call, scb);
2066                 if (ret < 0)
2067                         return ret;
2068
2069                 call->count++;
2070                 if (call->count < call->count2)
2071                         goto more_counts;
2072
2073                 call->count = 0;
2074                 call->unmarshall++;
2075                 afs_extract_to_tmp(call);
2076                 /* Fall through */
2077
2078                 /* Extract the callback count and array in two steps */
2079         case 3:
2080                 _debug("extract CB count");
2081                 ret = afs_extract_data(call, true);
2082                 if (ret < 0)
2083                         return ret;
2084
2085                 tmp = ntohl(call->tmp);
2086                 _debug("CB count: %u", tmp);
2087                 if (tmp != call->count2)
2088                         return afs_protocol_error(call, -EBADMSG,
2089                                                   afs_eproto_ibulkst_cb_count);
2090                 call->count = 0;
2091                 call->unmarshall++;
2092         more_cbs:
2093                 afs_extract_to_buf(call, 3 * sizeof(__be32));
2094                 /* Fall through */
2095
2096         case 4:
2097                 _debug("extract CB array");
2098                 ret = afs_extract_data(call, true);
2099                 if (ret < 0)
2100                         return ret;
2101
2102                 _debug("unmarshall CB array");
2103                 bp = call->buffer;
2104                 scb = &call->out_scb[call->count];
2105                 xdr_decode_AFSCallBack(&bp, call, scb);
2106                 call->count++;
2107                 if (call->count < call->count2)
2108                         goto more_cbs;
2109
2110                 afs_extract_to_buf(call, 6 * sizeof(__be32));
2111                 call->unmarshall++;
2112                 /* Fall through */
2113
2114         case 5:
2115                 ret = afs_extract_data(call, false);
2116                 if (ret < 0)
2117                         return ret;
2118
2119                 bp = call->buffer;
2120                 xdr_decode_AFSVolSync(&bp, call->out_volsync);
2121
2122                 call->unmarshall++;
2123
2124         case 6:
2125                 break;
2126         }
2127
2128         _leave(" = 0 [done]");
2129         return 0;
2130 }
2131
2132 /*
2133  * FS.InlineBulkStatus operation type
2134  */
2135 static const struct afs_call_type afs_RXFSInlineBulkStatus = {
2136         .name           = "FS.InlineBulkStatus",
2137         .op             = afs_FS_InlineBulkStatus,
2138         .deliver        = afs_deliver_fs_inline_bulk_status,
2139         .destructor     = afs_flat_call_destructor,
2140 };
2141
2142 /*
2143  * Fetch the status information for up to 50 files
2144  */
2145 int afs_fs_inline_bulk_status(struct afs_fs_cursor *fc,
2146                               struct afs_net *net,
2147                               struct afs_fid *fids,
2148                               struct afs_status_cb *statuses,
2149                               unsigned int nr_fids,
2150                               struct afs_volsync *volsync)
2151 {
2152         struct afs_call *call;
2153         __be32 *bp;
2154         int i;
2155
2156         if (test_bit(AFS_SERVER_FL_IS_YFS, &fc->cbi->server->flags))
2157                 return yfs_fs_inline_bulk_status(fc, net, fids, statuses,
2158                                                  nr_fids, volsync);
2159
2160         _enter(",%x,{%llx:%llu},%u",
2161                key_serial(fc->key), fids[0].vid, fids[1].vnode, nr_fids);
2162
2163         call = afs_alloc_flat_call(net, &afs_RXFSInlineBulkStatus,
2164                                    (2 + nr_fids * 3) * 4,
2165                                    21 * 4);
2166         if (!call) {
2167                 fc->ac.error = -ENOMEM;
2168                 return -ENOMEM;
2169         }
2170
2171         call->key = fc->key;
2172         call->out_scb = statuses;
2173         call->out_volsync = volsync;
2174         call->count2 = nr_fids;
2175
2176         /* marshall the parameters */
2177         bp = call->request;
2178         *bp++ = htonl(FSINLINEBULKSTATUS);
2179         *bp++ = htonl(nr_fids);
2180         for (i = 0; i < nr_fids; i++) {
2181                 *bp++ = htonl(fids[i].vid);
2182                 *bp++ = htonl(fids[i].vnode);
2183                 *bp++ = htonl(fids[i].unique);
2184         }
2185
2186         afs_use_fs_server(call, fc->cbi);
2187         trace_afs_make_fs_call(call, &fids[0]);
2188         afs_set_fc_call(call, fc);
2189         afs_make_call(&fc->ac, call, GFP_NOFS);
2190         return afs_wait_for_call_to_complete(call, &fc->ac);
2191 }
2192
2193 /*
2194  * deliver reply data to an FS.FetchACL
2195  */
2196 static int afs_deliver_fs_fetch_acl(struct afs_call *call)
2197 {
2198         struct afs_acl *acl;
2199         const __be32 *bp;
2200         unsigned int size;
2201         int ret;
2202
2203         _enter("{%u}", call->unmarshall);
2204
2205         switch (call->unmarshall) {
2206         case 0:
2207                 afs_extract_to_tmp(call);
2208                 call->unmarshall++;
2209                 /* Fall through */
2210
2211                 /* extract the returned data length */
2212         case 1:
2213                 ret = afs_extract_data(call, true);
2214                 if (ret < 0)
2215                         return ret;
2216
2217                 size = call->count2 = ntohl(call->tmp);
2218                 size = round_up(size, 4);
2219
2220                 acl = kmalloc(struct_size(acl, data, size), GFP_KERNEL);
2221                 if (!acl)
2222                         return -ENOMEM;
2223                 call->ret_acl = acl;
2224                 acl->size = call->count2;
2225                 afs_extract_begin(call, acl->data, size);
2226                 call->unmarshall++;
2227                 /* Fall through */
2228
2229                 /* extract the returned data */
2230         case 2:
2231                 ret = afs_extract_data(call, true);
2232                 if (ret < 0)
2233                         return ret;
2234
2235                 afs_extract_to_buf(call, (21 + 6) * 4);
2236                 call->unmarshall++;
2237                 /* Fall through */
2238
2239                 /* extract the metadata */
2240         case 3:
2241                 ret = afs_extract_data(call, false);
2242                 if (ret < 0)
2243                         return ret;
2244
2245                 bp = call->buffer;
2246                 ret = xdr_decode_AFSFetchStatus(&bp, call, call->out_scb);
2247                 if (ret < 0)
2248                         return ret;
2249                 xdr_decode_AFSVolSync(&bp, call->out_volsync);
2250
2251                 call->unmarshall++;
2252
2253         case 4:
2254                 break;
2255         }
2256
2257         _leave(" = 0 [done]");
2258         return 0;
2259 }
2260
2261 static void afs_destroy_fs_fetch_acl(struct afs_call *call)
2262 {
2263         kfree(call->ret_acl);
2264         afs_flat_call_destructor(call);
2265 }
2266
2267 /*
2268  * FS.FetchACL operation type
2269  */
2270 static const struct afs_call_type afs_RXFSFetchACL = {
2271         .name           = "FS.FetchACL",
2272         .op             = afs_FS_FetchACL,
2273         .deliver        = afs_deliver_fs_fetch_acl,
2274         .destructor     = afs_destroy_fs_fetch_acl,
2275 };
2276
2277 /*
2278  * Fetch the ACL for a file.
2279  */
2280 struct afs_acl *afs_fs_fetch_acl(struct afs_fs_cursor *fc,
2281                                  struct afs_status_cb *scb)
2282 {
2283         struct afs_vnode *vnode = fc->vnode;
2284         struct afs_call *call;
2285         struct afs_net *net = afs_v2net(vnode);
2286         __be32 *bp;
2287
2288         _enter(",%x,{%llx:%llu},,",
2289                key_serial(fc->key), vnode->fid.vid, vnode->fid.vnode);
2290
2291         call = afs_alloc_flat_call(net, &afs_RXFSFetchACL, 16, (21 + 6) * 4);
2292         if (!call) {
2293                 fc->ac.error = -ENOMEM;
2294                 return ERR_PTR(-ENOMEM);
2295         }
2296
2297         call->key = fc->key;
2298         call->ret_acl = NULL;
2299         call->out_scb = scb;
2300         call->out_volsync = NULL;
2301
2302         /* marshall the parameters */
2303         bp = call->request;
2304         bp[0] = htonl(FSFETCHACL);
2305         bp[1] = htonl(vnode->fid.vid);
2306         bp[2] = htonl(vnode->fid.vnode);
2307         bp[3] = htonl(vnode->fid.unique);
2308
2309         afs_use_fs_server(call, fc->cbi);
2310         trace_afs_make_fs_call(call, &vnode->fid);
2311         afs_make_call(&fc->ac, call, GFP_KERNEL);
2312         return (struct afs_acl *)afs_wait_for_call_to_complete(call, &fc->ac);
2313 }
2314
2315 /*
2316  * Deliver reply data to any operation that returns file status and volume
2317  * sync.
2318  */
2319 static int afs_deliver_fs_file_status_and_vol(struct afs_call *call)
2320 {
2321         const __be32 *bp;
2322         int ret;
2323
2324         ret = afs_transfer_reply(call);
2325         if (ret < 0)
2326                 return ret;
2327
2328         bp = call->buffer;
2329         ret = xdr_decode_AFSFetchStatus(&bp, call, call->out_scb);
2330         if (ret < 0)
2331                 return ret;
2332         xdr_decode_AFSVolSync(&bp, call->out_volsync);
2333
2334         _leave(" = 0 [done]");
2335         return 0;
2336 }
2337
2338 /*
2339  * FS.StoreACL operation type
2340  */
2341 static const struct afs_call_type afs_RXFSStoreACL = {
2342         .name           = "FS.StoreACL",
2343         .op             = afs_FS_StoreACL,
2344         .deliver        = afs_deliver_fs_file_status_and_vol,
2345         .destructor     = afs_flat_call_destructor,
2346 };
2347
2348 /*
2349  * Fetch the ACL for a file.
2350  */
2351 int afs_fs_store_acl(struct afs_fs_cursor *fc, const struct afs_acl *acl,
2352                      struct afs_status_cb *scb)
2353 {
2354         struct afs_vnode *vnode = fc->vnode;
2355         struct afs_call *call;
2356         struct afs_net *net = afs_v2net(vnode);
2357         size_t size;
2358         __be32 *bp;
2359
2360         _enter(",%x,{%llx:%llu},,",
2361                key_serial(fc->key), vnode->fid.vid, vnode->fid.vnode);
2362
2363         size = round_up(acl->size, 4);
2364         call = afs_alloc_flat_call(net, &afs_RXFSStoreACL,
2365                                    5 * 4 + size, (21 + 6) * 4);
2366         if (!call) {
2367                 fc->ac.error = -ENOMEM;
2368                 return -ENOMEM;
2369         }
2370
2371         call->key = fc->key;
2372         call->out_scb = scb;
2373         call->out_volsync = NULL;
2374
2375         /* marshall the parameters */
2376         bp = call->request;
2377         bp[0] = htonl(FSSTOREACL);
2378         bp[1] = htonl(vnode->fid.vid);
2379         bp[2] = htonl(vnode->fid.vnode);
2380         bp[3] = htonl(vnode->fid.unique);
2381         bp[4] = htonl(acl->size);
2382         memcpy(&bp[5], acl->data, acl->size);
2383         if (acl->size != size)
2384                 memset((void *)&bp[5] + acl->size, 0, size - acl->size);
2385
2386         trace_afs_make_fs_call(call, &vnode->fid);
2387         afs_make_call(&fc->ac, call, GFP_KERNEL);
2388         return afs_wait_for_call_to_complete(call, &fc->ac);
2389 }