diff options
author | David Howells <dhowells@redhat.com> | 2018-04-09 22:12:31 +0200 |
---|---|---|
committer | David Howells <dhowells@redhat.com> | 2018-04-09 22:12:31 +0200 |
commit | 6f8880d8e68155726a2a22e8787cfebf1ffcab08 (patch) | |
tree | b0e11598c62e9d9c01f3a41cadb7f71b1b901692 /fs/afs/internal.h | |
parent | afs: Prospectively look up extra files when doing a single lookup (diff) | |
download | linux-6f8880d8e68155726a2a22e8787cfebf1ffcab08.tar.xz linux-6f8880d8e68155726a2a22e8787cfebf1ffcab08.zip |
afs: Implement @sys substitution handling
Implement the AFS feature by which @sys at the end of a pathname component
may be substituted for one of a list of values, typically naming the
operating system. Up to 16 alternatives may be specified and these are
tried in turn until one works. Each network namespace has[*] a separate
independent list.
Upon creation of a new network namespace, the list of values is
initialised[*] to a single OpenAFS-compatible string representing arch type
plus "_linux26". For example, on x86_64, the sysname is "amd64_linux26".
[*] Or will, once network namespace support is finalised in kAFS.
The list may be set by:
# for i in foo bar linux-x86_64; do echo $i; done >/proc/fs/afs/sysname
for which separate writes to the same fd are amalgamated and applied on
close. The LF character may be used as a separator to specify multiple
items in the same write() call.
The list may be cleared by:
# echo >/proc/fs/afs/sysname
and read by:
# cat /proc/fs/afs/sysname
foo
bar
linux-x86_64
Signed-off-by: David Howells <dhowells@redhat.com>
Diffstat (limited to 'fs/afs/internal.h')
-rw-r--r-- | fs/afs/internal.h | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/fs/afs/internal.h b/fs/afs/internal.h index 55b07e818400..27150bbc50d8 100644 --- a/fs/afs/internal.h +++ b/fs/afs/internal.h @@ -199,6 +199,18 @@ static inline struct afs_super_info *AFS_FS_S(struct super_block *sb) extern struct file_system_type afs_fs_type; /* + * Set of substitutes for @sys. + */ +struct afs_sysnames { +#define AFS_NR_SYSNAME 16 + char *subs[AFS_NR_SYSNAME]; + refcount_t usage; + unsigned short nr; + short error; + char blank[1]; +}; + +/* * AFS network namespace record. */ struct afs_net { @@ -246,8 +258,11 @@ struct afs_net { /* Misc */ struct proc_dir_entry *proc_afs; /* /proc/net/afs directory */ + struct afs_sysnames *sysnames; + rwlock_t sysnames_lock; }; +extern const char afs_init_sysname[]; extern struct afs_net __afs_net;// Dummy AFS network namespace; TODO: replace with real netns enum afs_cell_state { @@ -789,6 +804,7 @@ extern int __net_init afs_proc_init(struct afs_net *); extern void __net_exit afs_proc_cleanup(struct afs_net *); extern int afs_proc_cell_setup(struct afs_net *, struct afs_cell *); extern void afs_proc_cell_remove(struct afs_net *, struct afs_cell *); +extern void afs_put_sysnames(struct afs_sysnames *); /* * rotate.c |