^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) /* internal AFS stuff
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * Copyright (C) 2002, 2007 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/compiler.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <linux/ktime.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <linux/fs.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <linux/pagemap.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <linux/rxrpc.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <linux/key.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <linux/workqueue.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include <linux/sched.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include <linux/fscache.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #include <linux/backing-dev.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #include <linux/uuid.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #include <linux/mm_types.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #include <linux/dns_resolver.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #include <net/net_namespace.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #include <net/netns/generic.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #include <net/sock.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #include <net/af_rxrpc.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #include "afs.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #include "afs_vl.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #define AFS_CELL_MAX_ADDRS 15
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) struct pagevec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) struct afs_call;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) * Partial file-locking emulation mode. (The problem being that AFS3 only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) * allows whole-file locks and no upgrading/downgrading).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) enum afs_flock_mode {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) afs_flock_mode_unset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) afs_flock_mode_local, /* Local locking only */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) afs_flock_mode_openafs, /* Don't get server lock for a partial lock */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) afs_flock_mode_strict, /* Always get a server lock for a partial lock */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) afs_flock_mode_write, /* Get an exclusive server lock for a partial lock */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) struct afs_fs_context {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) bool force; /* T to force cell type */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) bool autocell; /* T if set auto mount operation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) bool dyn_root; /* T if dynamic root */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) bool no_cell; /* T if the source is "none" (for dynroot) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) enum afs_flock_mode flock_mode; /* Partial file-locking emulation mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) afs_voltype_t type; /* type of volume requested */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) unsigned int volnamesz; /* size of volume name */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) const char *volname; /* name of volume to mount */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) struct afs_net *net; /* the AFS net namespace stuff */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) struct afs_cell *cell; /* cell in which to find volume */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) struct afs_volume *volume; /* volume record */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) struct key *key; /* key to use for secure mounting */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) enum afs_call_state {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) AFS_CALL_CL_REQUESTING, /* Client: Request is being sent */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) AFS_CALL_CL_AWAIT_REPLY, /* Client: Awaiting reply */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) AFS_CALL_CL_PROC_REPLY, /* Client: rxrpc call complete; processing reply */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) AFS_CALL_SV_AWAIT_OP_ID, /* Server: Awaiting op ID */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) AFS_CALL_SV_AWAIT_REQUEST, /* Server: Awaiting request data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) AFS_CALL_SV_REPLYING, /* Server: Replying */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) AFS_CALL_SV_AWAIT_ACK, /* Server: Awaiting final ACK */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) AFS_CALL_COMPLETE, /* Completed or failed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) * List of server addresses.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) struct afs_addr_list {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) struct rcu_head rcu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) refcount_t usage;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) u32 version; /* Version */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) unsigned char max_addrs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) unsigned char nr_addrs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) unsigned char preferred; /* Preferred address */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) unsigned char nr_ipv4; /* Number of IPv4 addresses */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) enum dns_record_source source:8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) enum dns_lookup_status status:8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) unsigned long failed; /* Mask of addrs that failed locally/ICMP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) unsigned long responded; /* Mask of addrs that responded */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) struct sockaddr_rxrpc addrs[];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) #define AFS_MAX_ADDRESSES ((unsigned int)(sizeof(unsigned long) * 8))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) * a record of an in-progress RxRPC call
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) struct afs_call {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) const struct afs_call_type *type; /* type of call */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) struct afs_addr_list *alist; /* Address is alist[addr_ix] */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) wait_queue_head_t waitq; /* processes awaiting completion */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) struct work_struct async_work; /* async I/O processor */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) struct work_struct work; /* actual work processor */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) struct rxrpc_call *rxcall; /* RxRPC call handle */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) struct key *key; /* security for this call */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) struct afs_net *net; /* The network namespace */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) struct afs_server *server; /* The fileserver record if fs op (pins ref) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) struct afs_vlserver *vlserver; /* The vlserver record if vl op */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) void *request; /* request data (first part) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) struct iov_iter def_iter; /* Default buffer/data iterator */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) struct iov_iter *iter; /* Iterator currently in use */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) union { /* Convenience for ->def_iter */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) struct kvec kvec[1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) struct bio_vec bvec[1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) void *buffer; /* reply receive buffer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) union {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) long ret0; /* Value to reply with instead of 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) struct afs_addr_list *ret_alist;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) struct afs_vldb_entry *ret_vldb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) char *ret_str;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) struct afs_operation *op;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) unsigned int server_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) atomic_t usage;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) enum afs_call_state state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) spinlock_t state_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) int error; /* error code */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) u32 abort_code; /* Remote abort ID or 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) unsigned int max_lifespan; /* Maximum lifespan to set if not 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) unsigned request_size; /* size of request data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) unsigned reply_max; /* maximum size of reply */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) unsigned count2; /* count used in unmarshalling */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) unsigned char unmarshall; /* unmarshalling phase */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) unsigned char addr_ix; /* Address in ->alist */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) bool drop_ref; /* T if need to drop ref for incoming call */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) bool send_pages; /* T if data from mapping should be sent */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) bool need_attention; /* T if RxRPC poked us */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) bool async; /* T if asynchronous */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) bool upgrade; /* T to request service upgrade */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) bool have_reply_time; /* T if have got reply_time */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) bool intr; /* T if interruptible */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) bool unmarshalling_error; /* T if an unmarshalling error occurred */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) u16 service_id; /* Actual service ID (after upgrade) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) unsigned int debug_id; /* Trace ID */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) u32 operation_ID; /* operation ID for an incoming call */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) u32 count; /* count for use in unmarshalling */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) union { /* place to extract temporary data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) __be32 tmp_u;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) __be32 tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) } __attribute__((packed));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) __be64 tmp64;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) ktime_t reply_time; /* Time of first reply packet */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) struct afs_call_type {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) const char *name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) unsigned int op; /* Really enum afs_fs_operation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) /* deliver request or reply data to an call
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) * - returning an error will cause the call to be aborted
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) int (*deliver)(struct afs_call *call);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) /* clean up a call */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) void (*destructor)(struct afs_call *call);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) /* Work function */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) void (*work)(struct work_struct *work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) /* Call done function (gets called immediately on success or failure) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) void (*done)(struct afs_call *call);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) * Key available for writeback on a file.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) struct afs_wb_key {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) refcount_t usage;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) struct key *key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) struct list_head vnode_link; /* Link in vnode->wb_keys */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) * AFS open file information record. Pointed to by file->private_data.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) struct afs_file {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) struct key *key; /* The key this file was opened with */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) struct afs_wb_key *wb; /* Writeback key record for this file */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) static inline struct key *afs_file_key(struct file *file)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) struct afs_file *af = file->private_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) return af->key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) * Record of an outstanding read operation on a vnode.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) struct afs_read {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) loff_t pos; /* Where to start reading */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) loff_t len; /* How much we're asking for */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) loff_t actual_len; /* How much we're actually getting */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) loff_t remain; /* Amount remaining */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) loff_t file_size; /* File size returned by server */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) afs_dataversion_t data_version; /* Version number returned by server */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) refcount_t usage;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) unsigned int index; /* Which page we're reading into */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) unsigned int nr_pages;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) unsigned int offset; /* offset into current page */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) struct afs_vnode *vnode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) void (*page_done)(struct afs_read *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) struct page **pages;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) struct page *array[];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) * AFS superblock private data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) * - there's one superblock per volume
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) struct afs_super_info {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) struct net *net_ns; /* Network namespace */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) struct afs_cell *cell; /* The cell in which the volume resides */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) struct afs_volume *volume; /* volume record */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) enum afs_flock_mode flock_mode:8; /* File locking emulation mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) bool dyn_root; /* True if dynamic root */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) static inline struct afs_super_info *AFS_FS_S(struct super_block *sb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) return sb->s_fs_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) extern struct file_system_type afs_fs_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) * Set of substitutes for @sys.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) struct afs_sysnames {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) #define AFS_NR_SYSNAME 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) char *subs[AFS_NR_SYSNAME];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) refcount_t usage;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) unsigned short nr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) char blank[1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) };
^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) * AFS network namespace record.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) struct afs_net {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) struct net *net; /* Backpointer to the owning net namespace */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) struct afs_uuid uuid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) bool live; /* F if this namespace is being removed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) /* AF_RXRPC I/O stuff */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) struct socket *socket;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) struct afs_call *spare_incoming_call;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) struct work_struct charge_preallocation_work;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) struct mutex socket_mutex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) atomic_t nr_outstanding_calls;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) atomic_t nr_superblocks;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) /* Cell database */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) struct rb_root cells;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) struct afs_cell *ws_cell;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) struct work_struct cells_manager;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) struct timer_list cells_timer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) atomic_t cells_outstanding;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) struct rw_semaphore cells_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) struct mutex cells_alias_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) struct mutex proc_cells_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) struct hlist_head proc_cells;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) /* Known servers. Theoretically each fileserver can only be in one
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) * cell, but in practice, people create aliases and subsets and there's
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) * no easy way to distinguish them.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) seqlock_t fs_lock; /* For fs_servers, fs_probe_*, fs_proc */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) struct rb_root fs_servers; /* afs_server (by server UUID or address) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) struct list_head fs_probe_fast; /* List of afs_server to probe at 30s intervals */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) struct list_head fs_probe_slow; /* List of afs_server to probe at 5m intervals */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) struct hlist_head fs_proc; /* procfs servers list */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) struct hlist_head fs_addresses4; /* afs_server (by lowest IPv4 addr) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) struct hlist_head fs_addresses6; /* afs_server (by lowest IPv6 addr) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) seqlock_t fs_addr_lock; /* For fs_addresses[46] */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) struct work_struct fs_manager;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) struct timer_list fs_timer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) struct work_struct fs_prober;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) struct timer_list fs_probe_timer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) atomic_t servers_outstanding;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) /* File locking renewal management */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) struct mutex lock_manager_mutex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) /* Misc */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) struct super_block *dynroot_sb; /* Dynamic root mount superblock */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) struct proc_dir_entry *proc_afs; /* /proc/net/afs directory */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) struct afs_sysnames *sysnames;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) rwlock_t sysnames_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) /* Statistics counters */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) atomic_t n_lookup; /* Number of lookups done */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) atomic_t n_reval; /* Number of dentries needing revalidation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) atomic_t n_inval; /* Number of invalidations by the server */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) atomic_t n_relpg; /* Number of invalidations by releasepage */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) atomic_t n_read_dir; /* Number of directory pages read */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) atomic_t n_dir_cr; /* Number of directory entry creation edits */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) atomic_t n_dir_rm; /* Number of directory entry removal edits */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) atomic_t n_stores; /* Number of store ops */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) atomic_long_t n_store_bytes; /* Number of bytes stored */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) atomic_long_t n_fetch_bytes; /* Number of bytes fetched */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) atomic_t n_fetches; /* Number of data fetch ops */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) extern const char afs_init_sysname[];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) enum afs_cell_state {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) AFS_CELL_UNSET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) AFS_CELL_ACTIVATING,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) AFS_CELL_ACTIVE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) AFS_CELL_DEACTIVATING,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) AFS_CELL_INACTIVE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) AFS_CELL_FAILED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) AFS_CELL_REMOVED,
^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) * AFS cell record.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) * This is a tricky concept to get right as it is possible to create aliases
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) * simply by pointing AFSDB/SRV records for two names at the same set of VL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) * servers; it is also possible to do things like setting up two sets of VL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) * servers, one of which provides a superset of the volumes provided by the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) * other (for internal/external division, for example).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) * Cells only exist in the sense that (a) a cell's name maps to a set of VL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) * servers and (b) a cell's name is used by the client to select the key to use
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) * for authentication and encryption. The cell name is not typically used in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) * the protocol.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) * Two cells are determined to be aliases if they have an explicit alias (YFS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) * only), share any VL servers in common or have at least one volume in common.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) * "In common" means that the address list of the VL servers or the fileservers
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) * share at least one endpoint.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) struct afs_cell {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) union {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) struct rcu_head rcu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) struct rb_node net_node; /* Node in net->cells */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) struct afs_net *net;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) struct afs_cell *alias_of; /* The cell this is an alias of */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) struct afs_volume *root_volume; /* The root.cell volume if there is one */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) struct key *anonymous_key; /* anonymous user key for this cell */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) struct work_struct manager; /* Manager for init/deinit/dns */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) struct hlist_node proc_link; /* /proc cell list link */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) #ifdef CONFIG_AFS_FSCACHE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) struct fscache_cookie *cache; /* caching cookie */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) time64_t dns_expiry; /* Time AFSDB/SRV record expires */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) time64_t last_inactive; /* Time of last drop of usage count */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) atomic_t ref; /* Struct refcount */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) atomic_t active; /* Active usage counter */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) #define AFS_CELL_FL_NO_GC 0 /* The cell was added manually, don't auto-gc */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) #define AFS_CELL_FL_DO_LOOKUP 1 /* DNS lookup requested */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) #define AFS_CELL_FL_CHECK_ALIAS 2 /* Need to check for aliases */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) enum afs_cell_state state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) short error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) enum dns_record_source dns_source:8; /* Latest source of data from lookup */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) enum dns_lookup_status dns_status:8; /* Latest status of data from lookup */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) unsigned int dns_lookup_count; /* Counter of DNS lookups */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) unsigned int debug_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) /* The volumes belonging to this cell */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) struct rb_root volumes; /* Tree of volumes on this server */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) struct hlist_head proc_volumes; /* procfs volume list */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) seqlock_t volume_lock; /* For volumes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) /* Active fileserver interaction state. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) struct rb_root fs_servers; /* afs_server (by server UUID) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) seqlock_t fs_lock; /* For fs_servers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) /* VL server list. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) rwlock_t vl_servers_lock; /* Lock on vl_servers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) struct afs_vlserver_list __rcu *vl_servers;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) u8 name_len; /* Length of name */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) char *name; /* Cell name, case-flattened and NUL-padded */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) * Volume Location server record.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) struct afs_vlserver {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) struct rcu_head rcu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) struct afs_addr_list __rcu *addresses; /* List of addresses for this VL server */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) #define AFS_VLSERVER_FL_PROBED 0 /* The VL server has been probed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) #define AFS_VLSERVER_FL_PROBING 1 /* VL server is being probed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) #define AFS_VLSERVER_FL_IS_YFS 2 /* Server is YFS not AFS */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) #define AFS_VLSERVER_FL_RESPONDING 3 /* VL server is responding */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) rwlock_t lock; /* Lock on addresses */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) atomic_t usage;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) unsigned int rtt; /* Server's current RTT in uS */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) /* Probe state */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) wait_queue_head_t probe_wq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) atomic_t probe_outstanding;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) spinlock_t probe_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) unsigned int rtt; /* RTT in uS */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) u32 abort_code;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) short error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) unsigned short flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) #define AFS_VLSERVER_PROBE_RESPONDED 0x01 /* At least once response (may be abort) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) #define AFS_VLSERVER_PROBE_IS_YFS 0x02 /* The peer appears to be YFS */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) #define AFS_VLSERVER_PROBE_NOT_YFS 0x04 /* The peer appears not to be YFS */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) #define AFS_VLSERVER_PROBE_LOCAL_FAILURE 0x08 /* A local failure prevented a probe */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) } probe;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) u16 port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) u16 name_len; /* Length of name */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) char name[]; /* Server name, case-flattened */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) * Weighted list of Volume Location servers.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) struct afs_vlserver_entry {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) u16 priority; /* Preference (as SRV) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) u16 weight; /* Weight (as SRV) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) enum dns_record_source source:8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) enum dns_lookup_status status:8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) struct afs_vlserver *server;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) struct afs_vlserver_list {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) struct rcu_head rcu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) atomic_t usage;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) u8 nr_servers;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) u8 index; /* Server currently in use */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) u8 preferred; /* Preferred server */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) enum dns_record_source source:8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) enum dns_lookup_status status:8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) rwlock_t lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) struct afs_vlserver_entry servers[];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) * Cached VLDB entry.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) * This is pointed to by cell->vldb_entries, indexed by name.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) struct afs_vldb_entry {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) afs_volid_t vid[3]; /* Volume IDs for R/W, R/O and Bak volumes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) #define AFS_VLDB_HAS_RW 0 /* - R/W volume exists */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) #define AFS_VLDB_HAS_RO 1 /* - R/O volume exists */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) #define AFS_VLDB_HAS_BAK 2 /* - Backup volume exists */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) #define AFS_VLDB_QUERY_VALID 3 /* - Record is valid */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) #define AFS_VLDB_QUERY_ERROR 4 /* - VL server returned error */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) uuid_t fs_server[AFS_NMAXNSERVERS];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) u32 addr_version[AFS_NMAXNSERVERS]; /* Registration change counters */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) u8 fs_mask[AFS_NMAXNSERVERS];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) #define AFS_VOL_VTM_RW 0x01 /* R/W version of the volume is available (on this server) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) #define AFS_VOL_VTM_RO 0x02 /* R/O version of the volume is available (on this server) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) #define AFS_VOL_VTM_BAK 0x04 /* backup version of the volume is available (on this server) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) short error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) u8 nr_servers; /* Number of server records */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) u8 name_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) u8 name[AFS_MAXVOLNAME + 1]; /* NUL-padded volume name */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) * Record of fileserver with which we're actively communicating.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) struct afs_server {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) struct rcu_head rcu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) union {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) uuid_t uuid; /* Server ID */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) struct afs_uuid _uuid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) struct afs_addr_list __rcu *addresses;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) struct afs_cell *cell; /* Cell to which belongs (pins ref) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) struct rb_node uuid_rb; /* Link in net->fs_servers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) struct afs_server __rcu *uuid_next; /* Next server with same UUID */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) struct afs_server *uuid_prev; /* Previous server with same UUID */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) struct list_head probe_link; /* Link in net->fs_probe_list */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) struct hlist_node addr4_link; /* Link in net->fs_addresses4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) struct hlist_node addr6_link; /* Link in net->fs_addresses6 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) struct hlist_node proc_link; /* Link in net->fs_proc */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) struct afs_server *gc_next; /* Next server in manager's list */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) time64_t unuse_time; /* Time at which last unused */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) #define AFS_SERVER_FL_RESPONDING 0 /* The server is responding */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) #define AFS_SERVER_FL_UPDATING 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) #define AFS_SERVER_FL_NEEDS_UPDATE 2 /* Fileserver address list is out of date */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) #define AFS_SERVER_FL_NOT_READY 4 /* The record is not ready for use */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) #define AFS_SERVER_FL_NOT_FOUND 5 /* VL server says no such server */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) #define AFS_SERVER_FL_VL_FAIL 6 /* Failed to access VL server */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) #define AFS_SERVER_FL_MAY_HAVE_CB 8 /* May have callbacks on this fileserver */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) #define AFS_SERVER_FL_IS_YFS 16 /* Server is YFS not AFS */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) #define AFS_SERVER_FL_NO_IBULK 17 /* Fileserver doesn't support FS.InlineBulkStatus */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) #define AFS_SERVER_FL_NO_RM2 18 /* Fileserver doesn't support YFS.RemoveFile2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) atomic_t ref; /* Object refcount */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) atomic_t active; /* Active user count */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) u32 addr_version; /* Address list version */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) unsigned int rtt; /* Server's current RTT in uS */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) unsigned int debug_id; /* Debugging ID for traces */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) /* file service access */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) rwlock_t fs_lock; /* access lock */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) /* callback promise management */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) unsigned cb_s_break; /* Break-everything counter. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) /* Probe state */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) unsigned long probed_at; /* Time last probe was dispatched (jiffies) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) wait_queue_head_t probe_wq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) atomic_t probe_outstanding;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) spinlock_t probe_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) unsigned int rtt; /* RTT in uS */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) u32 abort_code;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) short error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) bool responded:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) bool is_yfs:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) bool not_yfs:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) bool local_failure:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) } probe;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) * Replaceable volume server list.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) struct afs_server_entry {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) struct afs_server *server;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) struct afs_server_list {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) afs_volid_t vids[AFS_MAXTYPES]; /* Volume IDs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) refcount_t usage;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) unsigned char nr_servers;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) unsigned char preferred; /* Preferred server */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) unsigned short vnovol_mask; /* Servers to be skipped due to VNOVOL */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) unsigned int seq; /* Set to ->servers_seq when installed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) rwlock_t lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) struct afs_server_entry servers[];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) };
^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) * Live AFS volume management.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) struct afs_volume {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) union {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) struct rcu_head rcu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) afs_volid_t vid; /* volume ID */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) atomic_t usage;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) time64_t update_at; /* Time at which to next update */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) struct afs_cell *cell; /* Cell to which belongs (pins ref) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) struct rb_node cell_node; /* Link in cell->volumes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) struct hlist_node proc_link; /* Link in cell->proc_volumes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) struct super_block __rcu *sb; /* Superblock on which inodes reside */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) #define AFS_VOLUME_NEEDS_UPDATE 0 /* - T if an update needs performing */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) #define AFS_VOLUME_UPDATING 1 /* - T if an update is in progress */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) #define AFS_VOLUME_WAIT 2 /* - T if users must wait for update */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) #define AFS_VOLUME_DELETED 3 /* - T if volume appears deleted */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) #define AFS_VOLUME_OFFLINE 4 /* - T if volume offline notice given */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) #define AFS_VOLUME_BUSY 5 /* - T if volume busy notice given */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) #define AFS_VOLUME_MAYBE_NO_IBULK 6 /* - T if some servers don't have InlineBulkStatus */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) #ifdef CONFIG_AFS_FSCACHE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) struct fscache_cookie *cache; /* caching cookie */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) struct afs_server_list __rcu *servers; /* List of servers on which volume resides */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) rwlock_t servers_lock; /* Lock for ->servers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) unsigned int servers_seq; /* Incremented each time ->servers changes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) unsigned cb_v_break; /* Break-everything counter. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) rwlock_t cb_v_break_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) afs_voltype_t type; /* type of volume */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) char type_force; /* force volume type (suppress R/O -> R/W) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) u8 name_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) u8 name[AFS_MAXVOLNAME + 1]; /* NUL-padded volume name */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) enum afs_lock_state {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) AFS_VNODE_LOCK_NONE, /* The vnode has no lock on the server */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) AFS_VNODE_LOCK_WAITING_FOR_CB, /* We're waiting for the server to break the callback */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) AFS_VNODE_LOCK_SETTING, /* We're asking the server for a lock */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) AFS_VNODE_LOCK_GRANTED, /* We have a lock on the server */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) AFS_VNODE_LOCK_EXTENDING, /* We're extending a lock on the server */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) AFS_VNODE_LOCK_NEED_UNLOCK, /* We need to unlock on the server */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) AFS_VNODE_LOCK_UNLOCKING, /* We're telling the server to unlock */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) AFS_VNODE_LOCK_DELETED, /* The vnode has been deleted whilst we have a lock */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) * AFS inode private data.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) * Note that afs_alloc_inode() *must* reset anything that could incorrectly
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) * leak from one inode to another.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) struct afs_vnode {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) struct inode vfs_inode; /* the VFS's inode record */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) struct afs_volume *volume; /* volume on which vnode resides */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) struct afs_fid fid; /* the file identifier for this inode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) struct afs_file_status status; /* AFS status info for this file */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) afs_dataversion_t invalid_before; /* Child dentries are invalid before this */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) #ifdef CONFIG_AFS_FSCACHE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) struct fscache_cookie *cache; /* caching cookie */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) struct afs_permits __rcu *permit_cache; /* cache of permits so far obtained */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) struct mutex io_lock; /* Lock for serialising I/O on this mutex */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) struct rw_semaphore validate_lock; /* lock for validating this vnode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) struct rw_semaphore rmdir_lock; /* Lock for rmdir vs sillyrename */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) struct key *silly_key; /* Silly rename key */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) spinlock_t wb_lock; /* lock for wb_keys */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) spinlock_t lock; /* waitqueue/flags lock */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) #define AFS_VNODE_CB_PROMISED 0 /* Set if vnode has a callback promise */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) #define AFS_VNODE_UNSET 1 /* set if vnode attributes not yet set */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) #define AFS_VNODE_DIR_VALID 2 /* Set if dir contents are valid */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) #define AFS_VNODE_ZAP_DATA 3 /* set if vnode's data should be invalidated */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) #define AFS_VNODE_DELETED 4 /* set if vnode deleted on server */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) #define AFS_VNODE_MOUNTPOINT 5 /* set if vnode is a mountpoint symlink */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) #define AFS_VNODE_AUTOCELL 6 /* set if Vnode is an auto mount point */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) #define AFS_VNODE_PSEUDODIR 7 /* set if Vnode is a pseudo directory */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) #define AFS_VNODE_NEW_CONTENT 8 /* Set if file has new content (create/trunc-0) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) #define AFS_VNODE_SILLY_DELETED 9 /* Set if file has been silly-deleted */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) #define AFS_VNODE_MODIFYING 10 /* Set if we're performing a modification op */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) struct list_head wb_keys; /* List of keys available for writeback */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) struct list_head pending_locks; /* locks waiting to be granted */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) struct list_head granted_locks; /* locks granted on this file */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) struct delayed_work lock_work; /* work to be done in locking */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) struct key *lock_key; /* Key to be used in lock ops */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) ktime_t locked_at; /* Time at which lock obtained */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) enum afs_lock_state lock_state : 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) afs_lock_type_t lock_type : 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) /* outstanding callback notification on this file */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) void *cb_server; /* Server with callback/filelock */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) unsigned int cb_s_break; /* Mass break counter on ->server */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) unsigned int cb_v_break; /* Mass break counter on ->volume */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) unsigned int cb_break; /* Break counter on vnode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) seqlock_t cb_lock; /* Lock for ->cb_server, ->status, ->cb_*break */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) time64_t cb_expires_at; /* time at which callback expires */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) static inline struct fscache_cookie *afs_vnode_cache(struct afs_vnode *vnode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) #ifdef CONFIG_AFS_FSCACHE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) return vnode->cache;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) * cached security record for one user's attempt to access a vnode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) struct afs_permit {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) struct key *key; /* RxRPC ticket holding a security context */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) afs_access_t access; /* CallerAccess value for this key */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) * Immutable cache of CallerAccess records from attempts to access vnodes.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) * These may be shared between multiple vnodes.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) struct afs_permits {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) struct rcu_head rcu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) struct hlist_node hash_node; /* Link in hash */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) unsigned long h; /* Hash value for this permit list */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) refcount_t usage;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) unsigned short nr_permits; /* Number of records */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) bool invalidated; /* Invalidated due to key change */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) struct afs_permit permits[]; /* List of permits sorted by key pointer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) * Error prioritisation and accumulation.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) struct afs_error {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) short error; /* Accumulated error */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) bool responded; /* T if server responded */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) * Cursor for iterating over a server's address list.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) struct afs_addr_cursor {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) struct afs_addr_list *alist; /* Current address list (pins ref) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) unsigned long tried; /* Tried addresses */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) signed char index; /* Current address */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) bool responded; /* T if the current address responded */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) unsigned short nr_iterations; /* Number of address iterations */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) short error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) u32 abort_code;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) * Cursor for iterating over a set of volume location servers.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) struct afs_vl_cursor {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) struct afs_addr_cursor ac;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) struct afs_cell *cell; /* The cell we're querying */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) struct afs_vlserver_list *server_list; /* Current server list (pins ref) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) struct afs_vlserver *server; /* Server on which this resides */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) struct key *key; /* Key for the server */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) unsigned long untried; /* Bitmask of untried servers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) short index; /* Current server */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) short error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) unsigned short flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) #define AFS_VL_CURSOR_STOP 0x0001 /* Set to cease iteration */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) #define AFS_VL_CURSOR_RETRY 0x0002 /* Set to do a retry */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) #define AFS_VL_CURSOR_RETRIED 0x0004 /* Set if started a retry */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) unsigned short nr_iterations; /* Number of server iterations */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) * Fileserver operation methods.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) struct afs_operation_ops {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) void (*issue_afs_rpc)(struct afs_operation *op);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) void (*issue_yfs_rpc)(struct afs_operation *op);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) void (*success)(struct afs_operation *op);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) void (*aborted)(struct afs_operation *op);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) void (*edit_dir)(struct afs_operation *op);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) void (*put)(struct afs_operation *op);
^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) struct afs_vnode_param {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) struct afs_vnode *vnode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) struct afs_fid fid; /* Fid to access */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) struct afs_status_cb scb; /* Returned status and callback promise */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) afs_dataversion_t dv_before; /* Data version before the call */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) unsigned int cb_break_before; /* cb_break + cb_s_break before the call */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) u8 dv_delta; /* Expected change in data version */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) bool put_vnode:1; /* T if we have a ref on the vnode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) bool need_io_lock:1; /* T if we need the I/O lock on this */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) bool update_ctime:1; /* Need to update the ctime */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) bool set_size:1; /* Must update i_size */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) bool op_unlinked:1; /* True if file was unlinked by op */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) bool speculative:1; /* T if speculative status fetch (no vnode lock) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) bool modification:1; /* Set if the content gets modified */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) * Fileserver operation wrapper, handling server and address rotation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) * asynchronously. May make simultaneous calls to multiple servers.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) struct afs_operation {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) struct afs_net *net; /* Network namespace */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) struct key *key; /* Key for the cell */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) const struct afs_call_type *type; /* Type of call done */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) const struct afs_operation_ops *ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) /* Parameters/results for the operation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) struct afs_volume *volume; /* Volume being accessed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) struct afs_vnode_param file[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) struct afs_vnode_param *more_files;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) struct afs_volsync volsync;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) struct dentry *dentry; /* Dentry to be altered */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) struct dentry *dentry_2; /* Second dentry to be altered */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) struct timespec64 mtime; /* Modification time to record */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) struct timespec64 ctime; /* Change time to set */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) short nr_files; /* Number of entries in file[], more_files */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) short error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) unsigned int debug_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) unsigned int cb_v_break; /* Volume break counter before op */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) unsigned int cb_s_break; /* Server break counter before op */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) union {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) int which; /* Which ->file[] to fetch for */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) } fetch_status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) int reason; /* enum afs_edit_dir_reason */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) mode_t mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) const char *symlink;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) } create;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) bool need_rehash;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) } unlink;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) struct dentry *rehash;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) struct dentry *tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) bool new_negative;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) } rename;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) struct afs_read *req;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) } fetch;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) afs_lock_type_t type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) } lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) struct address_space *mapping; /* Pages being written from */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) pgoff_t first; /* first page in mapping to deal with */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815) pgoff_t last; /* last page in mapping to deal with */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) unsigned first_offset; /* offset into mapping[first] */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) unsigned last_to; /* amount of mapping[last] */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) bool laundering; /* Laundering page, PG_writeback not set */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) } store;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) struct iattr *attr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) loff_t old_i_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) } setattr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) struct afs_acl *acl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) struct yfs_acl *yacl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) struct afs_volume_status vs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) struct kstatfs *buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) } volstatus;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) /* Fileserver iteration state */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833) struct afs_addr_cursor ac;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) struct afs_server_list *server_list; /* Current server list (pins ref) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835) struct afs_server *server; /* Server we're using (ref pinned by server_list) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) struct afs_call *call;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) unsigned long untried; /* Bitmask of untried servers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) short index; /* Current server */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) unsigned short nr_iterations; /* Number of server iterations */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) unsigned int flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) #define AFS_OPERATION_STOP 0x0001 /* Set to cease iteration */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) #define AFS_OPERATION_VBUSY 0x0002 /* Set if seen VBUSY */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) #define AFS_OPERATION_VMOVED 0x0004 /* Set if seen VMOVED */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) #define AFS_OPERATION_VNOVOL 0x0008 /* Set if seen VNOVOL */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846) #define AFS_OPERATION_CUR_ONLY 0x0010 /* Set if current server only (file lock held) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) #define AFS_OPERATION_NO_VSLEEP 0x0020 /* Set to prevent sleep on VBUSY, VOFFLINE, ... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) #define AFS_OPERATION_UNINTR 0x0040 /* Set if op is uninterruptible */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849) #define AFS_OPERATION_DOWNGRADE 0x0080 /* Set to retry with downgraded opcode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) #define AFS_OPERATION_LOCK_0 0x0100 /* Set if have io_lock on file[0] */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) #define AFS_OPERATION_LOCK_1 0x0200 /* Set if have io_lock on file[1] */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) #define AFS_OPERATION_TRIED_ALL 0x0400 /* Set if we've tried all the fileservers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) #define AFS_OPERATION_RETRY_SERVER 0x0800 /* Set if we should retry the current server */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) #define AFS_OPERATION_DIR_CONFLICT 0x1000 /* Set if we detected a 3rd-party dir change */
^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) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) * Cache auxiliary data.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) struct afs_vnode_cache_aux {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) u64 data_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865) * We use page->private to hold the amount of the page that we've written to,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) * splitting the field into two parts. However, we need to represent a range
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867) * 0...PAGE_SIZE, so we reduce the resolution if the size of the page
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868) * exceeds what we can encode.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) #ifdef CONFIG_64BIT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871) #define __AFS_PAGE_PRIV_MASK 0x7fffffffUL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) #define __AFS_PAGE_PRIV_SHIFT 32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) #define __AFS_PAGE_PRIV_MMAPPED 0x80000000UL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) #define __AFS_PAGE_PRIV_MASK 0x7fffUL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) #define __AFS_PAGE_PRIV_SHIFT 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877) #define __AFS_PAGE_PRIV_MMAPPED 0x8000UL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) static inline unsigned int afs_page_dirty_resolution(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882) int shift = PAGE_SHIFT - (__AFS_PAGE_PRIV_SHIFT - 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) return (shift > 0) ? shift : 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886) static inline size_t afs_page_dirty_from(unsigned long priv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) unsigned long x = priv & __AFS_PAGE_PRIV_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890) /* The lower bound is inclusive */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) return x << afs_page_dirty_resolution();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894) static inline size_t afs_page_dirty_to(unsigned long priv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896) unsigned long x = (priv >> __AFS_PAGE_PRIV_SHIFT) & __AFS_PAGE_PRIV_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) /* The upper bound is immediately beyond the region */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899) return (x + 1) << afs_page_dirty_resolution();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902) static inline unsigned long afs_page_dirty(size_t from, size_t to)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) unsigned int res = afs_page_dirty_resolution();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905) from >>= res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) to = (to - 1) >> res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907) return (to << __AFS_PAGE_PRIV_SHIFT) | from;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910) static inline unsigned long afs_page_dirty_mmapped(unsigned long priv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912) return priv | __AFS_PAGE_PRIV_MMAPPED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915) static inline bool afs_is_page_dirty_mmapped(unsigned long priv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917) return priv & __AFS_PAGE_PRIV_MMAPPED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) #include <trace/events/afs.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922) /*****************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924) * addr_list.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926) static inline struct afs_addr_list *afs_get_addrlist(struct afs_addr_list *alist)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928) if (alist)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929) refcount_inc(&alist->usage);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930) return alist;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932) extern struct afs_addr_list *afs_alloc_addrlist(unsigned int,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933) unsigned short,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934) unsigned short);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935) extern void afs_put_addrlist(struct afs_addr_list *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936) extern struct afs_vlserver_list *afs_parse_text_addrs(struct afs_net *,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937) const char *, size_t, char,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938) unsigned short, unsigned short);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939) extern struct afs_vlserver_list *afs_dns_query(struct afs_cell *, time64_t *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940) extern bool afs_iterate_addresses(struct afs_addr_cursor *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941) extern int afs_end_cursor(struct afs_addr_cursor *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943) extern void afs_merge_fs_addr4(struct afs_addr_list *, __be32, u16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944) extern void afs_merge_fs_addr6(struct afs_addr_list *, __be32 *, u16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947) * cache.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949) #ifdef CONFIG_AFS_FSCACHE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950) extern struct fscache_netfs afs_cache_netfs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951) extern struct fscache_cookie_def afs_cell_cache_index_def;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952) extern struct fscache_cookie_def afs_volume_cache_index_def;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953) extern struct fscache_cookie_def afs_vnode_cache_index_def;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955) #define afs_cell_cache_index_def (*(struct fscache_cookie_def *) NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956) #define afs_volume_cache_index_def (*(struct fscache_cookie_def *) NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 957) #define afs_vnode_cache_index_def (*(struct fscache_cookie_def *) NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 958) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 959)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 960) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 961) * callback.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 962) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 963) extern void afs_init_callback_state(struct afs_server *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 964) extern void __afs_break_callback(struct afs_vnode *, enum afs_cb_break_reason);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 965) extern void afs_break_callback(struct afs_vnode *, enum afs_cb_break_reason);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 966) extern void afs_break_callbacks(struct afs_server *, size_t, struct afs_callback_break *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 967)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 968) static inline unsigned int afs_calc_vnode_cb_break(struct afs_vnode *vnode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 969) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 970) return vnode->cb_break + vnode->cb_v_break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 971) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 972)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 973) static inline bool afs_cb_is_broken(unsigned int cb_break,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 974) const struct afs_vnode *vnode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 975) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 976) return cb_break != (vnode->cb_break + vnode->volume->cb_v_break);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 977) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 978)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 979) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 980) * cell.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 981) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 982) extern int afs_cell_init(struct afs_net *, const char *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 983) extern struct afs_cell *afs_find_cell(struct afs_net *, const char *, unsigned,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 984) enum afs_cell_trace);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 985) extern struct afs_cell *afs_lookup_cell(struct afs_net *, const char *, unsigned,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 986) const char *, bool);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 987) extern struct afs_cell *afs_use_cell(struct afs_cell *, enum afs_cell_trace);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 988) extern void afs_unuse_cell(struct afs_net *, struct afs_cell *, enum afs_cell_trace);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 989) extern struct afs_cell *afs_get_cell(struct afs_cell *, enum afs_cell_trace);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 990) extern void afs_see_cell(struct afs_cell *, enum afs_cell_trace);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 991) extern void afs_put_cell(struct afs_cell *, enum afs_cell_trace);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 992) extern void afs_queue_cell(struct afs_cell *, enum afs_cell_trace);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 993) extern void afs_manage_cells(struct work_struct *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 994) extern void afs_cells_timer(struct timer_list *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 995) extern void __net_exit afs_cell_purge(struct afs_net *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 996)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 997) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 998) * cmservice.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 999) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) extern bool afs_cm_incoming_call(struct afs_call *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) * dir.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) extern const struct file_operations afs_dir_file_operations;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) extern const struct inode_operations afs_dir_inode_operations;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) extern const struct address_space_operations afs_dir_aops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) extern const struct dentry_operations afs_fs_dentry_operations;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) extern void afs_d_release(struct dentry *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) extern void afs_check_for_remote_deletion(struct afs_operation *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) * dir_edit.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) extern void afs_edit_dir_add(struct afs_vnode *, struct qstr *, struct afs_fid *,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) enum afs_edit_dir_reason);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) extern void afs_edit_dir_remove(struct afs_vnode *, struct qstr *, enum afs_edit_dir_reason);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) * dir_silly.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) extern int afs_sillyrename(struct afs_vnode *, struct afs_vnode *,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) struct dentry *, struct key *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) extern int afs_silly_iput(struct dentry *, struct inode *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) * dynroot.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) extern const struct inode_operations afs_dynroot_inode_operations;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) extern const struct dentry_operations afs_dynroot_dentry_operations;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) extern struct inode *afs_try_auto_mntpt(struct dentry *, struct inode *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) extern int afs_dynroot_mkdir(struct afs_net *, struct afs_cell *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) extern void afs_dynroot_rmdir(struct afs_net *, struct afs_cell *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) extern int afs_dynroot_populate(struct super_block *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) extern void afs_dynroot_depopulate(struct super_block *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) * file.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) extern const struct address_space_operations afs_fs_aops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) extern const struct inode_operations afs_file_inode_operations;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) extern const struct file_operations afs_file_operations;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) extern int afs_cache_wb_key(struct afs_vnode *, struct afs_file *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) extern void afs_put_wb_key(struct afs_wb_key *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) extern int afs_open(struct inode *, struct file *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) extern int afs_release(struct inode *, struct file *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) extern int afs_fetch_data(struct afs_vnode *, struct key *, struct afs_read *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) extern int afs_page_filler(void *, struct page *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) extern void afs_put_read(struct afs_read *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) static inline struct afs_read *afs_get_read(struct afs_read *req)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) refcount_inc(&req->usage);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) return req;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) * flock.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) extern struct workqueue_struct *afs_lock_manager;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) extern void afs_lock_op_done(struct afs_call *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) extern void afs_lock_work(struct work_struct *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) extern void afs_lock_may_be_available(struct afs_vnode *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) extern int afs_lock(struct file *, int, struct file_lock *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) extern int afs_flock(struct file *, int, struct file_lock *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) * fsclient.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) extern void afs_fs_fetch_status(struct afs_operation *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) extern void afs_fs_fetch_data(struct afs_operation *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) extern void afs_fs_create_file(struct afs_operation *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) extern void afs_fs_make_dir(struct afs_operation *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) extern void afs_fs_remove_file(struct afs_operation *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) extern void afs_fs_remove_dir(struct afs_operation *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) extern void afs_fs_link(struct afs_operation *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) extern void afs_fs_symlink(struct afs_operation *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) extern void afs_fs_rename(struct afs_operation *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) extern void afs_fs_store_data(struct afs_operation *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) extern void afs_fs_setattr(struct afs_operation *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) extern void afs_fs_get_volume_status(struct afs_operation *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) extern void afs_fs_set_lock(struct afs_operation *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) extern void afs_fs_extend_lock(struct afs_operation *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) extern void afs_fs_release_lock(struct afs_operation *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) extern int afs_fs_give_up_all_callbacks(struct afs_net *, struct afs_server *,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090) struct afs_addr_cursor *, struct key *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) extern bool afs_fs_get_capabilities(struct afs_net *, struct afs_server *,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) struct afs_addr_cursor *, struct key *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) extern void afs_fs_inline_bulk_status(struct afs_operation *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) struct afs_acl {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) u32 size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) u8 data[];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) extern void afs_fs_fetch_acl(struct afs_operation *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) extern void afs_fs_store_acl(struct afs_operation *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) * fs_operation.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106) extern struct afs_operation *afs_alloc_operation(struct key *, struct afs_volume *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) extern int afs_put_operation(struct afs_operation *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) extern bool afs_begin_vnode_operation(struct afs_operation *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) extern void afs_wait_for_operation(struct afs_operation *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) extern int afs_do_sync_operation(struct afs_operation *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) static inline void afs_op_nomem(struct afs_operation *op)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114) op->error = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) static inline void afs_op_set_vnode(struct afs_operation *op, unsigned int n,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) struct afs_vnode *vnode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) op->file[n].vnode = vnode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) op->file[n].need_io_lock = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) static inline void afs_op_set_fid(struct afs_operation *op, unsigned int n,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) const struct afs_fid *fid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) op->file[n].fid = *fid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) * fs_probe.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) extern void afs_fileserver_probe_result(struct afs_call *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134) extern void afs_fs_probe_fileserver(struct afs_net *, struct afs_server *, struct key *, bool);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) extern int afs_wait_for_fs_probes(struct afs_server_list *, unsigned long);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) extern void afs_probe_fileserver(struct afs_net *, struct afs_server *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) extern void afs_fs_probe_dispatcher(struct work_struct *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138) extern int afs_wait_for_one_fs_probe(struct afs_server *, bool);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) extern void afs_fs_probe_cleanup(struct afs_net *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) * inode.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144) extern const struct afs_operation_ops afs_fetch_status_operation;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146) extern void afs_vnode_commit_status(struct afs_operation *, struct afs_vnode_param *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147) extern int afs_fetch_status(struct afs_vnode *, struct key *, bool, afs_access_t *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) extern int afs_ilookup5_test_by_fid(struct inode *, void *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149) extern struct inode *afs_iget_pseudo_dir(struct super_block *, bool);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150) extern struct inode *afs_iget(struct afs_operation *, struct afs_vnode_param *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151) extern struct inode *afs_root_iget(struct super_block *, struct key *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) extern bool afs_check_validity(struct afs_vnode *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153) extern int afs_validate(struct afs_vnode *, struct key *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154) extern int afs_getattr(const struct path *, struct kstat *, u32, unsigned int);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) extern int afs_setattr(struct dentry *, struct iattr *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156) extern void afs_evict_inode(struct inode *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157) extern int afs_drop_inode(struct inode *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160) * main.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162) extern struct workqueue_struct *afs_wq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163) extern int afs_net_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165) static inline struct afs_net *afs_net(struct net *net)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167) return net_generic(net, afs_net_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) static inline struct afs_net *afs_sb2net(struct super_block *sb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172) return afs_net(AFS_FS_S(sb)->net_ns);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175) static inline struct afs_net *afs_d2net(struct dentry *dentry)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177) return afs_sb2net(dentry->d_sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180) static inline struct afs_net *afs_i2net(struct inode *inode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182) return afs_sb2net(inode->i_sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185) static inline struct afs_net *afs_v2net(struct afs_vnode *vnode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187) return afs_i2net(&vnode->vfs_inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190) static inline struct afs_net *afs_sock2net(struct sock *sk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192) return net_generic(sock_net(sk), afs_net_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195) static inline void __afs_stat(atomic_t *s)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197) atomic_inc(s);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) #define afs_stat_v(vnode, n) __afs_stat(&afs_v2net(vnode)->n)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203) * misc.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205) extern int afs_abort_to_error(u32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206) extern void afs_prioritise_error(struct afs_error *, int, u32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209) * mntpt.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211) extern const struct inode_operations afs_mntpt_inode_operations;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212) extern const struct inode_operations afs_autocell_inode_operations;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) extern const struct file_operations afs_mntpt_file_operations;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215) extern struct vfsmount *afs_d_automount(struct path *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216) extern void afs_mntpt_kill_timer(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219) * proc.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221) #ifdef CONFIG_PROC_FS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222) extern int __net_init afs_proc_init(struct afs_net *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223) extern void __net_exit afs_proc_cleanup(struct afs_net *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224) extern int afs_proc_cell_setup(struct afs_cell *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225) extern void afs_proc_cell_remove(struct afs_cell *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226) extern void afs_put_sysnames(struct afs_sysnames *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228) static inline int afs_proc_init(struct afs_net *net) { return 0; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229) static inline void afs_proc_cleanup(struct afs_net *net) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230) static inline int afs_proc_cell_setup(struct afs_cell *cell) { return 0; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231) static inline void afs_proc_cell_remove(struct afs_cell *cell) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232) static inline void afs_put_sysnames(struct afs_sysnames *sysnames) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236) * rotate.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238) extern bool afs_select_fileserver(struct afs_operation *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239) extern void afs_dump_edestaddrreq(const struct afs_operation *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242) * rxrpc.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244) extern struct workqueue_struct *afs_async_calls;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246) extern int __net_init afs_open_socket(struct afs_net *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247) extern void __net_exit afs_close_socket(struct afs_net *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248) extern void afs_charge_preallocation(struct work_struct *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249) extern void afs_put_call(struct afs_call *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250) extern void afs_make_call(struct afs_addr_cursor *, struct afs_call *, gfp_t);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251) extern long afs_wait_for_call_to_complete(struct afs_call *, struct afs_addr_cursor *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252) extern struct afs_call *afs_alloc_flat_call(struct afs_net *,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253) const struct afs_call_type *,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254) size_t, size_t);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255) extern void afs_flat_call_destructor(struct afs_call *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256) extern void afs_send_empty_reply(struct afs_call *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257) extern void afs_send_simple_reply(struct afs_call *, const void *, size_t);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258) extern int afs_extract_data(struct afs_call *, bool);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259) extern int afs_protocol_error(struct afs_call *, enum afs_eproto_cause);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) static inline void afs_make_op_call(struct afs_operation *op, struct afs_call *call,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262) gfp_t gfp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264) op->call = call;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265) op->type = call->type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266) call->op = op;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267) call->key = op->key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268) call->intr = !(op->flags & AFS_OPERATION_UNINTR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269) afs_make_call(&op->ac, call, gfp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272) static inline void afs_extract_begin(struct afs_call *call, void *buf, size_t size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274) call->kvec[0].iov_base = buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275) call->kvec[0].iov_len = size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276) iov_iter_kvec(&call->def_iter, READ, call->kvec, 1, size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279) static inline void afs_extract_to_tmp(struct afs_call *call)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281) afs_extract_begin(call, &call->tmp, sizeof(call->tmp));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284) static inline void afs_extract_to_tmp64(struct afs_call *call)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286) afs_extract_begin(call, &call->tmp64, sizeof(call->tmp64));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289) static inline void afs_extract_discard(struct afs_call *call, size_t size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291) iov_iter_discard(&call->def_iter, READ, size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294) static inline void afs_extract_to_buf(struct afs_call *call, size_t size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296) afs_extract_begin(call, call->buffer, size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299) static inline int afs_transfer_reply(struct afs_call *call)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301) return afs_extract_data(call, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304) static inline bool afs_check_call_state(struct afs_call *call,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305) enum afs_call_state state)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307) return READ_ONCE(call->state) == state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310) static inline bool afs_set_call_state(struct afs_call *call,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311) enum afs_call_state from,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312) enum afs_call_state to)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314) bool ok = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316) spin_lock_bh(&call->state_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317) if (call->state == from) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318) call->state = to;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319) trace_afs_call_state(call, from, to, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320) ok = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322) spin_unlock_bh(&call->state_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323) return ok;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326) static inline void afs_set_call_complete(struct afs_call *call,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327) int error, u32 remote_abort)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329) enum afs_call_state state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330) bool ok = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332) spin_lock_bh(&call->state_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333) state = call->state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334) if (state != AFS_CALL_COMPLETE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335) call->abort_code = remote_abort;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336) call->error = error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337) call->state = AFS_CALL_COMPLETE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338) trace_afs_call_state(call, state, AFS_CALL_COMPLETE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339) error, remote_abort);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340) ok = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342) spin_unlock_bh(&call->state_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343) if (ok) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344) trace_afs_call_done(call);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346) /* Asynchronous calls have two refs to release - one from the alloc and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347) * one queued with the work item - and we can't just deallocate the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348) * call because the work item may be queued again.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350) if (call->drop_ref)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351) afs_put_call(call);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1352) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1354)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356) * security.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358) extern void afs_put_permits(struct afs_permits *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359) extern void afs_clear_permits(struct afs_vnode *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360) extern void afs_cache_permit(struct afs_vnode *, struct key *, unsigned int,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361) struct afs_status_cb *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362) extern void afs_zap_permits(struct rcu_head *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363) extern struct key *afs_request_key(struct afs_cell *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364) extern struct key *afs_request_key_rcu(struct afs_cell *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365) extern int afs_check_permit(struct afs_vnode *, struct key *, afs_access_t *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1366) extern int afs_permission(struct inode *, int);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1367) extern void __exit afs_clean_up_permit_cache(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1368)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370) * server.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1371) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1372) extern spinlock_t afs_server_peer_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1373)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374) extern struct afs_server *afs_find_server(struct afs_net *,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375) const struct sockaddr_rxrpc *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376) extern struct afs_server *afs_find_server_by_uuid(struct afs_net *, const uuid_t *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377) extern struct afs_server *afs_lookup_server(struct afs_cell *, struct key *, const uuid_t *, u32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378) extern struct afs_server *afs_get_server(struct afs_server *, enum afs_server_trace);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379) extern struct afs_server *afs_use_server(struct afs_server *, enum afs_server_trace);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380) extern void afs_unuse_server(struct afs_net *, struct afs_server *, enum afs_server_trace);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381) extern void afs_unuse_server_notime(struct afs_net *, struct afs_server *, enum afs_server_trace);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382) extern void afs_put_server(struct afs_net *, struct afs_server *, enum afs_server_trace);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383) extern void afs_manage_servers(struct work_struct *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384) extern void afs_servers_timer(struct timer_list *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385) extern void afs_fs_probe_timer(struct timer_list *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386) extern void __net_exit afs_purge_servers(struct afs_net *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387) extern bool afs_check_server_record(struct afs_operation *, struct afs_server *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389) static inline void afs_inc_servers_outstanding(struct afs_net *net)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391) atomic_inc(&net->servers_outstanding);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394) static inline void afs_dec_servers_outstanding(struct afs_net *net)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1396) if (atomic_dec_and_test(&net->servers_outstanding))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1397) wake_up_var(&net->servers_outstanding);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1398) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1399)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1400) static inline bool afs_is_probing_server(struct afs_server *server)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1401) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1402) return list_empty(&server->probe_link);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1403) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1404)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1405) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1406) * server_list.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1407) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1408) static inline struct afs_server_list *afs_get_serverlist(struct afs_server_list *slist)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1409) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1410) refcount_inc(&slist->usage);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1411) return slist;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1412) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1413)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1414) extern void afs_put_serverlist(struct afs_net *, struct afs_server_list *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1415) extern struct afs_server_list *afs_alloc_server_list(struct afs_cell *, struct key *,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1416) struct afs_vldb_entry *,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1417) u8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1418) extern bool afs_annotate_server_list(struct afs_server_list *, struct afs_server_list *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1419)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1420) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1421) * super.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1422) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1423) extern int __init afs_fs_init(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1424) extern void afs_fs_exit(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1425)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1426) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1427) * vlclient.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1428) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1429) extern struct afs_vldb_entry *afs_vl_get_entry_by_name_u(struct afs_vl_cursor *,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1430) const char *, int);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1431) extern struct afs_addr_list *afs_vl_get_addrs_u(struct afs_vl_cursor *, const uuid_t *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1432) extern struct afs_call *afs_vl_get_capabilities(struct afs_net *, struct afs_addr_cursor *,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1433) struct key *, struct afs_vlserver *, unsigned int);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1434) extern struct afs_addr_list *afs_yfsvl_get_endpoints(struct afs_vl_cursor *, const uuid_t *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1435) extern char *afs_yfsvl_get_cell_name(struct afs_vl_cursor *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1436)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1437) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1438) * vl_alias.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1439) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1440) extern int afs_cell_detect_alias(struct afs_cell *, struct key *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1441)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1442) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1443) * vl_probe.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1444) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1445) extern void afs_vlserver_probe_result(struct afs_call *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1446) extern int afs_send_vl_probes(struct afs_net *, struct key *, struct afs_vlserver_list *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1447) extern int afs_wait_for_vl_probes(struct afs_vlserver_list *, unsigned long);
^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) * vl_rotate.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1451) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1452) extern bool afs_begin_vlserver_operation(struct afs_vl_cursor *,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1453) struct afs_cell *, struct key *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1454) extern bool afs_select_vlserver(struct afs_vl_cursor *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1455) extern bool afs_select_current_vlserver(struct afs_vl_cursor *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1456) extern int afs_end_vlserver_operation(struct afs_vl_cursor *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1457)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1458) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1459) * vlserver_list.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1460) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1461) static inline struct afs_vlserver *afs_get_vlserver(struct afs_vlserver *vlserver)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1462) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1463) atomic_inc(&vlserver->usage);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1464) return vlserver;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1465) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1466)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1467) static inline struct afs_vlserver_list *afs_get_vlserverlist(struct afs_vlserver_list *vllist)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1468) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1469) if (vllist)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1470) atomic_inc(&vllist->usage);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1471) return vllist;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1472) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1473)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1474) extern struct afs_vlserver *afs_alloc_vlserver(const char *, size_t, unsigned short);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1475) extern void afs_put_vlserver(struct afs_net *, struct afs_vlserver *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1476) extern struct afs_vlserver_list *afs_alloc_vlserver_list(unsigned int);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1477) extern void afs_put_vlserverlist(struct afs_net *, struct afs_vlserver_list *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1478) extern struct afs_vlserver_list *afs_extract_vlserver_list(struct afs_cell *,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1479) const void *, size_t);
^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) * volume.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1483) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1484) extern struct afs_volume *afs_create_volume(struct afs_fs_context *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1485) extern void afs_activate_volume(struct afs_volume *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1486) extern void afs_deactivate_volume(struct afs_volume *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1487) extern struct afs_volume *afs_get_volume(struct afs_volume *, enum afs_volume_trace);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1488) extern void afs_put_volume(struct afs_net *, struct afs_volume *, enum afs_volume_trace);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1489) extern int afs_check_volume_status(struct afs_volume *, struct afs_operation *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1490)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1491) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1492) * write.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1493) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1494) extern int afs_set_page_dirty(struct page *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1495) extern int afs_write_begin(struct file *file, struct address_space *mapping,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1496) loff_t pos, unsigned len, unsigned flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1497) struct page **pagep, void **fsdata);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1498) extern int afs_write_end(struct file *file, struct address_space *mapping,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1499) loff_t pos, unsigned len, unsigned copied,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1500) struct page *page, void *fsdata);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1501) extern int afs_writepage(struct page *, struct writeback_control *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1502) extern int afs_writepages(struct address_space *, struct writeback_control *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1503) extern ssize_t afs_file_write(struct kiocb *, struct iov_iter *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1504) extern int afs_fsync(struct file *, loff_t, loff_t, int);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1505) extern vm_fault_t afs_page_mkwrite(struct vm_fault *vmf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1506) extern void afs_prune_wb_keys(struct afs_vnode *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1507) extern int afs_launder_page(struct page *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1508)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1509) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1510) * xattr.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1511) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1512) extern const struct xattr_handler *afs_xattr_handlers[];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1513)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1514) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1515) * yfsclient.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1516) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1517) extern void yfs_fs_fetch_data(struct afs_operation *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1518) extern void yfs_fs_create_file(struct afs_operation *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1519) extern void yfs_fs_make_dir(struct afs_operation *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1520) extern void yfs_fs_remove_file2(struct afs_operation *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1521) extern void yfs_fs_remove_file(struct afs_operation *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1522) extern void yfs_fs_remove_dir(struct afs_operation *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1523) extern void yfs_fs_link(struct afs_operation *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1524) extern void yfs_fs_symlink(struct afs_operation *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1525) extern void yfs_fs_rename(struct afs_operation *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1526) extern void yfs_fs_store_data(struct afs_operation *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1527) extern void yfs_fs_setattr(struct afs_operation *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1528) extern void yfs_fs_get_volume_status(struct afs_operation *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1529) extern void yfs_fs_set_lock(struct afs_operation *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1530) extern void yfs_fs_extend_lock(struct afs_operation *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1531) extern void yfs_fs_release_lock(struct afs_operation *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1532) extern void yfs_fs_fetch_status(struct afs_operation *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1533) extern void yfs_fs_inline_bulk_status(struct afs_operation *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1534)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1535) struct yfs_acl {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1536) struct afs_acl *acl; /* Dir/file/symlink ACL */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1537) struct afs_acl *vol_acl; /* Whole volume ACL */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1538) u32 inherit_flag; /* True if ACL is inherited from parent dir */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1539) u32 num_cleaned; /* Number of ACEs removed due to subject removal */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1540) unsigned int flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1541) #define YFS_ACL_WANT_ACL 0x01 /* Set if caller wants ->acl */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1542) #define YFS_ACL_WANT_VOL_ACL 0x02 /* Set if caller wants ->vol_acl */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1543) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1544)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1545) extern void yfs_free_opaque_acl(struct yfs_acl *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1546) extern void yfs_fs_fetch_opaque_acl(struct afs_operation *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1547) extern void yfs_fs_store_opaque_acl2(struct afs_operation *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1548)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1549) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1550) * Miscellaneous inline functions.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1551) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1552) static inline struct afs_vnode *AFS_FS_I(struct inode *inode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1553) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1554) return container_of(inode, struct afs_vnode, vfs_inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1555) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1556)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1557) static inline struct inode *AFS_VNODE_TO_I(struct afs_vnode *vnode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1558) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1559) return &vnode->vfs_inode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1560) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1561)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1562) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1563) * Note that a dentry got changed. We need to set d_fsdata to the data version
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1564) * number derived from the result of the operation. It doesn't matter if
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1565) * d_fsdata goes backwards as we'll just revalidate.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1566) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1567) static inline void afs_update_dentry_version(struct afs_operation *op,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1568) struct afs_vnode_param *dir_vp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1569) struct dentry *dentry)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1570) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1571) if (!op->error)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1572) dentry->d_fsdata =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1573) (void *)(unsigned long)dir_vp->scb.status.data_version;
^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) * Set the file size and block count. Estimate the number of 512 bytes blocks
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1578) * used, rounded up to nearest 1K for consistency with other AFS clients.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1579) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1580) static inline void afs_set_i_size(struct afs_vnode *vnode, u64 size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1581) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1582) i_size_write(&vnode->vfs_inode, size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1583) vnode->vfs_inode.i_blocks = ((size + 1023) >> 10) << 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1584) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1585)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1586) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1587) * Check for a conflicting operation on a directory that we just unlinked from.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1588) * If someone managed to sneak a link or an unlink in on the file we just
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1589) * unlinked, we won't be able to trust nlink on an AFS file (but not YFS).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1590) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1591) static inline void afs_check_dir_conflict(struct afs_operation *op,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1592) struct afs_vnode_param *dvp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1593) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1594) if (dvp->dv_before + dvp->dv_delta != dvp->scb.status.data_version)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1595) op->flags |= AFS_OPERATION_DIR_CONFLICT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1596) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1597)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1598) static inline int afs_io_error(struct afs_call *call, enum afs_io_error where)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1599) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1600) trace_afs_io_error(call->debug_id, -EIO, where);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1601) return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1602) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1603)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1604) static inline int afs_bad(struct afs_vnode *vnode, enum afs_file_error where)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1605) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1606) trace_afs_file_error(vnode, -EIO, where);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1607) return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1608) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1609)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1610) /*****************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1611) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1612) * debug tracing
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1613) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1614) extern unsigned afs_debug;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1615)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1616) #define dbgprintk(FMT,...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1617) printk("[%-6.6s] "FMT"\n", current->comm ,##__VA_ARGS__)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1618)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1619) #define kenter(FMT,...) dbgprintk("==> %s("FMT")",__func__ ,##__VA_ARGS__)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1620) #define kleave(FMT,...) dbgprintk("<== %s()"FMT"",__func__ ,##__VA_ARGS__)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1621) #define kdebug(FMT,...) dbgprintk(" "FMT ,##__VA_ARGS__)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1622)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1623)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1624) #if defined(__KDEBUG)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1625) #define _enter(FMT,...) kenter(FMT,##__VA_ARGS__)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1626) #define _leave(FMT,...) kleave(FMT,##__VA_ARGS__)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1627) #define _debug(FMT,...) kdebug(FMT,##__VA_ARGS__)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1628)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1629) #elif defined(CONFIG_AFS_DEBUG)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1630) #define AFS_DEBUG_KENTER 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1631) #define AFS_DEBUG_KLEAVE 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1632) #define AFS_DEBUG_KDEBUG 0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1633)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1634) #define _enter(FMT,...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1635) do { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1636) if (unlikely(afs_debug & AFS_DEBUG_KENTER)) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1637) kenter(FMT,##__VA_ARGS__); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1638) } while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1639)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1640) #define _leave(FMT,...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1641) do { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1642) if (unlikely(afs_debug & AFS_DEBUG_KLEAVE)) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1643) kleave(FMT,##__VA_ARGS__); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1644) } while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1645)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1646) #define _debug(FMT,...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1647) do { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1648) if (unlikely(afs_debug & AFS_DEBUG_KDEBUG)) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1649) kdebug(FMT,##__VA_ARGS__); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1650) } while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1651)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1652) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1653) #define _enter(FMT,...) no_printk("==> %s("FMT")",__func__ ,##__VA_ARGS__)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1654) #define _leave(FMT,...) no_printk("<== %s()"FMT"",__func__ ,##__VA_ARGS__)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1655) #define _debug(FMT,...) no_printk(" "FMT ,##__VA_ARGS__)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1656) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1657)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1658) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1659) * debug assertion checking
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1660) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1661) #if 1 // defined(__KDEBUGALL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1662)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1663) #define ASSERT(X) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1664) do { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1665) if (unlikely(!(X))) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1666) printk(KERN_ERR "\n"); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1667) printk(KERN_ERR "AFS: Assertion failed\n"); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1668) BUG(); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1669) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1670) } while(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1671)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1672) #define ASSERTCMP(X, OP, Y) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1673) do { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1674) if (unlikely(!((X) OP (Y)))) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1675) printk(KERN_ERR "\n"); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1676) printk(KERN_ERR "AFS: Assertion failed\n"); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1677) printk(KERN_ERR "%lu " #OP " %lu is false\n", \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1678) (unsigned long)(X), (unsigned long)(Y)); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1679) printk(KERN_ERR "0x%lx " #OP " 0x%lx is false\n", \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1680) (unsigned long)(X), (unsigned long)(Y)); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1681) BUG(); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1682) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1683) } while(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1684)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1685) #define ASSERTRANGE(L, OP1, N, OP2, H) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1686) do { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1687) if (unlikely(!((L) OP1 (N)) || !((N) OP2 (H)))) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1688) printk(KERN_ERR "\n"); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1689) printk(KERN_ERR "AFS: Assertion failed\n"); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1690) printk(KERN_ERR "%lu "#OP1" %lu "#OP2" %lu is false\n", \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1691) (unsigned long)(L), (unsigned long)(N), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1692) (unsigned long)(H)); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1693) printk(KERN_ERR "0x%lx "#OP1" 0x%lx "#OP2" 0x%lx is false\n", \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1694) (unsigned long)(L), (unsigned long)(N), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1695) (unsigned long)(H)); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1696) BUG(); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1697) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1698) } while(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1699)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1700) #define ASSERTIF(C, X) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1701) do { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1702) if (unlikely((C) && !(X))) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1703) printk(KERN_ERR "\n"); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1704) printk(KERN_ERR "AFS: Assertion failed\n"); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1705) BUG(); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1706) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1707) } while(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1708)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1709) #define ASSERTIFCMP(C, X, OP, Y) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1710) do { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1711) if (unlikely((C) && !((X) OP (Y)))) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1712) printk(KERN_ERR "\n"); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1713) printk(KERN_ERR "AFS: Assertion failed\n"); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1714) printk(KERN_ERR "%lu " #OP " %lu is false\n", \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1715) (unsigned long)(X), (unsigned long)(Y)); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1716) printk(KERN_ERR "0x%lx " #OP " 0x%lx is false\n", \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1717) (unsigned long)(X), (unsigned long)(Y)); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1718) BUG(); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1719) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1720) } while(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1721)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1722) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1723)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1724) #define ASSERT(X) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1725) do { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1726) } while(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1727)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1728) #define ASSERTCMP(X, OP, Y) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1729) do { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1730) } while(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1731)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1732) #define ASSERTRANGE(L, OP1, N, OP2, H) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1733) do { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1734) } while(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1735)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1736) #define ASSERTIF(C, X) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1737) do { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1738) } while(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1739)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1740) #define ASSERTIFCMP(C, X, OP, Y) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1741) do { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1742) } while(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1743)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1744) #endif /* __KDEBUGALL */