OSDN Git Service

kill the last remaining user of proc_ns_fget()
authorAl Viro <viro@zeniv.linux.org.uk>
Sun, 15 May 2022 22:16:54 +0000 (18:16 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Fri, 21 Apr 2023 02:55:35 +0000 (22:55 -0400)
lookups by descriptor are better off closer to syscall surface...

Reviewed-by: Christian Brauner <brauner@kernel.org>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/nsfs.c
include/linux/proc_ns.h
net/core/net_namespace.c

index f8df60b..f602a96 100644 (file)
--- a/fs/nsfs.c
+++ b/fs/nsfs.c
@@ -235,24 +235,6 @@ bool proc_ns_file(const struct file *file)
        return file->f_op == &ns_file_operations;
 }
 
-struct file *proc_ns_fget(int fd)
-{
-       struct file *file;
-
-       file = fget(fd);
-       if (!file)
-               return ERR_PTR(-EBADF);
-
-       if (file->f_op != &ns_file_operations)
-               goto out_invalid;
-
-       return file;
-
-out_invalid:
-       fput(file);
-       return ERR_PTR(-EINVAL);
-}
-
 /**
  * ns_match() - Returns true if current namespace matches dev/ino provided.
  * @ns: current namespace
index 75807ec..49539bc 100644 (file)
@@ -72,7 +72,6 @@ static inline int ns_alloc_inum(struct ns_common *ns)
 
 #define ns_free_inum(ns) proc_free_inum((ns)->inum)
 
-extern struct file *proc_ns_fget(int fd);
 #define get_proc_ns(inode) ((struct ns_common *)(inode)->i_private)
 extern int ns_get_path(struct path *path, struct task_struct *task,
                        const struct proc_ns_operations *ns_ops);
index 7b69cf8..3e3598c 100644 (file)
@@ -20,6 +20,7 @@
 #include <linux/sched/task.h>
 #include <linux/uidgid.h>
 #include <linux/cookie.h>
+#include <linux/proc_fs.h>
 
 #include <net/sock.h>
 #include <net/netlink.h>
@@ -676,21 +677,19 @@ EXPORT_SYMBOL_GPL(get_net_ns);
 
 struct net *get_net_ns_by_fd(int fd)
 {
-       struct file *file;
-       struct ns_common *ns;
-       struct net *net;
+       struct fd f = fdget(fd);
+       struct net *net = ERR_PTR(-EINVAL);
 
-       file = proc_ns_fget(fd);
-       if (IS_ERR(file))
-               return ERR_CAST(file);
+       if (!f.file)
+               return ERR_PTR(-EBADF);
 
-       ns = get_proc_ns(file_inode(file));
-       if (ns->ops == &netns_operations)
-               net = get_net(container_of(ns, struct net, ns));
-       else
-               net = ERR_PTR(-EINVAL);
+       if (proc_ns_file(f.file)) {
+               struct ns_common *ns = get_proc_ns(file_inode(f.file));
+               if (ns->ops == &netns_operations)
+                       net = get_net(container_of(ns, struct net, ns));
+       }
+       fdput(f);
 
-       fput(file);
        return net;
 }
 EXPORT_SYMBOL_GPL(get_net_ns_by_fd);