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