Declare the seq_operations and let procfs open and free the seq_file of /proc/net/rpc/<cache>/content. ->proc_open() and ->proc_release() only take and drop the module reference and set up ->private now. The rpc_pipefs file is unchanged. Reading the procfs file then no longer holds up its removal when the network namespace goes away.
Signed-off-by: Christian Brauner (Amutable) <[email protected]> --- net/sunrpc/cache.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/net/sunrpc/cache.c b/net/sunrpc/cache.c index 1ceaea7e01b9..007521e8a57f 100644 --- a/net/sunrpc/cache.c +++ b/net/sunrpc/cache.c @@ -1606,24 +1606,28 @@ static const struct proc_ops cache_channel_proc_ops = { .proc_release = cache_release_procfs, }; +/* procfs opens the seq_file */ static int content_open_procfs(struct inode *inode, struct file *filp) { struct cache_detail *cd = pde_data(inode); - return content_open(inode, filp, cd); + if (!cd || !try_module_get(cd->owner)) + return -EACCES; + ((struct seq_file *)filp->private_data)->private = cd; + return 0; } static int content_release_procfs(struct inode *inode, struct file *filp) { struct cache_detail *cd = pde_data(inode); - return content_release(inode, filp, cd); + module_put(cd->owner); + return 0; } static const struct proc_ops content_proc_ops = { + .proc_seq_ops = &cache_content_op, .proc_open = content_open_procfs, - .proc_read = seq_read, - .proc_lseek = seq_lseek, .proc_release = content_release_procfs, }; -- 2.53.0
