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