diff options
author | David Howells <dhowells@redhat.com> | 2017-11-02 15:27:46 +0000 |
---|---|---|
committer | David Howells <dhowells@redhat.com> | 2017-11-13 15:38:17 +0000 |
commit | 9ed900b1160ef306bc74ad0228d7ab199234c758 (patch) | |
tree | f2e3ed236dce6980e51e8216e9e06ffbf9c1d989 /fs/afs/internal.h | |
parent | 49566f6f06b38d7c1a5c7eacc8a38c6ea2e36549 (diff) |
afs: Push the net ns pointer to more places
Push the network namespace pointer to more places in AFS, including the
afs_server structure (which doesn't hold a ref on the netns).
In particular, afs_put_cell() now takes requires a net ns parameter so that
it can safely alter the netns after decrementing the cell usage count - the
cell will be deallocated by a background thread after being cached for a
period, which means that it's not safe to access it after reducing its
usage count.
Signed-off-by: David Howells <dhowells@redhat.com>
Diffstat (limited to 'fs/afs/internal.h')
-rw-r--r-- | fs/afs/internal.h | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/fs/afs/internal.h b/fs/afs/internal.h index 2d90cb7605f3..7cd30ae71f91 100644 --- a/fs/afs/internal.h +++ b/fs/afs/internal.h @@ -335,6 +335,7 @@ struct afs_server { atomic_t usage; time64_t time_of_death; /* time at which put reduced usage to 0 */ struct in_addr addr; /* server address */ + struct afs_net *net; /* Network namespace in which the server resides */ struct afs_cell *cell; /* cell in which server resides */ struct list_head link; /* link in cell's server list */ struct list_head grave; /* link in master graveyard list */ @@ -513,7 +514,7 @@ extern int afs_cell_init(struct afs_net *, char *); extern struct afs_cell *afs_cell_create(struct afs_net *, const char *, unsigned, char *, bool); extern struct afs_cell *afs_cell_lookup(struct afs_net *, const char *, unsigned, bool); extern struct afs_cell *afs_grab_cell(struct afs_cell *); -extern void afs_put_cell(struct afs_cell *); +extern void afs_put_cell(struct afs_net *, struct afs_cell *); extern void __net_exit afs_cell_purge(struct afs_net *); /* @@ -713,7 +714,7 @@ extern struct afs_server *afs_lookup_server(struct afs_cell *, const struct in_addr *); extern struct afs_server *afs_find_server(struct afs_net *, const struct sockaddr_rxrpc *); -extern void afs_put_server(struct afs_server *); +extern void afs_put_server(struct afs_net *, struct afs_server *); extern void afs_reap_server(struct work_struct *); extern void __net_exit afs_purge_servers(struct afs_net *); @@ -802,7 +803,7 @@ static inline struct afs_volume *afs_get_volume(struct afs_volume *volume) return volume; } -extern void afs_put_volume(struct afs_net *, struct afs_volume *); +extern void afs_put_volume(struct afs_cell *, struct afs_volume *); extern struct afs_volume *afs_volume_lookup(struct afs_mount_params *); extern struct afs_server *afs_volume_pick_fileserver(struct afs_vnode *); extern int afs_volume_release_fileserver(struct afs_vnode *, |