Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/fs/afs/internal.h
29265 views
1
/* SPDX-License-Identifier: GPL-2.0-or-later */
2
/* internal AFS stuff
3
*
4
* Copyright (C) 2002, 2007 Red Hat, Inc. All Rights Reserved.
5
* Written by David Howells ([email protected])
6
*/
7
8
#include <linux/compiler.h>
9
#include <linux/kernel.h>
10
#include <linux/ktime.h>
11
#include <linux/fs.h>
12
#include <linux/filelock.h>
13
#include <linux/pagemap.h>
14
#include <linux/rxrpc.h>
15
#include <linux/key.h>
16
#include <linux/workqueue.h>
17
#include <linux/sched.h>
18
#include <linux/fscache.h>
19
#include <linux/backing-dev.h>
20
#include <linux/uuid.h>
21
#include <linux/mm_types.h>
22
#include <linux/dns_resolver.h>
23
#include <crypto/krb5.h>
24
#include <net/net_namespace.h>
25
#include <net/netns/generic.h>
26
#include <net/sock.h>
27
#include <net/af_rxrpc.h>
28
29
#include "afs.h"
30
#include "afs_vl.h"
31
32
#define AFS_CELL_MAX_ADDRS 15
33
34
struct pagevec;
35
struct afs_call;
36
struct afs_vnode;
37
struct afs_server_probe;
38
39
/*
40
* Partial file-locking emulation mode. (The problem being that AFS3 only
41
* allows whole-file locks and no upgrading/downgrading).
42
*/
43
enum afs_flock_mode {
44
afs_flock_mode_unset,
45
afs_flock_mode_local, /* Local locking only */
46
afs_flock_mode_openafs, /* Don't get server lock for a partial lock */
47
afs_flock_mode_strict, /* Always get a server lock for a partial lock */
48
afs_flock_mode_write, /* Get an exclusive server lock for a partial lock */
49
};
50
51
struct afs_fs_context {
52
bool force; /* T to force cell type */
53
bool autocell; /* T if set auto mount operation */
54
bool dyn_root; /* T if dynamic root */
55
bool no_cell; /* T if the source is "none" (for dynroot) */
56
enum afs_flock_mode flock_mode; /* Partial file-locking emulation mode */
57
afs_voltype_t type; /* type of volume requested */
58
unsigned int volnamesz; /* size of volume name */
59
const char *volname; /* name of volume to mount */
60
struct afs_net *net; /* the AFS net namespace stuff */
61
struct afs_cell *cell; /* cell in which to find volume */
62
struct afs_volume *volume; /* volume record */
63
struct key *key; /* key to use for secure mounting */
64
};
65
66
enum afs_call_state {
67
AFS_CALL_CL_REQUESTING, /* Client: Request is being sent */
68
AFS_CALL_CL_AWAIT_REPLY, /* Client: Awaiting reply */
69
AFS_CALL_CL_PROC_REPLY, /* Client: rxrpc call complete; processing reply */
70
AFS_CALL_SV_AWAIT_OP_ID, /* Server: Awaiting op ID */
71
AFS_CALL_SV_AWAIT_REQUEST, /* Server: Awaiting request data */
72
AFS_CALL_SV_REPLYING, /* Server: Replying */
73
AFS_CALL_SV_AWAIT_ACK, /* Server: Awaiting final ACK */
74
AFS_CALL_COMPLETE, /* Completed or failed */
75
};
76
77
/*
78
* Address preferences.
79
*/
80
struct afs_addr_preference {
81
union {
82
struct in_addr ipv4_addr; /* AF_INET address to compare against */
83
struct in6_addr ipv6_addr; /* AF_INET6 address to compare against */
84
};
85
sa_family_t family; /* Which address to use */
86
u16 prio; /* Priority */
87
u8 subnet_mask; /* How many bits to compare */
88
};
89
90
struct afs_addr_preference_list {
91
struct rcu_head rcu;
92
u16 version; /* Incremented when prefs list changes */
93
u8 ipv6_off; /* Offset of IPv6 addresses */
94
u8 nr; /* Number of addresses in total */
95
u8 max_prefs; /* Number of prefs allocated */
96
struct afs_addr_preference prefs[] __counted_by(max_prefs);
97
};
98
99
struct afs_address {
100
struct rxrpc_peer *peer;
101
short last_error; /* Last error from this address */
102
u16 prio; /* Address priority */
103
};
104
105
/*
106
* List of server addresses.
107
*/
108
struct afs_addr_list {
109
struct rcu_head rcu;
110
refcount_t usage;
111
u32 version; /* Version */
112
unsigned int debug_id;
113
unsigned int addr_pref_version; /* Version of address preference list */
114
unsigned char max_addrs;
115
unsigned char nr_addrs;
116
unsigned char preferred; /* Preferred address */
117
unsigned char nr_ipv4; /* Number of IPv4 addresses */
118
enum dns_record_source source:8;
119
enum dns_lookup_status status:8;
120
unsigned long probe_failed; /* Mask of addrs that failed locally/ICMP */
121
unsigned long responded; /* Mask of addrs that responded */
122
struct afs_address addrs[] __counted_by(max_addrs);
123
#define AFS_MAX_ADDRESSES ((unsigned int)(sizeof(unsigned long) * 8))
124
};
125
126
/*
127
* a record of an in-progress RxRPC call
128
*/
129
struct afs_call {
130
const struct afs_call_type *type; /* type of call */
131
wait_queue_head_t waitq; /* processes awaiting completion */
132
struct work_struct async_work; /* async I/O processor */
133
struct work_struct work; /* actual work processor */
134
struct work_struct free_work; /* Deferred free processor */
135
struct rxrpc_call *rxcall; /* RxRPC call handle */
136
struct rxrpc_peer *peer; /* Remote endpoint */
137
struct key *key; /* security for this call */
138
struct afs_net *net; /* The network namespace */
139
struct afs_server *server; /* The fileserver record if fs op (pins ref) */
140
struct afs_vlserver *vlserver; /* The vlserver record if vl op */
141
void *request; /* request data (first part) */
142
size_t iov_len; /* Size of *iter to be used */
143
struct iov_iter def_iter; /* Default buffer/data iterator */
144
struct iov_iter *write_iter; /* Iterator defining write to be made */
145
struct iov_iter *iter; /* Iterator currently in use */
146
union { /* Convenience for ->def_iter */
147
struct kvec kvec[1];
148
struct bio_vec bvec[1];
149
};
150
void *buffer; /* reply receive buffer */
151
union {
152
struct afs_endpoint_state *probe;
153
struct afs_addr_list *vl_probe;
154
struct afs_addr_list *ret_alist;
155
struct afs_vldb_entry *ret_vldb;
156
char *ret_str;
157
};
158
struct afs_fid fid; /* Primary vnode ID (or all zeroes) */
159
unsigned char probe_index; /* Address in ->probe_alist */
160
struct afs_operation *op;
161
unsigned int server_index;
162
refcount_t ref;
163
enum afs_call_state state;
164
spinlock_t state_lock;
165
int error; /* error code */
166
u32 abort_code; /* Remote abort ID or 0 */
167
unsigned long long remaining; /* How much is left to receive */
168
unsigned int max_lifespan; /* Maximum lifespan in secs to set if not 0 */
169
unsigned request_size; /* size of request data */
170
unsigned reply_max; /* maximum size of reply */
171
unsigned count2; /* count used in unmarshalling */
172
unsigned char unmarshall; /* unmarshalling phase */
173
bool drop_ref; /* T if need to drop ref for incoming call */
174
bool need_attention; /* T if RxRPC poked us */
175
bool async; /* T if asynchronous */
176
bool upgrade; /* T to request service upgrade */
177
bool intr; /* T if interruptible */
178
bool unmarshalling_error; /* T if an unmarshalling error occurred */
179
bool responded; /* Got a response from the call (may be abort) */
180
u8 security_ix; /* Security class */
181
u16 service_id; /* Actual service ID (after upgrade) */
182
unsigned int debug_id; /* Trace ID */
183
u32 enctype; /* Security encoding type */
184
u32 operation_ID; /* operation ID for an incoming call */
185
u32 count; /* count for use in unmarshalling */
186
union { /* place to extract temporary data */
187
struct {
188
__be32 tmp_u;
189
__be32 tmp;
190
} __attribute__((packed));
191
__be64 tmp64;
192
};
193
ktime_t issue_time; /* Time of issue of operation */
194
};
195
196
struct afs_call_type {
197
const char *name;
198
unsigned int op; /* Really enum afs_fs_operation */
199
200
/* deliver request or reply data to an call
201
* - returning an error will cause the call to be aborted
202
*/
203
int (*deliver)(struct afs_call *call);
204
205
/* clean up a call */
206
void (*destructor)(struct afs_call *call);
207
208
/* Async receive processing function */
209
void (*async_rx)(struct work_struct *work);
210
211
/* Work function */
212
void (*work)(struct work_struct *work);
213
214
/* Call done function (gets called immediately on success or failure) */
215
void (*done)(struct afs_call *call);
216
217
/* Handle a call being immediately cancelled. */
218
void (*immediate_cancel)(struct afs_call *call);
219
};
220
221
/*
222
* Key available for writeback on a file.
223
*/
224
struct afs_wb_key {
225
refcount_t usage;
226
struct key *key;
227
struct list_head vnode_link; /* Link in vnode->wb_keys */
228
};
229
230
/*
231
* AFS open file information record. Pointed to by file->private_data.
232
*/
233
struct afs_file {
234
struct key *key; /* The key this file was opened with */
235
struct afs_wb_key *wb; /* Writeback key record for this file */
236
};
237
238
static inline struct key *afs_file_key(struct file *file)
239
{
240
struct afs_file *af = file->private_data;
241
242
return af->key;
243
}
244
245
/*
246
* AFS superblock private data
247
* - there's one superblock per volume
248
*/
249
struct afs_super_info {
250
struct net *net_ns; /* Network namespace */
251
struct afs_cell *cell; /* The cell in which the volume resides */
252
struct afs_volume *volume; /* volume record */
253
enum afs_flock_mode flock_mode:8; /* File locking emulation mode */
254
bool dyn_root; /* True if dynamic root */
255
};
256
257
static inline struct afs_super_info *AFS_FS_S(struct super_block *sb)
258
{
259
return sb->s_fs_info;
260
}
261
262
extern struct file_system_type afs_fs_type;
263
264
/*
265
* Set of substitutes for @sys.
266
*/
267
struct afs_sysnames {
268
#define AFS_NR_SYSNAME 16
269
char *subs[AFS_NR_SYSNAME];
270
refcount_t usage;
271
unsigned short nr;
272
char blank[1];
273
};
274
275
/*
276
* AFS network namespace record.
277
*/
278
struct afs_net {
279
struct net *net; /* Backpointer to the owning net namespace */
280
struct afs_uuid uuid;
281
bool live; /* F if this namespace is being removed */
282
283
/* AF_RXRPC I/O stuff */
284
struct socket *socket;
285
struct afs_call *spare_incoming_call;
286
struct work_struct charge_preallocation_work;
287
struct work_struct rx_oob_work;
288
struct mutex socket_mutex;
289
atomic_t nr_outstanding_calls;
290
atomic_t nr_superblocks;
291
292
/* Cell database */
293
struct rb_root cells;
294
struct idr cells_dyn_ino; /* cell->dynroot_ino mapping */
295
struct afs_cell __rcu *ws_cell;
296
atomic_t cells_outstanding;
297
struct rw_semaphore cells_lock;
298
struct mutex cells_alias_lock;
299
300
struct mutex proc_cells_lock;
301
struct hlist_head proc_cells;
302
303
/* Known servers. Theoretically each fileserver can only be in one
304
* cell, but in practice, people create aliases and subsets and there's
305
* no easy way to distinguish them.
306
*/
307
seqlock_t fs_lock; /* For fs_probe_*, fs_proc */
308
struct list_head fs_probe_fast; /* List of afs_server to probe at 30s intervals */
309
struct list_head fs_probe_slow; /* List of afs_server to probe at 5m intervals */
310
struct hlist_head fs_proc; /* procfs servers list */
311
312
struct key *fs_cm_token_key; /* Key for creating CM tokens */
313
struct work_struct fs_prober;
314
struct timer_list fs_probe_timer;
315
atomic_t servers_outstanding;
316
317
/* File locking renewal management */
318
struct mutex lock_manager_mutex;
319
320
/* Misc */
321
struct super_block *dynroot_sb; /* Dynamic root mount superblock */
322
struct proc_dir_entry *proc_afs; /* /proc/net/afs directory */
323
struct afs_sysnames *sysnames;
324
rwlock_t sysnames_lock;
325
struct afs_addr_preference_list __rcu *address_prefs;
326
u16 address_pref_version;
327
328
/* Statistics counters */
329
atomic_t n_lookup; /* Number of lookups done */
330
atomic_t n_reval; /* Number of dentries needing revalidation */
331
atomic_t n_inval; /* Number of invalidations by the server */
332
atomic_t n_relpg; /* Number of invalidations by release_folio */
333
atomic_t n_read_dir; /* Number of directory pages read */
334
atomic_t n_dir_cr; /* Number of directory entry creation edits */
335
atomic_t n_dir_rm; /* Number of directory entry removal edits */
336
atomic_t n_stores; /* Number of store ops */
337
atomic_long_t n_store_bytes; /* Number of bytes stored */
338
atomic_long_t n_fetch_bytes; /* Number of bytes fetched */
339
atomic_t n_fetches; /* Number of data fetch ops */
340
};
341
342
extern const char afs_init_sysname[];
343
344
enum afs_cell_state {
345
AFS_CELL_SETTING_UP,
346
AFS_CELL_ACTIVE,
347
AFS_CELL_REMOVING,
348
AFS_CELL_DEAD,
349
};
350
351
/*
352
* AFS cell record.
353
*
354
* This is a tricky concept to get right as it is possible to create aliases
355
* simply by pointing AFSDB/SRV records for two names at the same set of VL
356
* servers; it is also possible to do things like setting up two sets of VL
357
* servers, one of which provides a superset of the volumes provided by the
358
* other (for internal/external division, for example).
359
*
360
* Cells only exist in the sense that (a) a cell's name maps to a set of VL
361
* servers and (b) a cell's name is used by the client to select the key to use
362
* for authentication and encryption. The cell name is not typically used in
363
* the protocol.
364
*
365
* Two cells are determined to be aliases if they have an explicit alias (YFS
366
* only), share any VL servers in common or have at least one volume in common.
367
* "In common" means that the address list of the VL servers or the fileservers
368
* share at least one endpoint.
369
*/
370
struct afs_cell {
371
union {
372
struct rcu_head rcu;
373
struct rb_node net_node; /* Node in net->cells */
374
};
375
struct afs_net *net;
376
struct afs_cell *alias_of; /* The cell this is an alias of */
377
struct afs_volume *root_volume; /* The root.cell volume if there is one */
378
struct key *anonymous_key; /* anonymous user key for this cell */
379
struct work_struct destroyer; /* Destroyer for cell */
380
struct work_struct manager; /* Manager for init/deinit/dns */
381
struct timer_list management_timer; /* General management timer */
382
struct hlist_node proc_link; /* /proc cell list link */
383
time64_t dns_expiry; /* Time AFSDB/SRV record expires */
384
time64_t last_inactive; /* Time of last drop of usage count */
385
refcount_t ref; /* Struct refcount */
386
atomic_t active; /* Active usage counter */
387
unsigned long flags;
388
#define AFS_CELL_FL_NO_GC 0 /* The cell was added manually, don't auto-gc */
389
#define AFS_CELL_FL_DO_LOOKUP 1 /* DNS lookup requested */
390
#define AFS_CELL_FL_CHECK_ALIAS 2 /* Need to check for aliases */
391
enum afs_cell_state state;
392
short error;
393
enum dns_record_source dns_source:8; /* Latest source of data from lookup */
394
enum dns_lookup_status dns_status:8; /* Latest status of data from lookup */
395
unsigned int dns_lookup_count; /* Counter of DNS lookups */
396
unsigned int debug_id;
397
unsigned int dynroot_ino; /* Inode numbers for dynroot (a pair) */
398
399
/* The volumes belonging to this cell */
400
struct rw_semaphore vs_lock; /* Lock for server->volumes */
401
struct rb_root volumes; /* Tree of volumes on this server */
402
struct hlist_head proc_volumes; /* procfs volume list */
403
seqlock_t volume_lock; /* For volumes */
404
405
/* Active fileserver interaction state. */
406
struct rb_root fs_servers; /* afs_server (by server UUID) */
407
struct rw_semaphore fs_lock; /* For fs_servers */
408
409
/* VL server list. */
410
rwlock_t vl_servers_lock; /* Lock on vl_servers */
411
struct afs_vlserver_list __rcu *vl_servers;
412
413
u8 name_len; /* Length of name */
414
char *name; /* Cell name, case-flattened and NUL-padded */
415
};
416
417
/*
418
* Volume Location server record.
419
*/
420
struct afs_vlserver {
421
struct rcu_head rcu;
422
struct afs_addr_list __rcu *addresses; /* List of addresses for this VL server */
423
unsigned long flags;
424
#define AFS_VLSERVER_FL_PROBED 0 /* The VL server has been probed */
425
#define AFS_VLSERVER_FL_PROBING 1 /* VL server is being probed */
426
#define AFS_VLSERVER_FL_IS_YFS 2 /* Server is YFS not AFS */
427
#define AFS_VLSERVER_FL_RESPONDING 3 /* VL server is responding */
428
rwlock_t lock; /* Lock on addresses */
429
refcount_t ref;
430
unsigned int rtt; /* Server's current RTT in uS */
431
unsigned int debug_id;
432
433
/* Probe state */
434
wait_queue_head_t probe_wq;
435
atomic_t probe_outstanding;
436
spinlock_t probe_lock;
437
struct {
438
unsigned int rtt; /* Best RTT in uS (or UINT_MAX) */
439
u32 abort_code;
440
short error;
441
unsigned short flags;
442
#define AFS_VLSERVER_PROBE_RESPONDED 0x01 /* At least once response (may be abort) */
443
#define AFS_VLSERVER_PROBE_IS_YFS 0x02 /* The peer appears to be YFS */
444
#define AFS_VLSERVER_PROBE_NOT_YFS 0x04 /* The peer appears not to be YFS */
445
#define AFS_VLSERVER_PROBE_LOCAL_FAILURE 0x08 /* A local failure prevented a probe */
446
} probe;
447
448
u16 service_id; /* Service ID we're using */
449
u16 port;
450
u16 name_len; /* Length of name */
451
char name[]; /* Server name, case-flattened */
452
};
453
454
/*
455
* Weighted list of Volume Location servers.
456
*/
457
struct afs_vlserver_entry {
458
u16 priority; /* Preference (as SRV) */
459
u16 weight; /* Weight (as SRV) */
460
enum dns_record_source source:8;
461
enum dns_lookup_status status:8;
462
struct afs_vlserver *server;
463
};
464
465
struct afs_vlserver_list {
466
struct rcu_head rcu;
467
refcount_t ref;
468
u8 nr_servers;
469
u8 index; /* Server currently in use */
470
u8 preferred; /* Preferred server */
471
enum dns_record_source source:8;
472
enum dns_lookup_status status:8;
473
rwlock_t lock;
474
struct afs_vlserver_entry servers[];
475
};
476
477
/*
478
* Cached VLDB entry.
479
*
480
* This is pointed to by cell->vldb_entries, indexed by name.
481
*/
482
struct afs_vldb_entry {
483
afs_volid_t vid[3]; /* Volume IDs for R/W, R/O and Bak volumes */
484
485
unsigned long flags;
486
#define AFS_VLDB_HAS_RW 0 /* - R/W volume exists */
487
#define AFS_VLDB_HAS_RO 1 /* - R/O volume exists */
488
#define AFS_VLDB_HAS_BAK 2 /* - Backup volume exists */
489
#define AFS_VLDB_QUERY_VALID 3 /* - Record is valid */
490
#define AFS_VLDB_QUERY_ERROR 4 /* - VL server returned error */
491
492
uuid_t fs_server[AFS_NMAXNSERVERS];
493
u32 addr_version[AFS_NMAXNSERVERS]; /* Registration change counters */
494
u8 fs_mask[AFS_NMAXNSERVERS];
495
#define AFS_VOL_VTM_RW 0x01 /* R/W version of the volume is available (on this server) */
496
#define AFS_VOL_VTM_RO 0x02 /* R/O version of the volume is available (on this server) */
497
#define AFS_VOL_VTM_BAK 0x04 /* backup version of the volume is available (on this server) */
498
u8 vlsf_flags[AFS_NMAXNSERVERS];
499
short error;
500
u8 nr_servers; /* Number of server records */
501
u8 name_len;
502
u8 name[AFS_MAXVOLNAME + 1]; /* NUL-padded volume name */
503
};
504
505
/*
506
* Fileserver endpoint state. The records the addresses of a fileserver's
507
* endpoints and the state and result of a round of probing on them. This
508
* allows the rotation algorithm to access those results without them being
509
* erased by a subsequent round of probing.
510
*/
511
struct afs_endpoint_state {
512
struct rcu_head rcu;
513
struct afs_addr_list *addresses; /* The addresses being probed */
514
unsigned long responsive_set; /* Bitset of responsive endpoints */
515
unsigned long failed_set; /* Bitset of endpoints we failed to probe */
516
refcount_t ref;
517
unsigned int server_id; /* Debug ID of server */
518
unsigned int probe_seq; /* Probe sequence (from server::probe_counter) */
519
atomic_t nr_probing; /* Number of outstanding probes */
520
unsigned int rtt; /* Best RTT in uS (or UINT_MAX) */
521
s32 abort_code;
522
short error;
523
unsigned long flags;
524
#define AFS_ESTATE_RESPONDED 0 /* Set if the server responded */
525
#define AFS_ESTATE_SUPERSEDED 1 /* Set if this record has been superseded */
526
#define AFS_ESTATE_IS_YFS 2 /* Set if probe upgraded to YFS */
527
#define AFS_ESTATE_NOT_YFS 3 /* Set if probe didn't upgrade to YFS */
528
#define AFS_ESTATE_LOCAL_FAILURE 4 /* Set if there was a local failure (eg. ENOMEM) */
529
};
530
531
/*
532
* Record of fileserver with which we're actively communicating.
533
*/
534
struct afs_server {
535
struct rcu_head rcu;
536
union {
537
uuid_t uuid; /* Server ID */
538
struct afs_uuid _uuid;
539
};
540
541
struct afs_cell *cell; /* Cell to which belongs (pins ref) */
542
struct rb_node uuid_rb; /* Link in cell->fs_servers */
543
struct list_head probe_link; /* Link in net->fs_probe_* */
544
struct hlist_node proc_link; /* Link in net->fs_proc */
545
struct list_head volumes; /* RCU list of afs_server_entry objects */
546
struct work_struct destroyer; /* Work item to try and destroy a server */
547
struct timer_list timer; /* Management timer */
548
struct mutex cm_token_lock; /* Lock governing creation of appdata */
549
struct krb5_buffer cm_rxgk_appdata; /* Appdata to be included in RESPONSE packet */
550
time64_t unuse_time; /* Time at which last unused */
551
unsigned long flags;
552
#define AFS_SERVER_FL_RESPONDING 0 /* The server is responding */
553
#define AFS_SERVER_FL_UPDATING 1
554
#define AFS_SERVER_FL_NEEDS_UPDATE 2 /* Fileserver address list is out of date */
555
#define AFS_SERVER_FL_UNCREATED 3 /* The record needs creating */
556
#define AFS_SERVER_FL_CREATING 4 /* The record is being created */
557
#define AFS_SERVER_FL_EXPIRED 5 /* The record has expired */
558
#define AFS_SERVER_FL_NOT_FOUND 6 /* VL server says no such server */
559
#define AFS_SERVER_FL_VL_FAIL 7 /* Failed to access VL server */
560
#define AFS_SERVER_FL_MAY_HAVE_CB 8 /* May have callbacks on this fileserver */
561
#define AFS_SERVER_FL_IS_YFS 16 /* Server is YFS not AFS */
562
#define AFS_SERVER_FL_NO_IBULK 17 /* Fileserver doesn't support FS.InlineBulkStatus */
563
#define AFS_SERVER_FL_NO_RM2 18 /* Fileserver doesn't support YFS.RemoveFile2 */
564
#define AFS_SERVER_FL_HAS_FS64 19 /* Fileserver supports FS.{Fetch,Store}Data64 */
565
#define AFS_SERVER_FL_NO_RENAME2 20 /* YFS Fileserver doesn't support enhanced rename */
566
refcount_t ref; /* Object refcount */
567
atomic_t active; /* Active user count */
568
u32 addr_version; /* Address list version */
569
u16 service_id; /* Service ID we're using. */
570
short create_error; /* Creation error */
571
unsigned int rtt; /* Server's current RTT in uS */
572
unsigned int debug_id; /* Debugging ID for traces */
573
574
/* file service access */
575
rwlock_t fs_lock; /* access lock */
576
577
/* Probe state */
578
struct afs_endpoint_state __rcu *endpoint_state; /* Latest endpoint/probe state */
579
unsigned long probed_at; /* Time last probe was dispatched (jiffies) */
580
wait_queue_head_t probe_wq;
581
unsigned int probe_counter; /* Number of probes issued */
582
spinlock_t probe_lock;
583
};
584
585
enum afs_ro_replicating {
586
AFS_RO_NOT_REPLICATING, /* Not doing replication */
587
AFS_RO_REPLICATING_USE_OLD, /* Replicating; use old version */
588
AFS_RO_REPLICATING_USE_NEW, /* Replicating; switch to new version */
589
} __mode(byte);
590
591
/*
592
* Replaceable volume server list.
593
*/
594
struct afs_server_entry {
595
struct afs_server *server;
596
struct afs_volume *volume;
597
struct list_head slink; /* Link in server->volumes */
598
time64_t cb_expires_at; /* Time at which volume-level callback expires */
599
unsigned long flags;
600
#define AFS_SE_EXCLUDED 0 /* Set if server is to be excluded in rotation */
601
#define AFS_SE_VOLUME_OFFLINE 1 /* Set if volume offline notice given */
602
#define AFS_SE_VOLUME_BUSY 2 /* Set if volume busy notice given */
603
};
604
605
struct afs_server_list {
606
struct rcu_head rcu;
607
refcount_t usage;
608
bool attached; /* T if attached to servers */
609
enum afs_ro_replicating ro_replicating; /* RW->RO update (probably) in progress */
610
unsigned char nr_servers;
611
unsigned short vnovol_mask; /* Servers to be skipped due to VNOVOL */
612
unsigned int seq; /* Set to ->servers_seq when installed */
613
rwlock_t lock;
614
struct afs_server_entry servers[];
615
};
616
617
/*
618
* Live AFS volume management.
619
*/
620
struct afs_volume {
621
struct rcu_head rcu;
622
afs_volid_t vid; /* The volume ID of this volume */
623
afs_volid_t vids[AFS_MAXTYPES]; /* All associated volume IDs */
624
refcount_t ref;
625
unsigned int debug_id; /* Debugging ID for traces */
626
time64_t update_at; /* Time at which to next update */
627
struct afs_cell *cell; /* Cell to which belongs (pins ref) */
628
struct rb_node cell_node; /* Link in cell->volumes */
629
struct hlist_node proc_link; /* Link in cell->proc_volumes */
630
struct super_block __rcu *sb; /* Superblock on which inodes reside */
631
struct work_struct destructor; /* Deferred destructor */
632
unsigned long flags;
633
#define AFS_VOLUME_NEEDS_UPDATE 0 /* - T if an update needs performing */
634
#define AFS_VOLUME_UPDATING 1 /* - T if an update is in progress */
635
#define AFS_VOLUME_WAIT 2 /* - T if users must wait for update */
636
#define AFS_VOLUME_DELETED 3 /* - T if volume appears deleted */
637
#define AFS_VOLUME_MAYBE_NO_IBULK 4 /* - T if some servers don't have InlineBulkStatus */
638
#define AFS_VOLUME_RM_TREE 5 /* - Set if volume removed from cell->volumes */
639
#ifdef CONFIG_AFS_FSCACHE
640
struct fscache_volume *cache; /* Caching cookie */
641
#endif
642
struct afs_server_list __rcu *servers; /* List of servers on which volume resides */
643
rwlock_t servers_lock; /* Lock for ->servers */
644
unsigned int servers_seq; /* Incremented each time ->servers changes */
645
646
/* RO release tracking */
647
struct mutex volsync_lock; /* Time/state evaluation lock */
648
time64_t creation_time; /* Volume creation time (or TIME64_MIN) */
649
time64_t update_time; /* Volume update time (or TIME64_MIN) */
650
651
/* Callback management */
652
struct mutex cb_check_lock; /* Lock to control race to check after v_break */
653
time64_t cb_expires_at; /* Earliest volume callback expiry time */
654
atomic_t cb_ro_snapshot; /* RO volume update-from-snapshot counter */
655
atomic_t cb_v_break; /* Volume-break event counter. */
656
atomic_t cb_v_check; /* Volume-break has-been-checked counter. */
657
atomic_t cb_scrub; /* Scrub-all-data event counter. */
658
rwlock_t cb_v_break_lock;
659
struct rw_semaphore open_mmaps_lock;
660
struct list_head open_mmaps; /* List of vnodes that are mmapped */
661
662
afs_voltype_t type; /* type of volume */
663
char type_force; /* force volume type (suppress R/O -> R/W) */
664
u8 name_len;
665
u8 name[AFS_MAXVOLNAME + 1]; /* NUL-padded volume name */
666
};
667
668
enum afs_lock_state {
669
AFS_VNODE_LOCK_NONE, /* The vnode has no lock on the server */
670
AFS_VNODE_LOCK_WAITING_FOR_CB, /* We're waiting for the server to break the callback */
671
AFS_VNODE_LOCK_SETTING, /* We're asking the server for a lock */
672
AFS_VNODE_LOCK_GRANTED, /* We have a lock on the server */
673
AFS_VNODE_LOCK_EXTENDING, /* We're extending a lock on the server */
674
AFS_VNODE_LOCK_NEED_UNLOCK, /* We need to unlock on the server */
675
AFS_VNODE_LOCK_UNLOCKING, /* We're telling the server to unlock */
676
AFS_VNODE_LOCK_DELETED, /* The vnode has been deleted whilst we have a lock */
677
};
678
679
/*
680
* AFS inode private data.
681
*
682
* Note that afs_alloc_inode() *must* reset anything that could incorrectly
683
* leak from one inode to another.
684
*/
685
struct afs_vnode {
686
struct netfs_inode netfs; /* Netfslib context and vfs inode */
687
struct afs_volume *volume; /* volume on which vnode resides */
688
struct afs_fid fid; /* the file identifier for this inode */
689
struct afs_file_status status; /* AFS status info for this file */
690
afs_dataversion_t invalid_before; /* Child dentries are invalid before this */
691
struct afs_permits __rcu *permit_cache; /* cache of permits so far obtained */
692
struct list_head io_lock_waiters; /* Threads waiting for the I/O lock */
693
struct rw_semaphore validate_lock; /* lock for validating this vnode */
694
struct rw_semaphore rmdir_lock; /* Lock for rmdir vs sillyrename */
695
struct key *silly_key; /* Silly rename key */
696
spinlock_t wb_lock; /* lock for wb_keys */
697
spinlock_t lock; /* waitqueue/flags lock */
698
unsigned long flags;
699
#define AFS_VNODE_IO_LOCK 0 /* Set if the I/O serialisation lock is held */
700
#define AFS_VNODE_UNSET 1 /* set if vnode attributes not yet set */
701
#define AFS_VNODE_DIR_VALID 2 /* Set if dir contents are valid */
702
#define AFS_VNODE_ZAP_DATA 3 /* set if vnode's data should be invalidated */
703
#define AFS_VNODE_DELETED 4 /* set if vnode deleted on server */
704
#define AFS_VNODE_MOUNTPOINT 5 /* set if vnode is a mountpoint symlink */
705
#define AFS_VNODE_PSEUDODIR 7 /* set if Vnode is a pseudo directory */
706
#define AFS_VNODE_NEW_CONTENT 8 /* Set if file has new content (create/trunc-0) */
707
#define AFS_VNODE_SILLY_DELETED 9 /* Set if file has been silly-deleted */
708
#define AFS_VNODE_MODIFYING 10 /* Set if we're performing a modification op */
709
#define AFS_VNODE_DIR_READ 11 /* Set if we've read a dir's contents */
710
711
struct folio_queue *directory; /* Directory contents */
712
struct list_head wb_keys; /* List of keys available for writeback */
713
struct list_head pending_locks; /* locks waiting to be granted */
714
struct list_head granted_locks; /* locks granted on this file */
715
struct delayed_work lock_work; /* work to be done in locking */
716
struct key *lock_key; /* Key to be used in lock ops */
717
ktime_t locked_at; /* Time at which lock obtained */
718
enum afs_lock_state lock_state : 8;
719
afs_lock_type_t lock_type : 8;
720
unsigned int directory_size; /* Amount of space in ->directory */
721
722
/* outstanding callback notification on this file */
723
struct work_struct cb_work; /* Work for mmap'd files */
724
struct list_head cb_mmap_link; /* Link in cell->fs_open_mmaps */
725
void *cb_server; /* Server with callback/filelock */
726
atomic_t cb_nr_mmap; /* Number of mmaps */
727
unsigned int cb_ro_snapshot; /* RO volume release counter on ->volume */
728
unsigned int cb_scrub; /* Scrub counter on ->volume */
729
unsigned int cb_break; /* Break counter on vnode */
730
unsigned int cb_v_check; /* Break check counter on ->volume */
731
seqlock_t cb_lock; /* Lock for ->cb_server, ->status, ->cb_*break */
732
733
atomic64_t cb_expires_at; /* time at which callback expires */
734
#define AFS_NO_CB_PROMISE TIME64_MIN
735
};
736
737
static inline struct fscache_cookie *afs_vnode_cache(struct afs_vnode *vnode)
738
{
739
#ifdef CONFIG_AFS_FSCACHE
740
return netfs_i_cookie(&vnode->netfs);
741
#else
742
return NULL;
743
#endif
744
}
745
746
static inline void afs_vnode_set_cache(struct afs_vnode *vnode,
747
struct fscache_cookie *cookie)
748
{
749
#ifdef CONFIG_AFS_FSCACHE
750
vnode->netfs.cache = cookie;
751
if (cookie)
752
mapping_set_release_always(vnode->netfs.inode.i_mapping);
753
#endif
754
}
755
756
/*
757
* cached security record for one user's attempt to access a vnode
758
*/
759
struct afs_permit {
760
struct key *key; /* RxRPC ticket holding a security context */
761
afs_access_t access; /* CallerAccess value for this key */
762
};
763
764
/*
765
* Immutable cache of CallerAccess records from attempts to access vnodes.
766
* These may be shared between multiple vnodes.
767
*/
768
struct afs_permits {
769
struct rcu_head rcu;
770
struct hlist_node hash_node; /* Link in hash */
771
unsigned long h; /* Hash value for this permit list */
772
refcount_t usage;
773
unsigned short nr_permits; /* Number of records */
774
bool invalidated; /* Invalidated due to key change */
775
struct afs_permit permits[] __counted_by(nr_permits); /* List of permits sorted by key pointer */
776
};
777
778
/*
779
* Error prioritisation and accumulation.
780
*/
781
struct afs_error {
782
s32 abort_code; /* Cumulative abort code */
783
short error; /* Cumulative error */
784
bool responded; /* T if server responded */
785
bool aborted; /* T if ->error is from an abort */
786
};
787
788
/*
789
* Cursor for iterating over a set of volume location servers.
790
*/
791
struct afs_vl_cursor {
792
struct afs_cell *cell; /* The cell we're querying */
793
struct afs_vlserver_list *server_list; /* Current server list (pins ref) */
794
struct afs_vlserver *server; /* Server on which this resides */
795
struct afs_addr_list *alist; /* Current address list (pins ref) */
796
struct key *key; /* Key for the server */
797
unsigned long untried_servers; /* Bitmask of untried servers */
798
unsigned long addr_tried; /* Tried addresses */
799
struct afs_error cumul_error; /* Cumulative error */
800
unsigned int debug_id;
801
s32 call_abort_code;
802
short call_error; /* Error from single call */
803
short server_index; /* Current server */
804
signed char addr_index; /* Current address */
805
unsigned short flags;
806
#define AFS_VL_CURSOR_STOP 0x0001 /* Set to cease iteration */
807
#define AFS_VL_CURSOR_RETRY 0x0002 /* Set to do a retry */
808
#define AFS_VL_CURSOR_RETRIED 0x0004 /* Set if started a retry */
809
short nr_iterations; /* Number of server iterations */
810
bool call_responded; /* T if the current address responded */
811
};
812
813
/*
814
* Fileserver state tracking for an operation. An array of these is kept,
815
* indexed by server index.
816
*/
817
struct afs_server_state {
818
/* Tracking of fileserver probe state. Other operations may interfere
819
* by probing a fileserver when accessing other volumes.
820
*/
821
unsigned int probe_seq;
822
unsigned long untried_addrs; /* Addresses we haven't tried yet */
823
struct wait_queue_entry probe_waiter;
824
struct afs_endpoint_state *endpoint_state; /* Endpoint state being monitored */
825
};
826
827
/*
828
* Fileserver operation methods.
829
*/
830
struct afs_operation_ops {
831
void (*issue_afs_rpc)(struct afs_operation *op);
832
void (*issue_yfs_rpc)(struct afs_operation *op);
833
void (*success)(struct afs_operation *op);
834
void (*aborted)(struct afs_operation *op);
835
void (*failed)(struct afs_operation *op);
836
void (*edit_dir)(struct afs_operation *op);
837
void (*put)(struct afs_operation *op);
838
};
839
840
struct afs_vnode_param {
841
struct afs_vnode *vnode;
842
struct afs_fid fid; /* Fid to access */
843
struct afs_status_cb scb; /* Returned status and callback promise */
844
afs_dataversion_t dv_before; /* Data version before the call */
845
unsigned int cb_break_before; /* cb_break before the call */
846
u8 dv_delta; /* Expected change in data version */
847
bool put_vnode:1; /* T if we have a ref on the vnode */
848
bool need_io_lock:1; /* T if we need the I/O lock on this */
849
bool update_ctime:1; /* Need to update the ctime */
850
bool set_size:1; /* Must update i_size */
851
bool op_unlinked:1; /* True if file was unlinked by op */
852
bool speculative:1; /* T if speculative status fetch (no vnode lock) */
853
bool modification:1; /* Set if the content gets modified */
854
};
855
856
/*
857
* Fileserver operation wrapper, handling server and address rotation
858
* asynchronously. May make simultaneous calls to multiple servers.
859
*/
860
struct afs_operation {
861
struct afs_net *net; /* Network namespace */
862
struct key *key; /* Key for the cell */
863
const struct afs_call_type *type; /* Type of call done */
864
const struct afs_operation_ops *ops;
865
866
/* Parameters/results for the operation */
867
struct afs_volume *volume; /* Volume being accessed */
868
struct afs_vnode_param file[2];
869
struct afs_vnode_param *more_files;
870
struct afs_volsync pre_volsync; /* Volsync before op */
871
struct afs_volsync volsync; /* Volsync returned by op */
872
struct dentry *dentry; /* Dentry to be altered */
873
struct dentry *dentry_2; /* Second dentry to be altered */
874
struct timespec64 mtime; /* Modification time to record */
875
struct timespec64 ctime; /* Change time to set */
876
struct afs_error cumul_error; /* Cumulative error */
877
short nr_files; /* Number of entries in file[], more_files */
878
unsigned int debug_id;
879
880
unsigned int cb_v_break; /* Volume break counter before op */
881
882
union {
883
struct {
884
int which; /* Which ->file[] to fetch for */
885
} fetch_status;
886
struct {
887
int reason; /* enum afs_edit_dir_reason */
888
mode_t mode;
889
const char *symlink;
890
} create;
891
struct {
892
bool need_rehash;
893
} unlink;
894
struct {
895
struct dentry *rehash;
896
struct dentry *tmp;
897
unsigned int rename_flags;
898
bool new_negative;
899
} rename;
900
struct {
901
struct netfs_io_subrequest *subreq;
902
} fetch;
903
struct {
904
afs_lock_type_t type;
905
} lock;
906
struct {
907
struct iov_iter *write_iter;
908
loff_t pos;
909
loff_t size;
910
loff_t i_size;
911
} store;
912
struct {
913
struct iattr *attr;
914
loff_t old_i_size;
915
} setattr;
916
struct afs_acl *acl;
917
struct yfs_acl *yacl;
918
struct {
919
struct afs_volume_status vs;
920
struct kstatfs *buf;
921
} volstatus;
922
};
923
924
/* Fileserver iteration state */
925
struct afs_server_list *server_list; /* Current server list (pins ref) */
926
struct afs_server *server; /* Server we're using (ref pinned by server_list) */
927
struct afs_endpoint_state *estate; /* Current endpoint state (doesn't pin ref) */
928
struct afs_server_state *server_states; /* States of the servers involved */
929
struct afs_call *call;
930
unsigned long untried_servers; /* Bitmask of untried servers */
931
unsigned long addr_tried; /* Tried addresses */
932
s32 call_abort_code; /* Abort code from single call */
933
short call_error; /* Error from single call */
934
short server_index; /* Current server */
935
short nr_iterations; /* Number of server iterations */
936
signed char addr_index; /* Current address */
937
bool call_responded; /* T if the current address responded */
938
939
unsigned int flags;
940
#define AFS_OPERATION_STOP 0x0001 /* Set to cease iteration */
941
#define AFS_OPERATION_VBUSY 0x0002 /* Set if seen VBUSY */
942
#define AFS_OPERATION_VMOVED 0x0004 /* Set if seen VMOVED */
943
#define AFS_OPERATION_VNOVOL 0x0008 /* Set if seen VNOVOL */
944
#define AFS_OPERATION_CUR_ONLY 0x0010 /* Set if current server only (file lock held) */
945
#define AFS_OPERATION_NO_VSLEEP 0x0020 /* Set to prevent sleep on VBUSY, VOFFLINE, ... */
946
#define AFS_OPERATION_UNINTR 0x0040 /* Set if op is uninterruptible */
947
#define AFS_OPERATION_DOWNGRADE 0x0080 /* Set to retry with downgraded opcode */
948
#define AFS_OPERATION_LOCK_0 0x0100 /* Set if have io_lock on file[0] */
949
#define AFS_OPERATION_LOCK_1 0x0200 /* Set if have io_lock on file[1] */
950
#define AFS_OPERATION_TRIED_ALL 0x0400 /* Set if we've tried all the fileservers */
951
#define AFS_OPERATION_RETRY_SERVER 0x0800 /* Set if we should retry the current server */
952
#define AFS_OPERATION_DIR_CONFLICT 0x1000 /* Set if we detected a 3rd-party dir change */
953
#define AFS_OPERATION_ASYNC 0x2000 /* Set if should run asynchronously */
954
};
955
956
/*
957
* Cache auxiliary data.
958
*/
959
struct afs_vnode_cache_aux {
960
__be64 data_version;
961
} __packed;
962
963
static inline void afs_set_cache_aux(struct afs_vnode *vnode,
964
struct afs_vnode_cache_aux *aux)
965
{
966
aux->data_version = cpu_to_be64(vnode->status.data_version);
967
}
968
969
static inline void afs_invalidate_cache(struct afs_vnode *vnode, unsigned int flags)
970
{
971
struct afs_vnode_cache_aux aux;
972
973
afs_set_cache_aux(vnode, &aux);
974
fscache_invalidate(afs_vnode_cache(vnode), &aux,
975
i_size_read(&vnode->netfs.inode), flags);
976
}
977
978
/*
979
* Directory iteration management.
980
*/
981
struct afs_dir_iter {
982
struct afs_vnode *dvnode;
983
union afs_xdr_dir_block *block;
984
struct folio_queue *fq;
985
unsigned int fpos;
986
int fq_slot;
987
unsigned int loop_check;
988
u8 nr_slots;
989
u8 bucket;
990
unsigned int prev_entry;
991
};
992
993
#include <trace/events/afs.h>
994
995
/*****************************************************************************/
996
/*
997
* addr_list.c
998
*/
999
struct afs_addr_list *afs_get_addrlist(struct afs_addr_list *alist, enum afs_alist_trace reason);
1000
extern struct afs_addr_list *afs_alloc_addrlist(unsigned int nr);
1001
extern void afs_put_addrlist(struct afs_addr_list *alist, enum afs_alist_trace reason);
1002
extern struct afs_vlserver_list *afs_parse_text_addrs(struct afs_net *,
1003
const char *, size_t, char,
1004
unsigned short, unsigned short);
1005
bool afs_addr_list_same(const struct afs_addr_list *a,
1006
const struct afs_addr_list *b);
1007
extern struct afs_vlserver_list *afs_dns_query(struct afs_cell *, time64_t *);
1008
1009
extern int afs_merge_fs_addr4(struct afs_net *net, struct afs_addr_list *addr,
1010
__be32 xdr, u16 port);
1011
extern int afs_merge_fs_addr6(struct afs_net *net, struct afs_addr_list *addr,
1012
__be32 *xdr, u16 port);
1013
void afs_set_peer_appdata(struct afs_server *server,
1014
struct afs_addr_list *old_alist,
1015
struct afs_addr_list *new_alist);
1016
1017
/*
1018
* addr_prefs.c
1019
*/
1020
int afs_proc_addr_prefs_write(struct file *file, char *buf, size_t size);
1021
void afs_get_address_preferences_rcu(struct afs_net *net, struct afs_addr_list *alist);
1022
void afs_get_address_preferences(struct afs_net *net, struct afs_addr_list *alist);
1023
1024
/*
1025
* callback.c
1026
*/
1027
extern void afs_invalidate_mmap_work(struct work_struct *);
1028
extern void afs_init_callback_state(struct afs_server *);
1029
extern void __afs_break_callback(struct afs_vnode *, enum afs_cb_break_reason);
1030
extern void afs_break_callback(struct afs_vnode *, enum afs_cb_break_reason);
1031
extern void afs_break_callbacks(struct afs_server *, size_t, struct afs_callback_break *);
1032
1033
static inline unsigned int afs_calc_vnode_cb_break(struct afs_vnode *vnode)
1034
{
1035
return vnode->cb_break + vnode->cb_ro_snapshot + vnode->cb_scrub;
1036
}
1037
1038
static inline bool afs_cb_is_broken(unsigned int cb_break,
1039
const struct afs_vnode *vnode)
1040
{
1041
return cb_break != (vnode->cb_break +
1042
atomic_read(&vnode->volume->cb_ro_snapshot) +
1043
atomic_read(&vnode->volume->cb_scrub));
1044
}
1045
1046
/*
1047
* cell.c
1048
*/
1049
extern int afs_cell_init(struct afs_net *, const char *);
1050
extern struct afs_cell *afs_find_cell(struct afs_net *, const char *, unsigned,
1051
enum afs_cell_trace);
1052
struct afs_cell *afs_lookup_cell(struct afs_net *net,
1053
const char *name, unsigned int namesz,
1054
const char *vllist, bool excl,
1055
enum afs_cell_trace trace);
1056
extern struct afs_cell *afs_use_cell(struct afs_cell *, enum afs_cell_trace);
1057
void afs_unuse_cell(struct afs_cell *cell, enum afs_cell_trace reason);
1058
extern struct afs_cell *afs_get_cell(struct afs_cell *, enum afs_cell_trace);
1059
extern void afs_see_cell(struct afs_cell *, enum afs_cell_trace);
1060
extern void afs_put_cell(struct afs_cell *, enum afs_cell_trace);
1061
extern void afs_queue_cell(struct afs_cell *, enum afs_cell_trace);
1062
void afs_set_cell_timer(struct afs_cell *cell, unsigned int delay_secs);
1063
extern void __net_exit afs_cell_purge(struct afs_net *);
1064
1065
/*
1066
* cmservice.c
1067
*/
1068
extern bool afs_cm_incoming_call(struct afs_call *);
1069
1070
/*
1071
* cm_security.c
1072
*/
1073
void afs_process_oob_queue(struct work_struct *work);
1074
#ifdef CONFIG_RXGK
1075
int afs_create_token_key(struct afs_net *net, struct socket *socket);
1076
#else
1077
static inline int afs_create_token_key(struct afs_net *net, struct socket *socket)
1078
{
1079
return 0;
1080
}
1081
#endif
1082
1083
/*
1084
* dir.c
1085
*/
1086
extern const struct file_operations afs_dir_file_operations;
1087
extern const struct inode_operations afs_dir_inode_operations;
1088
extern const struct address_space_operations afs_dir_aops;
1089
extern const struct dentry_operations afs_fs_dentry_operations;
1090
1091
ssize_t afs_read_single(struct afs_vnode *dvnode, struct file *file);
1092
ssize_t afs_read_dir(struct afs_vnode *dvnode, struct file *file)
1093
__acquires(&dvnode->validate_lock);
1094
extern void afs_d_release(struct dentry *);
1095
extern void afs_check_for_remote_deletion(struct afs_operation *);
1096
int afs_single_writepages(struct address_space *mapping,
1097
struct writeback_control *wbc);
1098
1099
/*
1100
* dir_edit.c
1101
*/
1102
extern void afs_edit_dir_add(struct afs_vnode *, const struct qstr *, struct afs_fid *,
1103
enum afs_edit_dir_reason);
1104
extern void afs_edit_dir_remove(struct afs_vnode *, const struct qstr *, enum afs_edit_dir_reason);
1105
void afs_edit_dir_update(struct afs_vnode *vnode, const struct qstr *name,
1106
struct afs_vnode *new_dvnode, enum afs_edit_dir_reason why);
1107
void afs_mkdir_init_dir(struct afs_vnode *dvnode, struct afs_vnode *parent_vnode);
1108
1109
/*
1110
* dir_search.c
1111
*/
1112
unsigned int afs_dir_hash_name(const struct qstr *name);
1113
bool afs_dir_init_iter(struct afs_dir_iter *iter, const struct qstr *name);
1114
union afs_xdr_dir_block *afs_dir_find_block(struct afs_dir_iter *iter, size_t block);
1115
int afs_dir_search_bucket(struct afs_dir_iter *iter, const struct qstr *name,
1116
struct afs_fid *_fid);
1117
int afs_dir_search(struct afs_vnode *dvnode, const struct qstr *name,
1118
struct afs_fid *_fid, afs_dataversion_t *_dir_version);
1119
1120
/*
1121
* dir_silly.c
1122
*/
1123
extern int afs_sillyrename(struct afs_vnode *, struct afs_vnode *,
1124
struct dentry *, struct key *);
1125
extern int afs_silly_iput(struct dentry *, struct inode *);
1126
1127
/*
1128
* dynroot.c
1129
*/
1130
extern const struct inode_operations afs_dynroot_inode_operations;
1131
extern const struct dentry_operations afs_dynroot_dentry_operations;
1132
1133
struct inode *afs_dynroot_iget_root(struct super_block *sb);
1134
1135
/*
1136
* file.c
1137
*/
1138
extern const struct address_space_operations afs_file_aops;
1139
extern const struct inode_operations afs_file_inode_operations;
1140
extern const struct file_operations afs_file_operations;
1141
extern const struct afs_operation_ops afs_fetch_data_operation;
1142
extern const struct netfs_request_ops afs_req_ops;
1143
1144
extern int afs_cache_wb_key(struct afs_vnode *, struct afs_file *);
1145
extern void afs_put_wb_key(struct afs_wb_key *);
1146
extern int afs_open(struct inode *, struct file *);
1147
extern int afs_release(struct inode *, struct file *);
1148
void afs_fetch_data_async_rx(struct work_struct *work);
1149
void afs_fetch_data_immediate_cancel(struct afs_call *call);
1150
1151
/*
1152
* flock.c
1153
*/
1154
extern struct workqueue_struct *afs_lock_manager;
1155
1156
extern void afs_lock_op_done(struct afs_call *);
1157
extern void afs_lock_work(struct work_struct *);
1158
extern void afs_lock_may_be_available(struct afs_vnode *);
1159
extern int afs_lock(struct file *, int, struct file_lock *);
1160
extern int afs_flock(struct file *, int, struct file_lock *);
1161
1162
/*
1163
* fsclient.c
1164
*/
1165
extern void afs_fs_fetch_status(struct afs_operation *);
1166
extern void afs_fs_fetch_data(struct afs_operation *);
1167
extern void afs_fs_create_file(struct afs_operation *);
1168
extern void afs_fs_make_dir(struct afs_operation *);
1169
extern void afs_fs_remove_file(struct afs_operation *);
1170
extern void afs_fs_remove_dir(struct afs_operation *);
1171
extern void afs_fs_link(struct afs_operation *);
1172
extern void afs_fs_symlink(struct afs_operation *);
1173
extern void afs_fs_rename(struct afs_operation *);
1174
extern void afs_fs_store_data(struct afs_operation *);
1175
extern void afs_fs_setattr(struct afs_operation *);
1176
extern void afs_fs_get_volume_status(struct afs_operation *);
1177
extern void afs_fs_set_lock(struct afs_operation *);
1178
extern void afs_fs_extend_lock(struct afs_operation *);
1179
extern void afs_fs_release_lock(struct afs_operation *);
1180
int afs_fs_give_up_all_callbacks(struct afs_net *net, struct afs_server *server,
1181
struct afs_address *addr, struct key *key);
1182
bool afs_fs_get_capabilities(struct afs_net *net, struct afs_server *server,
1183
struct afs_endpoint_state *estate, unsigned int addr_index,
1184
struct key *key);
1185
extern void afs_fs_inline_bulk_status(struct afs_operation *);
1186
1187
struct afs_acl {
1188
u32 size;
1189
u8 data[] __counted_by(size);
1190
};
1191
1192
extern void afs_fs_fetch_acl(struct afs_operation *);
1193
extern void afs_fs_store_acl(struct afs_operation *);
1194
1195
/*
1196
* fs_operation.c
1197
*/
1198
extern struct afs_operation *afs_alloc_operation(struct key *, struct afs_volume *);
1199
extern int afs_put_operation(struct afs_operation *);
1200
extern bool afs_begin_vnode_operation(struct afs_operation *);
1201
extern void afs_end_vnode_operation(struct afs_operation *op);
1202
extern void afs_wait_for_operation(struct afs_operation *);
1203
extern int afs_do_sync_operation(struct afs_operation *);
1204
1205
static inline void afs_op_set_vnode(struct afs_operation *op, unsigned int n,
1206
struct afs_vnode *vnode)
1207
{
1208
op->file[n].vnode = vnode;
1209
op->file[n].need_io_lock = true;
1210
}
1211
1212
static inline void afs_op_set_fid(struct afs_operation *op, unsigned int n,
1213
const struct afs_fid *fid)
1214
{
1215
op->file[n].fid = *fid;
1216
}
1217
1218
/*
1219
* fs_probe.c
1220
*/
1221
struct afs_endpoint_state *afs_get_endpoint_state(struct afs_endpoint_state *estate,
1222
enum afs_estate_trace where);
1223
void afs_put_endpoint_state(struct afs_endpoint_state *estate, enum afs_estate_trace where);
1224
extern void afs_fileserver_probe_result(struct afs_call *);
1225
int afs_fs_probe_fileserver(struct afs_net *net, struct afs_server *server,
1226
struct afs_addr_list *new_alist, struct key *key);
1227
int afs_wait_for_fs_probes(struct afs_operation *op, struct afs_server_state *states, bool intr);
1228
extern void afs_probe_fileserver(struct afs_net *, struct afs_server *);
1229
extern void afs_fs_probe_dispatcher(struct work_struct *);
1230
int afs_wait_for_one_fs_probe(struct afs_server *server, struct afs_endpoint_state *estate,
1231
unsigned long exclude, bool is_intr);
1232
extern void afs_fs_probe_cleanup(struct afs_net *);
1233
1234
/*
1235
* inode.c
1236
*/
1237
extern const struct afs_operation_ops afs_fetch_status_operation;
1238
1239
void afs_init_new_symlink(struct afs_vnode *vnode, struct afs_operation *op);
1240
const char *afs_get_link(struct dentry *dentry, struct inode *inode,
1241
struct delayed_call *callback);
1242
int afs_readlink(struct dentry *dentry, char __user *buffer, int buflen);
1243
extern void afs_vnode_commit_status(struct afs_operation *, struct afs_vnode_param *);
1244
extern int afs_fetch_status(struct afs_vnode *, struct key *, bool, afs_access_t *);
1245
extern int afs_ilookup5_test_by_fid(struct inode *, void *);
1246
extern struct inode *afs_iget(struct afs_operation *, struct afs_vnode_param *);
1247
extern struct inode *afs_root_iget(struct super_block *, struct key *);
1248
extern int afs_getattr(struct mnt_idmap *idmap, const struct path *,
1249
struct kstat *, u32, unsigned int);
1250
extern int afs_setattr(struct mnt_idmap *idmap, struct dentry *, struct iattr *);
1251
extern void afs_evict_inode(struct inode *);
1252
extern int afs_drop_inode(struct inode *);
1253
1254
/*
1255
* main.c
1256
*/
1257
extern struct workqueue_struct *afs_wq;
1258
extern int afs_net_id;
1259
1260
static inline struct afs_net *afs_net(struct net *net)
1261
{
1262
return net_generic(net, afs_net_id);
1263
}
1264
1265
static inline struct afs_net *afs_sb2net(struct super_block *sb)
1266
{
1267
return afs_net(AFS_FS_S(sb)->net_ns);
1268
}
1269
1270
static inline struct afs_net *afs_d2net(struct dentry *dentry)
1271
{
1272
return afs_sb2net(dentry->d_sb);
1273
}
1274
1275
static inline struct afs_net *afs_i2net(struct inode *inode)
1276
{
1277
return afs_sb2net(inode->i_sb);
1278
}
1279
1280
static inline struct afs_net *afs_v2net(struct afs_vnode *vnode)
1281
{
1282
return afs_i2net(&vnode->netfs.inode);
1283
}
1284
1285
static inline struct afs_net *afs_sock2net(struct sock *sk)
1286
{
1287
return net_generic(sock_net(sk), afs_net_id);
1288
}
1289
1290
static inline void __afs_stat(atomic_t *s)
1291
{
1292
atomic_inc(s);
1293
}
1294
1295
#define afs_stat_v(vnode, n) __afs_stat(&afs_v2net(vnode)->n)
1296
1297
/*
1298
* misc.c
1299
*/
1300
extern int afs_abort_to_error(u32);
1301
extern void afs_prioritise_error(struct afs_error *, int, u32);
1302
1303
static inline void afs_op_nomem(struct afs_operation *op)
1304
{
1305
op->cumul_error.error = -ENOMEM;
1306
}
1307
1308
static inline int afs_op_error(const struct afs_operation *op)
1309
{
1310
return op->cumul_error.error;
1311
}
1312
1313
static inline s32 afs_op_abort_code(const struct afs_operation *op)
1314
{
1315
return op->cumul_error.abort_code;
1316
}
1317
1318
static inline int afs_op_set_error(struct afs_operation *op, int error)
1319
{
1320
return op->cumul_error.error = error;
1321
}
1322
1323
static inline void afs_op_accumulate_error(struct afs_operation *op, int error, s32 abort_code)
1324
{
1325
afs_prioritise_error(&op->cumul_error, error, abort_code);
1326
}
1327
1328
/*
1329
* mntpt.c
1330
*/
1331
extern const struct inode_operations afs_mntpt_inode_operations;
1332
extern const struct inode_operations afs_autocell_inode_operations;
1333
extern const struct file_operations afs_mntpt_file_operations;
1334
1335
extern struct vfsmount *afs_d_automount(struct path *);
1336
extern void afs_mntpt_kill_timer(void);
1337
1338
/*
1339
* proc.c
1340
*/
1341
#ifdef CONFIG_PROC_FS
1342
extern int __net_init afs_proc_init(struct afs_net *);
1343
extern void __net_exit afs_proc_cleanup(struct afs_net *);
1344
extern int afs_proc_cell_setup(struct afs_cell *);
1345
extern void afs_proc_cell_remove(struct afs_cell *);
1346
extern void afs_put_sysnames(struct afs_sysnames *);
1347
#else
1348
static inline int afs_proc_init(struct afs_net *net) { return 0; }
1349
static inline void afs_proc_cleanup(struct afs_net *net) {}
1350
static inline int afs_proc_cell_setup(struct afs_cell *cell) { return 0; }
1351
static inline void afs_proc_cell_remove(struct afs_cell *cell) {}
1352
static inline void afs_put_sysnames(struct afs_sysnames *sysnames) {}
1353
#endif
1354
1355
/*
1356
* rotate.c
1357
*/
1358
void afs_clear_server_states(struct afs_operation *op);
1359
extern bool afs_select_fileserver(struct afs_operation *);
1360
extern void afs_dump_edestaddrreq(const struct afs_operation *);
1361
1362
/*
1363
* rxrpc.c
1364
*/
1365
extern struct workqueue_struct *afs_async_calls;
1366
1367
extern int __net_init afs_open_socket(struct afs_net *);
1368
extern void __net_exit afs_close_socket(struct afs_net *);
1369
extern void afs_charge_preallocation(struct work_struct *);
1370
extern void afs_put_call(struct afs_call *);
1371
void afs_deferred_put_call(struct afs_call *call);
1372
void afs_make_call(struct afs_call *call, gfp_t gfp);
1373
void afs_deliver_to_call(struct afs_call *call);
1374
void afs_wait_for_call_to_complete(struct afs_call *call);
1375
extern struct afs_call *afs_alloc_flat_call(struct afs_net *,
1376
const struct afs_call_type *,
1377
size_t, size_t);
1378
extern void afs_flat_call_destructor(struct afs_call *);
1379
extern void afs_send_empty_reply(struct afs_call *);
1380
extern void afs_send_simple_reply(struct afs_call *, const void *, size_t);
1381
extern int afs_extract_data(struct afs_call *, bool);
1382
extern int afs_protocol_error(struct afs_call *, enum afs_eproto_cause);
1383
1384
static inline struct afs_call *afs_get_call(struct afs_call *call,
1385
enum afs_call_trace why)
1386
{
1387
int r;
1388
1389
__refcount_inc(&call->ref, &r);
1390
1391
trace_afs_call(call->debug_id, why, r + 1,
1392
atomic_read(&call->net->nr_outstanding_calls),
1393
__builtin_return_address(0));
1394
return call;
1395
}
1396
1397
static inline void afs_see_call(struct afs_call *call, enum afs_call_trace why)
1398
{
1399
int r = refcount_read(&call->ref);
1400
1401
trace_afs_call(call->debug_id, why, r,
1402
atomic_read(&call->net->nr_outstanding_calls),
1403
__builtin_return_address(0));
1404
}
1405
1406
static inline void afs_make_op_call(struct afs_operation *op, struct afs_call *call,
1407
gfp_t gfp)
1408
{
1409
struct afs_addr_list *alist = op->estate->addresses;
1410
1411
op->call = call;
1412
op->type = call->type;
1413
call->op = op;
1414
call->key = op->key;
1415
call->intr = !(op->flags & AFS_OPERATION_UNINTR);
1416
call->peer = rxrpc_kernel_get_peer(alist->addrs[op->addr_index].peer);
1417
call->service_id = op->server->service_id;
1418
afs_make_call(call, gfp);
1419
}
1420
1421
static inline void afs_extract_begin(struct afs_call *call, void *buf, size_t size)
1422
{
1423
call->iov_len = size;
1424
call->kvec[0].iov_base = buf;
1425
call->kvec[0].iov_len = size;
1426
iov_iter_kvec(&call->def_iter, ITER_DEST, call->kvec, 1, size);
1427
}
1428
1429
static inline void afs_extract_to_tmp(struct afs_call *call)
1430
{
1431
call->iov_len = sizeof(call->tmp);
1432
afs_extract_begin(call, &call->tmp, sizeof(call->tmp));
1433
}
1434
1435
static inline void afs_extract_to_tmp64(struct afs_call *call)
1436
{
1437
call->iov_len = sizeof(call->tmp64);
1438
afs_extract_begin(call, &call->tmp64, sizeof(call->tmp64));
1439
}
1440
1441
static inline void afs_extract_discard(struct afs_call *call, size_t size)
1442
{
1443
call->iov_len = size;
1444
iov_iter_discard(&call->def_iter, ITER_DEST, size);
1445
}
1446
1447
static inline void afs_extract_to_buf(struct afs_call *call, size_t size)
1448
{
1449
call->iov_len = size;
1450
afs_extract_begin(call, call->buffer, size);
1451
}
1452
1453
static inline int afs_transfer_reply(struct afs_call *call)
1454
{
1455
return afs_extract_data(call, false);
1456
}
1457
1458
static inline bool afs_check_call_state(struct afs_call *call,
1459
enum afs_call_state state)
1460
{
1461
return READ_ONCE(call->state) == state;
1462
}
1463
1464
static inline bool afs_set_call_state(struct afs_call *call,
1465
enum afs_call_state from,
1466
enum afs_call_state to)
1467
{
1468
bool ok = false;
1469
1470
spin_lock_bh(&call->state_lock);
1471
if (call->state == from) {
1472
call->state = to;
1473
trace_afs_call_state(call, from, to, 0, 0);
1474
ok = true;
1475
}
1476
spin_unlock_bh(&call->state_lock);
1477
return ok;
1478
}
1479
1480
static inline void afs_set_call_complete(struct afs_call *call,
1481
int error, u32 remote_abort)
1482
{
1483
enum afs_call_state state;
1484
bool ok = false;
1485
1486
spin_lock_bh(&call->state_lock);
1487
state = call->state;
1488
if (state != AFS_CALL_COMPLETE) {
1489
call->abort_code = remote_abort;
1490
call->error = error;
1491
call->state = AFS_CALL_COMPLETE;
1492
trace_afs_call_state(call, state, AFS_CALL_COMPLETE,
1493
error, remote_abort);
1494
ok = true;
1495
}
1496
spin_unlock_bh(&call->state_lock);
1497
if (ok) {
1498
trace_afs_call_done(call);
1499
1500
/* Asynchronous calls have two refs to release - one from the alloc and
1501
* one queued with the work item - and we can't just deallocate the
1502
* call because the work item may be queued again.
1503
*/
1504
if (call->drop_ref)
1505
afs_put_call(call);
1506
}
1507
}
1508
1509
/*
1510
* security.c
1511
*/
1512
extern void afs_put_permits(struct afs_permits *);
1513
extern void afs_clear_permits(struct afs_vnode *);
1514
extern void afs_cache_permit(struct afs_vnode *, struct key *, unsigned int,
1515
struct afs_status_cb *);
1516
extern struct key *afs_request_key(struct afs_cell *);
1517
extern struct key *afs_request_key_rcu(struct afs_cell *);
1518
extern int afs_check_permit(struct afs_vnode *, struct key *, afs_access_t *);
1519
extern int afs_permission(struct mnt_idmap *, struct inode *, int);
1520
extern void __exit afs_clean_up_permit_cache(void);
1521
1522
/*
1523
* server.c
1524
*/
1525
extern spinlock_t afs_server_peer_lock;
1526
1527
struct afs_server *afs_find_server(const struct rxrpc_peer *peer);
1528
extern struct afs_server *afs_lookup_server(struct afs_cell *, struct key *, const uuid_t *, u32);
1529
extern struct afs_server *afs_get_server(struct afs_server *, enum afs_server_trace);
1530
struct afs_server *afs_use_server(struct afs_server *server, bool activate,
1531
enum afs_server_trace reason);
1532
void afs_unuse_server(struct afs_net *net, struct afs_server *server,
1533
enum afs_server_trace reason);
1534
void afs_unuse_server_notime(struct afs_net *net, struct afs_server *server,
1535
enum afs_server_trace reason);
1536
extern void afs_put_server(struct afs_net *, struct afs_server *, enum afs_server_trace);
1537
void afs_purge_servers(struct afs_cell *cell);
1538
extern void afs_fs_probe_timer(struct timer_list *);
1539
void __net_exit afs_wait_for_servers(struct afs_net *net);
1540
bool afs_check_server_record(struct afs_operation *op, struct afs_server *server, struct key *key);
1541
1542
static inline void afs_see_server(struct afs_server *server, enum afs_server_trace trace)
1543
{
1544
int r = refcount_read(&server->ref);
1545
int a = atomic_read(&server->active);
1546
1547
trace_afs_server(server->debug_id, r, a, trace);
1548
1549
}
1550
1551
static inline void afs_inc_servers_outstanding(struct afs_net *net)
1552
{
1553
atomic_inc(&net->servers_outstanding);
1554
}
1555
1556
static inline void afs_dec_servers_outstanding(struct afs_net *net)
1557
{
1558
if (atomic_dec_and_test(&net->servers_outstanding))
1559
wake_up_var(&net->servers_outstanding);
1560
}
1561
1562
static inline bool afs_is_probing_server(struct afs_server *server)
1563
{
1564
return list_empty(&server->probe_link);
1565
}
1566
1567
/*
1568
* server_list.c
1569
*/
1570
static inline struct afs_server_list *afs_get_serverlist(struct afs_server_list *slist)
1571
{
1572
refcount_inc(&slist->usage);
1573
return slist;
1574
}
1575
1576
extern void afs_put_serverlist(struct afs_net *, struct afs_server_list *);
1577
struct afs_server_list *afs_alloc_server_list(struct afs_volume *volume,
1578
struct key *key,
1579
struct afs_vldb_entry *vldb);
1580
extern bool afs_annotate_server_list(struct afs_server_list *, struct afs_server_list *);
1581
void afs_attach_volume_to_servers(struct afs_volume *volume, struct afs_server_list *slist);
1582
void afs_reattach_volume_to_servers(struct afs_volume *volume, struct afs_server_list *slist,
1583
struct afs_server_list *old);
1584
void afs_detach_volume_from_servers(struct afs_volume *volume, struct afs_server_list *slist);
1585
1586
/*
1587
* super.c
1588
*/
1589
extern int __init afs_fs_init(void);
1590
extern void afs_fs_exit(void);
1591
1592
/*
1593
* validation.c
1594
*/
1595
bool afs_check_validity(const struct afs_vnode *vnode);
1596
int afs_update_volume_state(struct afs_operation *op);
1597
int afs_validate(struct afs_vnode *vnode, struct key *key);
1598
1599
/*
1600
* vlclient.c
1601
*/
1602
extern struct afs_vldb_entry *afs_vl_get_entry_by_name_u(struct afs_vl_cursor *,
1603
const char *, int);
1604
extern struct afs_addr_list *afs_vl_get_addrs_u(struct afs_vl_cursor *, const uuid_t *);
1605
struct afs_call *afs_vl_get_capabilities(struct afs_net *net,
1606
struct afs_addr_list *alist,
1607
unsigned int addr_index,
1608
struct key *key,
1609
struct afs_vlserver *server,
1610
unsigned int server_index);
1611
extern struct afs_addr_list *afs_yfsvl_get_endpoints(struct afs_vl_cursor *, const uuid_t *);
1612
extern char *afs_yfsvl_get_cell_name(struct afs_vl_cursor *);
1613
1614
/*
1615
* vl_alias.c
1616
*/
1617
extern int afs_cell_detect_alias(struct afs_cell *, struct key *);
1618
1619
/*
1620
* vl_probe.c
1621
*/
1622
extern void afs_vlserver_probe_result(struct afs_call *);
1623
extern int afs_send_vl_probes(struct afs_net *, struct key *, struct afs_vlserver_list *);
1624
extern int afs_wait_for_vl_probes(struct afs_vlserver_list *, unsigned long);
1625
1626
/*
1627
* vl_rotate.c
1628
*/
1629
extern bool afs_begin_vlserver_operation(struct afs_vl_cursor *,
1630
struct afs_cell *, struct key *);
1631
extern bool afs_select_vlserver(struct afs_vl_cursor *);
1632
extern bool afs_select_current_vlserver(struct afs_vl_cursor *);
1633
extern int afs_end_vlserver_operation(struct afs_vl_cursor *);
1634
1635
/*
1636
* vlserver_list.c
1637
*/
1638
static inline struct afs_vlserver *afs_get_vlserver(struct afs_vlserver *vlserver)
1639
{
1640
refcount_inc(&vlserver->ref);
1641
return vlserver;
1642
}
1643
1644
static inline struct afs_vlserver_list *afs_get_vlserverlist(struct afs_vlserver_list *vllist)
1645
{
1646
if (vllist)
1647
refcount_inc(&vllist->ref);
1648
return vllist;
1649
}
1650
1651
extern struct afs_vlserver *afs_alloc_vlserver(const char *, size_t, unsigned short);
1652
extern void afs_put_vlserver(struct afs_net *, struct afs_vlserver *);
1653
extern struct afs_vlserver_list *afs_alloc_vlserver_list(unsigned int);
1654
extern void afs_put_vlserverlist(struct afs_net *, struct afs_vlserver_list *);
1655
extern struct afs_vlserver_list *afs_extract_vlserver_list(struct afs_cell *,
1656
const void *, size_t);
1657
1658
/*
1659
* volume.c
1660
*/
1661
extern struct afs_volume *afs_create_volume(struct afs_fs_context *);
1662
extern int afs_activate_volume(struct afs_volume *);
1663
extern void afs_deactivate_volume(struct afs_volume *);
1664
bool afs_try_get_volume(struct afs_volume *volume, enum afs_volume_trace reason);
1665
extern struct afs_volume *afs_get_volume(struct afs_volume *, enum afs_volume_trace);
1666
void afs_put_volume(struct afs_volume *volume, enum afs_volume_trace reason);
1667
extern int afs_check_volume_status(struct afs_volume *, struct afs_operation *);
1668
1669
/*
1670
* write.c
1671
*/
1672
void afs_prepare_write(struct netfs_io_subrequest *subreq);
1673
void afs_issue_write(struct netfs_io_subrequest *subreq);
1674
void afs_begin_writeback(struct netfs_io_request *wreq);
1675
void afs_retry_request(struct netfs_io_request *wreq, struct netfs_io_stream *stream);
1676
extern int afs_writepages(struct address_space *, struct writeback_control *);
1677
extern int afs_fsync(struct file *, loff_t, loff_t, int);
1678
extern vm_fault_t afs_page_mkwrite(struct vm_fault *vmf);
1679
extern void afs_prune_wb_keys(struct afs_vnode *);
1680
1681
/*
1682
* xattr.c
1683
*/
1684
extern const struct xattr_handler * const afs_xattr_handlers[];
1685
1686
/*
1687
* yfsclient.c
1688
*/
1689
extern void yfs_fs_fetch_data(struct afs_operation *);
1690
extern void yfs_fs_create_file(struct afs_operation *);
1691
extern void yfs_fs_make_dir(struct afs_operation *);
1692
extern void yfs_fs_remove_file2(struct afs_operation *);
1693
extern void yfs_fs_remove_file(struct afs_operation *);
1694
extern void yfs_fs_remove_dir(struct afs_operation *);
1695
extern void yfs_fs_link(struct afs_operation *);
1696
extern void yfs_fs_symlink(struct afs_operation *);
1697
extern void yfs_fs_rename(struct afs_operation *);
1698
void yfs_fs_rename_replace(struct afs_operation *op);
1699
void yfs_fs_rename_noreplace(struct afs_operation *op);
1700
void yfs_fs_rename_exchange(struct afs_operation *op);
1701
extern void yfs_fs_store_data(struct afs_operation *);
1702
extern void yfs_fs_setattr(struct afs_operation *);
1703
extern void yfs_fs_get_volume_status(struct afs_operation *);
1704
extern void yfs_fs_set_lock(struct afs_operation *);
1705
extern void yfs_fs_extend_lock(struct afs_operation *);
1706
extern void yfs_fs_release_lock(struct afs_operation *);
1707
extern void yfs_fs_fetch_status(struct afs_operation *);
1708
extern void yfs_fs_inline_bulk_status(struct afs_operation *);
1709
1710
struct yfs_acl {
1711
struct afs_acl *acl; /* Dir/file/symlink ACL */
1712
struct afs_acl *vol_acl; /* Whole volume ACL */
1713
u32 inherit_flag; /* True if ACL is inherited from parent dir */
1714
u32 num_cleaned; /* Number of ACEs removed due to subject removal */
1715
unsigned int flags;
1716
#define YFS_ACL_WANT_ACL 0x01 /* Set if caller wants ->acl */
1717
#define YFS_ACL_WANT_VOL_ACL 0x02 /* Set if caller wants ->vol_acl */
1718
};
1719
1720
extern void yfs_free_opaque_acl(struct yfs_acl *);
1721
extern void yfs_fs_fetch_opaque_acl(struct afs_operation *);
1722
extern void yfs_fs_store_opaque_acl2(struct afs_operation *);
1723
1724
/*
1725
* Miscellaneous inline functions.
1726
*/
1727
static inline struct afs_vnode *AFS_FS_I(struct inode *inode)
1728
{
1729
return container_of(inode, struct afs_vnode, netfs.inode);
1730
}
1731
1732
static inline struct inode *AFS_VNODE_TO_I(struct afs_vnode *vnode)
1733
{
1734
return &vnode->netfs.inode;
1735
}
1736
1737
/*
1738
* Note that a dentry got changed. We need to set d_fsdata to the data version
1739
* number derived from the result of the operation. It doesn't matter if
1740
* d_fsdata goes backwards as we'll just revalidate.
1741
*/
1742
static inline void afs_update_dentry_version(struct afs_operation *op,
1743
struct afs_vnode_param *dir_vp,
1744
struct dentry *dentry)
1745
{
1746
if (!op->cumul_error.error)
1747
dentry->d_fsdata =
1748
(void *)(unsigned long)dir_vp->scb.status.data_version;
1749
}
1750
1751
/*
1752
* Set the file size and block count. Estimate the number of 512 bytes blocks
1753
* used, rounded up to nearest 1K for consistency with other AFS clients.
1754
*/
1755
static inline void afs_set_i_size(struct afs_vnode *vnode, u64 size)
1756
{
1757
i_size_write(&vnode->netfs.inode, size);
1758
vnode->netfs.inode.i_blocks = ((size + 1023) >> 10) << 1;
1759
}
1760
1761
/*
1762
* Check for a conflicting operation on a directory that we just unlinked from.
1763
* If someone managed to sneak a link or an unlink in on the file we just
1764
* unlinked, we won't be able to trust nlink on an AFS file (but not YFS).
1765
*/
1766
static inline void afs_check_dir_conflict(struct afs_operation *op,
1767
struct afs_vnode_param *dvp)
1768
{
1769
if (dvp->dv_before + dvp->dv_delta != dvp->scb.status.data_version)
1770
op->flags |= AFS_OPERATION_DIR_CONFLICT;
1771
}
1772
1773
static inline int afs_io_error(struct afs_call *call, enum afs_io_error where)
1774
{
1775
trace_afs_io_error(call->debug_id, -EIO, where);
1776
return -EIO;
1777
}
1778
1779
static inline int afs_bad(struct afs_vnode *vnode, enum afs_file_error where)
1780
{
1781
trace_afs_file_error(vnode, -EIO, where);
1782
return -EIO;
1783
}
1784
1785
/*
1786
* Set the callback promise on a vnode.
1787
*/
1788
static inline void afs_set_cb_promise(struct afs_vnode *vnode, time64_t expires_at,
1789
enum afs_cb_promise_trace trace)
1790
{
1791
atomic64_set(&vnode->cb_expires_at, expires_at);
1792
trace_afs_cb_promise(vnode, trace);
1793
}
1794
1795
/*
1796
* Clear the callback promise on a vnode, returning true if it was promised.
1797
*/
1798
static inline bool afs_clear_cb_promise(struct afs_vnode *vnode,
1799
enum afs_cb_promise_trace trace)
1800
{
1801
trace_afs_cb_promise(vnode, trace);
1802
return atomic64_xchg(&vnode->cb_expires_at, AFS_NO_CB_PROMISE) != AFS_NO_CB_PROMISE;
1803
}
1804
1805
/*
1806
* Mark a directory as being invalid.
1807
*/
1808
static inline void afs_invalidate_dir(struct afs_vnode *dvnode,
1809
enum afs_dir_invalid_trace trace)
1810
{
1811
if (test_and_clear_bit(AFS_VNODE_DIR_VALID, &dvnode->flags)) {
1812
trace_afs_dir_invalid(dvnode, trace);
1813
afs_stat_v(dvnode, n_inval);
1814
}
1815
}
1816
1817
/*****************************************************************************/
1818
/*
1819
* debug tracing
1820
*/
1821
extern unsigned afs_debug;
1822
1823
#define dbgprintk(FMT,...) \
1824
printk("[%-6.6s] "FMT"\n", current->comm ,##__VA_ARGS__)
1825
1826
#define kenter(FMT,...) dbgprintk("==> %s("FMT")",__func__ ,##__VA_ARGS__)
1827
#define kleave(FMT,...) dbgprintk("<== %s()"FMT"",__func__ ,##__VA_ARGS__)
1828
#define kdebug(FMT,...) dbgprintk(" "FMT ,##__VA_ARGS__)
1829
1830
1831
#if defined(__KDEBUG)
1832
#define _enter(FMT,...) kenter(FMT,##__VA_ARGS__)
1833
#define _leave(FMT,...) kleave(FMT,##__VA_ARGS__)
1834
#define _debug(FMT,...) kdebug(FMT,##__VA_ARGS__)
1835
1836
#elif defined(CONFIG_AFS_DEBUG)
1837
#define AFS_DEBUG_KENTER 0x01
1838
#define AFS_DEBUG_KLEAVE 0x02
1839
#define AFS_DEBUG_KDEBUG 0x04
1840
1841
#define _enter(FMT,...) \
1842
do { \
1843
if (unlikely(afs_debug & AFS_DEBUG_KENTER)) \
1844
kenter(FMT,##__VA_ARGS__); \
1845
} while (0)
1846
1847
#define _leave(FMT,...) \
1848
do { \
1849
if (unlikely(afs_debug & AFS_DEBUG_KLEAVE)) \
1850
kleave(FMT,##__VA_ARGS__); \
1851
} while (0)
1852
1853
#define _debug(FMT,...) \
1854
do { \
1855
if (unlikely(afs_debug & AFS_DEBUG_KDEBUG)) \
1856
kdebug(FMT,##__VA_ARGS__); \
1857
} while (0)
1858
1859
#else
1860
#define _enter(FMT,...) no_printk("==> %s("FMT")",__func__ ,##__VA_ARGS__)
1861
#define _leave(FMT,...) no_printk("<== %s()"FMT"",__func__ ,##__VA_ARGS__)
1862
#define _debug(FMT,...) no_printk(" "FMT ,##__VA_ARGS__)
1863
#endif
1864
1865
/*
1866
* debug assertion checking
1867
*/
1868
#if 1 // defined(__KDEBUGALL)
1869
1870
#define ASSERT(X) \
1871
do { \
1872
if (unlikely(!(X))) { \
1873
printk(KERN_ERR "\n"); \
1874
printk(KERN_ERR "AFS: Assertion failed\n"); \
1875
BUG(); \
1876
} \
1877
} while(0)
1878
1879
#define ASSERTCMP(X, OP, Y) \
1880
do { \
1881
if (unlikely(!((X) OP (Y)))) { \
1882
printk(KERN_ERR "\n"); \
1883
printk(KERN_ERR "AFS: Assertion failed\n"); \
1884
printk(KERN_ERR "%lu " #OP " %lu is false\n", \
1885
(unsigned long)(X), (unsigned long)(Y)); \
1886
printk(KERN_ERR "0x%lx " #OP " 0x%lx is false\n", \
1887
(unsigned long)(X), (unsigned long)(Y)); \
1888
BUG(); \
1889
} \
1890
} while(0)
1891
1892
#define ASSERTRANGE(L, OP1, N, OP2, H) \
1893
do { \
1894
if (unlikely(!((L) OP1 (N)) || !((N) OP2 (H)))) { \
1895
printk(KERN_ERR "\n"); \
1896
printk(KERN_ERR "AFS: Assertion failed\n"); \
1897
printk(KERN_ERR "%lu "#OP1" %lu "#OP2" %lu is false\n", \
1898
(unsigned long)(L), (unsigned long)(N), \
1899
(unsigned long)(H)); \
1900
printk(KERN_ERR "0x%lx "#OP1" 0x%lx "#OP2" 0x%lx is false\n", \
1901
(unsigned long)(L), (unsigned long)(N), \
1902
(unsigned long)(H)); \
1903
BUG(); \
1904
} \
1905
} while(0)
1906
1907
#define ASSERTIF(C, X) \
1908
do { \
1909
if (unlikely((C) && !(X))) { \
1910
printk(KERN_ERR "\n"); \
1911
printk(KERN_ERR "AFS: Assertion failed\n"); \
1912
BUG(); \
1913
} \
1914
} while(0)
1915
1916
#define ASSERTIFCMP(C, X, OP, Y) \
1917
do { \
1918
if (unlikely((C) && !((X) OP (Y)))) { \
1919
printk(KERN_ERR "\n"); \
1920
printk(KERN_ERR "AFS: Assertion failed\n"); \
1921
printk(KERN_ERR "%lu " #OP " %lu is false\n", \
1922
(unsigned long)(X), (unsigned long)(Y)); \
1923
printk(KERN_ERR "0x%lx " #OP " 0x%lx is false\n", \
1924
(unsigned long)(X), (unsigned long)(Y)); \
1925
BUG(); \
1926
} \
1927
} while(0)
1928
1929
#else
1930
1931
#define ASSERT(X) \
1932
do { \
1933
} while(0)
1934
1935
#define ASSERTCMP(X, OP, Y) \
1936
do { \
1937
} while(0)
1938
1939
#define ASSERTRANGE(L, OP1, N, OP2, H) \
1940
do { \
1941
} while(0)
1942
1943
#define ASSERTIF(C, X) \
1944
do { \
1945
} while(0)
1946
1947
#define ASSERTIFCMP(C, X, OP, Y) \
1948
do { \
1949
} while(0)
1950
1951
#endif /* __KDEBUGALL */
1952
1953