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