1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /* YFS File Server client stubs
4 * Copyright (C) 2018 Red Hat, Inc. All Rights Reserved.
5 * Written by David Howells (dhowells@redhat.com)
8 #include <linux/init.h>
9 #include <linux/slab.h>
10 #include <linux/sched.h>
11 #include <linux/circ_buf.h>
12 #include <linux/iversion.h>
16 #include "protocol_yfs.h"
18 static const struct afs_fid afs_zero_fid
;
20 static inline void afs_use_fs_server(struct afs_call
*call
, struct afs_cb_interest
*cbi
)
22 call
->cbi
= afs_get_cb_interest(cbi
);
25 #define xdr_size(x) (sizeof(*x) / sizeof(__be32))
27 static void xdr_decode_YFSFid(const __be32
**_bp
, struct afs_fid
*fid
)
29 const struct yfs_xdr_YFSFid
*x
= (const void *)*_bp
;
31 fid
->vid
= xdr_to_u64(x
->volume
);
32 fid
->vnode
= xdr_to_u64(x
->vnode
.lo
);
33 fid
->vnode_hi
= ntohl(x
->vnode
.hi
);
34 fid
->unique
= ntohl(x
->vnode
.unique
);
38 static __be32
*xdr_encode_u32(__be32
*bp
, u32 n
)
44 static __be32
*xdr_encode_u64(__be32
*bp
, u64 n
)
46 struct yfs_xdr_u64
*x
= (void *)bp
;
49 return bp
+ xdr_size(x
);
52 static __be32
*xdr_encode_YFSFid(__be32
*bp
, struct afs_fid
*fid
)
54 struct yfs_xdr_YFSFid
*x
= (void *)bp
;
56 x
->volume
= u64_to_xdr(fid
->vid
);
57 x
->vnode
.lo
= u64_to_xdr(fid
->vnode
);
58 x
->vnode
.hi
= htonl(fid
->vnode_hi
);
59 x
->vnode
.unique
= htonl(fid
->unique
);
60 return bp
+ xdr_size(x
);
63 static size_t xdr_strlen(unsigned int len
)
65 return sizeof(__be32
) + round_up(len
, sizeof(__be32
));
68 static __be32
*xdr_encode_string(__be32
*bp
, const char *p
, unsigned int len
)
70 bp
= xdr_encode_u32(bp
, len
);
71 bp
= memcpy(bp
, p
, len
);
73 unsigned int pad
= 4 - (len
& 3);
75 memset((u8
*)bp
+ len
, 0, pad
);
79 return bp
+ len
/ sizeof(__be32
);
82 static s64
linux_to_yfs_time(const struct timespec64
*t
)
84 /* Convert to 100ns intervals. */
85 return (u64
)t
->tv_sec
* 10000000 + t
->tv_nsec
/100;
88 static __be32
*xdr_encode_YFSStoreStatus_mode(__be32
*bp
, mode_t mode
)
90 struct yfs_xdr_YFSStoreStatus
*x
= (void *)bp
;
92 x
->mask
= htonl(AFS_SET_MODE
);
93 x
->mode
= htonl(mode
& S_IALLUGO
);
94 x
->mtime_client
= u64_to_xdr(0);
95 x
->owner
= u64_to_xdr(0);
96 x
->group
= u64_to_xdr(0);
97 return bp
+ xdr_size(x
);
100 static __be32
*xdr_encode_YFSStoreStatus_mtime(__be32
*bp
, const struct timespec64
*t
)
102 struct yfs_xdr_YFSStoreStatus
*x
= (void *)bp
;
103 s64 mtime
= linux_to_yfs_time(t
);
105 x
->mask
= htonl(AFS_SET_MTIME
);
107 x
->mtime_client
= u64_to_xdr(mtime
);
108 x
->owner
= u64_to_xdr(0);
109 x
->group
= u64_to_xdr(0);
110 return bp
+ xdr_size(x
);
114 * Convert a signed 100ns-resolution 64-bit time into a timespec.
116 static struct timespec64
yfs_time_to_linux(s64 t
)
118 struct timespec64 ts
;
122 * Unfortunately can not use normal 64 bit division on 32 bit arch, but
123 * the alternative, do_div, does not work with negative numbers so have
124 * to special case them
128 ts
.tv_nsec
= (time64_t
)(do_div(abs_t
, 10000000) * 100);
129 ts
.tv_nsec
= -ts
.tv_nsec
;
133 ts
.tv_nsec
= (time64_t
)do_div(abs_t
, 10000000) * 100;
140 static struct timespec64
xdr_to_time(const struct yfs_xdr_u64 xdr
)
142 s64 t
= xdr_to_u64(xdr
);
144 return yfs_time_to_linux(t
);
147 static void yfs_check_req(struct afs_call
*call
, __be32
*bp
)
149 size_t len
= (void *)bp
- call
->request
;
151 if (len
> call
->request_size
)
152 pr_err("kAFS: %s: Request buffer overflow (%zu>%u)\n",
153 call
->type
->name
, len
, call
->request_size
);
154 else if (len
< call
->request_size
)
155 pr_warn("kAFS: %s: Request buffer underflow (%zu<%u)\n",
156 call
->type
->name
, len
, call
->request_size
);
160 * Dump a bad file status record.
162 static void xdr_dump_bad(const __be32
*bp
)
167 pr_notice("YFS XDR: Bad status record\n");
168 for (i
= 0; i
< 5 * 4 * 4; i
+= 16) {
171 pr_notice("%03x: %08x %08x %08x %08x\n",
172 i
, ntohl(x
[0]), ntohl(x
[1]), ntohl(x
[2]), ntohl(x
[3]));
176 pr_notice("0x50: %08x\n", ntohl(x
[0]));
180 * Decode a YFSFetchStatus block
182 static int xdr_decode_YFSFetchStatus(const __be32
**_bp
,
183 struct afs_call
*call
,
184 struct afs_status_cb
*scb
)
186 const struct yfs_xdr_YFSFetchStatus
*xdr
= (const void *)*_bp
;
187 struct afs_file_status
*status
= &scb
->status
;
190 status
->abort_code
= ntohl(xdr
->abort_code
);
191 if (status
->abort_code
!= 0) {
192 if (status
->abort_code
== VNOVNODE
)
194 scb
->have_error
= true;
198 type
= ntohl(xdr
->type
);
202 case AFS_FTYPE_SYMLINK
:
209 status
->nlink
= ntohl(xdr
->nlink
);
210 status
->author
= xdr_to_u64(xdr
->author
);
211 status
->owner
= xdr_to_u64(xdr
->owner
);
212 status
->caller_access
= ntohl(xdr
->caller_access
); /* Ticket dependent */
213 status
->anon_access
= ntohl(xdr
->anon_access
);
214 status
->mode
= ntohl(xdr
->mode
) & S_IALLUGO
;
215 status
->group
= xdr_to_u64(xdr
->group
);
216 status
->lock_count
= ntohl(xdr
->lock_count
);
218 status
->mtime_client
= xdr_to_time(xdr
->mtime_client
);
219 status
->mtime_server
= xdr_to_time(xdr
->mtime_server
);
220 status
->size
= xdr_to_u64(xdr
->size
);
221 status
->data_version
= xdr_to_u64(xdr
->data_version
);
222 scb
->have_status
= true;
224 *_bp
+= xdr_size(xdr
);
229 return afs_protocol_error(call
, -EBADMSG
, afs_eproto_bad_status
);
233 * Decode a YFSCallBack block
235 static void xdr_decode_YFSCallBack(const __be32
**_bp
,
236 struct afs_call
*call
,
237 struct afs_status_cb
*scb
)
239 struct yfs_xdr_YFSCallBack
*x
= (void *)*_bp
;
240 struct afs_callback
*cb
= &scb
->callback
;
243 cb_expiry
= call
->reply_time
;
244 cb_expiry
= ktime_add(cb_expiry
, xdr_to_u64(x
->expiration_time
) * 100);
245 cb
->expires_at
= ktime_divns(cb_expiry
, NSEC_PER_SEC
);
251 * Decode a YFSVolSync block
253 static void xdr_decode_YFSVolSync(const __be32
**_bp
,
254 struct afs_volsync
*volsync
)
256 struct yfs_xdr_YFSVolSync
*x
= (void *)*_bp
;
260 creation
= xdr_to_u64(x
->vol_creation_date
);
261 do_div(creation
, 10 * 1000 * 1000);
262 volsync
->creation
= creation
;
269 * Encode the requested attributes into a YFSStoreStatus block
271 static __be32
*xdr_encode_YFS_StoreStatus(__be32
*bp
, struct iattr
*attr
)
273 struct yfs_xdr_YFSStoreStatus
*x
= (void *)bp
;
274 s64 mtime
= 0, owner
= 0, group
= 0;
275 u32 mask
= 0, mode
= 0;
278 if (attr
->ia_valid
& ATTR_MTIME
) {
279 mask
|= AFS_SET_MTIME
;
280 mtime
= linux_to_yfs_time(&attr
->ia_mtime
);
283 if (attr
->ia_valid
& ATTR_UID
) {
284 mask
|= AFS_SET_OWNER
;
285 owner
= from_kuid(&init_user_ns
, attr
->ia_uid
);
288 if (attr
->ia_valid
& ATTR_GID
) {
289 mask
|= AFS_SET_GROUP
;
290 group
= from_kgid(&init_user_ns
, attr
->ia_gid
);
293 if (attr
->ia_valid
& ATTR_MODE
) {
294 mask
|= AFS_SET_MODE
;
295 mode
= attr
->ia_mode
& S_IALLUGO
;
298 x
->mask
= htonl(mask
);
299 x
->mode
= htonl(mode
);
300 x
->mtime_client
= u64_to_xdr(mtime
);
301 x
->owner
= u64_to_xdr(owner
);
302 x
->group
= u64_to_xdr(group
);
303 return bp
+ xdr_size(x
);
307 * Decode a YFSFetchVolumeStatus block.
309 static void xdr_decode_YFSFetchVolumeStatus(const __be32
**_bp
,
310 struct afs_volume_status
*vs
)
312 const struct yfs_xdr_YFSFetchVolumeStatus
*x
= (const void *)*_bp
;
315 vs
->vid
= xdr_to_u64(x
->vid
);
316 vs
->parent_id
= xdr_to_u64(x
->parent_id
);
317 flags
= ntohl(x
->flags
);
318 vs
->online
= flags
& yfs_FVSOnline
;
319 vs
->in_service
= flags
& yfs_FVSInservice
;
320 vs
->blessed
= flags
& yfs_FVSBlessed
;
321 vs
->needs_salvage
= flags
& yfs_FVSNeedsSalvage
;
322 vs
->type
= ntohl(x
->type
);
324 vs
->max_quota
= xdr_to_u64(x
->max_quota
);
325 vs
->blocks_in_use
= xdr_to_u64(x
->blocks_in_use
);
326 vs
->part_blocks_avail
= xdr_to_u64(x
->part_blocks_avail
);
327 vs
->part_max_blocks
= xdr_to_u64(x
->part_max_blocks
);
328 vs
->vol_copy_date
= xdr_to_u64(x
->vol_copy_date
);
329 vs
->vol_backup_date
= xdr_to_u64(x
->vol_backup_date
);
330 *_bp
+= sizeof(*x
) / sizeof(__be32
);
334 * Deliver a reply that's a status, callback and volsync.
336 static int yfs_deliver_fs_status_cb_and_volsync(struct afs_call
*call
)
341 ret
= afs_transfer_reply(call
);
345 /* unmarshall the reply once we've received all of it */
347 ret
= xdr_decode_YFSFetchStatus(&bp
, call
, call
->out_scb
);
350 xdr_decode_YFSCallBack(&bp
, call
, call
->out_scb
);
351 xdr_decode_YFSVolSync(&bp
, call
->out_volsync
);
353 _leave(" = 0 [done]");
358 * Deliver reply data to operations that just return a file status and a volume
361 static int yfs_deliver_status_and_volsync(struct afs_call
*call
)
366 ret
= afs_transfer_reply(call
);
371 ret
= xdr_decode_YFSFetchStatus(&bp
, call
, call
->out_scb
);
374 xdr_decode_YFSVolSync(&bp
, call
->out_volsync
);
376 _leave(" = 0 [done]");
381 * YFS.FetchStatus operation type
383 static const struct afs_call_type yfs_RXYFSFetchStatus_vnode
= {
384 .name
= "YFS.FetchStatus(vnode)",
385 .op
= yfs_FS_FetchStatus
,
386 .deliver
= yfs_deliver_fs_status_cb_and_volsync
,
387 .destructor
= afs_flat_call_destructor
,
391 * Fetch the status information for a file.
393 int yfs_fs_fetch_file_status(struct afs_fs_cursor
*fc
, struct afs_status_cb
*scb
,
394 struct afs_volsync
*volsync
)
396 struct afs_vnode
*vnode
= fc
->vnode
;
397 struct afs_call
*call
;
398 struct afs_net
*net
= afs_v2net(vnode
);
401 _enter(",%x,{%llx:%llu},,",
402 key_serial(fc
->key
), vnode
->fid
.vid
, vnode
->fid
.vnode
);
404 call
= afs_alloc_flat_call(net
, &yfs_RXYFSFetchStatus_vnode
,
406 sizeof(struct yfs_xdr_YFSFid
),
407 sizeof(struct yfs_xdr_YFSFetchStatus
) +
408 sizeof(struct yfs_xdr_YFSCallBack
) +
409 sizeof(struct yfs_xdr_YFSVolSync
));
411 fc
->ac
.error
= -ENOMEM
;
417 call
->out_volsync
= volsync
;
419 /* marshall the parameters */
421 bp
= xdr_encode_u32(bp
, YFSFETCHSTATUS
);
422 bp
= xdr_encode_u32(bp
, 0); /* RPC flags */
423 bp
= xdr_encode_YFSFid(bp
, &vnode
->fid
);
424 yfs_check_req(call
, bp
);
426 afs_use_fs_server(call
, fc
->cbi
);
427 trace_afs_make_fs_call(call
, &vnode
->fid
);
428 afs_set_fc_call(call
, fc
);
429 afs_make_call(&fc
->ac
, call
, GFP_NOFS
);
430 return afs_wait_for_call_to_complete(call
, &fc
->ac
);
434 * Deliver reply data to an YFS.FetchData64.
436 static int yfs_deliver_fs_fetch_data64(struct afs_call
*call
)
438 struct afs_read
*req
= call
->read_request
;
443 _enter("{%u,%zu/%llu}",
444 call
->unmarshall
, iov_iter_count(call
->iter
), req
->actual_len
);
446 switch (call
->unmarshall
) {
450 req
->offset
= req
->pos
& (PAGE_SIZE
- 1);
451 afs_extract_to_tmp64(call
);
455 /* extract the returned data length */
457 _debug("extract data length");
458 ret
= afs_extract_data(call
, true);
462 req
->actual_len
= be64_to_cpu(call
->tmp64
);
463 _debug("DATA length: %llu", req
->actual_len
);
464 req
->remain
= min(req
->len
, req
->actual_len
);
465 if (req
->remain
== 0)
471 ASSERTCMP(req
->index
, <, req
->nr_pages
);
472 if (req
->remain
> PAGE_SIZE
- req
->offset
)
473 size
= PAGE_SIZE
- req
->offset
;
476 call
->bvec
[0].bv_len
= size
;
477 call
->bvec
[0].bv_offset
= req
->offset
;
478 call
->bvec
[0].bv_page
= req
->pages
[req
->index
];
479 iov_iter_bvec(&call
->def_iter
, READ
, call
->bvec
, 1, size
);
480 ASSERTCMP(size
, <=, PAGE_SIZE
);
483 /* extract the returned data */
485 _debug("extract data %zu/%llu",
486 iov_iter_count(call
->iter
), req
->remain
);
488 ret
= afs_extract_data(call
, true);
491 req
->remain
-= call
->bvec
[0].bv_len
;
492 req
->offset
+= call
->bvec
[0].bv_len
;
493 ASSERTCMP(req
->offset
, <=, PAGE_SIZE
);
494 if (req
->offset
== PAGE_SIZE
) {
503 ASSERTCMP(req
->remain
, ==, 0);
504 if (req
->actual_len
<= req
->len
)
507 /* Discard any excess data the server gave us */
508 afs_extract_discard(call
, req
->actual_len
- req
->len
);
509 call
->unmarshall
= 3;
513 _debug("extract discard %zu/%llu",
514 iov_iter_count(call
->iter
), req
->actual_len
- req
->len
);
516 ret
= afs_extract_data(call
, true);
521 call
->unmarshall
= 4;
522 afs_extract_to_buf(call
,
523 sizeof(struct yfs_xdr_YFSFetchStatus
) +
524 sizeof(struct yfs_xdr_YFSCallBack
) +
525 sizeof(struct yfs_xdr_YFSVolSync
));
528 /* extract the metadata */
530 ret
= afs_extract_data(call
, false);
535 ret
= xdr_decode_YFSFetchStatus(&bp
, call
, call
->out_scb
);
538 xdr_decode_YFSCallBack(&bp
, call
, call
->out_scb
);
539 xdr_decode_YFSVolSync(&bp
, call
->out_volsync
);
541 req
->data_version
= call
->out_scb
->status
.data_version
;
542 req
->file_size
= call
->out_scb
->status
.size
;
551 for (; req
->index
< req
->nr_pages
; req
->index
++) {
552 if (req
->offset
< PAGE_SIZE
)
553 zero_user_segment(req
->pages
[req
->index
],
554 req
->offset
, PAGE_SIZE
);
560 _leave(" = 0 [done]");
564 static void yfs_fetch_data_destructor(struct afs_call
*call
)
566 afs_put_read(call
->read_request
);
567 afs_flat_call_destructor(call
);
571 * YFS.FetchData64 operation type
573 static const struct afs_call_type yfs_RXYFSFetchData64
= {
574 .name
= "YFS.FetchData64",
575 .op
= yfs_FS_FetchData64
,
576 .deliver
= yfs_deliver_fs_fetch_data64
,
577 .destructor
= yfs_fetch_data_destructor
,
581 * Fetch data from a file.
583 int yfs_fs_fetch_data(struct afs_fs_cursor
*fc
, struct afs_status_cb
*scb
,
584 struct afs_read
*req
)
586 struct afs_vnode
*vnode
= fc
->vnode
;
587 struct afs_call
*call
;
588 struct afs_net
*net
= afs_v2net(vnode
);
591 _enter(",%x,{%llx:%llu},%llx,%llx",
592 key_serial(fc
->key
), vnode
->fid
.vid
, vnode
->fid
.vnode
,
595 call
= afs_alloc_flat_call(net
, &yfs_RXYFSFetchData64
,
597 sizeof(struct yfs_xdr_YFSFid
) +
598 sizeof(struct yfs_xdr_u64
) * 2,
599 sizeof(struct yfs_xdr_YFSFetchStatus
) +
600 sizeof(struct yfs_xdr_YFSCallBack
) +
601 sizeof(struct yfs_xdr_YFSVolSync
));
607 call
->out_volsync
= NULL
;
608 call
->read_request
= afs_get_read(req
);
610 /* marshall the parameters */
612 bp
= xdr_encode_u32(bp
, YFSFETCHDATA64
);
613 bp
= xdr_encode_u32(bp
, 0); /* RPC flags */
614 bp
= xdr_encode_YFSFid(bp
, &vnode
->fid
);
615 bp
= xdr_encode_u64(bp
, req
->pos
);
616 bp
= xdr_encode_u64(bp
, req
->len
);
617 yfs_check_req(call
, bp
);
619 afs_use_fs_server(call
, fc
->cbi
);
620 trace_afs_make_fs_call(call
, &vnode
->fid
);
621 afs_set_fc_call(call
, fc
);
622 afs_make_call(&fc
->ac
, call
, GFP_NOFS
);
623 return afs_wait_for_call_to_complete(call
, &fc
->ac
);
627 * Deliver reply data for YFS.CreateFile or YFS.MakeDir.
629 static int yfs_deliver_fs_create_vnode(struct afs_call
*call
)
634 _enter("{%u}", call
->unmarshall
);
636 ret
= afs_transfer_reply(call
);
640 /* unmarshall the reply once we've received all of it */
642 xdr_decode_YFSFid(&bp
, call
->out_fid
);
643 ret
= xdr_decode_YFSFetchStatus(&bp
, call
, call
->out_scb
);
646 ret
= xdr_decode_YFSFetchStatus(&bp
, call
, call
->out_dir_scb
);
649 xdr_decode_YFSCallBack(&bp
, call
, call
->out_scb
);
650 xdr_decode_YFSVolSync(&bp
, call
->out_volsync
);
652 _leave(" = 0 [done]");
657 * FS.CreateFile and FS.MakeDir operation type
659 static const struct afs_call_type afs_RXFSCreateFile
= {
660 .name
= "YFS.CreateFile",
661 .op
= yfs_FS_CreateFile
,
662 .deliver
= yfs_deliver_fs_create_vnode
,
663 .destructor
= afs_flat_call_destructor
,
669 int yfs_fs_create_file(struct afs_fs_cursor
*fc
,
672 struct afs_status_cb
*dvnode_scb
,
673 struct afs_fid
*newfid
,
674 struct afs_status_cb
*new_scb
)
676 struct afs_vnode
*dvnode
= fc
->vnode
;
677 struct afs_call
*call
;
678 struct afs_net
*net
= afs_v2net(dvnode
);
679 size_t namesz
, reqsz
, rplsz
;
684 namesz
= strlen(name
);
685 reqsz
= (sizeof(__be32
) +
687 sizeof(struct yfs_xdr_YFSFid
) +
689 sizeof(struct yfs_xdr_YFSStoreStatus
) +
691 rplsz
= (sizeof(struct yfs_xdr_YFSFid
) +
692 sizeof(struct yfs_xdr_YFSFetchStatus
) +
693 sizeof(struct yfs_xdr_YFSFetchStatus
) +
694 sizeof(struct yfs_xdr_YFSCallBack
) +
695 sizeof(struct yfs_xdr_YFSVolSync
));
697 call
= afs_alloc_flat_call(net
, &afs_RXFSCreateFile
, reqsz
, rplsz
);
702 call
->out_dir_scb
= dvnode_scb
;
703 call
->out_fid
= newfid
;
704 call
->out_scb
= new_scb
;
706 /* marshall the parameters */
708 bp
= xdr_encode_u32(bp
, YFSCREATEFILE
);
709 bp
= xdr_encode_u32(bp
, 0); /* RPC flags */
710 bp
= xdr_encode_YFSFid(bp
, &dvnode
->fid
);
711 bp
= xdr_encode_string(bp
, name
, namesz
);
712 bp
= xdr_encode_YFSStoreStatus_mode(bp
, mode
);
713 bp
= xdr_encode_u32(bp
, yfs_LockNone
); /* ViceLockType */
714 yfs_check_req(call
, bp
);
716 afs_use_fs_server(call
, fc
->cbi
);
717 trace_afs_make_fs_call1(call
, &dvnode
->fid
, name
);
718 afs_set_fc_call(call
, fc
);
719 afs_make_call(&fc
->ac
, call
, GFP_NOFS
);
720 return afs_wait_for_call_to_complete(call
, &fc
->ac
);
723 static const struct afs_call_type yfs_RXFSMakeDir
= {
724 .name
= "YFS.MakeDir",
725 .op
= yfs_FS_MakeDir
,
726 .deliver
= yfs_deliver_fs_create_vnode
,
727 .destructor
= afs_flat_call_destructor
,
733 int yfs_fs_make_dir(struct afs_fs_cursor
*fc
,
736 struct afs_status_cb
*dvnode_scb
,
737 struct afs_fid
*newfid
,
738 struct afs_status_cb
*new_scb
)
740 struct afs_vnode
*dvnode
= fc
->vnode
;
741 struct afs_call
*call
;
742 struct afs_net
*net
= afs_v2net(dvnode
);
743 size_t namesz
, reqsz
, rplsz
;
748 namesz
= strlen(name
);
749 reqsz
= (sizeof(__be32
) +
750 sizeof(struct yfs_xdr_RPCFlags
) +
751 sizeof(struct yfs_xdr_YFSFid
) +
753 sizeof(struct yfs_xdr_YFSStoreStatus
));
754 rplsz
= (sizeof(struct yfs_xdr_YFSFid
) +
755 sizeof(struct yfs_xdr_YFSFetchStatus
) +
756 sizeof(struct yfs_xdr_YFSFetchStatus
) +
757 sizeof(struct yfs_xdr_YFSCallBack
) +
758 sizeof(struct yfs_xdr_YFSVolSync
));
760 call
= afs_alloc_flat_call(net
, &yfs_RXFSMakeDir
, reqsz
, rplsz
);
765 call
->out_dir_scb
= dvnode_scb
;
766 call
->out_fid
= newfid
;
767 call
->out_scb
= new_scb
;
769 /* marshall the parameters */
771 bp
= xdr_encode_u32(bp
, YFSMAKEDIR
);
772 bp
= xdr_encode_u32(bp
, 0); /* RPC flags */
773 bp
= xdr_encode_YFSFid(bp
, &dvnode
->fid
);
774 bp
= xdr_encode_string(bp
, name
, namesz
);
775 bp
= xdr_encode_YFSStoreStatus_mode(bp
, mode
);
776 yfs_check_req(call
, bp
);
778 afs_use_fs_server(call
, fc
->cbi
);
779 trace_afs_make_fs_call1(call
, &dvnode
->fid
, name
);
780 afs_set_fc_call(call
, fc
);
781 afs_make_call(&fc
->ac
, call
, GFP_NOFS
);
782 return afs_wait_for_call_to_complete(call
, &fc
->ac
);
786 * Deliver reply data to a YFS.RemoveFile2 operation.
788 static int yfs_deliver_fs_remove_file2(struct afs_call
*call
)
794 _enter("{%u}", call
->unmarshall
);
796 ret
= afs_transfer_reply(call
);
801 ret
= xdr_decode_YFSFetchStatus(&bp
, call
, call
->out_dir_scb
);
805 xdr_decode_YFSFid(&bp
, &fid
);
806 ret
= xdr_decode_YFSFetchStatus(&bp
, call
, call
->out_scb
);
809 /* Was deleted if vnode->status.abort_code == VNOVNODE. */
811 xdr_decode_YFSVolSync(&bp
, call
->out_volsync
);
816 * YFS.RemoveFile2 operation type.
818 static const struct afs_call_type yfs_RXYFSRemoveFile2
= {
819 .name
= "YFS.RemoveFile2",
820 .op
= yfs_FS_RemoveFile2
,
821 .deliver
= yfs_deliver_fs_remove_file2
,
822 .destructor
= afs_flat_call_destructor
,
826 * Remove a file and retrieve new file status.
828 int yfs_fs_remove_file2(struct afs_fs_cursor
*fc
, struct afs_vnode
*vnode
,
829 const char *name
, struct afs_status_cb
*dvnode_scb
,
830 struct afs_status_cb
*vnode_scb
)
832 struct afs_vnode
*dvnode
= fc
->vnode
;
833 struct afs_call
*call
;
834 struct afs_net
*net
= afs_v2net(dvnode
);
840 namesz
= strlen(name
);
842 call
= afs_alloc_flat_call(net
, &yfs_RXYFSRemoveFile2
,
844 sizeof(struct yfs_xdr_RPCFlags
) +
845 sizeof(struct yfs_xdr_YFSFid
) +
847 sizeof(struct yfs_xdr_YFSFetchStatus
) +
848 sizeof(struct yfs_xdr_YFSFid
) +
849 sizeof(struct yfs_xdr_YFSFetchStatus
) +
850 sizeof(struct yfs_xdr_YFSVolSync
));
855 call
->out_dir_scb
= dvnode_scb
;
856 call
->out_scb
= vnode_scb
;
858 /* marshall the parameters */
860 bp
= xdr_encode_u32(bp
, YFSREMOVEFILE2
);
861 bp
= xdr_encode_u32(bp
, 0); /* RPC flags */
862 bp
= xdr_encode_YFSFid(bp
, &dvnode
->fid
);
863 bp
= xdr_encode_string(bp
, name
, namesz
);
864 yfs_check_req(call
, bp
);
866 afs_use_fs_server(call
, fc
->cbi
);
867 trace_afs_make_fs_call1(call
, &dvnode
->fid
, name
);
868 afs_set_fc_call(call
, fc
);
869 afs_make_call(&fc
->ac
, call
, GFP_NOFS
);
870 return afs_wait_for_call_to_complete(call
, &fc
->ac
);
874 * Deliver reply data to a YFS.RemoveFile or YFS.RemoveDir operation.
876 static int yfs_deliver_fs_remove(struct afs_call
*call
)
881 _enter("{%u}", call
->unmarshall
);
883 ret
= afs_transfer_reply(call
);
888 ret
= xdr_decode_YFSFetchStatus(&bp
, call
, call
->out_dir_scb
);
892 xdr_decode_YFSVolSync(&bp
, call
->out_volsync
);
897 * FS.RemoveDir and FS.RemoveFile operation types.
899 static const struct afs_call_type yfs_RXYFSRemoveFile
= {
900 .name
= "YFS.RemoveFile",
901 .op
= yfs_FS_RemoveFile
,
902 .deliver
= yfs_deliver_fs_remove
,
903 .destructor
= afs_flat_call_destructor
,
906 static const struct afs_call_type yfs_RXYFSRemoveDir
= {
907 .name
= "YFS.RemoveDir",
908 .op
= yfs_FS_RemoveDir
,
909 .deliver
= yfs_deliver_fs_remove
,
910 .destructor
= afs_flat_call_destructor
,
914 * remove a file or directory
916 int yfs_fs_remove(struct afs_fs_cursor
*fc
, struct afs_vnode
*vnode
,
917 const char *name
, bool isdir
,
918 struct afs_status_cb
*dvnode_scb
)
920 struct afs_vnode
*dvnode
= fc
->vnode
;
921 struct afs_call
*call
;
922 struct afs_net
*net
= afs_v2net(dvnode
);
928 namesz
= strlen(name
);
929 call
= afs_alloc_flat_call(
930 net
, isdir
? &yfs_RXYFSRemoveDir
: &yfs_RXYFSRemoveFile
,
932 sizeof(struct yfs_xdr_RPCFlags
) +
933 sizeof(struct yfs_xdr_YFSFid
) +
935 sizeof(struct yfs_xdr_YFSFetchStatus
) +
936 sizeof(struct yfs_xdr_YFSVolSync
));
941 call
->out_dir_scb
= dvnode_scb
;
943 /* marshall the parameters */
945 bp
= xdr_encode_u32(bp
, isdir
? YFSREMOVEDIR
: YFSREMOVEFILE
);
946 bp
= xdr_encode_u32(bp
, 0); /* RPC flags */
947 bp
= xdr_encode_YFSFid(bp
, &dvnode
->fid
);
948 bp
= xdr_encode_string(bp
, name
, namesz
);
949 yfs_check_req(call
, bp
);
951 afs_use_fs_server(call
, fc
->cbi
);
952 trace_afs_make_fs_call1(call
, &dvnode
->fid
, name
);
953 afs_set_fc_call(call
, fc
);
954 afs_make_call(&fc
->ac
, call
, GFP_NOFS
);
955 return afs_wait_for_call_to_complete(call
, &fc
->ac
);
959 * Deliver reply data to a YFS.Link operation.
961 static int yfs_deliver_fs_link(struct afs_call
*call
)
966 _enter("{%u}", call
->unmarshall
);
968 ret
= afs_transfer_reply(call
);
973 ret
= xdr_decode_YFSFetchStatus(&bp
, call
, call
->out_scb
);
976 ret
= xdr_decode_YFSFetchStatus(&bp
, call
, call
->out_dir_scb
);
979 xdr_decode_YFSVolSync(&bp
, call
->out_volsync
);
980 _leave(" = 0 [done]");
985 * YFS.Link operation type.
987 static const struct afs_call_type yfs_RXYFSLink
= {
990 .deliver
= yfs_deliver_fs_link
,
991 .destructor
= afs_flat_call_destructor
,
997 int yfs_fs_link(struct afs_fs_cursor
*fc
, struct afs_vnode
*vnode
,
999 struct afs_status_cb
*dvnode_scb
,
1000 struct afs_status_cb
*vnode_scb
)
1002 struct afs_vnode
*dvnode
= fc
->vnode
;
1003 struct afs_call
*call
;
1004 struct afs_net
*net
= afs_v2net(vnode
);
1010 namesz
= strlen(name
);
1011 call
= afs_alloc_flat_call(net
, &yfs_RXYFSLink
,
1013 sizeof(struct yfs_xdr_RPCFlags
) +
1014 sizeof(struct yfs_xdr_YFSFid
) +
1015 xdr_strlen(namesz
) +
1016 sizeof(struct yfs_xdr_YFSFid
),
1017 sizeof(struct yfs_xdr_YFSFetchStatus
) +
1018 sizeof(struct yfs_xdr_YFSFetchStatus
) +
1019 sizeof(struct yfs_xdr_YFSVolSync
));
1023 call
->key
= fc
->key
;
1024 call
->out_dir_scb
= dvnode_scb
;
1025 call
->out_scb
= vnode_scb
;
1027 /* marshall the parameters */
1029 bp
= xdr_encode_u32(bp
, YFSLINK
);
1030 bp
= xdr_encode_u32(bp
, 0); /* RPC flags */
1031 bp
= xdr_encode_YFSFid(bp
, &dvnode
->fid
);
1032 bp
= xdr_encode_string(bp
, name
, namesz
);
1033 bp
= xdr_encode_YFSFid(bp
, &vnode
->fid
);
1034 yfs_check_req(call
, bp
);
1036 afs_use_fs_server(call
, fc
->cbi
);
1037 trace_afs_make_fs_call1(call
, &vnode
->fid
, name
);
1038 afs_set_fc_call(call
, fc
);
1039 afs_make_call(&fc
->ac
, call
, GFP_NOFS
);
1040 return afs_wait_for_call_to_complete(call
, &fc
->ac
);
1044 * Deliver reply data to a YFS.Symlink operation.
1046 static int yfs_deliver_fs_symlink(struct afs_call
*call
)
1051 _enter("{%u}", call
->unmarshall
);
1053 ret
= afs_transfer_reply(call
);
1057 /* unmarshall the reply once we've received all of it */
1059 xdr_decode_YFSFid(&bp
, call
->out_fid
);
1060 ret
= xdr_decode_YFSFetchStatus(&bp
, call
, call
->out_scb
);
1063 ret
= xdr_decode_YFSFetchStatus(&bp
, call
, call
->out_dir_scb
);
1066 xdr_decode_YFSVolSync(&bp
, call
->out_volsync
);
1068 _leave(" = 0 [done]");
1073 * YFS.Symlink operation type
1075 static const struct afs_call_type yfs_RXYFSSymlink
= {
1076 .name
= "YFS.Symlink",
1077 .op
= yfs_FS_Symlink
,
1078 .deliver
= yfs_deliver_fs_symlink
,
1079 .destructor
= afs_flat_call_destructor
,
1083 * Create a symbolic link.
1085 int yfs_fs_symlink(struct afs_fs_cursor
*fc
,
1087 const char *contents
,
1088 struct afs_status_cb
*dvnode_scb
,
1089 struct afs_fid
*newfid
,
1090 struct afs_status_cb
*vnode_scb
)
1092 struct afs_vnode
*dvnode
= fc
->vnode
;
1093 struct afs_call
*call
;
1094 struct afs_net
*net
= afs_v2net(dvnode
);
1095 size_t namesz
, contents_sz
;
1100 namesz
= strlen(name
);
1101 contents_sz
= strlen(contents
);
1102 call
= afs_alloc_flat_call(net
, &yfs_RXYFSSymlink
,
1104 sizeof(struct yfs_xdr_RPCFlags
) +
1105 sizeof(struct yfs_xdr_YFSFid
) +
1106 xdr_strlen(namesz
) +
1107 xdr_strlen(contents_sz
) +
1108 sizeof(struct yfs_xdr_YFSStoreStatus
),
1109 sizeof(struct yfs_xdr_YFSFid
) +
1110 sizeof(struct yfs_xdr_YFSFetchStatus
) +
1111 sizeof(struct yfs_xdr_YFSFetchStatus
) +
1112 sizeof(struct yfs_xdr_YFSVolSync
));
1116 call
->key
= fc
->key
;
1117 call
->out_dir_scb
= dvnode_scb
;
1118 call
->out_fid
= newfid
;
1119 call
->out_scb
= vnode_scb
;
1121 /* marshall the parameters */
1123 bp
= xdr_encode_u32(bp
, YFSSYMLINK
);
1124 bp
= xdr_encode_u32(bp
, 0); /* RPC flags */
1125 bp
= xdr_encode_YFSFid(bp
, &dvnode
->fid
);
1126 bp
= xdr_encode_string(bp
, name
, namesz
);
1127 bp
= xdr_encode_string(bp
, contents
, contents_sz
);
1128 bp
= xdr_encode_YFSStoreStatus_mode(bp
, S_IRWXUGO
);
1129 yfs_check_req(call
, bp
);
1131 afs_use_fs_server(call
, fc
->cbi
);
1132 trace_afs_make_fs_call1(call
, &dvnode
->fid
, name
);
1133 afs_set_fc_call(call
, fc
);
1134 afs_make_call(&fc
->ac
, call
, GFP_NOFS
);
1135 return afs_wait_for_call_to_complete(call
, &fc
->ac
);
1139 * Deliver reply data to a YFS.Rename operation.
1141 static int yfs_deliver_fs_rename(struct afs_call
*call
)
1146 _enter("{%u}", call
->unmarshall
);
1148 ret
= afs_transfer_reply(call
);
1153 ret
= xdr_decode_YFSFetchStatus(&bp
, call
, call
->out_dir_scb
);
1156 if (call
->out_dir_scb
!= call
->out_scb
) {
1157 ret
= xdr_decode_YFSFetchStatus(&bp
, call
, call
->out_scb
);
1162 xdr_decode_YFSVolSync(&bp
, call
->out_volsync
);
1163 _leave(" = 0 [done]");
1168 * YFS.Rename operation type
1170 static const struct afs_call_type yfs_RXYFSRename
= {
1171 .name
= "FS.Rename",
1172 .op
= yfs_FS_Rename
,
1173 .deliver
= yfs_deliver_fs_rename
,
1174 .destructor
= afs_flat_call_destructor
,
1178 * Rename a file or directory.
1180 int yfs_fs_rename(struct afs_fs_cursor
*fc
,
1181 const char *orig_name
,
1182 struct afs_vnode
*new_dvnode
,
1183 const char *new_name
,
1184 struct afs_status_cb
*orig_dvnode_scb
,
1185 struct afs_status_cb
*new_dvnode_scb
)
1187 struct afs_vnode
*orig_dvnode
= fc
->vnode
;
1188 struct afs_call
*call
;
1189 struct afs_net
*net
= afs_v2net(orig_dvnode
);
1190 size_t o_namesz
, n_namesz
;
1195 o_namesz
= strlen(orig_name
);
1196 n_namesz
= strlen(new_name
);
1197 call
= afs_alloc_flat_call(net
, &yfs_RXYFSRename
,
1199 sizeof(struct yfs_xdr_RPCFlags
) +
1200 sizeof(struct yfs_xdr_YFSFid
) +
1201 xdr_strlen(o_namesz
) +
1202 sizeof(struct yfs_xdr_YFSFid
) +
1203 xdr_strlen(n_namesz
),
1204 sizeof(struct yfs_xdr_YFSFetchStatus
) +
1205 sizeof(struct yfs_xdr_YFSFetchStatus
) +
1206 sizeof(struct yfs_xdr_YFSVolSync
));
1210 call
->key
= fc
->key
;
1211 call
->out_dir_scb
= orig_dvnode_scb
;
1212 call
->out_scb
= new_dvnode_scb
;
1214 /* marshall the parameters */
1216 bp
= xdr_encode_u32(bp
, YFSRENAME
);
1217 bp
= xdr_encode_u32(bp
, 0); /* RPC flags */
1218 bp
= xdr_encode_YFSFid(bp
, &orig_dvnode
->fid
);
1219 bp
= xdr_encode_string(bp
, orig_name
, o_namesz
);
1220 bp
= xdr_encode_YFSFid(bp
, &new_dvnode
->fid
);
1221 bp
= xdr_encode_string(bp
, new_name
, n_namesz
);
1222 yfs_check_req(call
, bp
);
1224 afs_use_fs_server(call
, fc
->cbi
);
1225 trace_afs_make_fs_call2(call
, &orig_dvnode
->fid
, orig_name
, new_name
);
1226 afs_set_fc_call(call
, fc
);
1227 afs_make_call(&fc
->ac
, call
, GFP_NOFS
);
1228 return afs_wait_for_call_to_complete(call
, &fc
->ac
);
1232 * YFS.StoreData64 operation type.
1234 static const struct afs_call_type yfs_RXYFSStoreData64
= {
1235 .name
= "YFS.StoreData64",
1236 .op
= yfs_FS_StoreData64
,
1237 .deliver
= yfs_deliver_status_and_volsync
,
1238 .destructor
= afs_flat_call_destructor
,
1242 * Store a set of pages to a large file.
1244 int yfs_fs_store_data(struct afs_fs_cursor
*fc
, struct address_space
*mapping
,
1245 pgoff_t first
, pgoff_t last
,
1246 unsigned offset
, unsigned to
,
1247 struct afs_status_cb
*scb
)
1249 struct afs_vnode
*vnode
= fc
->vnode
;
1250 struct afs_call
*call
;
1251 struct afs_net
*net
= afs_v2net(vnode
);
1252 loff_t size
, pos
, i_size
;
1255 _enter(",%x,{%llx:%llu},,",
1256 key_serial(fc
->key
), vnode
->fid
.vid
, vnode
->fid
.vnode
);
1258 size
= (loff_t
)to
- (loff_t
)offset
;
1260 size
+= (loff_t
)(last
- first
) << PAGE_SHIFT
;
1261 pos
= (loff_t
)first
<< PAGE_SHIFT
;
1264 i_size
= i_size_read(&vnode
->vfs_inode
);
1265 if (pos
+ size
> i_size
)
1266 i_size
= size
+ pos
;
1268 _debug("size %llx, at %llx, i_size %llx",
1269 (unsigned long long)size
, (unsigned long long)pos
,
1270 (unsigned long long)i_size
);
1272 call
= afs_alloc_flat_call(net
, &yfs_RXYFSStoreData64
,
1275 sizeof(struct yfs_xdr_YFSFid
) +
1276 sizeof(struct yfs_xdr_YFSStoreStatus
) +
1277 sizeof(struct yfs_xdr_u64
) * 3,
1278 sizeof(struct yfs_xdr_YFSFetchStatus
) +
1279 sizeof(struct yfs_xdr_YFSVolSync
));
1283 call
->key
= fc
->key
;
1284 call
->mapping
= mapping
;
1285 call
->first
= first
;
1287 call
->first_offset
= offset
;
1289 call
->send_pages
= true;
1290 call
->out_scb
= scb
;
1292 /* marshall the parameters */
1294 bp
= xdr_encode_u32(bp
, YFSSTOREDATA64
);
1295 bp
= xdr_encode_u32(bp
, 0); /* RPC flags */
1296 bp
= xdr_encode_YFSFid(bp
, &vnode
->fid
);
1297 bp
= xdr_encode_YFSStoreStatus_mtime(bp
, &vnode
->vfs_inode
.i_mtime
);
1298 bp
= xdr_encode_u64(bp
, pos
);
1299 bp
= xdr_encode_u64(bp
, size
);
1300 bp
= xdr_encode_u64(bp
, i_size
);
1301 yfs_check_req(call
, bp
);
1303 afs_use_fs_server(call
, fc
->cbi
);
1304 trace_afs_make_fs_call(call
, &vnode
->fid
);
1305 afs_set_fc_call(call
, fc
);
1306 afs_make_call(&fc
->ac
, call
, GFP_NOFS
);
1307 return afs_wait_for_call_to_complete(call
, &fc
->ac
);
1311 * YFS.StoreStatus operation type
1313 static const struct afs_call_type yfs_RXYFSStoreStatus
= {
1314 .name
= "YFS.StoreStatus",
1315 .op
= yfs_FS_StoreStatus
,
1316 .deliver
= yfs_deliver_status_and_volsync
,
1317 .destructor
= afs_flat_call_destructor
,
1320 static const struct afs_call_type yfs_RXYFSStoreData64_as_Status
= {
1321 .name
= "YFS.StoreData64",
1322 .op
= yfs_FS_StoreData64
,
1323 .deliver
= yfs_deliver_status_and_volsync
,
1324 .destructor
= afs_flat_call_destructor
,
1328 * Set the attributes on a file, using YFS.StoreData64 rather than
1329 * YFS.StoreStatus so as to alter the file size also.
1331 static int yfs_fs_setattr_size(struct afs_fs_cursor
*fc
, struct iattr
*attr
,
1332 struct afs_status_cb
*scb
)
1334 struct afs_vnode
*vnode
= fc
->vnode
;
1335 struct afs_call
*call
;
1336 struct afs_net
*net
= afs_v2net(vnode
);
1339 _enter(",%x,{%llx:%llu},,",
1340 key_serial(fc
->key
), vnode
->fid
.vid
, vnode
->fid
.vnode
);
1342 call
= afs_alloc_flat_call(net
, &yfs_RXYFSStoreData64_as_Status
,
1343 sizeof(__be32
) * 2 +
1344 sizeof(struct yfs_xdr_YFSFid
) +
1345 sizeof(struct yfs_xdr_YFSStoreStatus
) +
1346 sizeof(struct yfs_xdr_u64
) * 3,
1347 sizeof(struct yfs_xdr_YFSFetchStatus
) +
1348 sizeof(struct yfs_xdr_YFSVolSync
));
1352 call
->key
= fc
->key
;
1353 call
->out_scb
= scb
;
1355 /* marshall the parameters */
1357 bp
= xdr_encode_u32(bp
, YFSSTOREDATA64
);
1358 bp
= xdr_encode_u32(bp
, 0); /* RPC flags */
1359 bp
= xdr_encode_YFSFid(bp
, &vnode
->fid
);
1360 bp
= xdr_encode_YFS_StoreStatus(bp
, attr
);
1361 bp
= xdr_encode_u64(bp
, attr
->ia_size
); /* position of start of write */
1362 bp
= xdr_encode_u64(bp
, 0); /* size of write */
1363 bp
= xdr_encode_u64(bp
, attr
->ia_size
); /* new file length */
1364 yfs_check_req(call
, bp
);
1366 afs_use_fs_server(call
, fc
->cbi
);
1367 trace_afs_make_fs_call(call
, &vnode
->fid
);
1368 afs_set_fc_call(call
, fc
);
1369 afs_make_call(&fc
->ac
, call
, GFP_NOFS
);
1370 return afs_wait_for_call_to_complete(call
, &fc
->ac
);
1374 * Set the attributes on a file, using YFS.StoreData64 if there's a change in
1375 * file size, and YFS.StoreStatus otherwise.
1377 int yfs_fs_setattr(struct afs_fs_cursor
*fc
, struct iattr
*attr
,
1378 struct afs_status_cb
*scb
)
1380 struct afs_vnode
*vnode
= fc
->vnode
;
1381 struct afs_call
*call
;
1382 struct afs_net
*net
= afs_v2net(vnode
);
1385 if (attr
->ia_valid
& ATTR_SIZE
)
1386 return yfs_fs_setattr_size(fc
, attr
, scb
);
1388 _enter(",%x,{%llx:%llu},,",
1389 key_serial(fc
->key
), vnode
->fid
.vid
, vnode
->fid
.vnode
);
1391 call
= afs_alloc_flat_call(net
, &yfs_RXYFSStoreStatus
,
1392 sizeof(__be32
) * 2 +
1393 sizeof(struct yfs_xdr_YFSFid
) +
1394 sizeof(struct yfs_xdr_YFSStoreStatus
),
1395 sizeof(struct yfs_xdr_YFSFetchStatus
) +
1396 sizeof(struct yfs_xdr_YFSVolSync
));
1400 call
->key
= fc
->key
;
1401 call
->out_scb
= scb
;
1403 /* marshall the parameters */
1405 bp
= xdr_encode_u32(bp
, YFSSTORESTATUS
);
1406 bp
= xdr_encode_u32(bp
, 0); /* RPC flags */
1407 bp
= xdr_encode_YFSFid(bp
, &vnode
->fid
);
1408 bp
= xdr_encode_YFS_StoreStatus(bp
, attr
);
1409 yfs_check_req(call
, bp
);
1411 afs_use_fs_server(call
, fc
->cbi
);
1412 trace_afs_make_fs_call(call
, &vnode
->fid
);
1413 afs_set_fc_call(call
, fc
);
1414 afs_make_call(&fc
->ac
, call
, GFP_NOFS
);
1415 return afs_wait_for_call_to_complete(call
, &fc
->ac
);
1419 * Deliver reply data to a YFS.GetVolumeStatus operation.
1421 static int yfs_deliver_fs_get_volume_status(struct afs_call
*call
)
1428 _enter("{%u}", call
->unmarshall
);
1430 switch (call
->unmarshall
) {
1433 afs_extract_to_buf(call
, sizeof(struct yfs_xdr_YFSFetchVolumeStatus
));
1436 /* extract the returned status record */
1438 _debug("extract status");
1439 ret
= afs_extract_data(call
, true);
1444 xdr_decode_YFSFetchVolumeStatus(&bp
, call
->out_volstatus
);
1446 afs_extract_to_tmp(call
);
1449 /* extract the volume name length */
1451 ret
= afs_extract_data(call
, true);
1455 call
->count
= ntohl(call
->tmp
);
1456 _debug("volname length: %u", call
->count
);
1457 if (call
->count
>= AFSNAMEMAX
)
1458 return afs_protocol_error(call
, -EBADMSG
,
1459 afs_eproto_volname_len
);
1460 size
= (call
->count
+ 3) & ~3; /* It's padded */
1461 afs_extract_to_buf(call
, size
);
1465 /* extract the volume name */
1467 _debug("extract volname");
1468 ret
= afs_extract_data(call
, true);
1474 _debug("volname '%s'", p
);
1475 afs_extract_to_tmp(call
);
1479 /* extract the offline message length */
1481 ret
= afs_extract_data(call
, true);
1485 call
->count
= ntohl(call
->tmp
);
1486 _debug("offline msg length: %u", call
->count
);
1487 if (call
->count
>= AFSNAMEMAX
)
1488 return afs_protocol_error(call
, -EBADMSG
,
1489 afs_eproto_offline_msg_len
);
1490 size
= (call
->count
+ 3) & ~3; /* It's padded */
1491 afs_extract_to_buf(call
, size
);
1495 /* extract the offline message */
1497 _debug("extract offline");
1498 ret
= afs_extract_data(call
, true);
1504 _debug("offline '%s'", p
);
1506 afs_extract_to_tmp(call
);
1510 /* extract the message of the day length */
1512 ret
= afs_extract_data(call
, true);
1516 call
->count
= ntohl(call
->tmp
);
1517 _debug("motd length: %u", call
->count
);
1518 if (call
->count
>= AFSNAMEMAX
)
1519 return afs_protocol_error(call
, -EBADMSG
,
1520 afs_eproto_motd_len
);
1521 size
= (call
->count
+ 3) & ~3; /* It's padded */
1522 afs_extract_to_buf(call
, size
);
1526 /* extract the message of the day */
1528 _debug("extract motd");
1529 ret
= afs_extract_data(call
, false);
1535 _debug("motd '%s'", p
);
1544 _leave(" = 0 [done]");
1549 * YFS.GetVolumeStatus operation type
1551 static const struct afs_call_type yfs_RXYFSGetVolumeStatus
= {
1552 .name
= "YFS.GetVolumeStatus",
1553 .op
= yfs_FS_GetVolumeStatus
,
1554 .deliver
= yfs_deliver_fs_get_volume_status
,
1555 .destructor
= afs_flat_call_destructor
,
1559 * fetch the status of a volume
1561 int yfs_fs_get_volume_status(struct afs_fs_cursor
*fc
,
1562 struct afs_volume_status
*vs
)
1564 struct afs_vnode
*vnode
= fc
->vnode
;
1565 struct afs_call
*call
;
1566 struct afs_net
*net
= afs_v2net(vnode
);
1571 call
= afs_alloc_flat_call(net
, &yfs_RXYFSGetVolumeStatus
,
1572 sizeof(__be32
) * 2 +
1573 sizeof(struct yfs_xdr_u64
),
1575 sizeof(struct yfs_xdr_YFSFetchVolumeStatus
) +
1581 call
->key
= fc
->key
;
1582 call
->out_volstatus
= vs
;
1584 /* marshall the parameters */
1586 bp
= xdr_encode_u32(bp
, YFSGETVOLUMESTATUS
);
1587 bp
= xdr_encode_u32(bp
, 0); /* RPC flags */
1588 bp
= xdr_encode_u64(bp
, vnode
->fid
.vid
);
1589 yfs_check_req(call
, bp
);
1591 afs_use_fs_server(call
, fc
->cbi
);
1592 trace_afs_make_fs_call(call
, &vnode
->fid
);
1593 afs_set_fc_call(call
, fc
);
1594 afs_make_call(&fc
->ac
, call
, GFP_NOFS
);
1595 return afs_wait_for_call_to_complete(call
, &fc
->ac
);
1599 * YFS.SetLock operation type
1601 static const struct afs_call_type yfs_RXYFSSetLock
= {
1602 .name
= "YFS.SetLock",
1603 .op
= yfs_FS_SetLock
,
1604 .deliver
= yfs_deliver_status_and_volsync
,
1605 .done
= afs_lock_op_done
,
1606 .destructor
= afs_flat_call_destructor
,
1610 * YFS.ExtendLock operation type
1612 static const struct afs_call_type yfs_RXYFSExtendLock
= {
1613 .name
= "YFS.ExtendLock",
1614 .op
= yfs_FS_ExtendLock
,
1615 .deliver
= yfs_deliver_status_and_volsync
,
1616 .done
= afs_lock_op_done
,
1617 .destructor
= afs_flat_call_destructor
,
1621 * YFS.ReleaseLock operation type
1623 static const struct afs_call_type yfs_RXYFSReleaseLock
= {
1624 .name
= "YFS.ReleaseLock",
1625 .op
= yfs_FS_ReleaseLock
,
1626 .deliver
= yfs_deliver_status_and_volsync
,
1627 .destructor
= afs_flat_call_destructor
,
1631 * Set a lock on a file
1633 int yfs_fs_set_lock(struct afs_fs_cursor
*fc
, afs_lock_type_t type
,
1634 struct afs_status_cb
*scb
)
1636 struct afs_vnode
*vnode
= fc
->vnode
;
1637 struct afs_call
*call
;
1638 struct afs_net
*net
= afs_v2net(vnode
);
1643 call
= afs_alloc_flat_call(net
, &yfs_RXYFSSetLock
,
1644 sizeof(__be32
) * 2 +
1645 sizeof(struct yfs_xdr_YFSFid
) +
1647 sizeof(struct yfs_xdr_YFSFetchStatus
) +
1648 sizeof(struct yfs_xdr_YFSVolSync
));
1652 call
->key
= fc
->key
;
1653 call
->lvnode
= vnode
;
1654 call
->out_scb
= scb
;
1656 /* marshall the parameters */
1658 bp
= xdr_encode_u32(bp
, YFSSETLOCK
);
1659 bp
= xdr_encode_u32(bp
, 0); /* RPC flags */
1660 bp
= xdr_encode_YFSFid(bp
, &vnode
->fid
);
1661 bp
= xdr_encode_u32(bp
, type
);
1662 yfs_check_req(call
, bp
);
1664 afs_use_fs_server(call
, fc
->cbi
);
1665 trace_afs_make_fs_calli(call
, &vnode
->fid
, type
);
1666 afs_set_fc_call(call
, fc
);
1667 afs_make_call(&fc
->ac
, call
, GFP_NOFS
);
1668 return afs_wait_for_call_to_complete(call
, &fc
->ac
);
1672 * extend a lock on a file
1674 int yfs_fs_extend_lock(struct afs_fs_cursor
*fc
, struct afs_status_cb
*scb
)
1676 struct afs_vnode
*vnode
= fc
->vnode
;
1677 struct afs_call
*call
;
1678 struct afs_net
*net
= afs_v2net(vnode
);
1683 call
= afs_alloc_flat_call(net
, &yfs_RXYFSExtendLock
,
1684 sizeof(__be32
) * 2 +
1685 sizeof(struct yfs_xdr_YFSFid
),
1686 sizeof(struct yfs_xdr_YFSFetchStatus
) +
1687 sizeof(struct yfs_xdr_YFSVolSync
));
1691 call
->key
= fc
->key
;
1692 call
->lvnode
= vnode
;
1693 call
->out_scb
= scb
;
1695 /* marshall the parameters */
1697 bp
= xdr_encode_u32(bp
, YFSEXTENDLOCK
);
1698 bp
= xdr_encode_u32(bp
, 0); /* RPC flags */
1699 bp
= xdr_encode_YFSFid(bp
, &vnode
->fid
);
1700 yfs_check_req(call
, bp
);
1702 afs_use_fs_server(call
, fc
->cbi
);
1703 trace_afs_make_fs_call(call
, &vnode
->fid
);
1704 afs_set_fc_call(call
, fc
);
1705 afs_make_call(&fc
->ac
, call
, GFP_NOFS
);
1706 return afs_wait_for_call_to_complete(call
, &fc
->ac
);
1710 * release a lock on a file
1712 int yfs_fs_release_lock(struct afs_fs_cursor
*fc
, struct afs_status_cb
*scb
)
1714 struct afs_vnode
*vnode
= fc
->vnode
;
1715 struct afs_call
*call
;
1716 struct afs_net
*net
= afs_v2net(vnode
);
1721 call
= afs_alloc_flat_call(net
, &yfs_RXYFSReleaseLock
,
1722 sizeof(__be32
) * 2 +
1723 sizeof(struct yfs_xdr_YFSFid
),
1724 sizeof(struct yfs_xdr_YFSFetchStatus
) +
1725 sizeof(struct yfs_xdr_YFSVolSync
));
1729 call
->key
= fc
->key
;
1730 call
->lvnode
= vnode
;
1731 call
->out_scb
= scb
;
1733 /* marshall the parameters */
1735 bp
= xdr_encode_u32(bp
, YFSRELEASELOCK
);
1736 bp
= xdr_encode_u32(bp
, 0); /* RPC flags */
1737 bp
= xdr_encode_YFSFid(bp
, &vnode
->fid
);
1738 yfs_check_req(call
, bp
);
1740 afs_use_fs_server(call
, fc
->cbi
);
1741 trace_afs_make_fs_call(call
, &vnode
->fid
);
1742 afs_set_fc_call(call
, fc
);
1743 afs_make_call(&fc
->ac
, call
, GFP_NOFS
);
1744 return afs_wait_for_call_to_complete(call
, &fc
->ac
);
1748 * YFS.FetchStatus operation type
1750 static const struct afs_call_type yfs_RXYFSFetchStatus
= {
1751 .name
= "YFS.FetchStatus",
1752 .op
= yfs_FS_FetchStatus
,
1753 .deliver
= yfs_deliver_fs_status_cb_and_volsync
,
1754 .destructor
= afs_flat_call_destructor
,
1758 * Fetch the status information for a fid without needing a vnode handle.
1760 int yfs_fs_fetch_status(struct afs_fs_cursor
*fc
,
1761 struct afs_net
*net
,
1762 struct afs_fid
*fid
,
1763 struct afs_status_cb
*scb
,
1764 struct afs_volsync
*volsync
)
1766 struct afs_call
*call
;
1769 _enter(",%x,{%llx:%llu},,",
1770 key_serial(fc
->key
), fid
->vid
, fid
->vnode
);
1772 call
= afs_alloc_flat_call(net
, &yfs_RXYFSFetchStatus
,
1773 sizeof(__be32
) * 2 +
1774 sizeof(struct yfs_xdr_YFSFid
),
1775 sizeof(struct yfs_xdr_YFSFetchStatus
) +
1776 sizeof(struct yfs_xdr_YFSCallBack
) +
1777 sizeof(struct yfs_xdr_YFSVolSync
));
1779 fc
->ac
.error
= -ENOMEM
;
1783 call
->key
= fc
->key
;
1784 call
->out_scb
= scb
;
1785 call
->out_volsync
= volsync
;
1787 /* marshall the parameters */
1789 bp
= xdr_encode_u32(bp
, YFSFETCHSTATUS
);
1790 bp
= xdr_encode_u32(bp
, 0); /* RPC flags */
1791 bp
= xdr_encode_YFSFid(bp
, fid
);
1792 yfs_check_req(call
, bp
);
1794 afs_use_fs_server(call
, fc
->cbi
);
1795 trace_afs_make_fs_call(call
, fid
);
1796 afs_set_fc_call(call
, fc
);
1797 afs_make_call(&fc
->ac
, call
, GFP_NOFS
);
1798 return afs_wait_for_call_to_complete(call
, &fc
->ac
);
1802 * Deliver reply data to an YFS.InlineBulkStatus call
1804 static int yfs_deliver_fs_inline_bulk_status(struct afs_call
*call
)
1806 struct afs_status_cb
*scb
;
1811 _enter("{%u}", call
->unmarshall
);
1813 switch (call
->unmarshall
) {
1815 afs_extract_to_tmp(call
);
1819 /* Extract the file status count and array in two steps */
1821 _debug("extract status count");
1822 ret
= afs_extract_data(call
, true);
1826 tmp
= ntohl(call
->tmp
);
1827 _debug("status count: %u/%u", tmp
, call
->count2
);
1828 if (tmp
!= call
->count2
)
1829 return afs_protocol_error(call
, -EBADMSG
,
1830 afs_eproto_ibulkst_count
);
1835 afs_extract_to_buf(call
, sizeof(struct yfs_xdr_YFSFetchStatus
));
1839 _debug("extract status array %u", call
->count
);
1840 ret
= afs_extract_data(call
, true);
1845 scb
= &call
->out_scb
[call
->count
];
1846 ret
= xdr_decode_YFSFetchStatus(&bp
, call
, scb
);
1851 if (call
->count
< call
->count2
)
1856 afs_extract_to_tmp(call
);
1859 /* Extract the callback count and array in two steps */
1861 _debug("extract CB count");
1862 ret
= afs_extract_data(call
, true);
1866 tmp
= ntohl(call
->tmp
);
1867 _debug("CB count: %u", tmp
);
1868 if (tmp
!= call
->count2
)
1869 return afs_protocol_error(call
, -EBADMSG
,
1870 afs_eproto_ibulkst_cb_count
);
1874 afs_extract_to_buf(call
, sizeof(struct yfs_xdr_YFSCallBack
));
1878 _debug("extract CB array");
1879 ret
= afs_extract_data(call
, true);
1883 _debug("unmarshall CB array");
1885 scb
= &call
->out_scb
[call
->count
];
1886 xdr_decode_YFSCallBack(&bp
, call
, scb
);
1888 if (call
->count
< call
->count2
)
1891 afs_extract_to_buf(call
, sizeof(struct yfs_xdr_YFSVolSync
));
1896 ret
= afs_extract_data(call
, false);
1901 xdr_decode_YFSVolSync(&bp
, call
->out_volsync
);
1910 _leave(" = 0 [done]");
1915 * FS.InlineBulkStatus operation type
1917 static const struct afs_call_type yfs_RXYFSInlineBulkStatus
= {
1918 .name
= "YFS.InlineBulkStatus",
1919 .op
= yfs_FS_InlineBulkStatus
,
1920 .deliver
= yfs_deliver_fs_inline_bulk_status
,
1921 .destructor
= afs_flat_call_destructor
,
1925 * Fetch the status information for up to 1024 files
1927 int yfs_fs_inline_bulk_status(struct afs_fs_cursor
*fc
,
1928 struct afs_net
*net
,
1929 struct afs_fid
*fids
,
1930 struct afs_status_cb
*statuses
,
1931 unsigned int nr_fids
,
1932 struct afs_volsync
*volsync
)
1934 struct afs_call
*call
;
1938 _enter(",%x,{%llx:%llu},%u",
1939 key_serial(fc
->key
), fids
[0].vid
, fids
[1].vnode
, nr_fids
);
1941 call
= afs_alloc_flat_call(net
, &yfs_RXYFSInlineBulkStatus
,
1945 sizeof(struct yfs_xdr_YFSFid
) * nr_fids
,
1946 sizeof(struct yfs_xdr_YFSFetchStatus
));
1948 fc
->ac
.error
= -ENOMEM
;
1952 call
->key
= fc
->key
;
1953 call
->out_scb
= statuses
;
1954 call
->out_volsync
= volsync
;
1955 call
->count2
= nr_fids
;
1957 /* marshall the parameters */
1959 bp
= xdr_encode_u32(bp
, YFSINLINEBULKSTATUS
);
1960 bp
= xdr_encode_u32(bp
, 0); /* RPCFlags */
1961 bp
= xdr_encode_u32(bp
, nr_fids
);
1962 for (i
= 0; i
< nr_fids
; i
++)
1963 bp
= xdr_encode_YFSFid(bp
, &fids
[i
]);
1964 yfs_check_req(call
, bp
);
1966 afs_use_fs_server(call
, fc
->cbi
);
1967 trace_afs_make_fs_call(call
, &fids
[0]);
1968 afs_set_fc_call(call
, fc
);
1969 afs_make_call(&fc
->ac
, call
, GFP_NOFS
);
1970 return afs_wait_for_call_to_complete(call
, &fc
->ac
);
1974 * Deliver reply data to an YFS.FetchOpaqueACL.
1976 static int yfs_deliver_fs_fetch_opaque_acl(struct afs_call
*call
)
1978 struct yfs_acl
*yacl
= call
->out_yacl
;
1979 struct afs_acl
*acl
;
1984 _enter("{%u}", call
->unmarshall
);
1986 switch (call
->unmarshall
) {
1988 afs_extract_to_tmp(call
);
1992 /* Extract the file ACL length */
1994 ret
= afs_extract_data(call
, true);
1998 size
= call
->count2
= ntohl(call
->tmp
);
1999 size
= round_up(size
, 4);
2001 if (yacl
->flags
& YFS_ACL_WANT_ACL
) {
2002 acl
= kmalloc(struct_size(acl
, data
, size
), GFP_KERNEL
);
2006 acl
->size
= call
->count2
;
2007 afs_extract_begin(call
, acl
->data
, size
);
2009 afs_extract_discard(call
, size
);
2014 /* Extract the file ACL */
2016 ret
= afs_extract_data(call
, true);
2020 afs_extract_to_tmp(call
);
2024 /* Extract the volume ACL length */
2026 ret
= afs_extract_data(call
, true);
2030 size
= call
->count2
= ntohl(call
->tmp
);
2031 size
= round_up(size
, 4);
2033 if (yacl
->flags
& YFS_ACL_WANT_VOL_ACL
) {
2034 acl
= kmalloc(struct_size(acl
, data
, size
), GFP_KERNEL
);
2037 yacl
->vol_acl
= acl
;
2038 acl
->size
= call
->count2
;
2039 afs_extract_begin(call
, acl
->data
, size
);
2041 afs_extract_discard(call
, size
);
2046 /* Extract the volume ACL */
2048 ret
= afs_extract_data(call
, true);
2052 afs_extract_to_buf(call
,
2053 sizeof(__be32
) * 2 +
2054 sizeof(struct yfs_xdr_YFSFetchStatus
) +
2055 sizeof(struct yfs_xdr_YFSVolSync
));
2059 /* extract the metadata */
2061 ret
= afs_extract_data(call
, false);
2066 yacl
->inherit_flag
= ntohl(*bp
++);
2067 yacl
->num_cleaned
= ntohl(*bp
++);
2068 ret
= xdr_decode_YFSFetchStatus(&bp
, call
, call
->out_scb
);
2071 xdr_decode_YFSVolSync(&bp
, call
->out_volsync
);
2080 _leave(" = 0 [done]");
2084 void yfs_free_opaque_acl(struct yfs_acl
*yacl
)
2088 kfree(yacl
->vol_acl
);
2094 * YFS.FetchOpaqueACL operation type
2096 static const struct afs_call_type yfs_RXYFSFetchOpaqueACL
= {
2097 .name
= "YFS.FetchOpaqueACL",
2098 .op
= yfs_FS_FetchOpaqueACL
,
2099 .deliver
= yfs_deliver_fs_fetch_opaque_acl
,
2100 .destructor
= afs_flat_call_destructor
,
2104 * Fetch the YFS advanced ACLs for a file.
2106 struct yfs_acl
*yfs_fs_fetch_opaque_acl(struct afs_fs_cursor
*fc
,
2107 struct yfs_acl
*yacl
,
2108 struct afs_status_cb
*scb
)
2110 struct afs_vnode
*vnode
= fc
->vnode
;
2111 struct afs_call
*call
;
2112 struct afs_net
*net
= afs_v2net(vnode
);
2115 _enter(",%x,{%llx:%llu},,",
2116 key_serial(fc
->key
), vnode
->fid
.vid
, vnode
->fid
.vnode
);
2118 call
= afs_alloc_flat_call(net
, &yfs_RXYFSFetchOpaqueACL
,
2119 sizeof(__be32
) * 2 +
2120 sizeof(struct yfs_xdr_YFSFid
),
2121 sizeof(__be32
) * 2 +
2122 sizeof(struct yfs_xdr_YFSFetchStatus
) +
2123 sizeof(struct yfs_xdr_YFSVolSync
));
2125 fc
->ac
.error
= -ENOMEM
;
2126 return ERR_PTR(-ENOMEM
);
2129 call
->key
= fc
->key
;
2130 call
->out_yacl
= yacl
;
2131 call
->out_scb
= scb
;
2132 call
->out_volsync
= NULL
;
2134 /* marshall the parameters */
2136 bp
= xdr_encode_u32(bp
, YFSFETCHOPAQUEACL
);
2137 bp
= xdr_encode_u32(bp
, 0); /* RPC flags */
2138 bp
= xdr_encode_YFSFid(bp
, &vnode
->fid
);
2139 yfs_check_req(call
, bp
);
2141 afs_use_fs_server(call
, fc
->cbi
);
2142 trace_afs_make_fs_call(call
, &vnode
->fid
);
2143 afs_make_call(&fc
->ac
, call
, GFP_KERNEL
);
2144 return (struct yfs_acl
*)afs_wait_for_call_to_complete(call
, &fc
->ac
);
2148 * YFS.StoreOpaqueACL2 operation type
2150 static const struct afs_call_type yfs_RXYFSStoreOpaqueACL2
= {
2151 .name
= "YFS.StoreOpaqueACL2",
2152 .op
= yfs_FS_StoreOpaqueACL2
,
2153 .deliver
= yfs_deliver_status_and_volsync
,
2154 .destructor
= afs_flat_call_destructor
,
2158 * Fetch the YFS ACL for a file.
2160 int yfs_fs_store_opaque_acl2(struct afs_fs_cursor
*fc
, const struct afs_acl
*acl
,
2161 struct afs_status_cb
*scb
)
2163 struct afs_vnode
*vnode
= fc
->vnode
;
2164 struct afs_call
*call
;
2165 struct afs_net
*net
= afs_v2net(vnode
);
2169 _enter(",%x,{%llx:%llu},,",
2170 key_serial(fc
->key
), vnode
->fid
.vid
, vnode
->fid
.vnode
);
2172 size
= round_up(acl
->size
, 4);
2173 call
= afs_alloc_flat_call(net
, &yfs_RXYFSStoreOpaqueACL2
,
2174 sizeof(__be32
) * 2 +
2175 sizeof(struct yfs_xdr_YFSFid
) +
2176 sizeof(__be32
) + size
,
2177 sizeof(struct yfs_xdr_YFSFetchStatus
) +
2178 sizeof(struct yfs_xdr_YFSVolSync
));
2180 fc
->ac
.error
= -ENOMEM
;
2184 call
->key
= fc
->key
;
2185 call
->out_scb
= scb
;
2186 call
->out_volsync
= NULL
;
2188 /* marshall the parameters */
2190 bp
= xdr_encode_u32(bp
, YFSSTOREOPAQUEACL2
);
2191 bp
= xdr_encode_u32(bp
, 0); /* RPC flags */
2192 bp
= xdr_encode_YFSFid(bp
, &vnode
->fid
);
2193 bp
= xdr_encode_u32(bp
, acl
->size
);
2194 memcpy(bp
, acl
->data
, acl
->size
);
2195 if (acl
->size
!= size
)
2196 memset((void *)bp
+ acl
->size
, 0, size
- acl
->size
);
2197 yfs_check_req(call
, bp
);
2199 trace_afs_make_fs_call(call
, &vnode
->fid
);
2200 afs_make_call(&fc
->ac
, call
, GFP_KERNEL
);
2201 return afs_wait_for_call_to_complete(call
, &fc
->ac
);