diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2018-06-16 03:32:04 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2018-06-16 03:32:04 -0400 |
| commit | 35773c93817c5f2df264d013978e7551056a063a (patch) | |
| tree | 5ca02a3f3c680091d5b1019b27ba23b5323a038a | |
| parent | 29d6849d88b61edf130aef500acad78206bda3cd (diff) | |
| parent | 47ea0f2ebffd400d36ab5946ec8d6d6e08a67d53 (diff) | |
Merge branch 'afs-proc' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
Pull AFS updates from Al Viro:
"Assorted AFS stuff - ended up in vfs.git since most of that consists
of David's AFS-related followups to Christoph's procfs series"
* 'afs-proc' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs:
afs: Optimise callback breaking by not repeating volume lookup
afs: Display manually added cells in dynamic root mount
afs: Enable IPv6 DNS lookups
afs: Show all of a server's addresses in /proc/fs/afs/servers
afs: Handle CONFIG_PROC_FS=n
proc: Make inline name size calculation automatic
afs: Implement network namespacing
afs: Mark afs_net::ws_cell as __rcu and set using rcu functions
afs: Fix a Sparse warning in xdr_decode_AFSFetchStatus()
proc: Add a way to make network proc files writable
afs: Rearrange fs/afs/proc.c to remove remaining predeclarations.
afs: Rearrange fs/afs/proc.c to move the show routines up
afs: Rearrange fs/afs/proc.c by moving fops and open functions down
afs: Move /proc management functions to the end of the file
| -rw-r--r-- | fs/afs/Makefile | 4 | ||||
| -rw-r--r-- | fs/afs/addr_list.c | 2 | ||||
| -rw-r--r-- | fs/afs/callback.c | 110 | ||||
| -rw-r--r-- | fs/afs/cell.c | 24 | ||||
| -rw-r--r-- | fs/afs/cmservice.c | 2 | ||||
| -rw-r--r-- | fs/afs/dynroot.c | 126 | ||||
| -rw-r--r-- | fs/afs/fsclient.c | 100 | ||||
| -rw-r--r-- | fs/afs/internal.h | 75 | ||||
| -rw-r--r-- | fs/afs/main.c | 35 | ||||
| -rw-r--r-- | fs/afs/netdevices.c | 6 | ||||
| -rw-r--r-- | fs/afs/proc.c | 793 | ||||
| -rw-r--r-- | fs/afs/rxrpc.c | 2 | ||||
| -rw-r--r-- | fs/afs/server.c | 2 | ||||
| -rw-r--r-- | fs/afs/super.c | 68 | ||||
| -rw-r--r-- | fs/namei.c | 29 | ||||
| -rw-r--r-- | fs/proc/generic.c | 26 | ||||
| -rw-r--r-- | fs/proc/inode.c | 5 | ||||
| -rw-r--r-- | fs/proc/internal.h | 20 | ||||
| -rw-r--r-- | fs/proc/proc_net.c | 92 | ||||
| -rw-r--r-- | fs/proc/root.c | 3 | ||||
| -rw-r--r-- | include/linux/namei.h | 1 | ||||
| -rw-r--r-- | include/linux/proc_fs.h | 12 |
22 files changed, 892 insertions, 645 deletions
diff --git a/fs/afs/Makefile b/fs/afs/Makefile index 532acae25453..546874057bd3 100644 --- a/fs/afs/Makefile +++ b/fs/afs/Makefile | |||
| @@ -5,7 +5,7 @@ | |||
| 5 | 5 | ||
| 6 | afs-cache-$(CONFIG_AFS_FSCACHE) := cache.o | 6 | afs-cache-$(CONFIG_AFS_FSCACHE) := cache.o |
| 7 | 7 | ||
| 8 | kafs-objs := \ | 8 | kafs-y := \ |
| 9 | $(afs-cache-y) \ | 9 | $(afs-cache-y) \ |
| 10 | addr_list.o \ | 10 | addr_list.o \ |
| 11 | callback.o \ | 11 | callback.o \ |
| @@ -21,7 +21,6 @@ kafs-objs := \ | |||
| 21 | main.o \ | 21 | main.o \ |
| 22 | misc.o \ | 22 | misc.o \ |
| 23 | mntpt.o \ | 23 | mntpt.o \ |
| 24 | proc.o \ | ||
| 25 | rotate.o \ | 24 | rotate.o \ |
| 26 | rxrpc.o \ | 25 | rxrpc.o \ |
| 27 | security.o \ | 26 | security.o \ |
| @@ -34,4 +33,5 @@ kafs-objs := \ | |||
| 34 | write.o \ | 33 | write.o \ |
| 35 | xattr.o | 34 | xattr.o |
| 36 | 35 | ||
| 36 | kafs-$(CONFIG_PROC_FS) += proc.o | ||
| 37 | obj-$(CONFIG_AFS_FS) := kafs.o | 37 | obj-$(CONFIG_AFS_FS) := kafs.o |
diff --git a/fs/afs/addr_list.c b/fs/afs/addr_list.c index 2c46c46f3a6d..025a9a5e1c32 100644 --- a/fs/afs/addr_list.c +++ b/fs/afs/addr_list.c | |||
| @@ -215,7 +215,7 @@ struct afs_addr_list *afs_dns_query(struct afs_cell *cell, time64_t *_expiry) | |||
| 215 | _enter("%s", cell->name); | 215 | _enter("%s", cell->name); |
| 216 | 216 | ||
| 217 | ret = dns_query("afsdb", cell->name, cell->name_len, | 217 | ret = dns_query("afsdb", cell->name, cell->name_len, |
| 218 | "ipv4", &vllist, _expiry); | 218 | "", &vllist, _expiry); |
| 219 | if (ret < 0) | 219 | if (ret < 0) |
| 220 | return ERR_PTR(ret); | 220 | return ERR_PTR(ret); |
| 221 | 221 | ||
diff --git a/fs/afs/callback.c b/fs/afs/callback.c index 571437dcb252..5f261fbf2182 100644 --- a/fs/afs/callback.c +++ b/fs/afs/callback.c | |||
| @@ -21,6 +21,66 @@ | |||
| 21 | #include "internal.h" | 21 | #include "internal.h" |
| 22 | 22 | ||
| 23 | /* | 23 | /* |
| 24 | * Create volume and callback interests on a server. | ||
| 25 | */ | ||
| 26 | static struct afs_cb_interest *afs_create_interest(struct afs_server *server, | ||
| 27 | struct afs_vnode *vnode) | ||
| 28 | { | ||
| 29 | struct afs_vol_interest *new_vi, *vi; | ||
| 30 | struct afs_cb_interest *new; | ||
| 31 | struct hlist_node **pp; | ||
| 32 | |||
| 33 | new_vi = kzalloc(sizeof(struct afs_vol_interest), GFP_KERNEL); | ||
| 34 | if (!new_vi) | ||
| 35 | return NULL; | ||
| 36 | |||
| 37 | new = kzalloc(sizeof(struct afs_cb_interest), GFP_KERNEL); | ||
| 38 | if (!new) { | ||
| 39 | kfree(new_vi); | ||
| 40 | return NULL; | ||
| 41 | } | ||
| 42 | |||
| 43 | new_vi->usage = 1; | ||
| 44 | new_vi->vid = vnode->volume->vid; | ||
| 45 | INIT_HLIST_NODE(&new_vi->srv_link); | ||
| 46 | INIT_HLIST_HEAD(&new_vi->cb_interests); | ||
| 47 | |||
| 48 | refcount_set(&new->usage, 1); | ||
| 49 | new->sb = vnode->vfs_inode.i_sb; | ||
| 50 | new->vid = vnode->volume->vid; | ||
| 51 | new->server = afs_get_server(server); | ||
| 52 | INIT_HLIST_NODE(&new->cb_vlink); | ||
| 53 | |||
| 54 | write_lock(&server->cb_break_lock); | ||
| 55 | |||
| 56 | for (pp = &server->cb_volumes.first; *pp; pp = &(*pp)->next) { | ||
| 57 | vi = hlist_entry(*pp, struct afs_vol_interest, srv_link); | ||
| 58 | if (vi->vid < new_vi->vid) | ||
| 59 | continue; | ||
| 60 | if (vi->vid > new_vi->vid) | ||
| 61 | break; | ||
| 62 | vi->usage++; | ||
| 63 | goto found_vi; | ||
| 64 | } | ||
| 65 | |||
| 66 | new_vi->srv_link.pprev = pp; | ||
| 67 | new_vi->srv_link.next = *pp; | ||
| 68 | if (*pp) | ||
| 69 | (*pp)->pprev = &new_vi->srv_link.next; | ||
| 70 | *pp = &new_vi->srv_link; | ||
| 71 | vi = new_vi; | ||
| 72 | new_vi = NULL; | ||
| 73 | found_vi: | ||
| 74 | |||
| 75 | new->vol_interest = vi; | ||
| 76 | hlist_add_head(&new->cb_vlink, &vi->cb_interests); | ||
| 77 | |||
| 78 | write_unlock(&server->cb_break_lock); | ||
| 79 | kfree(new_vi); | ||
| 80 | return new; | ||
| 81 | } | ||
| 82 | |||
| 83 | /* | ||
| 24 | * Set up an interest-in-callbacks record for a volume on a server and | 84 | * Set up an interest-in-callbacks record for a volume on a server and |
| 25 | * register it with the server. | 85 | * register it with the server. |
| 26 | * - Called with vnode->io_lock held. | 86 | * - Called with vnode->io_lock held. |
| @@ -77,20 +137,10 @@ again: | |||
| 77 | } | 137 | } |
| 78 | 138 | ||
| 79 | if (!cbi) { | 139 | if (!cbi) { |
| 80 | new = kzalloc(sizeof(struct afs_cb_interest), GFP_KERNEL); | 140 | new = afs_create_interest(server, vnode); |
| 81 | if (!new) | 141 | if (!new) |
| 82 | return -ENOMEM; | 142 | return -ENOMEM; |
| 83 | 143 | ||
| 84 | refcount_set(&new->usage, 1); | ||
| 85 | new->sb = vnode->vfs_inode.i_sb; | ||
| 86 | new->vid = vnode->volume->vid; | ||
| 87 | new->server = afs_get_server(server); | ||
| 88 | INIT_LIST_HEAD(&new->cb_link); | ||
| 89 | |||
| 90 | write_lock(&server->cb_break_lock); | ||
| 91 | list_add_tail(&new->cb_link, &server->cb_interests); | ||
| 92 | write_unlock(&server->cb_break_lock); | ||
| 93 | |||
| 94 | write_lock(&slist->lock); | 144 | write_lock(&slist->lock); |
| 95 | if (!entry->cb_interest) { | 145 | if (!entry->cb_interest) { |
| 96 | entry->cb_interest = afs_get_cb_interest(new); | 146 | entry->cb_interest = afs_get_cb_interest(new); |
| @@ -126,11 +176,22 @@ again: | |||
| 126 | */ | 176 | */ |
| 127 | void afs_put_cb_interest(struct afs_net *net, struct afs_cb_interest *cbi) | 177 | void afs_put_cb_interest(struct afs_net *net, struct afs_cb_interest *cbi) |
| 128 | { | 178 | { |
| 179 | struct afs_vol_interest *vi; | ||
| 180 | |||
| 129 | if (cbi && refcount_dec_and_test(&cbi->usage)) { | 181 | if (cbi && refcount_dec_and_test(&cbi->usage)) { |
| 130 | if (!list_empty(&cbi->cb_link)) { | 182 | if (!hlist_unhashed(&cbi->cb_vlink)) { |
| 131 | write_lock(&cbi->server->cb_break_lock); | 183 | write_lock(&cbi->server->cb_break_lock); |
| 132 | list_del_init(&cbi->cb_link); | 184 | |
| 185 | hlist_del_init(&cbi->cb_vlink); | ||
| 186 | vi = cbi->vol_interest; | ||
| 187 | cbi->vol_interest = NULL; | ||
| 188 | if (--vi->usage == 0) | ||
| 189 | hlist_del(&vi->srv_link); | ||
| 190 | else | ||
| 191 | vi = NULL; | ||
| 192 | |||
| 133 | write_unlock(&cbi->server->cb_break_lock); | 193 | write_unlock(&cbi->server->cb_break_lock); |
| 194 | kfree(vi); | ||
| 134 | afs_put_server(net, cbi->server); | 195 | afs_put_server(net, cbi->server); |
| 135 | } | 196 | } |
| 136 | kfree(cbi); | 197 | kfree(cbi); |
| @@ -182,20 +243,34 @@ void afs_break_callback(struct afs_vnode *vnode) | |||
| 182 | static void afs_break_one_callback(struct afs_server *server, | 243 | static void afs_break_one_callback(struct afs_server *server, |
| 183 | struct afs_fid *fid) | 244 | struct afs_fid *fid) |
| 184 | { | 245 | { |
| 246 | struct afs_vol_interest *vi; | ||
| 185 | struct afs_cb_interest *cbi; | 247 | struct afs_cb_interest *cbi; |
| 186 | struct afs_iget_data data; | 248 | struct afs_iget_data data; |
| 187 | struct afs_vnode *vnode; | 249 | struct afs_vnode *vnode; |
| 188 | struct inode *in | ||
