Linux Audio

Check our new training course

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