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