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