hc
2024-02-20 e636c8d336489bf3eed5878299e6cc045bbad077
kernel/fs/afs/fsclient.c
....@@ -1,12 +1,8 @@
1
+// SPDX-License-Identifier: GPL-2.0-or-later
12 /* AFS File Server client stubs
23 *
34 * Copyright (C) 2002, 2007 Red Hat, Inc. All Rights Reserved.
45 * 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.
106 */
117
128 #include <linux/init.h>
....@@ -17,19 +13,6 @@
1713 #include "internal.h"
1814 #include "afs_fs.h"
1915 #include "xdr_fs.h"
20
-
21
-static const struct afs_fid afs_zero_fid;
22
-
23
-/*
24
- * We need somewhere to discard into in case the server helpfully returns more
25
- * than we asked for in FS.FetchData{,64}.
26
- */
27
-static u8 afs_discard_buffer[64];
28
-
29
-static inline void afs_use_fs_server(struct afs_call *call, struct afs_cb_interest *cbi)
30
-{
31
- call->cbi = afs_get_cb_interest(cbi);
32
-}
3316
3417 /*
3518 * decode an AFSFid block
....@@ -65,79 +48,17 @@
6548 }
6649
6750 /*
68
- * Update the core inode struct from a returned status record.
69
- */
70
-void afs_update_inode_from_status(struct afs_vnode *vnode,
71
- struct afs_file_status *status,
72
- const afs_dataversion_t *expected_version,
73
- u8 flags)
74
-{
75
- struct timespec64 t;
76
- umode_t mode;
77
-
78
- t.tv_sec = status->mtime_client;
79
- t.tv_nsec = 0;
80
- vnode->vfs_inode.i_ctime = t;
81
- vnode->vfs_inode.i_mtime = t;
82
- vnode->vfs_inode.i_atime = t;
83
-
84
- if (flags & (AFS_VNODE_META_CHANGED | AFS_VNODE_NOT_YET_SET)) {
85
- vnode->vfs_inode.i_uid = make_kuid(&init_user_ns, status->owner);
86
- vnode->vfs_inode.i_gid = make_kgid(&init_user_ns, status->group);
87
- set_nlink(&vnode->vfs_inode, status->nlink);
88
-
89
- mode = vnode->vfs_inode.i_mode;
90
- mode &= ~S_IALLUGO;
91
- mode |= status->mode;
92
- barrier();
93
- vnode->vfs_inode.i_mode = mode;
94
- }
95
-
96
- if (!(flags & AFS_VNODE_NOT_YET_SET)) {
97
- if (expected_version &&
98
- *expected_version != status->data_version) {
99
- _debug("vnode modified %llx on {%x:%u} [exp %llx]",
100
- (unsigned long long) status->data_version,
101
- vnode->fid.vid, vnode->fid.vnode,
102
- (unsigned long long) *expected_version);
103
- vnode->invalid_before = status->data_version;
104
- if (vnode->status.type == AFS_FTYPE_DIR) {
105
- if (test_and_clear_bit(AFS_VNODE_DIR_VALID, &vnode->flags))
106
- afs_stat_v(vnode, n_inval);
107
- } else {
108
- set_bit(AFS_VNODE_ZAP_DATA, &vnode->flags);
109
- }
110
- } else if (vnode->status.type == AFS_FTYPE_DIR) {
111
- /* Expected directory change is handled elsewhere so
112
- * that we can locally edit the directory and save on a
113
- * download.
114
- */
115
- if (test_bit(AFS_VNODE_DIR_VALID, &vnode->flags))
116
- flags &= ~AFS_VNODE_DATA_CHANGED;
117
- }
118
- }
119
-
120
- if (flags & (AFS_VNODE_DATA_CHANGED | AFS_VNODE_NOT_YET_SET)) {
121
- inode_set_iversion_raw(&vnode->vfs_inode, status->data_version);
122
- i_size_write(&vnode->vfs_inode, status->size);
123
- }
124
-}
125
-
126
-/*
12751 * decode an AFSFetchStatus block
12852 */
129
-static int xdr_decode_AFSFetchStatus(struct afs_call *call,
130
- const __be32 **_bp,
131
- struct afs_file_status *status,
132
- struct afs_vnode *vnode,
133
- const afs_dataversion_t *expected_version,
134
- struct afs_read *read_req)
53
+static void xdr_decode_AFSFetchStatus(const __be32 **_bp,
54
+ struct afs_call *call,
55
+ struct afs_status_cb *scb)
13556 {
13657 const struct afs_xdr_AFSFetchStatus *xdr = (const void *)*_bp;
58
+ struct afs_file_status *status = &scb->status;
13759 bool inline_error = (call->operation_ID == afs_FS_InlineBulkStatus);
13860 u64 data_version, size;
13961 u32 type, abort_code;
140
- u8 flags = 0;
14162
14263 abort_code = ntohl(xdr->abort_code);
14364
....@@ -150,7 +71,8 @@
15071 * case.
15172 */
15273 status->abort_code = abort_code;
153
- return 0;
74
+ scb->have_error = true;
75
+ goto advance;
15476 }
15577
15678 pr_warn("Unknown AFSFetchStatus version %u\n", ntohl(xdr->if_version));
....@@ -159,7 +81,8 @@
15981
16082 if (abort_code != 0 && inline_error) {
16183 status->abort_code = abort_code;
162
- return 0;
84
+ scb->have_error = true;
85
+ goto advance;
16386 }
16487
16588 type = ntohl(xdr->type);
....@@ -167,42 +90,25 @@
16790 case AFS_FTYPE_FILE:
16891 case AFS_FTYPE_DIR:
16992 case AFS_FTYPE_SYMLINK:
170
- if (type != status->type &&
171
- vnode &&
172
- !test_bit(AFS_VNODE_UNSET, &vnode->flags)) {
173
- pr_warning("Vnode %x:%x:%x changed type %u to %u\n",
174
- vnode->fid.vid,
175
- vnode->fid.vnode,
176
- vnode->fid.unique,
177
- status->type, type);
178
- goto bad;
179
- }
18093 status->type = type;
18194 break;
18295 default:
18396 goto bad;
18497 }
18598
186
-#define EXTRACT_M(FIELD) \
187
- do { \
188
- u32 x = ntohl(xdr->FIELD); \
189
- if (status->FIELD != x) { \
190
- flags |= AFS_VNODE_META_CHANGED; \
191
- status->FIELD = x; \
192
- } \
193
- } while (0)
99
+ status->nlink = ntohl(xdr->nlink);
100
+ status->author = ntohl(xdr->author);
101
+ status->owner = ntohl(xdr->owner);
102
+ status->caller_access = ntohl(xdr->caller_access); /* Ticket dependent */
103
+ status->anon_access = ntohl(xdr->anon_access);
104
+ status->mode = ntohl(xdr->mode) & S_IALLUGO;
105
+ status->group = ntohl(xdr->group);
106
+ status->lock_count = ntohl(xdr->lock_count);
194107
195
- EXTRACT_M(nlink);
196
- EXTRACT_M(author);
197
- EXTRACT_M(owner);
198
- EXTRACT_M(caller_access); /* call ticket dependent */
199
- EXTRACT_M(anon_access);
200
- EXTRACT_M(mode);
201
- EXTRACT_M(group);
202
-
203
- status->mtime_client = ntohl(xdr->mtime_client);
204
- status->mtime_server = ntohl(xdr->mtime_server);
205
- status->lock_count = ntohl(xdr->lock_count);
108
+ status->mtime_client.tv_sec = ntohl(xdr->mtime_client);
109
+ status->mtime_client.tv_nsec = 0;
110
+ status->mtime_server.tv_sec = ntohl(xdr->mtime_server);
111
+ status->mtime_server.tv_nsec = 0;
206112
207113 size = (u64)ntohl(xdr->size_lo);
208114 size |= (u64)ntohl(xdr->size_hi) << 32;
....@@ -210,97 +116,34 @@
210116
211117 data_version = (u64)ntohl(xdr->data_version_lo);
212118 data_version |= (u64)ntohl(xdr->data_version_hi) << 32;
213
- if (data_version != status->data_version) {
214
- status->data_version = data_version;
215
- flags |= AFS_VNODE_DATA_CHANGED;
216
- }
217
-
218
- if (read_req) {
219
- read_req->data_version = data_version;
220
- read_req->file_size = size;
221
- }
222
-
119
+ status->data_version = data_version;
120
+ scb->have_status = true;
121
+advance:
223122 *_bp = (const void *)*_bp + sizeof(*xdr);
224
-
225
- if (vnode) {
226
- if (test_bit(AFS_VNODE_UNSET, &vnode->flags))
227
- flags |= AFS_VNODE_NOT_YET_SET;
228
- afs_update_inode_from_status(vnode, status, expected_version,
229
- flags);
230
- }
231
-
232
- return 0;
123
+ return;
233124
234125 bad:
235126 xdr_dump_bad(*_bp);
236
- return afs_protocol_error(call, -EBADMSG);
127
+ afs_protocol_error(call, afs_eproto_bad_status);
128
+ goto advance;
237129 }
238130
239
-/*
240
- * Decode the file status. We need to lock the target vnode if we're going to
241
- * update its status so that stat() sees the attributes update atomically.
242
- */
243
-static int afs_decode_status(struct afs_call *call,
244
- const __be32 **_bp,
245
- struct afs_file_status *status,
246
- struct afs_vnode *vnode,
247
- const afs_dataversion_t *expected_version,
248
- struct afs_read *read_req)
131
+static time64_t xdr_decode_expiry(struct afs_call *call, u32 expiry)
249132 {
250
- int ret;
251
-
252
- if (!vnode)
253
- return xdr_decode_AFSFetchStatus(call, _bp, status, vnode,
254
- expected_version, read_req);
255
-
256
- write_seqlock(&vnode->cb_lock);
257
- ret = xdr_decode_AFSFetchStatus(call, _bp, status, vnode,
258
- expected_version, read_req);
259
- write_sequnlock(&vnode->cb_lock);
260
- return ret;
133
+ return ktime_divns(call->issue_time, NSEC_PER_SEC) + expiry;
261134 }
262135
263
-/*
264
- * decode an AFSCallBack block
265
- */
266
-static void xdr_decode_AFSCallBack(struct afs_call *call,
267
- struct afs_vnode *vnode,
268
- const __be32 **_bp)
136
+static void xdr_decode_AFSCallBack(const __be32 **_bp,
137
+ struct afs_call *call,
138
+ struct afs_status_cb *scb)
269139 {
270
- struct afs_cb_interest *old, *cbi = call->cbi;
271
- const __be32 *bp = *_bp;
272
- u32 cb_expiry;
273
-
274
- write_seqlock(&vnode->cb_lock);
275
-
276
- if (call->cb_break == afs_cb_break_sum(vnode, cbi)) {
277
- vnode->cb_version = ntohl(*bp++);
278
- cb_expiry = ntohl(*bp++);
279
- vnode->cb_type = ntohl(*bp++);
280
- vnode->cb_expires_at = cb_expiry + ktime_get_real_seconds();
281
- old = vnode->cb_interest;
282
- if (old != call->cbi) {
283
- vnode->cb_interest = cbi;
284
- cbi = old;
285
- }
286
- set_bit(AFS_VNODE_CB_PROMISED, &vnode->flags);
287
- } else {
288
- bp += 3;
289
- }
290
-
291
- write_sequnlock(&vnode->cb_lock);
292
- call->cbi = cbi;
293
- *_bp = bp;
294
-}
295
-
296
-static void xdr_decode_AFSCallBack_raw(const __be32 **_bp,
297
- struct afs_callback *cb)
298
-{
140
+ struct afs_callback *cb = &scb->callback;
299141 const __be32 *bp = *_bp;
300142
301
- cb->version = ntohl(*bp++);
302
- cb->expiry = ntohl(*bp++);
303
- cb->type = ntohl(*bp++);
143
+ bp++; /* version */
144
+ cb->expires_at = xdr_decode_expiry(call, ntohl(*bp++));
145
+ bp++; /* type */
146
+ scb->have_cb = true;
304147 *_bp = bp;
305148 }
306149
....@@ -311,14 +154,18 @@
311154 struct afs_volsync *volsync)
312155 {
313156 const __be32 *bp = *_bp;
157
+ u32 creation;
314158
315
- volsync->creation = ntohl(*bp++);
159
+ creation = ntohl(*bp++);
316160 bp++; /* spare2 */
317161 bp++; /* spare3 */
318162 bp++; /* spare4 */
319163 bp++; /* spare5 */
320164 bp++; /* spare6 */
321165 *_bp = bp;
166
+
167
+ if (volsync)
168
+ volsync->creation = creation;
322169 }
323170
324171 /*
....@@ -379,15 +226,18 @@
379226 vs->blocks_in_use = ntohl(*bp++);
380227 vs->part_blocks_avail = ntohl(*bp++);
381228 vs->part_max_blocks = ntohl(*bp++);
229
+ vs->vol_copy_date = 0;
230
+ vs->vol_backup_date = 0;
382231 *_bp = bp;
383232 }
384233
385234 /*
386235 * deliver reply data to an FS.FetchStatus
387236 */
388
-static int afs_deliver_fs_fetch_status_vnode(struct afs_call *call)
237
+static int afs_deliver_fs_fetch_status(struct afs_call *call)
389238 {
390
- struct afs_vnode *vnode = call->reply[0];
239
+ struct afs_operation *op = call->op;
240
+ struct afs_vnode_param *vp = &op->file[op->fetch_status.which];
391241 const __be32 *bp;
392242 int ret;
393243
....@@ -395,16 +245,11 @@
395245 if (ret < 0)
396246 return ret;
397247
398
- _enter("{%x:%u}", vnode->fid.vid, vnode->fid.vnode);
399
-
400248 /* unmarshall the reply once we've received all of it */
401249 bp = call->buffer;
402
- if (afs_decode_status(call, &bp, &vnode->status, vnode,
403
- &call->expected_version, NULL) < 0)
404
- return afs_protocol_error(call, -EBADMSG);
405
- xdr_decode_AFSCallBack(call, vnode, &bp);
406
- if (call->reply[1])
407
- xdr_decode_AFSVolSync(&bp, call->reply[1]);
250
+ xdr_decode_AFSFetchStatus(&bp, call, &vp->scb);
251
+ xdr_decode_AFSCallBack(&bp, call, &vp->scb);
252
+ xdr_decode_AFSVolSync(&bp, &op->volsync);
408253
409254 _leave(" = 0 [done]");
410255 return 0;
....@@ -413,50 +258,39 @@
413258 /*
414259 * FS.FetchStatus operation type
415260 */
416
-static const struct afs_call_type afs_RXFSFetchStatus_vnode = {
417
- .name = "FS.FetchStatus(vnode)",
261
+static const struct afs_call_type afs_RXFSFetchStatus = {
262
+ .name = "FS.FetchStatus",
418263 .op = afs_FS_FetchStatus,
419
- .deliver = afs_deliver_fs_fetch_status_vnode,
264
+ .deliver = afs_deliver_fs_fetch_status,
420265 .destructor = afs_flat_call_destructor,
421266 };
422267
423268 /*
424269 * fetch the status information for a file
425270 */
426
-int afs_fs_fetch_file_status(struct afs_fs_cursor *fc, struct afs_volsync *volsync,
427
- bool new_inode)
271
+void afs_fs_fetch_status(struct afs_operation *op)
428272 {
429
- struct afs_vnode *vnode = fc->vnode;
273
+ struct afs_vnode_param *vp = &op->file[op->fetch_status.which];
430274 struct afs_call *call;
431
- struct afs_net *net = afs_v2net(vnode);
432275 __be32 *bp;
433276
434
- _enter(",%x,{%x:%u},,",
435
- key_serial(fc->key), vnode->fid.vid, vnode->fid.vnode);
277
+ _enter(",%x,{%llx:%llu},,",
278
+ key_serial(op->key), vp->fid.vid, vp->fid.vnode);
436279
437
- call = afs_alloc_flat_call(net, &afs_RXFSFetchStatus_vnode,
280
+ call = afs_alloc_flat_call(op->net, &afs_RXFSFetchStatus,
438281 16, (21 + 3 + 6) * 4);
439
- if (!call) {
440
- fc->ac.error = -ENOMEM;
441
- return -ENOMEM;
442
- }
443
-
444
- call->key = fc->key;
445
- call->reply[0] = vnode;
446
- call->reply[1] = volsync;
447
- call->expected_version = new_inode ? 1 : vnode->status.data_version;
282
+ if (!call)
283
+ return afs_op_nomem(op);
448284
449285 /* marshall the parameters */
450286 bp = call->request;
451287 bp[0] = htonl(FSFETCHSTATUS);
452
- bp[1] = htonl(vnode->fid.vid);
453
- bp[2] = htonl(vnode->fid.vnode);
454
- bp[3] = htonl(vnode->fid.unique);
288
+ bp[1] = htonl(vp->fid.vid);
289
+ bp[2] = htonl(vp->fid.vnode);
290
+ bp[3] = htonl(vp->fid.unique);
455291
456
- call->cb_break = fc->cb_break;
457
- afs_use_fs_server(call, fc->cbi);
458
- trace_afs_make_fs_call(call, &vnode->fid);
459
- return afs_make_call(&fc->ac, call, GFP_NOFS, false);
292
+ trace_afs_make_fs_call(call, &vp->fid);
293
+ afs_make_op_call(op, call, GFP_NOFS);
460294 }
461295
462296 /*
....@@ -464,155 +298,131 @@
464298 */
465299 static int afs_deliver_fs_fetch_data(struct afs_call *call)
466300 {
467
- struct afs_vnode *vnode = call->reply[0];
468
- struct afs_read *req = call->reply[2];
301
+ struct afs_operation *op = call->op;
302
+ struct afs_vnode_param *vp = &op->file[0];
303
+ struct afs_read *req = op->fetch.req;
469304 const __be32 *bp;
470305 unsigned int size;
471
- void *buffer;
472306 int ret;
473307
474
- _enter("{%u,%zu/%u;%llu/%llu}",
475
- call->unmarshall, call->offset, call->count,
476
- req->remain, req->actual_len);
308
+ _enter("{%u,%zu/%llu}",
309
+ call->unmarshall, iov_iter_count(call->iter), req->actual_len);
477310
478311 switch (call->unmarshall) {
479312 case 0:
480313 req->actual_len = 0;
481
- call->offset = 0;
482
- call->unmarshall++;
483
- if (call->operation_ID != FSFETCHDATA64) {
484
- call->unmarshall++;
485
- goto no_msw;
486
- }
487
-
488
- /* extract the upper part of the returned data length of an
489
- * FSFETCHDATA64 op (which should always be 0 using this
490
- * client) */
491
- case 1:
492
- _debug("extract data length (MSW)");
493
- ret = afs_extract_data(call, &call->tmp, 4, true);
494
- if (ret < 0)
495
- return ret;
496
-
497
- req->actual_len = ntohl(call->tmp);
498
- req->actual_len <<= 32;
499
- call->offset = 0;
500
- call->unmarshall++;
501
-
502
- no_msw:
503
- /* extract the returned data length */
504
- case 2:
505
- _debug("extract data length");
506
- ret = afs_extract_data(call, &call->tmp, 4, true);
507
- if (ret < 0)
508
- return ret;
509
-
510
- req->actual_len |= ntohl(call->tmp);
511
- _debug("DATA length: %llu", req->actual_len);
512
-
513
- req->remain = req->actual_len;
514
- call->offset = req->pos & (PAGE_SIZE - 1);
515314 req->index = 0;
516
- if (req->actual_len == 0)
315
+ req->offset = req->pos & (PAGE_SIZE - 1);
316
+ call->unmarshall++;
317
+ if (call->operation_ID == FSFETCHDATA64) {
318
+ afs_extract_to_tmp64(call);
319
+ } else {
320
+ call->tmp_u = htonl(0);
321
+ afs_extract_to_tmp(call);
322
+ }
323
+ fallthrough;
324
+
325
+ /* extract the returned data length */
326
+ case 1:
327
+ _debug("extract data length");
328
+ ret = afs_extract_data(call, true);
329
+ if (ret < 0)
330
+ return ret;
331
+
332
+ req->actual_len = be64_to_cpu(call->tmp64);
333
+ _debug("DATA length: %llu", req->actual_len);
334
+ req->remain = min(req->len, req->actual_len);
335
+ if (req->remain == 0)
517336 goto no_more_data;
337
+
518338 call->unmarshall++;
519339
520340 begin_page:
521341 ASSERTCMP(req->index, <, req->nr_pages);
522
- if (req->remain > PAGE_SIZE - call->offset)
523
- size = PAGE_SIZE - call->offset;
342
+ if (req->remain > PAGE_SIZE - req->offset)
343
+ size = PAGE_SIZE - req->offset;
524344 else
525345 size = req->remain;
526
- call->count = call->offset + size;
527
- ASSERTCMP(call->count, <=, PAGE_SIZE);
528
- req->remain -= size;
346
+ call->bvec[0].bv_len = size;
347
+ call->bvec[0].bv_offset = req->offset;
348
+ call->bvec[0].bv_page = req->pages[req->index];
349
+ iov_iter_bvec(&call->def_iter, READ, call->bvec, 1, size);
350
+ ASSERTCMP(size, <=, PAGE_SIZE);
351
+ fallthrough;
529352
530353 /* extract the returned data */
531
- case 3:
532
- _debug("extract data %llu/%llu %zu/%u",
533
- req->remain, req->actual_len, call->offset, call->count);
354
+ case 2:
355
+ _debug("extract data %zu/%llu",
356
+ iov_iter_count(call->iter), req->remain);
534357
535
- buffer = kmap(req->pages[req->index]);
536
- ret = afs_extract_data(call, buffer, call->count, true);
537
- kunmap(req->pages[req->index]);
358
+ ret = afs_extract_data(call, true);
538359 if (ret < 0)
539360 return ret;
540
- if (call->offset == PAGE_SIZE) {
541
- if (req->page_done)
542
- req->page_done(call, req);
361
+ req->remain -= call->bvec[0].bv_len;
362
+ req->offset += call->bvec[0].bv_len;
363
+ ASSERTCMP(req->offset, <=, PAGE_SIZE);
364
+ if (req->offset == PAGE_SIZE) {
365
+ req->offset = 0;
543366 req->index++;
544
- if (req->remain > 0) {
545
- call->offset = 0;
546
- if (req->index >= req->nr_pages) {
547
- call->unmarshall = 4;
548
- goto begin_discard;
549
- }
367
+ if (req->remain > 0)
550368 goto begin_page;
551
- }
552369 }
553
- goto no_more_data;
370
+
371
+ ASSERTCMP(req->remain, ==, 0);
372
+ if (req->actual_len <= req->len)
373
+ goto no_more_data;
554374
555375 /* Discard any excess data the server gave us */
556
- begin_discard:
557
- case 4:
558
- size = min_t(loff_t, sizeof(afs_discard_buffer), req->remain);
559
- call->count = size;
560
- _debug("extract discard %llu/%llu %zu/%u",
561
- req->remain, req->actual_len, call->offset, call->count);
376
+ afs_extract_discard(call, req->actual_len - req->len);
377
+ call->unmarshall = 3;
378
+ fallthrough;
562379
563
- call->offset = 0;
564
- ret = afs_extract_data(call, afs_discard_buffer, call->count, true);
565
- req->remain -= call->offset;
380
+ case 3:
381
+ _debug("extract discard %zu/%llu",
382
+ iov_iter_count(call->iter), req->actual_len - req->len);
383
+
384
+ ret = afs_extract_data(call, true);
566385 if (ret < 0)
567386 return ret;
568
- if (req->remain > 0)
569
- goto begin_discard;
570387
571388 no_more_data:
572
- call->offset = 0;
573
- call->unmarshall = 5;
389
+ call->unmarshall = 4;
390
+ afs_extract_to_buf(call, (21 + 3 + 6) * 4);
391
+ fallthrough;
574392
575393 /* extract the metadata */
576
- case 5:
577
- ret = afs_extract_data(call, call->buffer,
578
- (21 + 3 + 6) * 4, false);
394
+ case 4:
395
+ ret = afs_extract_data(call, false);
579396 if (ret < 0)
580397 return ret;
581398
582399 bp = call->buffer;
583
- if (afs_decode_status(call, &bp, &vnode->status, vnode,
584
- &vnode->status.data_version, req) < 0)
585
- return afs_protocol_error(call, -EBADMSG);
586
- xdr_decode_AFSCallBack(call, vnode, &bp);
587
- if (call->reply[1])
588
- xdr_decode_AFSVolSync(&bp, call->reply[1]);
400
+ xdr_decode_AFSFetchStatus(&bp, call, &vp->scb);
401
+ xdr_decode_AFSCallBack(&bp, call, &vp->scb);
402
+ xdr_decode_AFSVolSync(&bp, &op->volsync);
589403
590
- call->offset = 0;
404
+ req->data_version = vp->scb.status.data_version;
405
+ req->file_size = vp->scb.status.size;
406
+
591407 call->unmarshall++;
592408
593
- case 6:
409
+ case 5:
594410 break;
595411 }
596412
597413 for (; req->index < req->nr_pages; req->index++) {
598
- if (call->count < PAGE_SIZE)
414
+ if (req->offset < PAGE_SIZE)
599415 zero_user_segment(req->pages[req->index],
600
- call->count, PAGE_SIZE);
601
- if (req->page_done)
602
- req->page_done(call, req);
603
- call->count = 0;
416
+ req->offset, PAGE_SIZE);
417
+ req->offset = 0;
604418 }
419
+
420
+ if (req->page_done)
421
+ for (req->index = 0; req->index < req->nr_pages; req->index++)
422
+ req->page_done(req);
605423
606424 _leave(" = 0 [done]");
607425 return 0;
608
-}
609
-
610
-static void afs_fetch_data_destructor(struct afs_call *call)
611
-{
612
- struct afs_read *req = call->reply[2];
613
-
614
- afs_put_read(req);
615
- afs_flat_call_destructor(call);
616426 }
617427
618428 /*
....@@ -622,97 +432,79 @@
622432 .name = "FS.FetchData",
623433 .op = afs_FS_FetchData,
624434 .deliver = afs_deliver_fs_fetch_data,
625
- .destructor = afs_fetch_data_destructor,
435
+ .destructor = afs_flat_call_destructor,
626436 };
627437
628438 static const struct afs_call_type afs_RXFSFetchData64 = {
629439 .name = "FS.FetchData64",
630440 .op = afs_FS_FetchData64,
631441 .deliver = afs_deliver_fs_fetch_data,
632
- .destructor = afs_fetch_data_destructor,
442
+ .destructor = afs_flat_call_destructor,
633443 };
634444
635445 /*
636446 * fetch data from a very large file
637447 */
638
-static int afs_fs_fetch_data64(struct afs_fs_cursor *fc, struct afs_read *req)
448
+static void afs_fs_fetch_data64(struct afs_operation *op)
639449 {
640
- struct afs_vnode *vnode = fc->vnode;
450
+ struct afs_vnode_param *vp = &op->file[0];
451
+ struct afs_read *req = op->fetch.req;
641452 struct afs_call *call;
642
- struct afs_net *net = afs_v2net(vnode);
643453 __be32 *bp;
644454
645455 _enter("");
646456
647
- call = afs_alloc_flat_call(net, &afs_RXFSFetchData64, 32, (21 + 3 + 6) * 4);
457
+ call = afs_alloc_flat_call(op->net, &afs_RXFSFetchData64, 32, (21 + 3 + 6) * 4);
648458 if (!call)
649
- return -ENOMEM;
650
-
651
- call->key = fc->key;
652
- call->reply[0] = vnode;
653
- call->reply[1] = NULL; /* volsync */
654
- call->reply[2] = req;
655
- call->expected_version = vnode->status.data_version;
459
+ return afs_op_nomem(op);
656460
657461 /* marshall the parameters */
658462 bp = call->request;
659463 bp[0] = htonl(FSFETCHDATA64);
660
- bp[1] = htonl(vnode->fid.vid);
661
- bp[2] = htonl(vnode->fid.vnode);
662
- bp[3] = htonl(vnode->fid.unique);
464
+ bp[1] = htonl(vp->fid.vid);
465
+ bp[2] = htonl(vp->fid.vnode);
466
+ bp[3] = htonl(vp->fid.unique);
663467 bp[4] = htonl(upper_32_bits(req->pos));
664468 bp[5] = htonl(lower_32_bits(req->pos));
665469 bp[6] = 0;
666470 bp[7] = htonl(lower_32_bits(req->len));
667471
668
- refcount_inc(&req->usage);
669
- call->cb_break = fc->cb_break;
670
- afs_use_fs_server(call, fc->cbi);
671
- trace_afs_make_fs_call(call, &vnode->fid);
672
- return afs_make_call(&fc->ac, call, GFP_NOFS, false);
472
+ trace_afs_make_fs_call(call, &vp->fid);
473
+ afs_make_op_call(op, call, GFP_NOFS);
673474 }
674475
675476 /*
676477 * fetch data from a file
677478 */
678
-int afs_fs_fetch_data(struct afs_fs_cursor *fc, struct afs_read *req)
479
+void afs_fs_fetch_data(struct afs_operation *op)
679480 {
680
- struct afs_vnode *vnode = fc->vnode;
481
+ struct afs_vnode_param *vp = &op->file[0];
681482 struct afs_call *call;
682
- struct afs_net *net = afs_v2net(vnode);
483
+ struct afs_read *req = op->fetch.req;
683484 __be32 *bp;
684485
685486 if (upper_32_bits(req->pos) ||
686487 upper_32_bits(req->len) ||
687488 upper_32_bits(req->pos + req->len))
688
- return afs_fs_fetch_data64(fc, req);
489
+ return afs_fs_fetch_data64(op);
689490
690491 _enter("");
691492
692
- call = afs_alloc_flat_call(net, &afs_RXFSFetchData, 24, (21 + 3 + 6) * 4);
493
+ call = afs_alloc_flat_call(op->net, &afs_RXFSFetchData, 24, (21 + 3 + 6) * 4);
693494 if (!call)
694
- return -ENOMEM;
695
-
696
- call->key = fc->key;
697
- call->reply[0] = vnode;
698
- call->reply[1] = NULL; /* volsync */
699
- call->reply[2] = req;
700
- call->expected_version = vnode->status.data_version;
495
+ return afs_op_nomem(op);
701496
702497 /* marshall the parameters */
703498 bp = call->request;
704499 bp[0] = htonl(FSFETCHDATA);
705
- bp[1] = htonl(vnode->fid.vid);
706
- bp[2] = htonl(vnode->fid.vnode);
707
- bp[3] = htonl(vnode->fid.unique);
500
+ bp[1] = htonl(vp->fid.vid);
501
+ bp[2] = htonl(vp->fid.vnode);
502
+ bp[3] = htonl(vp->fid.unique);
708503 bp[4] = htonl(lower_32_bits(req->pos));
709504 bp[5] = htonl(lower_32_bits(req->len));
710505
711
- refcount_inc(&req->usage);
712
- call->cb_break = fc->cb_break;
713
- afs_use_fs_server(call, fc->cbi);
714
- trace_afs_make_fs_call(call, &vnode->fid);
715
- return afs_make_call(&fc->ac, call, GFP_NOFS, false);
506
+ trace_afs_make_fs_call(call, &vp->fid);
507
+ afs_make_op_call(op, call, GFP_NOFS);
716508 }
717509
718510 /*
....@@ -720,11 +512,11 @@
720512 */
721513 static int afs_deliver_fs_create_vnode(struct afs_call *call)
722514 {
723
- struct afs_vnode *vnode = call->reply[0];
515
+ struct afs_operation *op = call->op;
516
+ struct afs_vnode_param *dvp = &op->file[0];
517
+ struct afs_vnode_param *vp = &op->file[1];
724518 const __be32 *bp;
725519 int ret;
726
-
727
- _enter("{%u}", call->unmarshall);
728520
729521 ret = afs_transfer_reply(call);
730522 if (ret < 0)
....@@ -732,13 +524,11 @@
732524
733525 /* unmarshall the reply once we've received all of it */
734526 bp = call->buffer;
735
- xdr_decode_AFSFid(&bp, call->reply[1]);
736
- if (afs_decode_status(call, &bp, call->reply[2], NULL, NULL, NULL) < 0 ||
737
- afs_decode_status(call, &bp, &vnode->status, vnode,
738
- &call->expected_version, NULL) < 0)
739
- return afs_protocol_error(call, -EBADMSG);
740
- xdr_decode_AFSCallBack_raw(&bp, call->reply[3]);
741
- /* xdr_decode_AFSVolSync(&bp, call->reply[X]); */
527
+ xdr_decode_AFSFid(&bp, &op->file[1].fid);
528
+ xdr_decode_AFSFetchStatus(&bp, call, &vp->scb);
529
+ xdr_decode_AFSFetchStatus(&bp, call, &dvp->scb);
530
+ xdr_decode_AFSCallBack(&bp, call, &vp->scb);
531
+ xdr_decode_AFSVolSync(&bp, &op->volsync);
742532
743533 _leave(" = 0 [done]");
744534 return 0;
....@@ -754,6 +544,52 @@
754544 .destructor = afs_flat_call_destructor,
755545 };
756546
547
+/*
548
+ * Create a file.
549
+ */
550
+void afs_fs_create_file(struct afs_operation *op)
551
+{
552
+ const struct qstr *name = &op->dentry->d_name;
553
+ struct afs_vnode_param *dvp = &op->file[0];
554
+ struct afs_call *call;
555
+ size_t namesz, reqsz, padsz;
556
+ __be32 *bp;
557
+
558
+ _enter("");
559
+
560
+ namesz = name->len;
561
+ padsz = (4 - (namesz & 3)) & 3;
562
+ reqsz = (5 * 4) + namesz + padsz + (6 * 4);
563
+
564
+ call = afs_alloc_flat_call(op->net, &afs_RXFSCreateFile,
565
+ reqsz, (3 + 21 + 21 + 3 + 6) * 4);
566
+ if (!call)
567
+ return afs_op_nomem(op);
568
+
569
+ /* marshall the parameters */
570
+ bp = call->request;
571
+ *bp++ = htonl(FSCREATEFILE);
572
+ *bp++ = htonl(dvp->fid.vid);
573
+ *bp++ = htonl(dvp->fid.vnode);
574
+ *bp++ = htonl(dvp->fid.unique);
575
+ *bp++ = htonl(namesz);
576
+ memcpy(bp, name->name, namesz);
577
+ bp = (void *) bp + namesz;
578
+ if (padsz > 0) {
579
+ memset(bp, 0, padsz);
580
+ bp = (void *) bp + padsz;
581
+ }
582
+ *bp++ = htonl(AFS_SET_MODE | AFS_SET_MTIME);
583
+ *bp++ = htonl(op->mtime.tv_sec); /* mtime */
584
+ *bp++ = 0; /* owner */
585
+ *bp++ = 0; /* group */
586
+ *bp++ = htonl(op->create.mode & S_IALLUGO); /* unix mode */
587
+ *bp++ = 0; /* segment size */
588
+
589
+ trace_afs_make_fs_call1(call, &dvp->fid, name);
590
+ afs_make_op_call(op, call, GFP_NOFS);
591
+}
592
+
757593 static const struct afs_call_type afs_RXFSMakeDir = {
758594 .name = "FS.MakeDir",
759595 .op = afs_FS_MakeDir,
....@@ -762,76 +598,60 @@
762598 };
763599
764600 /*
765
- * create a file or make a directory
601
+ * Create a new directory
766602 */
767
-int afs_fs_create(struct afs_fs_cursor *fc,
768
- const char *name,
769
- umode_t mode,
770
- u64 current_data_version,
771
- struct afs_fid *newfid,
772
- struct afs_file_status *newstatus,
773
- struct afs_callback *newcb)
603
+void afs_fs_make_dir(struct afs_operation *op)
774604 {
775
- struct afs_vnode *vnode = fc->vnode;
605
+ const struct qstr *name = &op->dentry->d_name;
606
+ struct afs_vnode_param *dvp = &op->file[0];
776607 struct afs_call *call;
777
- struct afs_net *net = afs_v2net(vnode);
778608 size_t namesz, reqsz, padsz;
779609 __be32 *bp;
780610
781611 _enter("");
782612
783
- namesz = strlen(name);
613
+ namesz = name->len;
784614 padsz = (4 - (namesz & 3)) & 3;
785615 reqsz = (5 * 4) + namesz + padsz + (6 * 4);
786616
787
- call = afs_alloc_flat_call(
788
- net, S_ISDIR(mode) ? &afs_RXFSMakeDir : &afs_RXFSCreateFile,
789
- reqsz, (3 + 21 + 21 + 3 + 6) * 4);
617
+ call = afs_alloc_flat_call(op->net, &afs_RXFSMakeDir,
618
+ reqsz, (3 + 21 + 21 + 3 + 6) * 4);
790619 if (!call)
791
- return -ENOMEM;
792
-
793
- call->key = fc->key;
794
- call->reply[0] = vnode;
795
- call->reply[1] = newfid;
796
- call->reply[2] = newstatus;
797
- call->reply[3] = newcb;
798
- call->expected_version = current_data_version + 1;
620
+ return afs_op_nomem(op);
799621
800622 /* marshall the parameters */
801623 bp = call->request;
802
- *bp++ = htonl(S_ISDIR(mode) ? FSMAKEDIR : FSCREATEFILE);
803
- *bp++ = htonl(vnode->fid.vid);
804
- *bp++ = htonl(vnode->fid.vnode);
805
- *bp++ = htonl(vnode->fid.unique);
624
+ *bp++ = htonl(FSMAKEDIR);
625
+ *bp++ = htonl(dvp->fid.vid);
626
+ *bp++ = htonl(dvp->fid.vnode);
627
+ *bp++ = htonl(dvp->fid.unique);
806628 *bp++ = htonl(namesz);
807
- memcpy(bp, name, namesz);
629
+ memcpy(bp, name->name, namesz);
808630 bp = (void *) bp + namesz;
809631 if (padsz > 0) {
810632 memset(bp, 0, padsz);
811633 bp = (void *) bp + padsz;
812634 }
813635 *bp++ = htonl(AFS_SET_MODE | AFS_SET_MTIME);
814
- *bp++ = htonl(vnode->vfs_inode.i_mtime.tv_sec); /* mtime */
636
+ *bp++ = htonl(op->mtime.tv_sec); /* mtime */
815637 *bp++ = 0; /* owner */
816638 *bp++ = 0; /* group */
817
- *bp++ = htonl(mode & S_IALLUGO); /* unix mode */
639
+ *bp++ = htonl(op->create.mode & S_IALLUGO); /* unix mode */
818640 *bp++ = 0; /* segment size */
819641
820
- afs_use_fs_server(call, fc->cbi);
821
- trace_afs_make_fs_call(call, &vnode->fid);
822
- return afs_make_call(&fc->ac, call, GFP_NOFS, false);
642
+ trace_afs_make_fs_call1(call, &dvp->fid, name);
643
+ afs_make_op_call(op, call, GFP_NOFS);
823644 }
824645
825646 /*
826
- * deliver reply data to an FS.RemoveFile or FS.RemoveDir
647
+ * Deliver reply data to any operation that returns status and volume sync.
827648 */
828
-static int afs_deliver_fs_remove(struct afs_call *call)
649
+static int afs_deliver_fs_file_status_and_vol(struct afs_call *call)
829650 {
830
- struct afs_vnode *vnode = call->reply[0];
651
+ struct afs_operation *op = call->op;
652
+ struct afs_vnode_param *vp = &op->file[0];
831653 const __be32 *bp;
832654 int ret;
833
-
834
- _enter("{%u}", call->unmarshall);
835655
836656 ret = afs_transfer_reply(call);
837657 if (ret < 0)
....@@ -839,77 +659,108 @@
839659
840660 /* unmarshall the reply once we've received all of it */
841661 bp = call->buffer;
842
- if (afs_decode_status(call, &bp, &vnode->status, vnode,
843
- &call->expected_version, NULL) < 0)
844
- return afs_protocol_error(call, -EBADMSG);
845
- /* xdr_decode_AFSVolSync(&bp, call->reply[X]); */
662
+ xdr_decode_AFSFetchStatus(&bp, call, &vp->scb);
663
+ xdr_decode_AFSVolSync(&bp, &op->volsync);
846664
847665 _leave(" = 0 [done]");
848666 return 0;
849667 }
850668
851669 /*
852
- * FS.RemoveDir/FS.RemoveFile operation type
670
+ * FS.RemoveFile operation type
853671 */
854672 static const struct afs_call_type afs_RXFSRemoveFile = {
855673 .name = "FS.RemoveFile",
856674 .op = afs_FS_RemoveFile,
857
- .deliver = afs_deliver_fs_remove,
858
- .destructor = afs_flat_call_destructor,
859
-};
860
-
861
-static const struct afs_call_type afs_RXFSRemoveDir = {
862
- .name = "FS.RemoveDir",
863
- .op = afs_FS_RemoveDir,
864
- .deliver = afs_deliver_fs_remove,
675
+ .deliver = afs_deliver_fs_file_status_and_vol,
865676 .destructor = afs_flat_call_destructor,
866677 };
867678
868679 /*
869
- * remove a file or directory
680
+ * Remove a file.
870681 */
871
-int afs_fs_remove(struct afs_fs_cursor *fc, const char *name, bool isdir,
872
- u64 current_data_version)
682
+void afs_fs_remove_file(struct afs_operation *op)
873683 {
874
- struct afs_vnode *vnode = fc->vnode;
684
+ const struct qstr *name = &op->dentry->d_name;
685
+ struct afs_vnode_param *dvp = &op->file[0];
875686 struct afs_call *call;
876
- struct afs_net *net = afs_v2net(vnode);
877687 size_t namesz, reqsz, padsz;
878688 __be32 *bp;
879689
880690 _enter("");
881691
882
- namesz = strlen(name);
692
+ namesz = name->len;
883693 padsz = (4 - (namesz & 3)) & 3;
884694 reqsz = (5 * 4) + namesz + padsz;
885695
886
- call = afs_alloc_flat_call(
887
- net, isdir ? &afs_RXFSRemoveDir : &afs_RXFSRemoveFile,
888
- reqsz, (21 + 6) * 4);
696
+ call = afs_alloc_flat_call(op->net, &afs_RXFSRemoveFile,
697
+ reqsz, (21 + 6) * 4);
889698 if (!call)
890
- return -ENOMEM;
891
-
892
- call->key = fc->key;
893
- call->reply[0] = vnode;
894
- call->expected_version = current_data_version + 1;
699
+ return afs_op_nomem(op);
895700
896701 /* marshall the parameters */
897702 bp = call->request;
898
- *bp++ = htonl(isdir ? FSREMOVEDIR : FSREMOVEFILE);
899
- *bp++ = htonl(vnode->fid.vid);
900
- *bp++ = htonl(vnode->fid.vnode);
901
- *bp++ = htonl(vnode->fid.unique);
703
+ *bp++ = htonl(FSREMOVEFILE);
704
+ *bp++ = htonl(dvp->fid.vid);
705
+ *bp++ = htonl(dvp->fid.vnode);
706
+ *bp++ = htonl(dvp->fid.unique);
902707 *bp++ = htonl(namesz);
903
- memcpy(bp, name, namesz);
708
+ memcpy(bp, name->name, namesz);
904709 bp = (void *) bp + namesz;
905710 if (padsz > 0) {
906711 memset(bp, 0, padsz);
907712 bp = (void *) bp + padsz;
908713 }
909714
910
- afs_use_fs_server(call, fc->cbi);
911
- trace_afs_make_fs_call(call, &vnode->fid);
912
- return afs_make_call(&fc->ac, call, GFP_NOFS, false);
715
+ trace_afs_make_fs_call1(call, &dvp->fid, name);
716
+ afs_make_op_call(op, call, GFP_NOFS);
717
+}
718
+
719
+static const struct afs_call_type afs_RXFSRemoveDir = {
720
+ .name = "FS.RemoveDir",
721
+ .op = afs_FS_RemoveDir,
722
+ .deliver = afs_deliver_fs_file_status_and_vol,
723
+ .destructor = afs_flat_call_destructor,
724
+};
725
+
726
+/*
727
+ * Remove a directory.
728
+ */
729
+void afs_fs_remove_dir(struct afs_operation *op)
730
+{
731
+ const struct qstr *name = &op->dentry->d_name;
732
+ struct afs_vnode_param *dvp = &op->file[0];
733
+ struct afs_call *call;
734
+ size_t namesz, reqsz, padsz;
735
+ __be32 *bp;
736
+
737
+ _enter("");
738
+
739
+ namesz = name->len;
740
+ padsz = (4 - (namesz & 3)) & 3;
741
+ reqsz = (5 * 4) + namesz + padsz;
742
+
743
+ call = afs_alloc_flat_call(op->net, &afs_RXFSRemoveDir,
744
+ reqsz, (21 + 6) * 4);
745
+ if (!call)
746
+ return afs_op_nomem(op);
747
+
748
+ /* marshall the parameters */
749
+ bp = call->request;
750
+ *bp++ = htonl(FSREMOVEDIR);
751
+ *bp++ = htonl(dvp->fid.vid);
752
+ *bp++ = htonl(dvp->fid.vnode);
753
+ *bp++ = htonl(dvp->fid.unique);
754
+ *bp++ = htonl(namesz);
755
+ memcpy(bp, name->name, namesz);
756
+ bp = (void *) bp + namesz;
757
+ if (padsz > 0) {
758
+ memset(bp, 0, padsz);
759
+ bp = (void *) bp + padsz;
760
+ }
761
+
762
+ trace_afs_make_fs_call1(call, &dvp->fid, name);
763
+ afs_make_op_call(op, call, GFP_NOFS);
913764 }
914765
915766 /*
....@@ -917,7 +768,9 @@
917768 */
918769 static int afs_deliver_fs_link(struct afs_call *call)
919770 {
920
- struct afs_vnode *dvnode = call->reply[0], *vnode = call->reply[1];
771
+ struct afs_operation *op = call->op;
772
+ struct afs_vnode_param *dvp = &op->file[0];
773
+ struct afs_vnode_param *vp = &op->file[1];
921774 const __be32 *bp;
922775 int ret;
923776
....@@ -929,11 +782,9 @@
929782
930783 /* unmarshall the reply once we've received all of it */
931784 bp = call->buffer;
932
- if (afs_decode_status(call, &bp, &vnode->status, vnode, NULL, NULL) < 0 ||
933
- afs_decode_status(call, &bp, &dvnode->status, dvnode,
934
- &call->expected_version, NULL) < 0)
935
- return afs_protocol_error(call, -EBADMSG);
936
- /* xdr_decode_AFSVolSync(&bp, call->reply[X]); */
785
+ xdr_decode_AFSFetchStatus(&bp, call, &vp->scb);
786
+ xdr_decode_AFSFetchStatus(&bp, call, &dvp->scb);
787
+ xdr_decode_AFSVolSync(&bp, &op->volsync);
937788
938789 _leave(" = 0 [done]");
939790 return 0;
....@@ -952,50 +803,44 @@
952803 /*
953804 * make a hard link
954805 */
955
-int afs_fs_link(struct afs_fs_cursor *fc, struct afs_vnode *vnode,
956
- const char *name, u64 current_data_version)
806
+void afs_fs_link(struct afs_operation *op)
957807 {
958
- struct afs_vnode *dvnode = fc->vnode;
808
+ const struct qstr *name = &op->dentry->d_name;
809
+ struct afs_vnode_param *dvp = &op->file[0];
810
+ struct afs_vnode_param *vp = &op->file[1];
959811 struct afs_call *call;
960
- struct afs_net *net = afs_v2net(vnode);
961812 size_t namesz, reqsz, padsz;
962813 __be32 *bp;
963814
964815 _enter("");
965816
966
- namesz = strlen(name);
817
+ namesz = name->len;
967818 padsz = (4 - (namesz & 3)) & 3;
968819 reqsz = (5 * 4) + namesz + padsz + (3 * 4);
969820
970
- call = afs_alloc_flat_call(net, &afs_RXFSLink, reqsz, (21 + 21 + 6) * 4);
821
+ call = afs_alloc_flat_call(op->net, &afs_RXFSLink, reqsz, (21 + 21 + 6) * 4);
971822 if (!call)
972
- return -ENOMEM;
973
-
974
- call->key = fc->key;
975
- call->reply[0] = dvnode;
976
- call->reply[1] = vnode;
977
- call->expected_version = current_data_version + 1;
823
+ return afs_op_nomem(op);
978824
979825 /* marshall the parameters */
980826 bp = call->request;
981827 *bp++ = htonl(FSLINK);
982
- *bp++ = htonl(dvnode->fid.vid);
983
- *bp++ = htonl(dvnode->fid.vnode);
984
- *bp++ = htonl(dvnode->fid.unique);
828
+ *bp++ = htonl(dvp->fid.vid);
829
+ *bp++ = htonl(dvp->fid.vnode);
830
+ *bp++ = htonl(dvp->fid.unique);
985831 *bp++ = htonl(namesz);
986
- memcpy(bp, name, namesz);
832
+ memcpy(bp, name->name, namesz);
987833 bp = (void *) bp + namesz;
988834 if (padsz > 0) {
989835 memset(bp, 0, padsz);
990836 bp = (void *) bp + padsz;
991837 }
992
- *bp++ = htonl(vnode->fid.vid);
993
- *bp++ = htonl(vnode->fid.vnode);
994
- *bp++ = htonl(vnode->fid.unique);
838
+ *bp++ = htonl(vp->fid.vid);
839
+ *bp++ = htonl(vp->fid.vnode);
840
+ *bp++ = htonl(vp->fid.unique);
995841
996
- afs_use_fs_server(call, fc->cbi);
997
- trace_afs_make_fs_call(call, &vnode->fid);
998
- return afs_make_call(&fc->ac, call, GFP_NOFS, false);
842
+ trace_afs_make_fs_call1(call, &vp->fid, name);
843
+ afs_make_op_call(op, call, GFP_NOFS);
999844 }
1000845
1001846 /*
....@@ -1003,7 +848,9 @@
1003848 */
1004849 static int afs_deliver_fs_symlink(struct afs_call *call)
1005850 {
1006
- struct afs_vnode *vnode = call->reply[0];
851
+ struct afs_operation *op = call->op;
852
+ struct afs_vnode_param *dvp = &op->file[0];
853
+ struct afs_vnode_param *vp = &op->file[1];
1007854 const __be32 *bp;
1008855 int ret;
1009856
....@@ -1015,12 +862,10 @@
1015862
1016863 /* unmarshall the reply once we've received all of it */
1017864 bp = call->buffer;
1018
- xdr_decode_AFSFid(&bp, call->reply[1]);
1019
- if (afs_decode_status(call, &bp, call->reply[2], NULL, NULL, NULL) ||
1020
- afs_decode_status(call, &bp, &vnode->status, vnode,
1021
- &call->expected_version, NULL) < 0)
1022
- return afs_protocol_error(call, -EBADMSG);
1023
- /* xdr_decode_AFSVolSync(&bp, call->reply[X]); */
865
+ xdr_decode_AFSFid(&bp, &vp->fid);
866
+ xdr_decode_AFSFetchStatus(&bp, call, &vp->scb);
867
+ xdr_decode_AFSFetchStatus(&bp, call, &dvp->scb);
868
+ xdr_decode_AFSVolSync(&bp, &op->volsync);
1024869
1025870 _leave(" = 0 [done]");
1026871 return 0;
....@@ -1039,70 +884,58 @@
1039884 /*
1040885 * create a symbolic link
1041886 */
1042
-int afs_fs_symlink(struct afs_fs_cursor *fc,
1043
- const char *name,
1044
- const char *contents,
1045
- u64 current_data_version,
1046
- struct afs_fid *newfid,
1047
- struct afs_file_status *newstatus)
887
+void afs_fs_symlink(struct afs_operation *op)
1048888 {
1049
- struct afs_vnode *vnode = fc->vnode;
889
+ const struct qstr *name = &op->dentry->d_name;
890
+ struct afs_vnode_param *dvp = &op->file[0];
1050891 struct afs_call *call;
1051
- struct afs_net *net = afs_v2net(vnode);
1052892 size_t namesz, reqsz, padsz, c_namesz, c_padsz;
1053893 __be32 *bp;
1054894
1055895 _enter("");
1056896
1057
- namesz = strlen(name);
897
+ namesz = name->len;
1058898 padsz = (4 - (namesz & 3)) & 3;
1059899
1060
- c_namesz = strlen(contents);
900
+ c_namesz = strlen(op->create.symlink);
1061901 c_padsz = (4 - (c_namesz & 3)) & 3;
1062902
1063903 reqsz = (6 * 4) + namesz + padsz + c_namesz + c_padsz + (6 * 4);
1064904
1065
- call = afs_alloc_flat_call(net, &afs_RXFSSymlink, reqsz,
905
+ call = afs_alloc_flat_call(op->net, &afs_RXFSSymlink, reqsz,
1066906 (3 + 21 + 21 + 6) * 4);
1067907 if (!call)
1068
- return -ENOMEM;
1069
-
1070
- call->key = fc->key;
1071
- call->reply[0] = vnode;
1072
- call->reply[1] = newfid;
1073
- call->reply[2] = newstatus;
1074
- call->expected_version = current_data_version + 1;
908
+ return afs_op_nomem(op);
1075909
1076910 /* marshall the parameters */
1077911 bp = call->request;
1078912 *bp++ = htonl(FSSYMLINK);
1079
- *bp++ = htonl(vnode->fid.vid);
1080
- *bp++ = htonl(vnode->fid.vnode);
1081
- *bp++ = htonl(vnode->fid.unique);
913
+ *bp++ = htonl(dvp->fid.vid);
914
+ *bp++ = htonl(dvp->fid.vnode);
915
+ *bp++ = htonl(dvp->fid.unique);
1082916 *bp++ = htonl(namesz);
1083
- memcpy(bp, name, namesz);
917
+ memcpy(bp, name->name, namesz);
1084918 bp = (void *) bp + namesz;
1085919 if (padsz > 0) {
1086920 memset(bp, 0, padsz);
1087921 bp = (void *) bp + padsz;
1088922 }
1089923 *bp++ = htonl(c_namesz);
1090
- memcpy(bp, contents, c_namesz);
924
+ memcpy(bp, op->create.symlink, c_namesz);
1091925 bp = (void *) bp + c_namesz;
1092926 if (c_padsz > 0) {
1093927 memset(bp, 0, c_padsz);
1094928 bp = (void *) bp + c_padsz;
1095929 }
1096930 *bp++ = htonl(AFS_SET_MODE | AFS_SET_MTIME);
1097
- *bp++ = htonl(vnode->vfs_inode.i_mtime.tv_sec); /* mtime */
931
+ *bp++ = htonl(op->mtime.tv_sec); /* mtime */
1098932 *bp++ = 0; /* owner */
1099933 *bp++ = 0; /* group */
1100934 *bp++ = htonl(S_IRWXUGO); /* unix mode */
1101935 *bp++ = 0; /* segment size */
1102936
1103
- afs_use_fs_server(call, fc->cbi);
1104
- trace_afs_make_fs_call(call, &vnode->fid);
1105
- return afs_make_call(&fc->ac, call, GFP_NOFS, false);
937
+ trace_afs_make_fs_call1(call, &dvp->fid, name);
938
+ afs_make_op_call(op, call, GFP_NOFS);
1106939 }
1107940
1108941 /*
....@@ -1110,26 +943,23 @@
1110943 */
1111944 static int afs_deliver_fs_rename(struct afs_call *call)
1112945 {
1113
- struct afs_vnode *orig_dvnode = call->reply[0], *new_dvnode = call->reply[1];
946
+ struct afs_operation *op = call->op;
947
+ struct afs_vnode_param *orig_dvp = &op->file[0];
948
+ struct afs_vnode_param *new_dvp = &op->file[1];
1114949 const __be32 *bp;
1115950 int ret;
1116
-
1117
- _enter("{%u}", call->unmarshall);
1118951
1119952 ret = afs_transfer_reply(call);
1120953 if (ret < 0)
1121954 return ret;
1122955
1123
- /* unmarshall the reply once we've received all of it */
1124956 bp = call->buffer;
1125
- if (afs_decode_status(call, &bp, &orig_dvnode->status, orig_dvnode,
1126
- &call->expected_version, NULL) < 0)
1127
- return afs_protocol_error(call, -EBADMSG);
1128
- if (new_dvnode != orig_dvnode &&
1129
- afs_decode_status(call, &bp, &new_dvnode->status, new_dvnode,
1130
- &call->expected_version_2, NULL) < 0)
1131
- return afs_protocol_error(call, -EBADMSG);
1132
- /* xdr_decode_AFSVolSync(&bp, call->reply[X]); */
957
+ /* If the two dirs are the same, we have two copies of the same status
958
+ * report, so we just decode it twice.
959
+ */
960
+ xdr_decode_AFSFetchStatus(&bp, call, &orig_dvp->scb);
961
+ xdr_decode_AFSFetchStatus(&bp, call, &new_dvp->scb);
962
+ xdr_decode_AFSVolSync(&bp, &op->volsync);
1133963
1134964 _leave(" = 0 [done]");
1135965 return 0;
....@@ -1146,27 +976,24 @@
1146976 };
1147977
1148978 /*
1149
- * create a symbolic link
979
+ * Rename/move a file or directory.
1150980 */
1151
-int afs_fs_rename(struct afs_fs_cursor *fc,
1152
- const char *orig_name,
1153
- struct afs_vnode *new_dvnode,
1154
- const char *new_name,
1155
- u64 current_orig_data_version,
1156
- u64 current_new_data_version)
981
+void afs_fs_rename(struct afs_operation *op)
1157982 {
1158
- struct afs_vnode *orig_dvnode = fc->vnode;
983
+ struct afs_vnode_param *orig_dvp = &op->file[0];
984
+ struct afs_vnode_param *new_dvp = &op->file[1];
985
+ const struct qstr *orig_name = &op->dentry->d_name;
986
+ const struct qstr *new_name = &op->dentry_2->d_name;
1159987 struct afs_call *call;
1160
- struct afs_net *net = afs_v2net(orig_dvnode);
1161988 size_t reqsz, o_namesz, o_padsz, n_namesz, n_padsz;
1162989 __be32 *bp;
1163990
1164991 _enter("");
1165992
1166
- o_namesz = strlen(orig_name);
993
+ o_namesz = orig_name->len;
1167994 o_padsz = (4 - (o_namesz & 3)) & 3;
1168995
1169
- n_namesz = strlen(new_name);
996
+ n_namesz = new_name->len;
1170997 n_padsz = (4 - (n_namesz & 3)) & 3;
1171998
1172999 reqsz = (4 * 4) +
....@@ -1174,52 +1001,46 @@
11741001 (3 * 4) +
11751002 4 + n_namesz + n_padsz;
11761003
1177
- call = afs_alloc_flat_call(net, &afs_RXFSRename, reqsz, (21 + 21 + 6) * 4);
1004
+ call = afs_alloc_flat_call(op->net, &afs_RXFSRename, reqsz, (21 + 21 + 6) * 4);
11781005 if (!call)
1179
- return -ENOMEM;
1180
-
1181
- call->key = fc->key;
1182
- call->reply[0] = orig_dvnode;
1183
- call->reply[1] = new_dvnode;
1184
- call->expected_version = current_orig_data_version + 1;
1185
- call->expected_version_2 = current_new_data_version + 1;
1006
+ return afs_op_nomem(op);
11861007
11871008 /* marshall the parameters */
11881009 bp = call->request;
11891010 *bp++ = htonl(FSRENAME);
1190
- *bp++ = htonl(orig_dvnode->fid.vid);
1191
- *bp++ = htonl(orig_dvnode->fid.vnode);
1192
- *bp++ = htonl(orig_dvnode->fid.unique);
1011
+ *bp++ = htonl(orig_dvp->fid.vid);
1012
+ *bp++ = htonl(orig_dvp->fid.vnode);
1013
+ *bp++ = htonl(orig_dvp->fid.unique);
11931014 *bp++ = htonl(o_namesz);
1194
- memcpy(bp, orig_name, o_namesz);
1015
+ memcpy(bp, orig_name->name, o_namesz);
11951016 bp = (void *) bp + o_namesz;
11961017 if (o_padsz > 0) {
11971018 memset(bp, 0, o_padsz);
11981019 bp = (void *) bp + o_padsz;
11991020 }
12001021
1201
- *bp++ = htonl(new_dvnode->fid.vid);
1202
- *bp++ = htonl(new_dvnode->fid.vnode);
1203
- *bp++ = htonl(new_dvnode->fid.unique);
1022
+ *bp++ = htonl(new_dvp->fid.vid);
1023
+ *bp++ = htonl(new_dvp->fid.vnode);
1024
+ *bp++ = htonl(new_dvp->fid.unique);
12041025 *bp++ = htonl(n_namesz);
1205
- memcpy(bp, new_name, n_namesz);
1026
+ memcpy(bp, new_name->name, n_namesz);
12061027 bp = (void *) bp + n_namesz;
12071028 if (n_padsz > 0) {
12081029 memset(bp, 0, n_padsz);
12091030 bp = (void *) bp + n_padsz;
12101031 }
12111032
1212
- afs_use_fs_server(call, fc->cbi);
1213
- trace_afs_make_fs_call(call, &orig_dvnode->fid);
1214
- return afs_make_call(&fc->ac, call, GFP_NOFS, false);
1033
+ trace_afs_make_fs_call2(call, &orig_dvp->fid, orig_name, new_name);
1034
+ afs_make_op_call(op, call, GFP_NOFS);
12151035 }
12161036
12171037 /*
1218
- * deliver reply data to an FS.StoreData
1038
+ * Deliver reply data to FS.StoreData or FS.StoreStatus
12191039 */
12201040 static int afs_deliver_fs_store_data(struct afs_call *call)
12211041 {
1222
- struct afs_vnode *vnode = call->reply[0];
1042
+ struct afs_operation *op = call->op;
1043
+ struct afs_vnode_param *vp = &op->file[0];
12231044 const __be32 *bp;
12241045 int ret;
12251046
....@@ -1231,12 +1052,8 @@
12311052
12321053 /* unmarshall the reply once we've received all of it */
12331054 bp = call->buffer;
1234
- if (afs_decode_status(call, &bp, &vnode->status, vnode,
1235
- &call->expected_version, NULL) < 0)
1236
- return afs_protocol_error(call, -EBADMSG);
1237
- /* xdr_decode_AFSVolSync(&bp, call->reply[X]); */
1238
-
1239
- afs_pages_written_back(vnode, call);
1055
+ xdr_decode_AFSFetchStatus(&bp, call, &vp->scb);
1056
+ xdr_decode_AFSVolSync(&bp, &op->volsync);
12401057
12411058 _leave(" = 0 [done]");
12421059 return 0;
....@@ -1262,84 +1079,69 @@
12621079 /*
12631080 * store a set of pages to a very large file
12641081 */
1265
-static int afs_fs_store_data64(struct afs_fs_cursor *fc,
1266
- struct address_space *mapping,
1267
- pgoff_t first, pgoff_t last,
1268
- unsigned offset, unsigned to,
1269
- loff_t size, loff_t pos, loff_t i_size)
1082
+static void afs_fs_store_data64(struct afs_operation *op,
1083
+ loff_t pos, loff_t size, loff_t i_size)
12701084 {
1271
- struct afs_vnode *vnode = fc->vnode;
1085
+ struct afs_vnode_param *vp = &op->file[0];
12721086 struct afs_call *call;
1273
- struct afs_net *net = afs_v2net(vnode);
12741087 __be32 *bp;
12751088
1276
- _enter(",%x,{%x:%u},,",
1277
- key_serial(fc->key), vnode->fid.vid, vnode->fid.vnode);
1089
+ _enter(",%x,{%llx:%llu},,",
1090
+ key_serial(op->key), vp->fid.vid, vp->fid.vnode);
12781091
1279
- call = afs_alloc_flat_call(net, &afs_RXFSStoreData64,
1092
+ call = afs_alloc_flat_call(op->net, &afs_RXFSStoreData64,
12801093 (4 + 6 + 3 * 2) * 4,
12811094 (21 + 6) * 4);
12821095 if (!call)
1283
- return -ENOMEM;
1096
+ return afs_op_nomem(op);
12841097
1285
- call->key = fc->key;
1286
- call->mapping = mapping;
1287
- call->reply[0] = vnode;
1288
- call->first = first;
1289
- call->last = last;
1290
- call->first_offset = offset;
1291
- call->last_to = to;
12921098 call->send_pages = true;
1293
- call->expected_version = vnode->status.data_version + 1;
12941099
12951100 /* marshall the parameters */
12961101 bp = call->request;
12971102 *bp++ = htonl(FSSTOREDATA64);
1298
- *bp++ = htonl(vnode->fid.vid);
1299
- *bp++ = htonl(vnode->fid.vnode);
1300
- *bp++ = htonl(vnode->fid.unique);
1103
+ *bp++ = htonl(vp->fid.vid);
1104
+ *bp++ = htonl(vp->fid.vnode);
1105
+ *bp++ = htonl(vp->fid.unique);
13011106
13021107 *bp++ = htonl(AFS_SET_MTIME); /* mask */
1303
- *bp++ = htonl(vnode->vfs_inode.i_mtime.tv_sec); /* mtime */
1108
+ *bp++ = htonl(op->mtime.tv_sec); /* mtime */
13041109 *bp++ = 0; /* owner */
13051110 *bp++ = 0; /* group */
13061111 *bp++ = 0; /* unix mode */
13071112 *bp++ = 0; /* segment size */
13081113
1309
- *bp++ = htonl(pos >> 32);
1310
- *bp++ = htonl((u32) pos);
1311
- *bp++ = htonl(size >> 32);
1312
- *bp++ = htonl((u32) size);
1313
- *bp++ = htonl(i_size >> 32);
1314
- *bp++ = htonl((u32) i_size);
1114
+ *bp++ = htonl(upper_32_bits(pos));
1115
+ *bp++ = htonl(lower_32_bits(pos));
1116
+ *bp++ = htonl(upper_32_bits(size));
1117
+ *bp++ = htonl(lower_32_bits(size));
1118
+ *bp++ = htonl(upper_32_bits(i_size));
1119
+ *bp++ = htonl(lower_32_bits(i_size));
13151120
1316
- trace_afs_make_fs_call(call, &vnode->fid);
1317
- return afs_make_call(&fc->ac, call, GFP_NOFS, false);
1121
+ trace_afs_make_fs_call(call, &vp->fid);
1122
+ afs_make_op_call(op, call, GFP_NOFS);
13181123 }
13191124
13201125 /*
13211126 * store a set of pages
13221127 */
1323
-int afs_fs_store_data(struct afs_fs_cursor *fc, struct address_space *mapping,
1324
- pgoff_t first, pgoff_t last,
1325
- unsigned offset, unsigned to)
1128
+void afs_fs_store_data(struct afs_operation *op)
13261129 {
1327
- struct afs_vnode *vnode = fc->vnode;
1130
+ struct afs_vnode_param *vp = &op->file[0];
13281131 struct afs_call *call;
1329
- struct afs_net *net = afs_v2net(vnode);
13301132 loff_t size, pos, i_size;
13311133 __be32 *bp;
13321134
1333
- _enter(",%x,{%x:%u},,",
1334
- key_serial(fc->key), vnode->fid.vid, vnode->fid.vnode);
1135
+ _enter(",%x,{%llx:%llu},,",
1136
+ key_serial(op->key), vp->fid.vid, vp->fid.vnode);
13351137
1336
- size = (loff_t)to - (loff_t)offset;
1337
- if (first != last)
1338
- size += (loff_t)(last - first) << PAGE_SHIFT;
1339
- pos = (loff_t)first << PAGE_SHIFT;
1340
- pos += offset;
1138
+ size = (loff_t)op->store.last_to - (loff_t)op->store.first_offset;
1139
+ if (op->store.first != op->store.last)
1140
+ size += (loff_t)(op->store.last - op->store.first) << PAGE_SHIFT;
1141
+ pos = (loff_t)op->store.first << PAGE_SHIFT;
1142
+ pos += op->store.first_offset;
13411143
1342
- i_size = i_size_read(&vnode->vfs_inode);
1144
+ i_size = i_size_read(&vp->vnode->vfs_inode);
13431145 if (pos + size > i_size)
13441146 i_size = size + pos;
13451147
....@@ -1347,73 +1149,38 @@
13471149 (unsigned long long) size, (unsigned long long) pos,
13481150 (unsigned long long) i_size);
13491151
1350
- if (pos >> 32 || i_size >> 32 || size >> 32 || (pos + size) >> 32)
1351
- return afs_fs_store_data64(fc, mapping, first, last, offset, to,
1352
- size, pos, i_size);
1152
+ if (upper_32_bits(pos) || upper_32_bits(i_size) || upper_32_bits(size) ||
1153
+ upper_32_bits(pos + size))
1154
+ return afs_fs_store_data64(op, pos, size, i_size);
13531155
1354
- call = afs_alloc_flat_call(net, &afs_RXFSStoreData,
1156
+ call = afs_alloc_flat_call(op->net, &afs_RXFSStoreData,
13551157 (4 + 6 + 3) * 4,
13561158 (21 + 6) * 4);
13571159 if (!call)
1358
- return -ENOMEM;
1160
+ return afs_op_nomem(op);
13591161
1360
- call->key = fc->key;
1361
- call->mapping = mapping;
1362
- call->reply[0] = vnode;
1363
- call->first = first;
1364
- call->last = last;
1365
- call->first_offset = offset;
1366
- call->last_to = to;
13671162 call->send_pages = true;
1368
- call->expected_version = vnode->status.data_version + 1;
13691163
13701164 /* marshall the parameters */
13711165 bp = call->request;
13721166 *bp++ = htonl(FSSTOREDATA);
1373
- *bp++ = htonl(vnode->fid.vid);
1374
- *bp++ = htonl(vnode->fid.vnode);
1375
- *bp++ = htonl(vnode->fid.unique);
1167
+ *bp++ = htonl(vp->fid.vid);
1168
+ *bp++ = htonl(vp->fid.vnode);
1169
+ *bp++ = htonl(vp->fid.unique);
13761170
13771171 *bp++ = htonl(AFS_SET_MTIME); /* mask */
1378
- *bp++ = htonl(vnode->vfs_inode.i_mtime.tv_sec); /* mtime */
1172
+ *bp++ = htonl(op->mtime.tv_sec); /* mtime */
13791173 *bp++ = 0; /* owner */
13801174 *bp++ = 0; /* group */
13811175 *bp++ = 0; /* unix mode */
13821176 *bp++ = 0; /* segment size */
13831177
1384
- *bp++ = htonl(pos);
1385
- *bp++ = htonl(size);
1386
- *bp++ = htonl(i_size);
1178
+ *bp++ = htonl(lower_32_bits(pos));
1179
+ *bp++ = htonl(lower_32_bits(size));
1180
+ *bp++ = htonl(lower_32_bits(i_size));
13871181
1388
- afs_use_fs_server(call, fc->cbi);
1389
- trace_afs_make_fs_call(call, &vnode->fid);
1390
- return afs_make_call(&fc->ac, call, GFP_NOFS, false);
1391
-}
1392
-
1393
-/*
1394
- * deliver reply data to an FS.StoreStatus
1395
- */
1396
-static int afs_deliver_fs_store_status(struct afs_call *call)
1397
-{
1398
- struct afs_vnode *vnode = call->reply[0];
1399
- const __be32 *bp;
1400
- int ret;
1401
-
1402
- _enter("");
1403
-
1404
- ret = afs_transfer_reply(call);
1405
- if (ret < 0)
1406
- return ret;
1407
-
1408
- /* unmarshall the reply once we've received all of it */
1409
- bp = call->buffer;
1410
- if (afs_decode_status(call, &bp, &vnode->status, vnode,
1411
- &call->expected_version, NULL) < 0)
1412
- return afs_protocol_error(call, -EBADMSG);
1413
- /* xdr_decode_AFSVolSync(&bp, call->reply[X]); */
1414
-
1415
- _leave(" = 0 [done]");
1416
- return 0;
1182
+ trace_afs_make_fs_call(call, &vp->fid);
1183
+ afs_make_op_call(op, call, GFP_NOFS);
14171184 }
14181185
14191186 /*
....@@ -1422,21 +1189,21 @@
14221189 static const struct afs_call_type afs_RXFSStoreStatus = {
14231190 .name = "FS.StoreStatus",
14241191 .op = afs_FS_StoreStatus,
1425
- .deliver = afs_deliver_fs_store_status,
1192
+ .deliver = afs_deliver_fs_store_data,
14261193 .destructor = afs_flat_call_destructor,
14271194 };
14281195
14291196 static const struct afs_call_type afs_RXFSStoreData_as_Status = {
14301197 .name = "FS.StoreData",
14311198 .op = afs_FS_StoreData,
1432
- .deliver = afs_deliver_fs_store_status,
1199
+ .deliver = afs_deliver_fs_store_data,
14331200 .destructor = afs_flat_call_destructor,
14341201 };
14351202
14361203 static const struct afs_call_type afs_RXFSStoreData64_as_Status = {
14371204 .name = "FS.StoreData64",
14381205 .op = afs_FS_StoreData64,
1439
- .deliver = afs_deliver_fs_store_status,
1206
+ .deliver = afs_deliver_fs_store_data,
14401207 .destructor = afs_flat_call_destructor,
14411208 };
14421209
....@@ -1444,134 +1211,119 @@
14441211 * set the attributes on a very large file, using FS.StoreData rather than
14451212 * FS.StoreStatus so as to alter the file size also
14461213 */
1447
-static int afs_fs_setattr_size64(struct afs_fs_cursor *fc, struct iattr *attr)
1214
+static void afs_fs_setattr_size64(struct afs_operation *op)
14481215 {
1449
- struct afs_vnode *vnode = fc->vnode;
1216
+ struct afs_vnode_param *vp = &op->file[0];
14501217 struct afs_call *call;
1451
- struct afs_net *net = afs_v2net(vnode);
1218
+ struct iattr *attr = op->setattr.attr;
14521219 __be32 *bp;
14531220
1454
- _enter(",%x,{%x:%u},,",
1455
- key_serial(fc->key), vnode->fid.vid, vnode->fid.vnode);
1221
+ _enter(",%x,{%llx:%llu},,",
1222
+ key_serial(op->key), vp->fid.vid, vp->fid.vnode);
14561223
14571224 ASSERT(attr->ia_valid & ATTR_SIZE);
14581225
1459
- call = afs_alloc_flat_call(net, &afs_RXFSStoreData64_as_Status,
1226
+ call = afs_alloc_flat_call(op->net, &afs_RXFSStoreData64_as_Status,
14601227 (4 + 6 + 3 * 2) * 4,
14611228 (21 + 6) * 4);
14621229 if (!call)
1463
- return -ENOMEM;
1464
-
1465
- call->key = fc->key;
1466
- call->reply[0] = vnode;
1467
- call->expected_version = vnode->status.data_version + 1;
1230
+ return afs_op_nomem(op);
14681231
14691232 /* marshall the parameters */
14701233 bp = call->request;
14711234 *bp++ = htonl(FSSTOREDATA64);
1472
- *bp++ = htonl(vnode->fid.vid);
1473
- *bp++ = htonl(vnode->fid.vnode);
1474
- *bp++ = htonl(vnode->fid.unique);
1235
+ *bp++ = htonl(vp->fid.vid);
1236
+ *bp++ = htonl(vp->fid.vnode);
1237
+ *bp++ = htonl(vp->fid.unique);
14751238
14761239 xdr_encode_AFS_StoreStatus(&bp, attr);
14771240
1478
- *bp++ = 0; /* position of start of write */
1241
+ *bp++ = htonl(upper_32_bits(attr->ia_size)); /* position of start of write */
1242
+ *bp++ = htonl(lower_32_bits(attr->ia_size));
1243
+ *bp++ = 0; /* size of write */
14791244 *bp++ = 0;
1480
- *bp++ = 0; /* size of write */
1481
- *bp++ = 0;
1482
- *bp++ = htonl(attr->ia_size >> 32); /* new file length */
1483
- *bp++ = htonl((u32) attr->ia_size);
1245
+ *bp++ = htonl(upper_32_bits(attr->ia_size)); /* new file length */
1246
+ *bp++ = htonl(lower_32_bits(attr->ia_size));
14841247
1485
- afs_use_fs_server(call, fc->cbi);
1486
- trace_afs_make_fs_call(call, &vnode->fid);
1487
- return afs_make_call(&fc->ac, call, GFP_NOFS, false);
1248
+ trace_afs_make_fs_call(call, &vp->fid);
1249
+ afs_make_op_call(op, call, GFP_NOFS);
14881250 }
14891251
14901252 /*
14911253 * set the attributes on a file, using FS.StoreData rather than FS.StoreStatus
14921254 * so as to alter the file size also
14931255 */
1494
-static int afs_fs_setattr_size(struct afs_fs_cursor *fc, struct iattr *attr)
1256
+static void afs_fs_setattr_size(struct afs_operation *op)
14951257 {
1496
- struct afs_vnode *vnode = fc->vnode;
1258
+ struct afs_vnode_param *vp = &op->file[0];
14971259 struct afs_call *call;
1498
- struct afs_net *net = afs_v2net(vnode);
1260
+ struct iattr *attr = op->setattr.attr;
14991261 __be32 *bp;
15001262
1501
- _enter(",%x,{%x:%u},,",
1502
- key_serial(fc->key), vnode->fid.vid, vnode->fid.vnode);
1263
+ _enter(",%x,{%llx:%llu},,",
1264
+ key_serial(op->key), vp->fid.vid, vp->fid.vnode);
15031265
15041266 ASSERT(attr->ia_valid & ATTR_SIZE);
1505
- if (attr->ia_size >> 32)
1506
- return afs_fs_setattr_size64(fc, attr);
1267
+ if (upper_32_bits(attr->ia_size))
1268
+ return afs_fs_setattr_size64(op);
15071269
1508
- call = afs_alloc_flat_call(net, &afs_RXFSStoreData_as_Status,
1270
+ call = afs_alloc_flat_call(op->net, &afs_RXFSStoreData_as_Status,
15091271 (4 + 6 + 3) * 4,
15101272 (21 + 6) * 4);
15111273 if (!call)
1512
- return -ENOMEM;
1513
-
1514
- call->key = fc->key;
1515
- call->reply[0] = vnode;
1516
- call->expected_version = vnode->status.data_version + 1;
1274
+ return afs_op_nomem(op);
15171275
15181276 /* marshall the parameters */
15191277 bp = call->request;
15201278 *bp++ = htonl(FSSTOREDATA);
1521
- *bp++ = htonl(vnode->fid.vid);
1522
- *bp++ = htonl(vnode->fid.vnode);
1523
- *bp++ = htonl(vnode->fid.unique);
1279
+ *bp++ = htonl(vp->fid.vid);
1280
+ *bp++ = htonl(vp->fid.vnode);
1281
+ *bp++ = htonl(vp->fid.unique);
15241282
15251283 xdr_encode_AFS_StoreStatus(&bp, attr);
15261284
1527
- *bp++ = 0; /* position of start of write */
1285
+ *bp++ = htonl(attr->ia_size); /* position of start of write */
15281286 *bp++ = 0; /* size of write */
15291287 *bp++ = htonl(attr->ia_size); /* new file length */
15301288
1531
- afs_use_fs_server(call, fc->cbi);
1532
- trace_afs_make_fs_call(call, &vnode->fid);
1533
- return afs_make_call(&fc->ac, call, GFP_NOFS, false);
1289
+ trace_afs_make_fs_call(call, &vp->fid);
1290
+ afs_make_op_call(op, call, GFP_NOFS);
15341291 }
15351292
15361293 /*
15371294 * set the attributes on a file, using FS.StoreData if there's a change in file
15381295 * size, and FS.StoreStatus otherwise
15391296 */
1540
-int afs_fs_setattr(struct afs_fs_cursor *fc, struct iattr *attr)
1297
+void afs_fs_setattr(struct afs_operation *op)
15411298 {
1542
- struct afs_vnode *vnode = fc->vnode;
1299
+ struct afs_vnode_param *vp = &op->file[0];
15431300 struct afs_call *call;
1544
- struct afs_net *net = afs_v2net(vnode);
1301
+ struct iattr *attr = op->setattr.attr;
15451302 __be32 *bp;
15461303
15471304 if (attr->ia_valid & ATTR_SIZE)
1548
- return afs_fs_setattr_size(fc, attr);
1305
+ return afs_fs_setattr_size(op);
15491306
1550
- _enter(",%x,{%x:%u},,",
1551
- key_serial(fc->key), vnode->fid.vid, vnode->fid.vnode);
1307
+ _enter(",%x,{%llx:%llu},,",
1308
+ key_serial(op->key), vp->fid.vid, vp->fid.vnode);
15521309
1553
- call = afs_alloc_flat_call(net, &afs_RXFSStoreStatus,
1310
+ call = afs_alloc_flat_call(op->net, &afs_RXFSStoreStatus,
15541311 (4 + 6) * 4,
15551312 (21 + 6) * 4);
15561313 if (!call)
1557
- return -ENOMEM;
1558
-
1559
- call->key = fc->key;
1560
- call->reply[0] = vnode;
1561
- call->expected_version = vnode->status.data_version;
1314
+ return afs_op_nomem(op);
15621315
15631316 /* marshall the parameters */
15641317 bp = call->request;
15651318 *bp++ = htonl(FSSTORESTATUS);
1566
- *bp++ = htonl(vnode->fid.vid);
1567
- *bp++ = htonl(vnode->fid.vnode);
1568
- *bp++ = htonl(vnode->fid.unique);
1319
+ *bp++ = htonl(vp->fid.vid);
1320
+ *bp++ = htonl(vp->fid.vnode);
1321
+ *bp++ = htonl(vp->fid.unique);
15691322
1570
- xdr_encode_AFS_StoreStatus(&bp, attr);
1323
+ xdr_encode_AFS_StoreStatus(&bp, op->setattr.attr);
15711324
1572
- afs_use_fs_server(call, fc->cbi);
1573
- trace_afs_make_fs_call(call, &vnode->fid);
1574
- return afs_make_call(&fc->ac, call, GFP_NOFS, false);
1325
+ trace_afs_make_fs_call(call, &vp->fid);
1326
+ afs_make_op_call(op, call, GFP_NOFS);
15751327 }
15761328
15771329 /*
....@@ -1579,181 +1331,126 @@
15791331 */
15801332 static int afs_deliver_fs_get_volume_status(struct afs_call *call)
15811333 {
1334
+ struct afs_operation *op = call->op;
15821335 const __be32 *bp;
15831336 char *p;
1337
+ u32 size;
15841338 int ret;
15851339
15861340 _enter("{%u}", call->unmarshall);
15871341
15881342 switch (call->unmarshall) {
15891343 case 0:
1590
- call->offset = 0;
15911344 call->unmarshall++;
1345
+ afs_extract_to_buf(call, 12 * 4);
1346
+ fallthrough;
15921347
15931348 /* extract the returned status record */
15941349 case 1:
15951350 _debug("extract status");
1596
- ret = afs_extract_data(call, call->buffer,
1597
- 12 * 4, true);
1351
+ ret = afs_extract_data(call, true);
15981352 if (ret < 0)
15991353 return ret;
16001354
16011355 bp = call->buffer;
1602
- xdr_decode_AFSFetchVolumeStatus(&bp, call->reply[1]);
1603
- call->offset = 0;
1356
+ xdr_decode_AFSFetchVolumeStatus(&bp, &op->volstatus.vs);
16041357 call->unmarshall++;
1358
+ afs_extract_to_tmp(call);
1359
+ fallthrough;
16051360
16061361 /* extract the volume name length */
16071362 case 2:
1608
- ret = afs_extract_data(call, &call->tmp, 4, true);
1363
+ ret = afs_extract_data(call, true);
16091364 if (ret < 0)
16101365 return ret;
16111366
16121367 call->count = ntohl(call->tmp);
16131368 _debug("volname length: %u", call->count);
16141369 if (call->count >= AFSNAMEMAX)
1615
- return afs_protocol_error(call, -EBADMSG);
1616
- call->offset = 0;
1370
+ return afs_protocol_error(call, afs_eproto_volname_len);
1371
+ size = (call->count + 3) & ~3; /* It's padded */
1372
+ afs_extract_to_buf(call, size);
16171373 call->unmarshall++;
1374
+ fallthrough;
16181375
16191376 /* extract the volume name */
16201377 case 3:
16211378 _debug("extract volname");
1622
- if (call->count > 0) {
1623
- ret = afs_extract_data(call, call->reply[2],
1624
- call->count, true);
1625
- if (ret < 0)
1626
- return ret;
1627
- }
1628
-
1629
- p = call->reply[2];
1630
- p[call->count] = 0;
1631
- _debug("volname '%s'", p);
1632
-
1633
- call->offset = 0;
1634
- call->unmarshall++;
1635
-
1636
- /* extract the volume name padding */
1637
- if ((call->count & 3) == 0) {
1638
- call->unmarshall++;
1639
- goto no_volname_padding;
1640
- }
1641
- call->count = 4 - (call->count & 3);
1642
-
1643
- case 4:
1644
- ret = afs_extract_data(call, call->buffer,
1645
- call->count, true);
1379
+ ret = afs_extract_data(call, true);
16461380 if (ret < 0)
16471381 return ret;
16481382
1649
- call->offset = 0;
1383
+ p = call->buffer;
1384
+ p[call->count] = 0;
1385
+ _debug("volname '%s'", p);
1386
+ afs_extract_to_tmp(call);
16501387 call->unmarshall++;
1651
- no_volname_padding:
1388
+ fallthrough;
16521389
16531390 /* extract the offline message length */
1654
- case 5:
1655
- ret = afs_extract_data(call, &call->tmp, 4, true);
1391
+ case 4:
1392
+ ret = afs_extract_data(call, true);
16561393 if (ret < 0)
16571394 return ret;
16581395
16591396 call->count = ntohl(call->tmp);
16601397 _debug("offline msg length: %u", call->count);
16611398 if (call->count >= AFSNAMEMAX)
1662
- return afs_protocol_error(call, -EBADMSG);
1663
- call->offset = 0;
1399
+ return afs_protocol_error(call, afs_eproto_offline_msg_len);
1400
+ size = (call->count + 3) & ~3; /* It's padded */
1401
+ afs_extract_to_buf(call, size);
16641402 call->unmarshall++;
1403
+ fallthrough;
16651404
16661405 /* extract the offline message */
1667
- case 6:
1406
+ case 5:
16681407 _debug("extract offline");
1669
- if (call->count > 0) {
1670
- ret = afs_extract_data(call, call->reply[2],
1671
- call->count, true);
1672
- if (ret < 0)
1673
- return ret;
1674
- }
1675
-
1676
- p = call->reply[2];
1677
- p[call->count] = 0;
1678
- _debug("offline '%s'", p);
1679
-
1680
- call->offset = 0;
1681
- call->unmarshall++;
1682
-
1683
- /* extract the offline message padding */
1684
- if ((call->count & 3) == 0) {
1685
- call->unmarshall++;
1686
- goto no_offline_padding;
1687
- }
1688
- call->count = 4 - (call->count & 3);
1689
-
1690
- case 7:
1691
- ret = afs_extract_data(call, call->buffer,
1692
- call->count, true);
1408
+ ret = afs_extract_data(call, true);
16931409 if (ret < 0)
16941410 return ret;
16951411
1696
- call->offset = 0;
1412
+ p = call->buffer;
1413
+ p[call->count] = 0;
1414
+ _debug("offline '%s'", p);
1415
+
1416
+ afs_extract_to_tmp(call);
16971417 call->unmarshall++;
1698
- no_offline_padding:
1418
+ fallthrough;
16991419
17001420 /* extract the message of the day length */
1701
- case 8:
1702
- ret = afs_extract_data(call, &call->tmp, 4, true);
1421
+ case 6:
1422
+ ret = afs_extract_data(call, true);
17031423 if (ret < 0)
17041424 return ret;
17051425
17061426 call->count = ntohl(call->tmp);
17071427 _debug("motd length: %u", call->count);
17081428 if (call->count >= AFSNAMEMAX)
1709
- return afs_protocol_error(call, -EBADMSG);
1710
- call->offset = 0;
1429
+ return afs_protocol_error(call, afs_eproto_motd_len);
1430
+ size = (call->count + 3) & ~3; /* It's padded */
1431
+ afs_extract_to_buf(call, size);
17111432 call->unmarshall++;
1433
+ fallthrough;
17121434
17131435 /* extract the message of the day */
1714
- case 9:
1436
+ case 7:
17151437 _debug("extract motd");
1716
- if (call->count > 0) {
1717
- ret = afs_extract_data(call, call->reply[2],
1718
- call->count, true);
1719
- if (ret < 0)
1720
- return ret;
1721
- }
1722
-
1723
- p = call->reply[2];
1724
- p[call->count] = 0;
1725
- _debug("motd '%s'", p);
1726
-
1727
- call->offset = 0;
1728
- call->unmarshall++;
1729
-
1730
- /* extract the message of the day padding */
1731
- call->count = (4 - (call->count & 3)) & 3;
1732
-
1733
- case 10:
1734
- ret = afs_extract_data(call, call->buffer,
1735
- call->count, false);
1438
+ ret = afs_extract_data(call, false);
17361439 if (ret < 0)
17371440 return ret;
17381441
1739
- call->offset = 0;
1442
+ p = call->buffer;
1443
+ p[call->count] = 0;
1444
+ _debug("motd '%s'", p);
1445
+
17401446 call->unmarshall++;
1741
- case 11:
1447
+
1448
+ case 8:
17421449 break;
17431450 }
17441451
17451452 _leave(" = 0 [done]");
17461453 return 0;
1747
-}
1748
-
1749
-/*
1750
- * destroy an FS.GetVolumeStatus call
1751
- */
1752
-static void afs_get_volume_status_call_destructor(struct afs_call *call)
1753
-{
1754
- kfree(call->reply[2]);
1755
- call->reply[2] = NULL;
1756
- afs_flat_call_destructor(call);
17571454 }
17581455
17591456 /*
....@@ -1763,46 +1460,32 @@
17631460 .name = "FS.GetVolumeStatus",
17641461 .op = afs_FS_GetVolumeStatus,
17651462 .deliver = afs_deliver_fs_get_volume_status,
1766
- .destructor = afs_get_volume_status_call_destructor,
1463
+ .destructor = afs_flat_call_destructor,
17671464 };
17681465
17691466 /*
17701467 * fetch the status of a volume
17711468 */
1772
-int afs_fs_get_volume_status(struct afs_fs_cursor *fc,
1773
- struct afs_volume_status *vs)
1469
+void afs_fs_get_volume_status(struct afs_operation *op)
17741470 {
1775
- struct afs_vnode *vnode = fc->vnode;
1471
+ struct afs_vnode_param *vp = &op->file[0];
17761472 struct afs_call *call;
1777
- struct afs_net *net = afs_v2net(vnode);
17781473 __be32 *bp;
1779
- void *tmpbuf;
17801474
17811475 _enter("");
17821476
1783
- tmpbuf = kmalloc(AFSOPAQUEMAX, GFP_KERNEL);
1784
- if (!tmpbuf)
1785
- return -ENOMEM;
1786
-
1787
- call = afs_alloc_flat_call(net, &afs_RXFSGetVolumeStatus, 2 * 4, 12 * 4);
1788
- if (!call) {
1789
- kfree(tmpbuf);
1790
- return -ENOMEM;
1791
- }
1792
-
1793
- call->key = fc->key;
1794
- call->reply[0] = vnode;
1795
- call->reply[1] = vs;
1796
- call->reply[2] = tmpbuf;
1477
+ call = afs_alloc_flat_call(op->net, &afs_RXFSGetVolumeStatus, 2 * 4,
1478
+ max(12 * 4, AFSOPAQUEMAX + 1));
1479
+ if (!call)
1480
+ return afs_op_nomem(op);
17971481
17981482 /* marshall the parameters */
17991483 bp = call->request;
18001484 bp[0] = htonl(FSGETVOLUMESTATUS);
1801
- bp[1] = htonl(vnode->fid.vid);
1485
+ bp[1] = htonl(vp->fid.vid);
18021486
1803
- afs_use_fs_server(call, fc->cbi);
1804
- trace_afs_make_fs_call(call, &vnode->fid);
1805
- return afs_make_call(&fc->ac, call, GFP_NOFS, false);
1487
+ trace_afs_make_fs_call(call, &vp->fid);
1488
+ afs_make_op_call(op, call, GFP_NOFS);
18061489 }
18071490
18081491 /*
....@@ -1810,6 +1493,7 @@
18101493 */
18111494 static int afs_deliver_fs_xxxx_lock(struct afs_call *call)
18121495 {
1496
+ struct afs_operation *op = call->op;
18131497 const __be32 *bp;
18141498 int ret;
18151499
....@@ -1821,7 +1505,7 @@
18211505
18221506 /* unmarshall the reply once we've received all of it */
18231507 bp = call->buffer;
1824
- /* xdr_decode_AFSVolSync(&bp, call->reply[X]); */
1508
+ xdr_decode_AFSVolSync(&bp, &op->volsync);
18251509
18261510 _leave(" = 0 [done]");
18271511 return 0;
....@@ -1834,6 +1518,7 @@
18341518 .name = "FS.SetLock",
18351519 .op = afs_FS_SetLock,
18361520 .deliver = afs_deliver_fs_xxxx_lock,
1521
+ .done = afs_lock_op_done,
18371522 .destructor = afs_flat_call_destructor,
18381523 };
18391524
....@@ -1844,6 +1529,7 @@
18441529 .name = "FS.ExtendLock",
18451530 .op = afs_FS_ExtendLock,
18461531 .deliver = afs_deliver_fs_xxxx_lock,
1532
+ .done = afs_lock_op_done,
18471533 .destructor = afs_flat_call_destructor,
18481534 };
18491535
....@@ -1860,95 +1546,80 @@
18601546 /*
18611547 * Set a lock on a file
18621548 */
1863
-int afs_fs_set_lock(struct afs_fs_cursor *fc, afs_lock_type_t type)
1549
+void afs_fs_set_lock(struct afs_operation *op)
18641550 {
1865
- struct afs_vnode *vnode = fc->vnode;
1551
+ struct afs_vnode_param *vp = &op->file[0];
18661552 struct afs_call *call;
1867
- struct afs_net *net = afs_v2net(vnode);
18681553 __be32 *bp;
18691554
18701555 _enter("");
18711556
1872
- call = afs_alloc_flat_call(net, &afs_RXFSSetLock, 5 * 4, 6 * 4);
1557
+ call = afs_alloc_flat_call(op->net, &afs_RXFSSetLock, 5 * 4, 6 * 4);
18731558 if (!call)
1874
- return -ENOMEM;
1875
-
1876
- call->key = fc->key;
1877
- call->reply[0] = vnode;
1559
+ return afs_op_nomem(op);
18781560
18791561 /* marshall the parameters */
18801562 bp = call->request;
18811563 *bp++ = htonl(FSSETLOCK);
1882
- *bp++ = htonl(vnode->fid.vid);
1883
- *bp++ = htonl(vnode->fid.vnode);
1884
- *bp++ = htonl(vnode->fid.unique);
1885
- *bp++ = htonl(type);
1564
+ *bp++ = htonl(vp->fid.vid);
1565
+ *bp++ = htonl(vp->fid.vnode);
1566
+ *bp++ = htonl(vp->fid.unique);
1567
+ *bp++ = htonl(op->lock.type);
18861568
1887
- afs_use_fs_server(call, fc->cbi);
1888
- trace_afs_make_fs_call(call, &vnode->fid);
1889
- return afs_make_call(&fc->ac, call, GFP_NOFS, false);
1569
+ trace_afs_make_fs_calli(call, &vp->fid, op->lock.type);
1570
+ afs_make_op_call(op, call, GFP_NOFS);
18901571 }
18911572
18921573 /*
18931574 * extend a lock on a file
18941575 */
1895
-int afs_fs_extend_lock(struct afs_fs_cursor *fc)
1576
+void afs_fs_extend_lock(struct afs_operation *op)
18961577 {
1897
- struct afs_vnode *vnode = fc->vnode;
1578
+ struct afs_vnode_param *vp = &op->file[0];
18981579 struct afs_call *call;
1899
- struct afs_net *net = afs_v2net(vnode);
19001580 __be32 *bp;
19011581
19021582 _enter("");
19031583
1904
- call = afs_alloc_flat_call(net, &afs_RXFSExtendLock, 4 * 4, 6 * 4);
1584
+ call = afs_alloc_flat_call(op->net, &afs_RXFSExtendLock, 4 * 4, 6 * 4);
19051585 if (!call)
1906
- return -ENOMEM;
1907
-
1908
- call->key = fc->key;
1909
- call->reply[0] = vnode;
1586
+ return afs_op_nomem(op);
19101587
19111588 /* marshall the parameters */
19121589 bp = call->request;
19131590 *bp++ = htonl(FSEXTENDLOCK);
1914
- *bp++ = htonl(vnode->fid.vid);
1915
- *bp++ = htonl(vnode->fid.vnode);
1916
- *bp++ = htonl(vnode->fid.unique);
1591
+ *bp++ = htonl(vp->fid.vid);
1592
+ *bp++ = htonl(vp->fid.vnode);
1593
+ *bp++ = htonl(vp->fid.unique);
19171594
1918
- afs_use_fs_server(call, fc->cbi);
1919
- trace_afs_make_fs_call(call, &vnode->fid);
1920
- return afs_make_call(&fc->ac, call, GFP_NOFS, false);
1595
+ trace_afs_make_fs_call(call, &vp->fid);
1596
+ afs_make_op_call(op, call, GFP_NOFS);
19211597 }
19221598
19231599 /*
19241600 * release a lock on a file
19251601 */
1926
-int afs_fs_release_lock(struct afs_fs_cursor *fc)
1602
+void afs_fs_release_lock(struct afs_operation *op)
19271603 {
1928
- struct afs_vnode *vnode = fc->vnode;
1604
+ struct afs_vnode_param *vp = &op->file[0];
19291605 struct afs_call *call;
1930
- struct afs_net *net = afs_v2net(vnode);
19311606 __be32 *bp;
19321607
19331608 _enter("");
19341609
1935
- call = afs_alloc_flat_call(net, &afs_RXFSReleaseLock, 4 * 4, 6 * 4);
1610
+ call = afs_alloc_flat_call(op->net, &afs_RXFSReleaseLock, 4 * 4, 6 * 4);
19361611 if (!call)
1937
- return -ENOMEM;
1938
-
1939
- call->key = fc->key;
1940
- call->reply[0] = vnode;
1612
+ return afs_op_nomem(op);
19411613
19421614 /* marshall the parameters */
19431615 bp = call->request;
19441616 *bp++ = htonl(FSRELEASELOCK);
1945
- *bp++ = htonl(vnode->fid.vid);
1946
- *bp++ = htonl(vnode->fid.vnode);
1947
- *bp++ = htonl(vnode->fid.unique);
1617
+ *bp++ = htonl(vp->fid.vid);
1618
+ *bp++ = htonl(vp->fid.vnode);
1619
+ *bp++ = htonl(vp->fid.unique);
19481620
1949
- afs_use_fs_server(call, fc->cbi);
1950
- trace_afs_make_fs_call(call, &vnode->fid);
1951
- return afs_make_call(&fc->ac, call, GFP_NOFS, false);
1621
+ trace_afs_make_fs_call(call, &vp->fid);
1622
+ afs_make_op_call(op, call, GFP_NOFS);
19521623 }
19531624
19541625 /*
....@@ -1992,8 +1663,9 @@
19921663 bp = call->request;
19931664 *bp++ = htonl(FSGIVEUPALLCALLBACKS);
19941665
1995
- /* Can't take a ref on server */
1996
- return afs_make_call(ac, call, GFP_NOFS, false);
1666
+ call->server = afs_use_server(server, afs_server_trace_give_up_cb);
1667
+ afs_make_call(ac, call, GFP_NOFS);
1668
+ return afs_wait_for_call_to_complete(call, ac);
19971669 }
19981670
19991671 /*
....@@ -2004,19 +1676,17 @@
20041676 u32 count;
20051677 int ret;
20061678
2007
- _enter("{%u,%zu/%u}", call->unmarshall, call->offset, call->count);
1679
+ _enter("{%u,%zu}", call->unmarshall, iov_iter_count(call->iter));
20081680
2009
-again:
20101681 switch (call->unmarshall) {
20111682 case 0:
2012
- call->offset = 0;
1683
+ afs_extract_to_tmp(call);
20131684 call->unmarshall++;
1685
+ fallthrough;
20141686
20151687 /* Extract the capabilities word count */
20161688 case 1:
2017
- ret = afs_extract_data(call, &call->tmp,
2018
- 1 * sizeof(__be32),
2019
- true);
1689
+ ret = afs_extract_data(call, true);
20201690 if (ret < 0)
20211691 return ret;
20221692
....@@ -2024,24 +1694,18 @@
20241694
20251695 call->count = count;
20261696 call->count2 = count;
2027
- call->offset = 0;
1697
+ afs_extract_discard(call, count * sizeof(__be32));
20281698 call->unmarshall++;
1699
+ fallthrough;
20291700
20301701 /* Extract capabilities words */
20311702 case 2:
2032
- count = min(call->count, 16U);
2033
- ret = afs_extract_data(call, call->buffer,
2034
- count * sizeof(__be32),
2035
- call->count > 16);
1703
+ ret = afs_extract_data(call, false);
20361704 if (ret < 0)
20371705 return ret;
20381706
20391707 /* TODO: Examine capabilities */
20401708
2041
- call->count -= count;
2042
- if (call->count > 0)
2043
- goto again;
2044
- call->offset = 0;
20451709 call->unmarshall++;
20461710 break;
20471711 }
....@@ -2057,17 +1721,18 @@
20571721 .name = "FS.GetCapabilities",
20581722 .op = afs_FS_GetCapabilities,
20591723 .deliver = afs_deliver_fs_get_capabilities,
1724
+ .done = afs_fileserver_probe_result,
20601725 .destructor = afs_flat_call_destructor,
20611726 };
20621727
20631728 /*
2064
- * Probe a fileserver for the capabilities that it supports. This can
2065
- * return up to 196 words.
1729
+ * Probe a fileserver for the capabilities that it supports. This RPC can
1730
+ * reply with up to 196 words. The operation is asynchronous and if we managed
1731
+ * to allocate a call, true is returned the result is delivered through the
1732
+ * ->done() - otherwise we return false to indicate we didn't even try.
20661733 */
2067
-int afs_fs_get_capabilities(struct afs_net *net,
2068
- struct afs_server *server,
2069
- struct afs_addr_cursor *ac,
2070
- struct key *key)
1734
+bool afs_fs_get_capabilities(struct afs_net *net, struct afs_server *server,
1735
+ struct afs_addr_cursor *ac, struct key *key)
20711736 {
20721737 struct afs_call *call;
20731738 __be32 *bp;
....@@ -2076,105 +1741,22 @@
20761741
20771742 call = afs_alloc_flat_call(net, &afs_RXFSGetCapabilities, 1 * 4, 16 * 4);
20781743 if (!call)
2079
- return -ENOMEM;
1744
+ return false;
20801745
20811746 call->key = key;
1747
+ call->server = afs_use_server(server, afs_server_trace_get_caps);
1748
+ call->upgrade = true;
1749
+ call->async = true;
1750
+ call->max_lifespan = AFS_PROBE_MAX_LIFESPAN;
20821751
20831752 /* marshall the parameters */
20841753 bp = call->request;
20851754 *bp++ = htonl(FSGETCAPABILITIES);
20861755
2087
- /* Can't take a ref on server */
20881756 trace_afs_make_fs_call(call, NULL);
2089
- return afs_make_call(ac, call, GFP_NOFS, false);
2090
-}
2091
-
2092
-/*
2093
- * Deliver reply data to an FS.FetchStatus with no vnode.
2094
- */
2095
-static int afs_deliver_fs_fetch_status(struct afs_call *call)
2096
-{
2097
- struct afs_file_status *status = call->reply[1];
2098
- struct afs_callback *callback = call->reply[2];
2099
- struct afs_volsync *volsync = call->reply[3];
2100
- struct afs_vnode *vnode = call->reply[0];
2101
- const __be32 *bp;
2102
- int ret;
2103
-
2104
- ret = afs_transfer_reply(call);
2105
- if (ret < 0)
2106
- return ret;
2107
-
2108
- _enter("{%x:%u}", vnode->fid.vid, vnode->fid.vnode);
2109
-
2110
- /* unmarshall the reply once we've received all of it */
2111
- bp = call->buffer;
2112
- afs_decode_status(call, &bp, status, vnode,
2113
- &call->expected_version, NULL);
2114
- callback[call->count].version = ntohl(bp[0]);
2115
- callback[call->count].expiry = ntohl(bp[1]);
2116
- callback[call->count].type = ntohl(bp[2]);
2117
- if (vnode)
2118
- xdr_decode_AFSCallBack(call, vnode, &bp);
2119
- else
2120
- bp += 3;
2121
- if (volsync)
2122
- xdr_decode_AFSVolSync(&bp, volsync);
2123
-
2124
- _leave(" = 0 [done]");
2125
- return 0;
2126
-}
2127
-
2128
-/*
2129
- * FS.FetchStatus operation type
2130
- */
2131
-static const struct afs_call_type afs_RXFSFetchStatus = {
2132
- .name = "FS.FetchStatus",
2133
- .op = afs_FS_FetchStatus,
2134
- .deliver = afs_deliver_fs_fetch_status,
2135
- .destructor = afs_flat_call_destructor,
2136
-};
2137
-
2138
-/*
2139
- * Fetch the status information for a fid without needing a vnode handle.
2140
- */
2141
-int afs_fs_fetch_status(struct afs_fs_cursor *fc,
2142
- struct afs_net *net,
2143
- struct afs_fid *fid,
2144
- struct afs_file_status *status,
2145
- struct afs_callback *callback,
2146
- struct afs_volsync *volsync)
2147
-{
2148
- struct afs_call *call;
2149
- __be32 *bp;
2150
-
2151
- _enter(",%x,{%x:%u},,",
2152
- key_serial(fc->key), fid->vid, fid->vnode);
2153
-
2154
- call = afs_alloc_flat_call(net, &afs_RXFSFetchStatus, 16, (21 + 3 + 6) * 4);
2155
- if (!call) {
2156
- fc->ac.error = -ENOMEM;
2157
- return -ENOMEM;
2158
- }
2159
-
2160
- call->key = fc->key;
2161
- call->reply[0] = NULL; /* vnode for fid[0] */
2162
- call->reply[1] = status;
2163
- call->reply[2] = callback;
2164
- call->reply[3] = volsync;
2165
- call->expected_version = 1; /* vnode->status.data_version */
2166
-
2167
- /* marshall the parameters */
2168
- bp = call->request;
2169
- bp[0] = htonl(FSFETCHSTATUS);
2170
- bp[1] = htonl(fid->vid);
2171
- bp[2] = htonl(fid->vnode);
2172
- bp[3] = htonl(fid->unique);
2173
-
2174
- call->cb_break = fc->cb_break;
2175
- afs_use_fs_server(call, fc->cbi);
2176
- trace_afs_make_fs_call(call, fid);
2177
- return afs_make_call(&fc->ac, call, GFP_NOFS, false);
1757
+ afs_make_call(ac, call, GFP_NOFS);
1758
+ afs_put_call(call);
1759
+ return true;
21781760 }
21791761
21801762 /*
....@@ -2182,9 +1764,8 @@
21821764 */
21831765 static int afs_deliver_fs_inline_bulk_status(struct afs_call *call)
21841766 {
2185
- struct afs_file_status *statuses;
2186
- struct afs_callback *callbacks;
2187
- struct afs_vnode *vnode = call->reply[0];
1767
+ struct afs_operation *op = call->op;
1768
+ struct afs_status_cb *scb;
21881769 const __be32 *bp;
21891770 u32 tmp;
21901771 int ret;
....@@ -2193,95 +1774,112 @@
21931774
21941775 switch (call->unmarshall) {
21951776 case 0:
2196
- call->offset = 0;
1777
+ afs_extract_to_tmp(call);
21971778 call->unmarshall++;
1779
+ fallthrough;
21981780
21991781 /* Extract the file status count and array in two steps */
22001782 case 1:
22011783 _debug("extract status count");
2202
- ret = afs_extract_data(call, &call->tmp, 4, true);
1784
+ ret = afs_extract_data(call, true);
22031785 if (ret < 0)
22041786 return ret;
22051787
22061788 tmp = ntohl(call->tmp);
2207
- _debug("status count: %u/%u", tmp, call->count2);
2208
- if (tmp != call->count2)
2209
- return afs_protocol_error(call, -EBADMSG);
1789
+ _debug("status count: %u/%u", tmp, op->nr_files);
1790
+ if (tmp != op->nr_files)
1791
+ return afs_protocol_error(call, afs_eproto_ibulkst_count);
22101792
22111793 call->count = 0;
22121794 call->unmarshall++;
22131795 more_counts:
2214
- call->offset = 0;
1796
+ afs_extract_to_buf(call, 21 * sizeof(__be32));
1797
+ fallthrough;
22151798
22161799 case 2:
22171800 _debug("extract status array %u", call->count);
2218
- ret = afs_extract_data(call, call->buffer, 21 * 4, true);
1801
+ ret = afs_extract_data(call, true);
22191802 if (ret < 0)
22201803 return ret;
22211804
1805
+ switch (call->count) {
1806
+ case 0:
1807
+ scb = &op->file[0].scb;
1808
+ break;
1809
+ case 1:
1810
+ scb = &op->file[1].scb;
1811
+ break;
1812
+ default:
1813
+ scb = &op->more_files[call->count - 2].scb;
1814
+ break;
1815
+ }
1816
+
22221817 bp = call->buffer;
2223
- statuses = call->reply[1];
2224
- if (afs_decode_status(call, &bp, &statuses[call->count],
2225
- call->count == 0 ? vnode : NULL,
2226
- NULL, NULL) < 0)
2227
- return afs_protocol_error(call, -EBADMSG);
1818
+ xdr_decode_AFSFetchStatus(&bp, call, scb);
22281819
22291820 call->count++;
2230
- if (call->count < call->count2)
1821
+ if (call->count < op->nr_files)
22311822 goto more_counts;
22321823
22331824 call->count = 0;
22341825 call->unmarshall++;
2235
- call->offset = 0;
1826
+ afs_extract_to_tmp(call);
1827
+ fallthrough;
22361828
22371829 /* Extract the callback count and array in two steps */
22381830 case 3:
22391831 _debug("extract CB count");
2240
- ret = afs_extract_data(call, &call->tmp, 4, true);
1832
+ ret = afs_extract_data(call, true);
22411833 if (ret < 0)
22421834 return ret;
22431835
22441836 tmp = ntohl(call->tmp);
22451837 _debug("CB count: %u", tmp);
2246
- if (tmp != call->count2)
2247
- return afs_protocol_error(call, -EBADMSG);
1838
+ if (tmp != op->nr_files)
1839
+ return afs_protocol_error(call, afs_eproto_ibulkst_cb_count);
22481840 call->count = 0;
22491841 call->unmarshall++;
22501842 more_cbs:
2251
- call->offset = 0;
1843
+ afs_extract_to_buf(call, 3 * sizeof(__be32));
1844
+ fallthrough;
22521845
22531846 case 4:
22541847 _debug("extract CB array");
2255
- ret = afs_extract_data(call, call->buffer, 3 * 4, true);
1848
+ ret = afs_extract_data(call, true);
22561849 if (ret < 0)
22571850 return ret;
22581851
22591852 _debug("unmarshall CB array");
1853
+ switch (call->count) {
1854
+ case 0:
1855
+ scb = &op->file[0].scb;
1856
+ break;
1857
+ case 1:
1858
+ scb = &op->file[1].scb;
1859
+ break;
1860
+ default:
1861
+ scb = &op->more_files[call->count - 2].scb;
1862
+ break;
1863
+ }
1864
+
22601865 bp = call->buffer;
2261
- callbacks = call->reply[2];
2262
- callbacks[call->count].version = ntohl(bp[0]);
2263
- callbacks[call->count].expiry = ntohl(bp[1]);
2264
- callbacks[call->count].type = ntohl(bp[2]);
2265
- statuses = call->reply[1];
2266
- if (call->count == 0 && vnode && statuses[0].abort_code == 0)
2267
- xdr_decode_AFSCallBack(call, vnode, &bp);
1866
+ xdr_decode_AFSCallBack(&bp, call, scb);
22681867 call->count++;
2269
- if (call->count < call->count2)
1868
+ if (call->count < op->nr_files)
22701869 goto more_cbs;
22711870
2272
- call->offset = 0;
1871
+ afs_extract_to_buf(call, 6 * sizeof(__be32));
22731872 call->unmarshall++;
1873
+ fallthrough;
22741874
22751875 case 5:
2276
- ret = afs_extract_data(call, call->buffer, 6 * 4, false);
1876
+ ret = afs_extract_data(call, false);
22771877 if (ret < 0)
22781878 return ret;
22791879
22801880 bp = call->buffer;
2281
- if (call->reply[3])
2282
- xdr_decode_AFSVolSync(&bp, call->reply[3]);
1881
+ xdr_decode_AFSVolSync(&bp, &op->volsync);
22831882
2284
- call->offset = 0;
22851883 call->unmarshall++;
22861884
22871885 case 6:
....@@ -2292,6 +1890,16 @@
22921890 return 0;
22931891 }
22941892
1893
+static void afs_done_fs_inline_bulk_status(struct afs_call *call)
1894
+{
1895
+ if (call->error == -ECONNABORTED &&
1896
+ call->abort_code == RX_INVALID_OPERATION) {
1897
+ set_bit(AFS_SERVER_FL_NO_IBULK, &call->server->flags);
1898
+ if (call->op)
1899
+ set_bit(AFS_VOLUME_MAYBE_NO_IBULK, &call->op->volume->flags);
1900
+ }
1901
+}
1902
+
22951903 /*
22961904 * FS.InlineBulkStatus operation type
22971905 */
....@@ -2299,54 +1907,200 @@
22991907 .name = "FS.InlineBulkStatus",
23001908 .op = afs_FS_InlineBulkStatus,
23011909 .deliver = afs_deliver_fs_inline_bulk_status,
1910
+ .done = afs_done_fs_inline_bulk_status,
23021911 .destructor = afs_flat_call_destructor,
23031912 };
23041913
23051914 /*
23061915 * Fetch the status information for up to 50 files
23071916 */
2308
-int afs_fs_inline_bulk_status(struct afs_fs_cursor *fc,
2309
- struct afs_net *net,
2310
- struct afs_fid *fids,
2311
- struct afs_file_status *statuses,
2312
- struct afs_callback *callbacks,
2313
- unsigned int nr_fids,
2314
- struct afs_volsync *volsync)
1917
+void afs_fs_inline_bulk_status(struct afs_operation *op)
23151918 {
1919
+ struct afs_vnode_param *dvp = &op->file[0];
1920
+ struct afs_vnode_param *vp = &op->file[1];
23161921 struct afs_call *call;
23171922 __be32 *bp;
23181923 int i;
23191924
2320
- _enter(",%x,{%x:%u},%u",
2321
- key_serial(fc->key), fids[0].vid, fids[1].vnode, nr_fids);
2322
-
2323
- call = afs_alloc_flat_call(net, &afs_RXFSInlineBulkStatus,
2324
- (2 + nr_fids * 3) * 4,
2325
- 21 * 4);
2326
- if (!call) {
2327
- fc->ac.error = -ENOMEM;
2328
- return -ENOMEM;
1925
+ if (test_bit(AFS_SERVER_FL_NO_IBULK, &op->server->flags)) {
1926
+ op->error = -ENOTSUPP;
1927
+ return;
23291928 }
23301929
2331
- call->key = fc->key;
2332
- call->reply[0] = NULL; /* vnode for fid[0] */
2333
- call->reply[1] = statuses;
2334
- call->reply[2] = callbacks;
2335
- call->reply[3] = volsync;
2336
- call->count2 = nr_fids;
1930
+ _enter(",%x,{%llx:%llu},%u",
1931
+ key_serial(op->key), vp->fid.vid, vp->fid.vnode, op->nr_files);
1932
+
1933
+ call = afs_alloc_flat_call(op->net, &afs_RXFSInlineBulkStatus,
1934
+ (2 + op->nr_files * 3) * 4,
1935
+ 21 * 4);
1936
+ if (!call)
1937
+ return afs_op_nomem(op);
23371938
23381939 /* marshall the parameters */
23391940 bp = call->request;
23401941 *bp++ = htonl(FSINLINEBULKSTATUS);
2341
- *bp++ = htonl(nr_fids);
2342
- for (i = 0; i < nr_fids; i++) {
2343
- *bp++ = htonl(fids[i].vid);
2344
- *bp++ = htonl(fids[i].vnode);
2345
- *bp++ = htonl(fids[i].unique);
1942
+ *bp++ = htonl(op->nr_files);
1943
+ *bp++ = htonl(dvp->fid.vid);
1944
+ *bp++ = htonl(dvp->fid.vnode);
1945
+ *bp++ = htonl(dvp->fid.unique);
1946
+ *bp++ = htonl(vp->fid.vid);
1947
+ *bp++ = htonl(vp->fid.vnode);
1948
+ *bp++ = htonl(vp->fid.unique);
1949
+ for (i = 0; i < op->nr_files - 2; i++) {
1950
+ *bp++ = htonl(op->more_files[i].fid.vid);
1951
+ *bp++ = htonl(op->more_files[i].fid.vnode);
1952
+ *bp++ = htonl(op->more_files[i].fid.unique);
23461953 }
23471954
2348
- call->cb_break = fc->cb_break;
2349
- afs_use_fs_server(call, fc->cbi);
2350
- trace_afs_make_fs_call(call, &fids[0]);
2351
- return afs_make_call(&fc->ac, call, GFP_NOFS, false);
1955
+ trace_afs_make_fs_call(call, &vp->fid);
1956
+ afs_make_op_call(op, call, GFP_NOFS);
1957
+}
1958
+
1959
+/*
1960
+ * deliver reply data to an FS.FetchACL
1961
+ */
1962
+static int afs_deliver_fs_fetch_acl(struct afs_call *call)
1963
+{
1964
+ struct afs_operation *op = call->op;
1965
+ struct afs_vnode_param *vp = &op->file[0];
1966
+ struct afs_acl *acl;
1967
+ const __be32 *bp;
1968
+ unsigned int size;
1969
+ int ret;
1970
+
1971
+ _enter("{%u}", call->unmarshall);
1972
+
1973
+ switch (call->unmarshall) {
1974
+ case 0:
1975
+ afs_extract_to_tmp(call);
1976
+ call->unmarshall++;
1977
+ fallthrough;
1978
+
1979
+ /* extract the returned data length */
1980
+ case 1:
1981
+ ret = afs_extract_data(call, true);
1982
+ if (ret < 0)
1983
+ return ret;
1984
+
1985
+ size = call->count2 = ntohl(call->tmp);
1986
+ size = round_up(size, 4);
1987
+
1988
+ acl = kmalloc(struct_size(acl, data, size), GFP_KERNEL);
1989
+ if (!acl)
1990
+ return -ENOMEM;
1991
+ op->acl = acl;
1992
+ acl->size = call->count2;
1993
+ afs_extract_begin(call, acl->data, size);
1994
+ call->unmarshall++;
1995
+ fallthrough;
1996
+
1997
+ /* extract the returned data */
1998
+ case 2:
1999
+ ret = afs_extract_data(call, true);
2000
+ if (ret < 0)
2001
+ return ret;
2002
+
2003
+ afs_extract_to_buf(call, (21 + 6) * 4);
2004
+ call->unmarshall++;
2005
+ fallthrough;
2006
+
2007
+ /* extract the metadata */
2008
+ case 3:
2009
+ ret = afs_extract_data(call, false);
2010
+ if (ret < 0)
2011
+ return ret;
2012
+
2013
+ bp = call->buffer;
2014
+ xdr_decode_AFSFetchStatus(&bp, call, &vp->scb);
2015
+ xdr_decode_AFSVolSync(&bp, &op->volsync);
2016
+
2017
+ call->unmarshall++;
2018
+
2019
+ case 4:
2020
+ break;
2021
+ }
2022
+
2023
+ _leave(" = 0 [done]");
2024
+ return 0;
2025
+}
2026
+
2027
+/*
2028
+ * FS.FetchACL operation type
2029
+ */
2030
+static const struct afs_call_type afs_RXFSFetchACL = {
2031
+ .name = "FS.FetchACL",
2032
+ .op = afs_FS_FetchACL,
2033
+ .deliver = afs_deliver_fs_fetch_acl,
2034
+};
2035
+
2036
+/*
2037
+ * Fetch the ACL for a file.
2038
+ */
2039
+void afs_fs_fetch_acl(struct afs_operation *op)
2040
+{
2041
+ struct afs_vnode_param *vp = &op->file[0];
2042
+ struct afs_call *call;
2043
+ __be32 *bp;
2044
+
2045
+ _enter(",%x,{%llx:%llu},,",
2046
+ key_serial(op->key), vp->fid.vid, vp->fid.vnode);
2047
+
2048
+ call = afs_alloc_flat_call(op->net, &afs_RXFSFetchACL, 16, (21 + 6) * 4);
2049
+ if (!call)
2050
+ return afs_op_nomem(op);
2051
+
2052
+ /* marshall the parameters */
2053
+ bp = call->request;
2054
+ bp[0] = htonl(FSFETCHACL);
2055
+ bp[1] = htonl(vp->fid.vid);
2056
+ bp[2] = htonl(vp->fid.vnode);
2057
+ bp[3] = htonl(vp->fid.unique);
2058
+
2059
+ trace_afs_make_fs_call(call, &vp->fid);
2060
+ afs_make_op_call(op, call, GFP_KERNEL);
2061
+}
2062
+
2063
+/*
2064
+ * FS.StoreACL operation type
2065
+ */
2066
+static const struct afs_call_type afs_RXFSStoreACL = {
2067
+ .name = "FS.StoreACL",
2068
+ .op = afs_FS_StoreACL,
2069
+ .deliver = afs_deliver_fs_file_status_and_vol,
2070
+ .destructor = afs_flat_call_destructor,
2071
+};
2072
+
2073
+/*
2074
+ * Fetch the ACL for a file.
2075
+ */
2076
+void afs_fs_store_acl(struct afs_operation *op)
2077
+{
2078
+ struct afs_vnode_param *vp = &op->file[0];
2079
+ struct afs_call *call;
2080
+ const struct afs_acl *acl = op->acl;
2081
+ size_t size;
2082
+ __be32 *bp;
2083
+
2084
+ _enter(",%x,{%llx:%llu},,",
2085
+ key_serial(op->key), vp->fid.vid, vp->fid.vnode);
2086
+
2087
+ size = round_up(acl->size, 4);
2088
+ call = afs_alloc_flat_call(op->net, &afs_RXFSStoreACL,
2089
+ 5 * 4 + size, (21 + 6) * 4);
2090
+ if (!call)
2091
+ return afs_op_nomem(op);
2092
+
2093
+ /* marshall the parameters */
2094
+ bp = call->request;
2095
+ bp[0] = htonl(FSSTOREACL);
2096
+ bp[1] = htonl(vp->fid.vid);
2097
+ bp[2] = htonl(vp->fid.vnode);
2098
+ bp[3] = htonl(vp->fid.unique);
2099
+ bp[4] = htonl(acl->size);
2100
+ memcpy(&bp[5], acl->data, acl->size);
2101
+ if (acl->size != size)
2102
+ memset((void *)&bp[5] + acl->size, 0, size - acl->size);
2103
+
2104
+ trace_afs_make_fs_call(call, &vp->fid);
2105
+ afs_make_op_call(op, call, GFP_KERNEL);
23522106 }