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