^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0-or-later
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /* YFS File Server client stubs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * Copyright (C) 2018 Red Hat, Inc. All Rights Reserved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Written by David Howells (dhowells@redhat.com)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #include <linux/init.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <linux/sched.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <linux/circ_buf.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <linux/iversion.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include "internal.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include "afs_fs.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include "xdr_fs.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include "protocol_yfs.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #define xdr_size(x) (sizeof(*x) / sizeof(__be32))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) static void xdr_decode_YFSFid(const __be32 **_bp, struct afs_fid *fid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) const struct yfs_xdr_YFSFid *x = (const void *)*_bp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) fid->vid = xdr_to_u64(x->volume);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) fid->vnode = xdr_to_u64(x->vnode.lo);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) fid->vnode_hi = ntohl(x->vnode.hi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) fid->unique = ntohl(x->vnode.unique);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) *_bp += xdr_size(x);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) static __be32 *xdr_encode_u32(__be32 *bp, u32 n)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) *bp++ = htonl(n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) return bp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) static __be32 *xdr_encode_u64(__be32 *bp, u64 n)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) struct yfs_xdr_u64 *x = (void *)bp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) *x = u64_to_xdr(n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) return bp + xdr_size(x);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) static __be32 *xdr_encode_YFSFid(__be32 *bp, struct afs_fid *fid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) struct yfs_xdr_YFSFid *x = (void *)bp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) x->volume = u64_to_xdr(fid->vid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) x->vnode.lo = u64_to_xdr(fid->vnode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) x->vnode.hi = htonl(fid->vnode_hi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) x->vnode.unique = htonl(fid->unique);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) return bp + xdr_size(x);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) static size_t xdr_strlen(unsigned int len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) return sizeof(__be32) + round_up(len, sizeof(__be32));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) static __be32 *xdr_encode_string(__be32 *bp, const char *p, unsigned int len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) bp = xdr_encode_u32(bp, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) bp = memcpy(bp, p, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) if (len & 3) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) unsigned int pad = 4 - (len & 3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) memset((u8 *)bp + len, 0, pad);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) len += pad;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) return bp + len / sizeof(__be32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) static __be32 *xdr_encode_name(__be32 *bp, const struct qstr *p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) return xdr_encode_string(bp, p->name, p->len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) static s64 linux_to_yfs_time(const struct timespec64 *t)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) /* Convert to 100ns intervals. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) return (u64)t->tv_sec * 10000000 + t->tv_nsec/100;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) static __be32 *xdr_encode_YFSStoreStatus_mode(__be32 *bp, mode_t mode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) struct yfs_xdr_YFSStoreStatus *x = (void *)bp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) x->mask = htonl(AFS_SET_MODE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) x->mode = htonl(mode & S_IALLUGO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) x->mtime_client = u64_to_xdr(0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) x->owner = u64_to_xdr(0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) x->group = u64_to_xdr(0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) return bp + xdr_size(x);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) static __be32 *xdr_encode_YFSStoreStatus_mtime(__be32 *bp, const struct timespec64 *t)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) struct yfs_xdr_YFSStoreStatus *x = (void *)bp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) s64 mtime = linux_to_yfs_time(t);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) x->mask = htonl(AFS_SET_MTIME);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) x->mode = htonl(0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) x->mtime_client = u64_to_xdr(mtime);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) x->owner = u64_to_xdr(0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) x->group = u64_to_xdr(0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) return bp + xdr_size(x);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) * Convert a signed 100ns-resolution 64-bit time into a timespec.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) static struct timespec64 yfs_time_to_linux(s64 t)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) struct timespec64 ts;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) u64 abs_t;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) * Unfortunately can not use normal 64 bit division on 32 bit arch, but
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) * the alternative, do_div, does not work with negative numbers so have
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) * to special case them
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) if (t < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) abs_t = -t;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) ts.tv_nsec = (time64_t)(do_div(abs_t, 10000000) * 100);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) ts.tv_nsec = -ts.tv_nsec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) ts.tv_sec = -abs_t;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) abs_t = t;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) ts.tv_nsec = (time64_t)do_div(abs_t, 10000000) * 100;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) ts.tv_sec = abs_t;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) return ts;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) static struct timespec64 xdr_to_time(const struct yfs_xdr_u64 xdr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) s64 t = xdr_to_u64(xdr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) return yfs_time_to_linux(t);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) static void yfs_check_req(struct afs_call *call, __be32 *bp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) size_t len = (void *)bp - call->request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) if (len > call->request_size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) pr_err("kAFS: %s: Request buffer overflow (%zu>%u)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) call->type->name, len, call->request_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) else if (len < call->request_size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) pr_warn("kAFS: %s: Request buffer underflow (%zu<%u)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) call->type->name, len, call->request_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) * Dump a bad file status record.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) static void xdr_dump_bad(const __be32 *bp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) __be32 x[4];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) pr_notice("YFS XDR: Bad status record\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) for (i = 0; i < 6 * 4 * 4; i += 16) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) memcpy(x, bp, 16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) bp += 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) pr_notice("%03x: %08x %08x %08x %08x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) i, ntohl(x[0]), ntohl(x[1]), ntohl(x[2]), ntohl(x[3]));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) memcpy(x, bp, 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) pr_notice("0x60: %08x %08x\n", ntohl(x[0]), ntohl(x[1]));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) * Decode a YFSFetchStatus block
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) static void xdr_decode_YFSFetchStatus(const __be32 **_bp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) struct afs_call *call,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) struct afs_status_cb *scb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) const struct yfs_xdr_YFSFetchStatus *xdr = (const void *)*_bp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) struct afs_file_status *status = &scb->status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) u32 type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) status->abort_code = ntohl(xdr->abort_code);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) if (status->abort_code != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) if (status->abort_code == VNOVNODE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) status->nlink = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) scb->have_error = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) goto advance;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) type = ntohl(xdr->type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) switch (type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) case AFS_FTYPE_FILE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) case AFS_FTYPE_DIR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) case AFS_FTYPE_SYMLINK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) status->type = type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) goto bad;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) status->nlink = ntohl(xdr->nlink);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) status->author = xdr_to_u64(xdr->author);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) status->owner = xdr_to_u64(xdr->owner);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) status->caller_access = ntohl(xdr->caller_access); /* Ticket dependent */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) status->anon_access = ntohl(xdr->anon_access);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) status->mode = ntohl(xdr->mode) & S_IALLUGO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) status->group = xdr_to_u64(xdr->group);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) status->lock_count = ntohl(xdr->lock_count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) status->mtime_client = xdr_to_time(xdr->mtime_client);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) status->mtime_server = xdr_to_time(xdr->mtime_server);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) status->size = xdr_to_u64(xdr->size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) status->data_version = xdr_to_u64(xdr->data_version);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) scb->have_status = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) advance:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) *_bp += xdr_size(xdr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) bad:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) xdr_dump_bad(*_bp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) afs_protocol_error(call, afs_eproto_bad_status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) goto advance;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) * Decode a YFSCallBack block
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) static void xdr_decode_YFSCallBack(const __be32 **_bp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) struct afs_call *call,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) struct afs_status_cb *scb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) struct yfs_xdr_YFSCallBack *x = (void *)*_bp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) struct afs_callback *cb = &scb->callback;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) ktime_t cb_expiry;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) cb_expiry = call->reply_time;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) cb_expiry = ktime_add(cb_expiry, xdr_to_u64(x->expiration_time) * 100);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) cb->expires_at = ktime_divns(cb_expiry, NSEC_PER_SEC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) scb->have_cb = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) *_bp += xdr_size(x);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) * Decode a YFSVolSync block
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) static void xdr_decode_YFSVolSync(const __be32 **_bp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) struct afs_volsync *volsync)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) struct yfs_xdr_YFSVolSync *x = (void *)*_bp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) u64 creation;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) if (volsync) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) creation = xdr_to_u64(x->vol_creation_date);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) do_div(creation, 10 * 1000 * 1000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) volsync->creation = creation;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) *_bp += xdr_size(x);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) * Encode the requested attributes into a YFSStoreStatus block
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) static __be32 *xdr_encode_YFS_StoreStatus(__be32 *bp, struct iattr *attr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) struct yfs_xdr_YFSStoreStatus *x = (void *)bp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) s64 mtime = 0, owner = 0, group = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) u32 mask = 0, mode = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) mask = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) if (attr->ia_valid & ATTR_MTIME) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) mask |= AFS_SET_MTIME;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) mtime = linux_to_yfs_time(&attr->ia_mtime);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) if (attr->ia_valid & ATTR_UID) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) mask |= AFS_SET_OWNER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) owner = from_kuid(&init_user_ns, attr->ia_uid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) if (attr->ia_valid & ATTR_GID) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) mask |= AFS_SET_GROUP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) group = from_kgid(&init_user_ns, attr->ia_gid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) if (attr->ia_valid & ATTR_MODE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) mask |= AFS_SET_MODE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) mode = attr->ia_mode & S_IALLUGO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) x->mask = htonl(mask);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) x->mode = htonl(mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) x->mtime_client = u64_to_xdr(mtime);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) x->owner = u64_to_xdr(owner);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) x->group = u64_to_xdr(group);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) return bp + xdr_size(x);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) * Decode a YFSFetchVolumeStatus block.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) static void xdr_decode_YFSFetchVolumeStatus(const __be32 **_bp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) struct afs_volume_status *vs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) const struct yfs_xdr_YFSFetchVolumeStatus *x = (const void *)*_bp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) u32 flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) vs->vid = xdr_to_u64(x->vid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) vs->parent_id = xdr_to_u64(x->parent_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) flags = ntohl(x->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) vs->online = flags & yfs_FVSOnline;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) vs->in_service = flags & yfs_FVSInservice;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) vs->blessed = flags & yfs_FVSBlessed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) vs->needs_salvage = flags & yfs_FVSNeedsSalvage;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) vs->type = ntohl(x->type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) vs->min_quota = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) vs->max_quota = xdr_to_u64(x->max_quota);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) vs->blocks_in_use = xdr_to_u64(x->blocks_in_use);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) vs->part_blocks_avail = xdr_to_u64(x->part_blocks_avail);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) vs->part_max_blocks = xdr_to_u64(x->part_max_blocks);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) vs->vol_copy_date = xdr_to_u64(x->vol_copy_date);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) vs->vol_backup_date = xdr_to_u64(x->vol_backup_date);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) *_bp += sizeof(*x) / sizeof(__be32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) * Deliver reply data to operations that just return a file status and a volume
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) * sync record.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) static int yfs_deliver_status_and_volsync(struct afs_call *call)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) struct afs_operation *op = call->op;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) const __be32 *bp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) ret = afs_transfer_reply(call);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) bp = call->buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) xdr_decode_YFSFetchStatus(&bp, call, &op->file[0].scb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) xdr_decode_YFSVolSync(&bp, &op->volsync);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) _leave(" = 0 [done]");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) * Deliver reply data to an YFS.FetchData64.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) static int yfs_deliver_fs_fetch_data64(struct afs_call *call)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) struct afs_operation *op = call->op;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) struct afs_vnode_param *vp = &op->file[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) struct afs_read *req = op->fetch.req;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) const __be32 *bp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) unsigned int size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) _enter("{%u,%zu/%llu}",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) call->unmarshall, iov_iter_count(call->iter), req->actual_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) switch (call->unmarshall) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) req->actual_len = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) req->index = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) req->offset = req->pos & (PAGE_SIZE - 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) afs_extract_to_tmp64(call);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) call->unmarshall++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) /* extract the returned data length */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) case 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) _debug("extract data length");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) ret = afs_extract_data(call, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) req->actual_len = be64_to_cpu(call->tmp64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) _debug("DATA length: %llu", req->actual_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) req->remain = min(req->len, req->actual_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) if (req->remain == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) goto no_more_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) call->unmarshall++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) begin_page:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) ASSERTCMP(req->index, <, req->nr_pages);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) if (req->remain > PAGE_SIZE - req->offset)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) size = PAGE_SIZE - req->offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) size = req->remain;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) call->bvec[0].bv_len = size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) call->bvec[0].bv_offset = req->offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) call->bvec[0].bv_page = req->pages[req->index];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) iov_iter_bvec(&call->def_iter, READ, call->bvec, 1, size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) ASSERTCMP(size, <=, PAGE_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) /* extract the returned data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) case 2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) _debug("extract data %zu/%llu",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) iov_iter_count(call->iter), req->remain);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) ret = afs_extract_data(call, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) req->remain -= call->bvec[0].bv_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) req->offset += call->bvec[0].bv_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) ASSERTCMP(req->offset, <=, PAGE_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) if (req->offset == PAGE_SIZE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) req->offset = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) req->index++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) if (req->remain > 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) goto begin_page;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) ASSERTCMP(req->remain, ==, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) if (req->actual_len <= req->len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) goto no_more_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) /* Discard any excess data the server gave us */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) afs_extract_discard(call, req->actual_len - req->len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) call->unmarshall = 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) case 3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) _debug("extract discard %zu/%llu",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) iov_iter_count(call->iter), req->actual_len - req->len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) ret = afs_extract_data(call, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) no_more_data:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) call->unmarshall = 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) afs_extract_to_buf(call,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) sizeof(struct yfs_xdr_YFSFetchStatus) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) sizeof(struct yfs_xdr_YFSCallBack) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) sizeof(struct yfs_xdr_YFSVolSync));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) /* extract the metadata */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) case 4:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) ret = afs_extract_data(call, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) bp = call->buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) xdr_decode_YFSFetchStatus(&bp, call, &vp->scb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) xdr_decode_YFSCallBack(&bp, call, &vp->scb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) xdr_decode_YFSVolSync(&bp, &op->volsync);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) req->data_version = vp->scb.status.data_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) req->file_size = vp->scb.status.size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) call->unmarshall++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) case 5:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) for (; req->index < req->nr_pages; req->index++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) if (req->offset < PAGE_SIZE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) zero_user_segment(req->pages[req->index],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) req->offset, PAGE_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) req->offset = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) if (req->page_done)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) for (req->index = 0; req->index < req->nr_pages; req->index++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) req->page_done(req);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) _leave(" = 0 [done]");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) * YFS.FetchData64 operation type
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) static const struct afs_call_type yfs_RXYFSFetchData64 = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) .name = "YFS.FetchData64",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) .op = yfs_FS_FetchData64,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) .deliver = yfs_deliver_fs_fetch_data64,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) .destructor = afs_flat_call_destructor,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) * Fetch data from a file.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) void yfs_fs_fetch_data(struct afs_operation *op)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) struct afs_vnode_param *vp = &op->file[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) struct afs_read *req = op->fetch.req;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) struct afs_call *call;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) __be32 *bp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) _enter(",%x,{%llx:%llu},%llx,%llx",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) key_serial(op->key), vp->fid.vid, vp->fid.vnode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) req->pos, req->len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) call = afs_alloc_flat_call(op->net, &yfs_RXYFSFetchData64,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) sizeof(__be32) * 2 +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) sizeof(struct yfs_xdr_YFSFid) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) sizeof(struct yfs_xdr_u64) * 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) sizeof(struct yfs_xdr_YFSFetchStatus) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) sizeof(struct yfs_xdr_YFSCallBack) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) sizeof(struct yfs_xdr_YFSVolSync));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) if (!call)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) return afs_op_nomem(op);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) /* marshall the parameters */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) bp = call->request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) bp = xdr_encode_u32(bp, YFSFETCHDATA64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) bp = xdr_encode_u32(bp, 0); /* RPC flags */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) bp = xdr_encode_YFSFid(bp, &vp->fid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) bp = xdr_encode_u64(bp, req->pos);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) bp = xdr_encode_u64(bp, req->len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) yfs_check_req(call, bp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) trace_afs_make_fs_call(call, &vp->fid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) afs_make_op_call(op, call, GFP_NOFS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) * Deliver reply data for YFS.CreateFile or YFS.MakeDir.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) static int yfs_deliver_fs_create_vnode(struct afs_call *call)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) struct afs_operation *op = call->op;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) struct afs_vnode_param *dvp = &op->file[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) struct afs_vnode_param *vp = &op->file[1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) const __be32 *bp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) _enter("{%u}", call->unmarshall);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) ret = afs_transfer_reply(call);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) /* unmarshall the reply once we've received all of it */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) bp = call->buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) xdr_decode_YFSFid(&bp, &op->file[1].fid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) xdr_decode_YFSFetchStatus(&bp, call, &vp->scb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) xdr_decode_YFSFetchStatus(&bp, call, &dvp->scb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) xdr_decode_YFSCallBack(&bp, call, &vp->scb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) xdr_decode_YFSVolSync(&bp, &op->volsync);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) _leave(" = 0 [done]");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) * FS.CreateFile and FS.MakeDir operation type
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) static const struct afs_call_type afs_RXFSCreateFile = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) .name = "YFS.CreateFile",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) .op = yfs_FS_CreateFile,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) .deliver = yfs_deliver_fs_create_vnode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) .destructor = afs_flat_call_destructor,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) * Create a file.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) void yfs_fs_create_file(struct afs_operation *op)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) const struct qstr *name = &op->dentry->d_name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) struct afs_vnode_param *dvp = &op->file[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) struct afs_call *call;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) size_t reqsz, rplsz;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) __be32 *bp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) _enter("");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) reqsz = (sizeof(__be32) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) sizeof(__be32) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) sizeof(struct yfs_xdr_YFSFid) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) xdr_strlen(name->len) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) sizeof(struct yfs_xdr_YFSStoreStatus) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) sizeof(__be32));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) rplsz = (sizeof(struct yfs_xdr_YFSFid) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) sizeof(struct yfs_xdr_YFSFetchStatus) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) sizeof(struct yfs_xdr_YFSFetchStatus) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) sizeof(struct yfs_xdr_YFSCallBack) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) sizeof(struct yfs_xdr_YFSVolSync));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) call = afs_alloc_flat_call(op->net, &afs_RXFSCreateFile, reqsz, rplsz);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) if (!call)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) return afs_op_nomem(op);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) /* marshall the parameters */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) bp = call->request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) bp = xdr_encode_u32(bp, YFSCREATEFILE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) bp = xdr_encode_u32(bp, 0); /* RPC flags */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) bp = xdr_encode_YFSFid(bp, &dvp->fid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) bp = xdr_encode_name(bp, name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) bp = xdr_encode_YFSStoreStatus_mode(bp, op->create.mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) bp = xdr_encode_u32(bp, yfs_LockNone); /* ViceLockType */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) yfs_check_req(call, bp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) trace_afs_make_fs_call1(call, &dvp->fid, name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) afs_make_op_call(op, call, GFP_NOFS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) static const struct afs_call_type yfs_RXFSMakeDir = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) .name = "YFS.MakeDir",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) .op = yfs_FS_MakeDir,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) .deliver = yfs_deliver_fs_create_vnode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) .destructor = afs_flat_call_destructor,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) * Make a directory.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) void yfs_fs_make_dir(struct afs_operation *op)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) const struct qstr *name = &op->dentry->d_name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) struct afs_vnode_param *dvp = &op->file[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) struct afs_call *call;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) size_t reqsz, rplsz;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) __be32 *bp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) _enter("");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) reqsz = (sizeof(__be32) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) sizeof(struct yfs_xdr_RPCFlags) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) sizeof(struct yfs_xdr_YFSFid) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) xdr_strlen(name->len) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) sizeof(struct yfs_xdr_YFSStoreStatus));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) rplsz = (sizeof(struct yfs_xdr_YFSFid) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) sizeof(struct yfs_xdr_YFSFetchStatus) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) sizeof(struct yfs_xdr_YFSFetchStatus) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) sizeof(struct yfs_xdr_YFSCallBack) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) sizeof(struct yfs_xdr_YFSVolSync));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) call = afs_alloc_flat_call(op->net, &yfs_RXFSMakeDir, reqsz, rplsz);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) if (!call)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) return afs_op_nomem(op);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) /* marshall the parameters */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) bp = call->request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) bp = xdr_encode_u32(bp, YFSMAKEDIR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) bp = xdr_encode_u32(bp, 0); /* RPC flags */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) bp = xdr_encode_YFSFid(bp, &dvp->fid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) bp = xdr_encode_name(bp, name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) bp = xdr_encode_YFSStoreStatus_mode(bp, op->create.mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) yfs_check_req(call, bp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) trace_afs_make_fs_call1(call, &dvp->fid, name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) afs_make_op_call(op, call, GFP_NOFS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) * Deliver reply data to a YFS.RemoveFile2 operation.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) static int yfs_deliver_fs_remove_file2(struct afs_call *call)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) struct afs_operation *op = call->op;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) struct afs_vnode_param *dvp = &op->file[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) struct afs_vnode_param *vp = &op->file[1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) struct afs_fid fid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) const __be32 *bp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) _enter("{%u}", call->unmarshall);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) ret = afs_transfer_reply(call);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) bp = call->buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) xdr_decode_YFSFetchStatus(&bp, call, &dvp->scb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) xdr_decode_YFSFid(&bp, &fid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) xdr_decode_YFSFetchStatus(&bp, call, &vp->scb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) /* Was deleted if vnode->status.abort_code == VNOVNODE. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) xdr_decode_YFSVolSync(&bp, &op->volsync);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) static void yfs_done_fs_remove_file2(struct afs_call *call)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) if (call->error == -ECONNABORTED &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) call->abort_code == RX_INVALID_OPERATION) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) set_bit(AFS_SERVER_FL_NO_RM2, &call->server->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) call->op->flags |= AFS_OPERATION_DOWNGRADE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) * YFS.RemoveFile2 operation type.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) static const struct afs_call_type yfs_RXYFSRemoveFile2 = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) .name = "YFS.RemoveFile2",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) .op = yfs_FS_RemoveFile2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) .deliver = yfs_deliver_fs_remove_file2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) .done = yfs_done_fs_remove_file2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) .destructor = afs_flat_call_destructor,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) * Remove a file and retrieve new file status.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) void yfs_fs_remove_file2(struct afs_operation *op)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) struct afs_vnode_param *dvp = &op->file[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) const struct qstr *name = &op->dentry->d_name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) struct afs_call *call;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) __be32 *bp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) _enter("");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) call = afs_alloc_flat_call(op->net, &yfs_RXYFSRemoveFile2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) sizeof(__be32) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) sizeof(struct yfs_xdr_RPCFlags) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) sizeof(struct yfs_xdr_YFSFid) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) xdr_strlen(name->len),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) sizeof(struct yfs_xdr_YFSFetchStatus) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) sizeof(struct yfs_xdr_YFSFid) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) sizeof(struct yfs_xdr_YFSFetchStatus) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) sizeof(struct yfs_xdr_YFSVolSync));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) if (!call)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) return afs_op_nomem(op);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) /* marshall the parameters */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) bp = call->request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) bp = xdr_encode_u32(bp, YFSREMOVEFILE2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) bp = xdr_encode_u32(bp, 0); /* RPC flags */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) bp = xdr_encode_YFSFid(bp, &dvp->fid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) bp = xdr_encode_name(bp, name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) yfs_check_req(call, bp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) trace_afs_make_fs_call1(call, &dvp->fid, name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) afs_make_op_call(op, call, GFP_NOFS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) * Deliver reply data to a YFS.RemoveFile or YFS.RemoveDir operation.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) static int yfs_deliver_fs_remove(struct afs_call *call)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) struct afs_operation *op = call->op;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) struct afs_vnode_param *dvp = &op->file[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) const __be32 *bp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) _enter("{%u}", call->unmarshall);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) ret = afs_transfer_reply(call);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) bp = call->buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) xdr_decode_YFSFetchStatus(&bp, call, &dvp->scb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) xdr_decode_YFSVolSync(&bp, &op->volsync);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) * FS.RemoveDir and FS.RemoveFile operation types.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) static const struct afs_call_type yfs_RXYFSRemoveFile = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) .name = "YFS.RemoveFile",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) .op = yfs_FS_RemoveFile,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) .deliver = yfs_deliver_fs_remove,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) .destructor = afs_flat_call_destructor,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) * Remove a file.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) void yfs_fs_remove_file(struct afs_operation *op)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) const struct qstr *name = &op->dentry->d_name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) struct afs_vnode_param *dvp = &op->file[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) struct afs_call *call;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) __be32 *bp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) _enter("");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) if (!test_bit(AFS_SERVER_FL_NO_RM2, &op->server->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) return yfs_fs_remove_file2(op);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) call = afs_alloc_flat_call(op->net, &yfs_RXYFSRemoveFile,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) sizeof(__be32) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) sizeof(struct yfs_xdr_RPCFlags) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) sizeof(struct yfs_xdr_YFSFid) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) xdr_strlen(name->len),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) sizeof(struct yfs_xdr_YFSFetchStatus) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) sizeof(struct yfs_xdr_YFSVolSync));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) if (!call)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) return afs_op_nomem(op);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) /* marshall the parameters */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) bp = call->request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) bp = xdr_encode_u32(bp, YFSREMOVEFILE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) bp = xdr_encode_u32(bp, 0); /* RPC flags */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) bp = xdr_encode_YFSFid(bp, &dvp->fid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) bp = xdr_encode_name(bp, name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) yfs_check_req(call, bp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) trace_afs_make_fs_call1(call, &dvp->fid, name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) afs_make_op_call(op, call, GFP_NOFS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815) static const struct afs_call_type yfs_RXYFSRemoveDir = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) .name = "YFS.RemoveDir",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) .op = yfs_FS_RemoveDir,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) .deliver = yfs_deliver_fs_remove,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) .destructor = afs_flat_call_destructor,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) * Remove a directory.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) void yfs_fs_remove_dir(struct afs_operation *op)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) const struct qstr *name = &op->dentry->d_name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) struct afs_vnode_param *dvp = &op->file[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) struct afs_call *call;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) __be32 *bp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) _enter("");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) call = afs_alloc_flat_call(op->net, &yfs_RXYFSRemoveDir,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835) sizeof(__be32) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) sizeof(struct yfs_xdr_RPCFlags) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) sizeof(struct yfs_xdr_YFSFid) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) xdr_strlen(name->len),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) sizeof(struct yfs_xdr_YFSFetchStatus) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) sizeof(struct yfs_xdr_YFSVolSync));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) if (!call)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) return afs_op_nomem(op);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) /* marshall the parameters */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) bp = call->request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846) bp = xdr_encode_u32(bp, YFSREMOVEDIR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) bp = xdr_encode_u32(bp, 0); /* RPC flags */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) bp = xdr_encode_YFSFid(bp, &dvp->fid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849) bp = xdr_encode_name(bp, name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) yfs_check_req(call, bp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) trace_afs_make_fs_call1(call, &dvp->fid, name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) afs_make_op_call(op, call, GFP_NOFS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) * Deliver reply data to a YFS.Link operation.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859) static int yfs_deliver_fs_link(struct afs_call *call)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) struct afs_operation *op = call->op;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) struct afs_vnode_param *dvp = &op->file[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863) struct afs_vnode_param *vp = &op->file[1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) const __be32 *bp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867) _enter("{%u}", call->unmarshall);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) ret = afs_transfer_reply(call);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) bp = call->buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) xdr_decode_YFSFetchStatus(&bp, call, &vp->scb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) xdr_decode_YFSFetchStatus(&bp, call, &dvp->scb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) xdr_decode_YFSVolSync(&bp, &op->volsync);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877) _leave(" = 0 [done]");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882) * YFS.Link operation type.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884) static const struct afs_call_type yfs_RXYFSLink = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885) .name = "YFS.Link",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886) .op = yfs_FS_Link,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887) .deliver = yfs_deliver_fs_link,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) .destructor = afs_flat_call_destructor,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) * Make a hard link.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894) void yfs_fs_link(struct afs_operation *op)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896) const struct qstr *name = &op->dentry->d_name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) struct afs_vnode_param *dvp = &op->file[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) struct afs_vnode_param *vp = &op->file[1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899) struct afs_call *call;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900) __be32 *bp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902) _enter("");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) call = afs_alloc_flat_call(op->net, &yfs_RXYFSLink,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905) sizeof(__be32) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) sizeof(struct yfs_xdr_RPCFlags) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907) sizeof(struct yfs_xdr_YFSFid) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908) xdr_strlen(name->len) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909) sizeof(struct yfs_xdr_YFSFid),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910) sizeof(struct yfs_xdr_YFSFetchStatus) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911) sizeof(struct yfs_xdr_YFSFetchStatus) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912) sizeof(struct yfs_xdr_YFSVolSync));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913) if (!call)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914) return afs_op_nomem(op);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) /* marshall the parameters */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917) bp = call->request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918) bp = xdr_encode_u32(bp, YFSLINK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919) bp = xdr_encode_u32(bp, 0); /* RPC flags */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) bp = xdr_encode_YFSFid(bp, &dvp->fid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921) bp = xdr_encode_name(bp, name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922) bp = xdr_encode_YFSFid(bp, &vp->fid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923) yfs_check_req(call, bp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925) trace_afs_make_fs_call1(call, &vp->fid, name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926) afs_make_op_call(op, call, GFP_NOFS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930) * Deliver reply data to a YFS.Symlink operation.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932) static int yfs_deliver_fs_symlink(struct afs_call *call)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934) struct afs_operation *op = call->op;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935) struct afs_vnode_param *dvp = &op->file[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936) struct afs_vnode_param *vp = &op->file[1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937) const __be32 *bp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940) _enter("{%u}", call->unmarshall);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942) ret = afs_transfer_reply(call);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946) /* unmarshall the reply once we've received all of it */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947) bp = call->buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948) xdr_decode_YFSFid(&bp, &vp->fid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949) xdr_decode_YFSFetchStatus(&bp, call, &vp->scb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950) xdr_decode_YFSFetchStatus(&bp, call, &dvp->scb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951) xdr_decode_YFSVolSync(&bp, &op->volsync);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953) _leave(" = 0 [done]");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 957) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 958) * YFS.Symlink operation type
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 959) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 960) static const struct afs_call_type yfs_RXYFSSymlink = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 961) .name = "YFS.Symlink",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 962) .op = yfs_FS_Symlink,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 963) .deliver = yfs_deliver_fs_symlink,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 964) .destructor = afs_flat_call_destructor,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 965) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 966)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 967) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 968) * Create a symbolic link.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 969) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 970) void yfs_fs_symlink(struct afs_operation *op)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 971) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 972) const struct qstr *name = &op->dentry->d_name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 973) struct afs_vnode_param *dvp = &op->file[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 974) struct afs_call *call;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 975) size_t contents_sz;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 976) __be32 *bp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 977)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 978) _enter("");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 979)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 980) contents_sz = strlen(op->create.symlink);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 981) call = afs_alloc_flat_call(op->net, &yfs_RXYFSSymlink,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 982) sizeof(__be32) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 983) sizeof(struct yfs_xdr_RPCFlags) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 984) sizeof(struct yfs_xdr_YFSFid) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 985) xdr_strlen(name->len) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 986) xdr_strlen(contents_sz) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 987) sizeof(struct yfs_xdr_YFSStoreStatus),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 988) sizeof(struct yfs_xdr_YFSFid) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 989) sizeof(struct yfs_xdr_YFSFetchStatus) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 990) sizeof(struct yfs_xdr_YFSFetchStatus) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 991) sizeof(struct yfs_xdr_YFSVolSync));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 992) if (!call)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 993) return afs_op_nomem(op);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 994)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 995) /* marshall the parameters */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 996) bp = call->request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 997) bp = xdr_encode_u32(bp, YFSSYMLINK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 998) bp = xdr_encode_u32(bp, 0); /* RPC flags */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 999) bp = xdr_encode_YFSFid(bp, &dvp->fid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) bp = xdr_encode_name(bp, name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) bp = xdr_encode_string(bp, op->create.symlink, contents_sz);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) bp = xdr_encode_YFSStoreStatus_mode(bp, S_IRWXUGO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) yfs_check_req(call, bp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) trace_afs_make_fs_call1(call, &dvp->fid, name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) afs_make_op_call(op, call, GFP_NOFS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) * Deliver reply data to a YFS.Rename operation.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) static int yfs_deliver_fs_rename(struct afs_call *call)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) struct afs_operation *op = call->op;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) struct afs_vnode_param *orig_dvp = &op->file[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) struct afs_vnode_param *new_dvp = &op->file[1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) const __be32 *bp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) _enter("{%u}", call->unmarshall);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) ret = afs_transfer_reply(call);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) bp = call->buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) /* If the two dirs are the same, we have two copies of the same status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) * report, so we just decode it twice.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) xdr_decode_YFSFetchStatus(&bp, call, &orig_dvp->scb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) xdr_decode_YFSFetchStatus(&bp, call, &new_dvp->scb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) xdr_decode_YFSVolSync(&bp, &op->volsync);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) _leave(" = 0 [done]");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) * YFS.Rename operation type
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) static const struct afs_call_type yfs_RXYFSRename = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) .name = "FS.Rename",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) .op = yfs_FS_Rename,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) .deliver = yfs_deliver_fs_rename,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) .destructor = afs_flat_call_destructor,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) * Rename a file or directory.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) void yfs_fs_rename(struct afs_operation *op)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) struct afs_vnode_param *orig_dvp = &op->file[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) struct afs_vnode_param *new_dvp = &op->file[1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) const struct qstr *orig_name = &op->dentry->d_name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) const struct qstr *new_name = &op->dentry_2->d_name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) struct afs_call *call;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) __be32 *bp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) _enter("");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) call = afs_alloc_flat_call(op->net, &yfs_RXYFSRename,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) sizeof(__be32) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) sizeof(struct yfs_xdr_RPCFlags) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) sizeof(struct yfs_xdr_YFSFid) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) xdr_strlen(orig_name->len) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) sizeof(struct yfs_xdr_YFSFid) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) xdr_strlen(new_name->len),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) sizeof(struct yfs_xdr_YFSFetchStatus) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) sizeof(struct yfs_xdr_YFSFetchStatus) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) sizeof(struct yfs_xdr_YFSVolSync));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) if (!call)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) return afs_op_nomem(op);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) /* marshall the parameters */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) bp = call->request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) bp = xdr_encode_u32(bp, YFSRENAME);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) bp = xdr_encode_u32(bp, 0); /* RPC flags */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) bp = xdr_encode_YFSFid(bp, &orig_dvp->fid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) bp = xdr_encode_name(bp, orig_name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) bp = xdr_encode_YFSFid(bp, &new_dvp->fid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) bp = xdr_encode_name(bp, new_name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) yfs_check_req(call, bp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) trace_afs_make_fs_call2(call, &orig_dvp->fid, orig_name, new_name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) afs_make_op_call(op, call, GFP_NOFS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) * YFS.StoreData64 operation type.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) static const struct afs_call_type yfs_RXYFSStoreData64 = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) .name = "YFS.StoreData64",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) .op = yfs_FS_StoreData64,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) .deliver = yfs_deliver_status_and_volsync,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) .destructor = afs_flat_call_destructor,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) * Store a set of pages to a large file.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) void yfs_fs_store_data(struct afs_operation *op)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) struct afs_vnode_param *vp = &op->file[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) struct afs_call *call;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) loff_t size, pos, i_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106) __be32 *bp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) _enter(",%x,{%llx:%llu},,",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) key_serial(op->key), vp->fid.vid, vp->fid.vnode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111) size = (loff_t)op->store.last_to - (loff_t)op->store.first_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) if (op->store.first != op->store.last)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) size += (loff_t)(op->store.last - op->store.first) << PAGE_SHIFT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114) pos = (loff_t)op->store.first << PAGE_SHIFT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) pos += op->store.first_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) i_size = i_size_read(&vp->vnode->vfs_inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) if (pos + size > i_size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119) i_size = size + pos;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) _debug("size %llx, at %llx, i_size %llx",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122) (unsigned long long)size, (unsigned long long)pos,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) (unsigned long long)i_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) call = afs_alloc_flat_call(op->net, &yfs_RXYFSStoreData64,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) sizeof(__be32) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) sizeof(__be32) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128) sizeof(struct yfs_xdr_YFSFid) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) sizeof(struct yfs_xdr_YFSStoreStatus) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130) sizeof(struct yfs_xdr_u64) * 3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) sizeof(struct yfs_xdr_YFSFetchStatus) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) sizeof(struct yfs_xdr_YFSVolSync));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) if (!call)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134) return afs_op_nomem(op);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) call->key = op->key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) call->send_pages = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) /* marshall the parameters */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140) bp = call->request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) bp = xdr_encode_u32(bp, YFSSTOREDATA64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) bp = xdr_encode_u32(bp, 0); /* RPC flags */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143) bp = xdr_encode_YFSFid(bp, &vp->fid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144) bp = xdr_encode_YFSStoreStatus_mtime(bp, &op->mtime);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) bp = xdr_encode_u64(bp, pos);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146) bp = xdr_encode_u64(bp, size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147) bp = xdr_encode_u64(bp, i_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) yfs_check_req(call, bp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150) trace_afs_make_fs_call(call, &vp->fid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151) afs_make_op_call(op, call, GFP_NOFS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) * YFS.StoreStatus operation type
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157) static const struct afs_call_type yfs_RXYFSStoreStatus = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158) .name = "YFS.StoreStatus",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) .op = yfs_FS_StoreStatus,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160) .deliver = yfs_deliver_status_and_volsync,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161) .destructor = afs_flat_call_destructor,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) static const struct afs_call_type yfs_RXYFSStoreData64_as_Status = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165) .name = "YFS.StoreData64",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) .op = yfs_FS_StoreData64,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167) .deliver = yfs_deliver_status_and_volsync,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168) .destructor = afs_flat_call_destructor,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172) * Set the attributes on a file, using YFS.StoreData64 rather than
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173) * YFS.StoreStatus so as to alter the file size also.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175) static void yfs_fs_setattr_size(struct afs_operation *op)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177) struct afs_vnode_param *vp = &op->file[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178) struct afs_call *call;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179) struct iattr *attr = op->setattr.attr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180) __be32 *bp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182) _enter(",%x,{%llx:%llu},,",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183) key_serial(op->key), vp->fid.vid, vp->fid.vnode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185) call = afs_alloc_flat_call(op->net, &yfs_RXYFSStoreData64_as_Status,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186) sizeof(__be32) * 2 +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187) sizeof(struct yfs_xdr_YFSFid) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) sizeof(struct yfs_xdr_YFSStoreStatus) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189) sizeof(struct yfs_xdr_u64) * 3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190) sizeof(struct yfs_xdr_YFSFetchStatus) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191) sizeof(struct yfs_xdr_YFSVolSync));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192) if (!call)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193) return afs_op_nomem(op);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195) /* marshall the parameters */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196) bp = call->request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197) bp = xdr_encode_u32(bp, YFSSTOREDATA64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198) bp = xdr_encode_u32(bp, 0); /* RPC flags */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199) bp = xdr_encode_YFSFid(bp, &vp->fid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) bp = xdr_encode_YFS_StoreStatus(bp, attr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) bp = xdr_encode_u64(bp, attr->ia_size); /* position of start of write */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202) bp = xdr_encode_u64(bp, 0); /* size of write */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203) bp = xdr_encode_u64(bp, attr->ia_size); /* new file length */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204) yfs_check_req(call, bp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206) trace_afs_make_fs_call(call, &vp->fid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207) afs_make_op_call(op, call, GFP_NOFS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211) * Set the attributes on a file, using YFS.StoreData64 if there's a change in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212) * file size, and YFS.StoreStatus otherwise.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214) void yfs_fs_setattr(struct afs_operation *op)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216) struct afs_vnode_param *vp = &op->file[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217) struct afs_call *call;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218) struct iattr *attr = op->setattr.attr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219) __be32 *bp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221) if (attr->ia_valid & ATTR_SIZE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222) return yfs_fs_setattr_size(op);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224) _enter(",%x,{%llx:%llu},,",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225) key_serial(op->key), vp->fid.vid, vp->fid.vnode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227) call = afs_alloc_flat_call(op->net, &yfs_RXYFSStoreStatus,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228) sizeof(__be32) * 2 +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229) sizeof(struct yfs_xdr_YFSFid) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230) sizeof(struct yfs_xdr_YFSStoreStatus),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231) sizeof(struct yfs_xdr_YFSFetchStatus) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232) sizeof(struct yfs_xdr_YFSVolSync));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233) if (!call)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234) return afs_op_nomem(op);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236) /* marshall the parameters */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237) bp = call->request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238) bp = xdr_encode_u32(bp, YFSSTORESTATUS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239) bp = xdr_encode_u32(bp, 0); /* RPC flags */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240) bp = xdr_encode_YFSFid(bp, &vp->fid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241) bp = xdr_encode_YFS_StoreStatus(bp, attr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242) yfs_check_req(call, bp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244) trace_afs_make_fs_call(call, &vp->fid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245) afs_make_op_call(op, call, GFP_NOFS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249) * Deliver reply data to a YFS.GetVolumeStatus operation.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251) static int yfs_deliver_fs_get_volume_status(struct afs_call *call)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253) struct afs_operation *op = call->op;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254) const __be32 *bp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255) char *p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256) u32 size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259) _enter("{%u}", call->unmarshall);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) switch (call->unmarshall) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262) case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263) call->unmarshall++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264) afs_extract_to_buf(call, sizeof(struct yfs_xdr_YFSFetchVolumeStatus));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267) /* extract the returned status record */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268) case 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269) _debug("extract status");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270) ret = afs_extract_data(call, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274) bp = call->buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275) xdr_decode_YFSFetchVolumeStatus(&bp, &op->volstatus.vs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276) call->unmarshall++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277) afs_extract_to_tmp(call);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280) /* extract the volume name length */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281) case 2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282) ret = afs_extract_data(call, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286) call->count = ntohl(call->tmp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287) _debug("volname length: %u", call->count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288) if (call->count >= AFSNAMEMAX)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289) return afs_protocol_error(call, afs_eproto_volname_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290) size = (call->count + 3) & ~3; /* It's padded */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291) afs_extract_to_buf(call, size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292) call->unmarshall++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295) /* extract the volume name */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296) case 3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297) _debug("extract volname");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298) ret = afs_extract_data(call, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302) p = call->buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303) p[call->count] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304) _debug("volname '%s'", p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305) afs_extract_to_tmp(call);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306) call->unmarshall++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309) /* extract the offline message length */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310) case 4:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311) ret = afs_extract_data(call, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315) call->count = ntohl(call->tmp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316) _debug("offline msg length: %u", call->count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317) if (call->count >= AFSNAMEMAX)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318) return afs_protocol_error(call, afs_eproto_offline_msg_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319) size = (call->count + 3) & ~3; /* It's padded */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320) afs_extract_to_buf(call, size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321) call->unmarshall++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324) /* extract the offline message */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325) case 5:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326) _debug("extract offline");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327) ret = afs_extract_data(call, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331) p = call->buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332) p[call->count] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333) _debug("offline '%s'", p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335) afs_extract_to_tmp(call);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336) call->unmarshall++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339) /* extract the message of the day length */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340) case 6:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341) ret = afs_extract_data(call, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345) call->count = ntohl(call->tmp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346) _debug("motd length: %u", call->count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347) if (call->count >= AFSNAMEMAX)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348) return afs_protocol_error(call, afs_eproto_motd_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349) size = (call->count + 3) & ~3; /* It's padded */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350) afs_extract_to_buf(call, size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351) call->unmarshall++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1352) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1354) /* extract the message of the day */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355) case 7:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356) _debug("extract motd");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357) ret = afs_extract_data(call, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361) p = call->buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362) p[call->count] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363) _debug("motd '%s'", p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365) call->unmarshall++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1366) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1367)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1368) case 8:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1371)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1372) _leave(" = 0 [done]");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1373) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377) * YFS.GetVolumeStatus operation type
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379) static const struct afs_call_type yfs_RXYFSGetVolumeStatus = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380) .name = "YFS.GetVolumeStatus",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381) .op = yfs_FS_GetVolumeStatus,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382) .deliver = yfs_deliver_fs_get_volume_status,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383) .destructor = afs_flat_call_destructor,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387) * fetch the status of a volume
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389) void yfs_fs_get_volume_status(struct afs_operation *op)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391) struct afs_vnode_param *vp = &op->file[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392) struct afs_call *call;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393) __be32 *bp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395) _enter("");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1396)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1397) call = afs_alloc_flat_call(op->net, &yfs_RXYFSGetVolumeStatus,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1398) sizeof(__be32) * 2 +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1399) sizeof(struct yfs_xdr_u64),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1400) max_t(size_t,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1401) sizeof(struct yfs_xdr_YFSFetchVolumeStatus) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1402) sizeof(__be32),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1403) AFSOPAQUEMAX + 1));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1404) if (!call)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1405) return afs_op_nomem(op);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1406)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1407) /* marshall the parameters */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1408) bp = call->request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1409) bp = xdr_encode_u32(bp, YFSGETVOLUMESTATUS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1410) bp = xdr_encode_u32(bp, 0); /* RPC flags */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1411) bp = xdr_encode_u64(bp, vp->fid.vid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1412) yfs_check_req(call, bp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1413)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1414) trace_afs_make_fs_call(call, &vp->fid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1415) afs_make_op_call(op, call, GFP_NOFS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1416) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1417)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1418) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1419) * YFS.SetLock operation type
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1420) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1421) static const struct afs_call_type yfs_RXYFSSetLock = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1422) .name = "YFS.SetLock",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1423) .op = yfs_FS_SetLock,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1424) .deliver = yfs_deliver_status_and_volsync,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1425) .done = afs_lock_op_done,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1426) .destructor = afs_flat_call_destructor,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1427) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1428)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1429) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1430) * YFS.ExtendLock operation type
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1431) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1432) static const struct afs_call_type yfs_RXYFSExtendLock = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1433) .name = "YFS.ExtendLock",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1434) .op = yfs_FS_ExtendLock,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1435) .deliver = yfs_deliver_status_and_volsync,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1436) .done = afs_lock_op_done,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1437) .destructor = afs_flat_call_destructor,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1438) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1439)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1440) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1441) * YFS.ReleaseLock operation type
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1442) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1443) static const struct afs_call_type yfs_RXYFSReleaseLock = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1444) .name = "YFS.ReleaseLock",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1445) .op = yfs_FS_ReleaseLock,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1446) .deliver = yfs_deliver_status_and_volsync,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1447) .destructor = afs_flat_call_destructor,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1448) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1449)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1450) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1451) * Set a lock on a file
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1452) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1453) void yfs_fs_set_lock(struct afs_operation *op)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1454) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1455) struct afs_vnode_param *vp = &op->file[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1456) struct afs_call *call;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1457) __be32 *bp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1458)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1459) _enter("");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1460)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1461) call = afs_alloc_flat_call(op->net, &yfs_RXYFSSetLock,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1462) sizeof(__be32) * 2 +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1463) sizeof(struct yfs_xdr_YFSFid) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1464) sizeof(__be32),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1465) sizeof(struct yfs_xdr_YFSFetchStatus) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1466) sizeof(struct yfs_xdr_YFSVolSync));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1467) if (!call)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1468) return afs_op_nomem(op);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1469)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1470) /* marshall the parameters */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1471) bp = call->request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1472) bp = xdr_encode_u32(bp, YFSSETLOCK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1473) bp = xdr_encode_u32(bp, 0); /* RPC flags */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1474) bp = xdr_encode_YFSFid(bp, &vp->fid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1475) bp = xdr_encode_u32(bp, op->lock.type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1476) yfs_check_req(call, bp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1477)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1478) trace_afs_make_fs_calli(call, &vp->fid, op->lock.type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1479) afs_make_op_call(op, call, GFP_NOFS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1480) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1481)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1482) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1483) * extend a lock on a file
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1484) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1485) void yfs_fs_extend_lock(struct afs_operation *op)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1486) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1487) struct afs_vnode_param *vp = &op->file[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1488) struct afs_call *call;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1489) __be32 *bp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1490)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1491) _enter("");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1492)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1493) call = afs_alloc_flat_call(op->net, &yfs_RXYFSExtendLock,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1494) sizeof(__be32) * 2 +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1495) sizeof(struct yfs_xdr_YFSFid),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1496) sizeof(struct yfs_xdr_YFSFetchStatus) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1497) sizeof(struct yfs_xdr_YFSVolSync));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1498) if (!call)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1499) return afs_op_nomem(op);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1500)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1501) /* marshall the parameters */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1502) bp = call->request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1503) bp = xdr_encode_u32(bp, YFSEXTENDLOCK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1504) bp = xdr_encode_u32(bp, 0); /* RPC flags */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1505) bp = xdr_encode_YFSFid(bp, &vp->fid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1506) yfs_check_req(call, bp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1507)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1508) trace_afs_make_fs_call(call, &vp->fid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1509) afs_make_op_call(op, call, GFP_NOFS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1510) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1511)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1512) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1513) * release a lock on a file
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1514) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1515) void yfs_fs_release_lock(struct afs_operation *op)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1516) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1517) struct afs_vnode_param *vp = &op->file[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1518) struct afs_call *call;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1519) __be32 *bp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1520)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1521) _enter("");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1522)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1523) call = afs_alloc_flat_call(op->net, &yfs_RXYFSReleaseLock,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1524) sizeof(__be32) * 2 +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1525) sizeof(struct yfs_xdr_YFSFid),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1526) sizeof(struct yfs_xdr_YFSFetchStatus) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1527) sizeof(struct yfs_xdr_YFSVolSync));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1528) if (!call)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1529) return afs_op_nomem(op);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1530)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1531) /* marshall the parameters */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1532) bp = call->request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1533) bp = xdr_encode_u32(bp, YFSRELEASELOCK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1534) bp = xdr_encode_u32(bp, 0); /* RPC flags */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1535) bp = xdr_encode_YFSFid(bp, &vp->fid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1536) yfs_check_req(call, bp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1537)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1538) trace_afs_make_fs_call(call, &vp->fid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1539) afs_make_op_call(op, call, GFP_NOFS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1540) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1541)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1542) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1543) * Deliver a reply to YFS.FetchStatus
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1544) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1545) static int yfs_deliver_fs_fetch_status(struct afs_call *call)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1546) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1547) struct afs_operation *op = call->op;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1548) struct afs_vnode_param *vp = &op->file[op->fetch_status.which];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1549) const __be32 *bp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1550) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1551)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1552) ret = afs_transfer_reply(call);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1553) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1554) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1555)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1556) /* unmarshall the reply once we've received all of it */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1557) bp = call->buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1558) xdr_decode_YFSFetchStatus(&bp, call, &vp->scb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1559) xdr_decode_YFSCallBack(&bp, call, &vp->scb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1560) xdr_decode_YFSVolSync(&bp, &op->volsync);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1561)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1562) _leave(" = 0 [done]");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1563) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1564) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1565)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1566) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1567) * YFS.FetchStatus operation type
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1568) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1569) static const struct afs_call_type yfs_RXYFSFetchStatus = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1570) .name = "YFS.FetchStatus",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1571) .op = yfs_FS_FetchStatus,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1572) .deliver = yfs_deliver_fs_fetch_status,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1573) .destructor = afs_flat_call_destructor,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1574) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1575)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1576) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1577) * Fetch the status information for a fid without needing a vnode handle.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1578) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1579) void yfs_fs_fetch_status(struct afs_operation *op)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1580) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1581) struct afs_vnode_param *vp = &op->file[op->fetch_status.which];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1582) struct afs_call *call;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1583) __be32 *bp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1584)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1585) _enter(",%x,{%llx:%llu},,",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1586) key_serial(op->key), vp->fid.vid, vp->fid.vnode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1587)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1588) call = afs_alloc_flat_call(op->net, &yfs_RXYFSFetchStatus,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1589) sizeof(__be32) * 2 +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1590) sizeof(struct yfs_xdr_YFSFid),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1591) sizeof(struct yfs_xdr_YFSFetchStatus) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1592) sizeof(struct yfs_xdr_YFSCallBack) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1593) sizeof(struct yfs_xdr_YFSVolSync));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1594) if (!call)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1595) return afs_op_nomem(op);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1596)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1597) /* marshall the parameters */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1598) bp = call->request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1599) bp = xdr_encode_u32(bp, YFSFETCHSTATUS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1600) bp = xdr_encode_u32(bp, 0); /* RPC flags */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1601) bp = xdr_encode_YFSFid(bp, &vp->fid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1602) yfs_check_req(call, bp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1603)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1604) trace_afs_make_fs_call(call, &vp->fid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1605) afs_make_op_call(op, call, GFP_NOFS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1606) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1607)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1608) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1609) * Deliver reply data to an YFS.InlineBulkStatus call
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1610) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1611) static int yfs_deliver_fs_inline_bulk_status(struct afs_call *call)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1612) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1613) struct afs_operation *op = call->op;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1614) struct afs_status_cb *scb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1615) const __be32 *bp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1616) u32 tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1617) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1618)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1619) _enter("{%u}", call->unmarshall);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1620)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1621) switch (call->unmarshall) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1622) case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1623) afs_extract_to_tmp(call);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1624) call->unmarshall++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1625) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1626)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1627) /* Extract the file status count and array in two steps */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1628) case 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1629) _debug("extract status count");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1630) ret = afs_extract_data(call, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1631) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1632) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1633)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1634) tmp = ntohl(call->tmp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1635) _debug("status count: %u/%u", tmp, op->nr_files);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1636) if (tmp != op->nr_files)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1637) return afs_protocol_error(call, afs_eproto_ibulkst_count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1638)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1639) call->count = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1640) call->unmarshall++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1641) more_counts:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1642) afs_extract_to_buf(call, sizeof(struct yfs_xdr_YFSFetchStatus));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1643) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1644)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1645) case 2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1646) _debug("extract status array %u", call->count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1647) ret = afs_extract_data(call, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1648) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1649) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1650)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1651) switch (call->count) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1652) case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1653) scb = &op->file[0].scb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1654) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1655) case 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1656) scb = &op->file[1].scb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1657) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1658) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1659) scb = &op->more_files[call->count - 2].scb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1660) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1661) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1662)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1663) bp = call->buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1664) xdr_decode_YFSFetchStatus(&bp, call, scb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1665)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1666) call->count++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1667) if (call->count < op->nr_files)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1668) goto more_counts;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1669)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1670) call->count = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1671) call->unmarshall++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1672) afs_extract_to_tmp(call);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1673) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1674)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1675) /* Extract the callback count and array in two steps */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1676) case 3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1677) _debug("extract CB count");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1678) ret = afs_extract_data(call, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1679) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1680) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1681)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1682) tmp = ntohl(call->tmp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1683) _debug("CB count: %u", tmp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1684) if (tmp != op->nr_files)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1685) return afs_protocol_error(call, afs_eproto_ibulkst_cb_count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1686) call->count = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1687) call->unmarshall++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1688) more_cbs:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1689) afs_extract_to_buf(call, sizeof(struct yfs_xdr_YFSCallBack));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1690) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1691)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1692) case 4:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1693) _debug("extract CB array");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1694) ret = afs_extract_data(call, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1695) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1696) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1697)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1698) _debug("unmarshall CB array");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1699) switch (call->count) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1700) case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1701) scb = &op->file[0].scb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1702) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1703) case 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1704) scb = &op->file[1].scb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1705) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1706) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1707) scb = &op->more_files[call->count - 2].scb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1708) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1709) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1710)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1711) bp = call->buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1712) xdr_decode_YFSCallBack(&bp, call, scb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1713) call->count++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1714) if (call->count < op->nr_files)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1715) goto more_cbs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1716)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1717) afs_extract_to_buf(call, sizeof(struct yfs_xdr_YFSVolSync));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1718) call->unmarshall++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1719) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1720)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1721) case 5:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1722) ret = afs_extract_data(call, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1723) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1724) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1725)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1726) bp = call->buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1727) xdr_decode_YFSVolSync(&bp, &op->volsync);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1728)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1729) call->unmarshall++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1730) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1731)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1732) case 6:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1733) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1734) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1735)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1736) _leave(" = 0 [done]");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1737) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1738) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1739)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1740) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1741) * FS.InlineBulkStatus operation type
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1742) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1743) static const struct afs_call_type yfs_RXYFSInlineBulkStatus = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1744) .name = "YFS.InlineBulkStatus",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1745) .op = yfs_FS_InlineBulkStatus,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1746) .deliver = yfs_deliver_fs_inline_bulk_status,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1747) .destructor = afs_flat_call_destructor,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1748) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1749)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1750) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1751) * Fetch the status information for up to 1024 files
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1752) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1753) void yfs_fs_inline_bulk_status(struct afs_operation *op)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1754) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1755) struct afs_vnode_param *dvp = &op->file[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1756) struct afs_vnode_param *vp = &op->file[1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1757) struct afs_call *call;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1758) __be32 *bp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1759) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1760)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1761) _enter(",%x,{%llx:%llu},%u",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1762) key_serial(op->key), vp->fid.vid, vp->fid.vnode, op->nr_files);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1763)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1764) call = afs_alloc_flat_call(op->net, &yfs_RXYFSInlineBulkStatus,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1765) sizeof(__be32) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1766) sizeof(__be32) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1767) sizeof(__be32) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1768) sizeof(struct yfs_xdr_YFSFid) * op->nr_files,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1769) sizeof(struct yfs_xdr_YFSFetchStatus));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1770) if (!call)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1771) return afs_op_nomem(op);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1772)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1773) /* marshall the parameters */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1774) bp = call->request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1775) bp = xdr_encode_u32(bp, YFSINLINEBULKSTATUS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1776) bp = xdr_encode_u32(bp, 0); /* RPCFlags */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1777) bp = xdr_encode_u32(bp, op->nr_files);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1778) bp = xdr_encode_YFSFid(bp, &dvp->fid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1779) bp = xdr_encode_YFSFid(bp, &vp->fid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1780) for (i = 0; i < op->nr_files - 2; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1781) bp = xdr_encode_YFSFid(bp, &op->more_files[i].fid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1782) yfs_check_req(call, bp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1783)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1784) trace_afs_make_fs_call(call, &vp->fid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1785) afs_make_op_call(op, call, GFP_NOFS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1786) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1787)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1788) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1789) * Deliver reply data to an YFS.FetchOpaqueACL.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1790) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1791) static int yfs_deliver_fs_fetch_opaque_acl(struct afs_call *call)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1792) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1793) struct afs_operation *op = call->op;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1794) struct afs_vnode_param *vp = &op->file[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1795) struct yfs_acl *yacl = op->yacl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1796) struct afs_acl *acl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1797) const __be32 *bp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1798) unsigned int size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1799) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1800)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1801) _enter("{%u}", call->unmarshall);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1802)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1803) switch (call->unmarshall) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1804) case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1805) afs_extract_to_tmp(call);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1806) call->unmarshall++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1807) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1808)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1809) /* Extract the file ACL length */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1810) case 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1811) ret = afs_extract_data(call, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1812) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1813) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1814)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1815) size = call->count2 = ntohl(call->tmp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1816) size = round_up(size, 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1817)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1818) if (yacl->flags & YFS_ACL_WANT_ACL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1819) acl = kmalloc(struct_size(acl, data, size), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1820) if (!acl)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1821) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1822) yacl->acl = acl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1823) acl->size = call->count2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1824) afs_extract_begin(call, acl->data, size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1825) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1826) afs_extract_discard(call, size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1827) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1828) call->unmarshall++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1829) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1830)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1831) /* Extract the file ACL */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1832) case 2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1833) ret = afs_extract_data(call, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1834) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1835) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1836)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1837) afs_extract_to_tmp(call);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1838) call->unmarshall++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1839) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1840)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1841) /* Extract the volume ACL length */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1842) case 3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1843) ret = afs_extract_data(call, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1844) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1845) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1846)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1847) size = call->count2 = ntohl(call->tmp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1848) size = round_up(size, 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1849)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1850) if (yacl->flags & YFS_ACL_WANT_VOL_ACL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1851) acl = kmalloc(struct_size(acl, data, size), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1852) if (!acl)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1853) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1854) yacl->vol_acl = acl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1855) acl->size = call->count2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1856) afs_extract_begin(call, acl->data, size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1857) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1858) afs_extract_discard(call, size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1859) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1860) call->unmarshall++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1861) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1862)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1863) /* Extract the volume ACL */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1864) case 4:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1865) ret = afs_extract_data(call, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1866) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1867) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1868)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1869) afs_extract_to_buf(call,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1870) sizeof(__be32) * 2 +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1871) sizeof(struct yfs_xdr_YFSFetchStatus) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1872) sizeof(struct yfs_xdr_YFSVolSync));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1873) call->unmarshall++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1874) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1875)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1876) /* extract the metadata */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1877) case 5:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1878) ret = afs_extract_data(call, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1879) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1880) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1881)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1882) bp = call->buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1883) yacl->inherit_flag = ntohl(*bp++);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1884) yacl->num_cleaned = ntohl(*bp++);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1885) xdr_decode_YFSFetchStatus(&bp, call, &vp->scb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1886) xdr_decode_YFSVolSync(&bp, &op->volsync);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1887)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1888) call->unmarshall++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1889) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1890)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1891) case 6:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1892) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1893) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1894)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1895) _leave(" = 0 [done]");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1896) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1897) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1898)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1899) void yfs_free_opaque_acl(struct yfs_acl *yacl)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1900) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1901) if (yacl) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1902) kfree(yacl->acl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1903) kfree(yacl->vol_acl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1904) kfree(yacl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1905) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1906) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1907)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1908) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1909) * YFS.FetchOpaqueACL operation type
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1910) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1911) static const struct afs_call_type yfs_RXYFSFetchOpaqueACL = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1912) .name = "YFS.FetchOpaqueACL",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1913) .op = yfs_FS_FetchOpaqueACL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1914) .deliver = yfs_deliver_fs_fetch_opaque_acl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1915) .destructor = afs_flat_call_destructor,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1916) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1917)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1918) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1919) * Fetch the YFS advanced ACLs for a file.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1920) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1921) void yfs_fs_fetch_opaque_acl(struct afs_operation *op)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1922) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1923) struct afs_vnode_param *vp = &op->file[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1924) struct afs_call *call;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1925) __be32 *bp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1926)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1927) _enter(",%x,{%llx:%llu},,",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1928) key_serial(op->key), vp->fid.vid, vp->fid.vnode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1929)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1930) call = afs_alloc_flat_call(op->net, &yfs_RXYFSFetchOpaqueACL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1931) sizeof(__be32) * 2 +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1932) sizeof(struct yfs_xdr_YFSFid),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1933) sizeof(__be32) * 2 +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1934) sizeof(struct yfs_xdr_YFSFetchStatus) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1935) sizeof(struct yfs_xdr_YFSVolSync));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1936) if (!call)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1937) return afs_op_nomem(op);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1938)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1939) /* marshall the parameters */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1940) bp = call->request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1941) bp = xdr_encode_u32(bp, YFSFETCHOPAQUEACL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1942) bp = xdr_encode_u32(bp, 0); /* RPC flags */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1943) bp = xdr_encode_YFSFid(bp, &vp->fid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1944) yfs_check_req(call, bp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1945)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1946) trace_afs_make_fs_call(call, &vp->fid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1947) afs_make_op_call(op, call, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1948) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1949)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1950) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1951) * YFS.StoreOpaqueACL2 operation type
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1952) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1953) static const struct afs_call_type yfs_RXYFSStoreOpaqueACL2 = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1954) .name = "YFS.StoreOpaqueACL2",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1955) .op = yfs_FS_StoreOpaqueACL2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1956) .deliver = yfs_deliver_status_and_volsync,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1957) .destructor = afs_flat_call_destructor,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1958) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1959)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1960) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1961) * Fetch the YFS ACL for a file.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1962) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1963) void yfs_fs_store_opaque_acl2(struct afs_operation *op)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1964) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1965) struct afs_vnode_param *vp = &op->file[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1966) struct afs_call *call;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1967) struct afs_acl *acl = op->acl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1968) size_t size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1969) __be32 *bp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1970)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1971) _enter(",%x,{%llx:%llu},,",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1972) key_serial(op->key), vp->fid.vid, vp->fid.vnode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1973)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1974) size = round_up(acl->size, 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1975) call = afs_alloc_flat_call(op->net, &yfs_RXYFSStoreOpaqueACL2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1976) sizeof(__be32) * 2 +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1977) sizeof(struct yfs_xdr_YFSFid) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1978) sizeof(__be32) + size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1979) sizeof(struct yfs_xdr_YFSFetchStatus) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1980) sizeof(struct yfs_xdr_YFSVolSync));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1981) if (!call)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1982) return afs_op_nomem(op);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1983)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1984) /* marshall the parameters */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1985) bp = call->request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1986) bp = xdr_encode_u32(bp, YFSSTOREOPAQUEACL2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1987) bp = xdr_encode_u32(bp, 0); /* RPC flags */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1988) bp = xdr_encode_YFSFid(bp, &vp->fid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1989) bp = xdr_encode_u32(bp, acl->size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1990) memcpy(bp, acl->data, acl->size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1991) if (acl->size != size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1992) memset((void *)bp + acl->size, 0, size - acl->size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1993) bp += size / sizeof(__be32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1994) yfs_check_req(call, bp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1995)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1996) trace_afs_make_fs_call(call, &vp->fid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1997) afs_make_op_call(op, call, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1998) }