~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/fs/afs/fsclient.c

Version: ~ [ linux-6.11.5 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.58 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.114 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.169 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.228 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.284 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.322 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

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

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php