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