Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
Pull vfs pile #2 from Al Viro: "Next pile (and there'll be one or two more). The large piece in this one is getting rid of /proc/*/ns/* weirdness; among other things, it allows to (finally) make nameidata completely opaque outside of fs/namei.c, making for easier further cleanups in there" * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: coda_venus_readdir(): use file_inode() fs/namei.c: fold link_path_walk() call into path_init() path_init(): don't bother with LOOKUP_PARENT in argument fs/namei.c: new helper (path_cleanup()) path_init(): store the "base" pointer to file in nameidata itself make default ->i_fop have ->open() fail with ENXIO make nameidata completely opaque outside of fs/namei.c kill proc_ns completely take the targets of /proc/*/ns/* symlinks to separate fs bury struct proc_ns in fs/proc copy address of proc_ns_ops into ns_common new helpers: ns_alloc_inum/ns_free_inum make proc_ns_operations work with struct ns_common * instead of void * switch the rest of proc_ns_operations to working with &...->ns netns: switch ->get()/->put()/->install()/->inum() to working with &net->ns make mntns ->get()/->put()/->install()/->inum() work with &mnt_ns->ns common object embedded into various struct ....ns
This commit is contained in:
@@ -2176,7 +2176,6 @@ static inline int sb_is_blkdev_sb(struct super_block *sb)
|
||||
extern int sync_filesystem(struct super_block *);
|
||||
extern const struct file_operations def_blk_fops;
|
||||
extern const struct file_operations def_chr_fops;
|
||||
extern const struct file_operations bad_sock_fops;
|
||||
#ifdef CONFIG_BLOCK
|
||||
extern int ioctl_by_bdev(struct block_device *, unsigned, unsigned long);
|
||||
extern int blkdev_ioctl(struct block_device *, fmode_t, unsigned, unsigned long);
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
#include <linux/rwsem.h>
|
||||
#include <linux/notifier.h>
|
||||
#include <linux/nsproxy.h>
|
||||
#include <linux/ns_common.h>
|
||||
|
||||
struct user_namespace;
|
||||
|
||||
@@ -58,7 +59,7 @@ struct ipc_namespace {
|
||||
/* user_ns which owns the ipc ns */
|
||||
struct user_namespace *user_ns;
|
||||
|
||||
unsigned int proc_inum;
|
||||
struct ns_common ns;
|
||||
};
|
||||
|
||||
extern struct ipc_namespace init_ipc_ns;
|
||||
|
||||
+3
-22
@@ -7,21 +7,10 @@
|
||||
#include <linux/path.h>
|
||||
|
||||
struct vfsmount;
|
||||
struct nameidata;
|
||||
|
||||
enum { MAX_NESTED_LINKS = 8 };
|
||||
|
||||
struct nameidata {
|
||||
struct path path;
|
||||
struct qstr last;
|
||||
struct path root;
|
||||
struct inode *inode; /* path.dentry.d_inode */
|
||||
unsigned int flags;
|
||||
unsigned seq, m_seq;
|
||||
int last_type;
|
||||
unsigned depth;
|
||||
char *saved_names[MAX_NESTED_LINKS + 1];
|
||||
};
|
||||
|
||||
/*
|
||||
* Type of the last component on LOOKUP_PARENT
|
||||
*/
|
||||
@@ -82,16 +71,8 @@ extern struct dentry *lock_rename(struct dentry *, struct dentry *);
|
||||
extern void unlock_rename(struct dentry *, struct dentry *);
|
||||
|
||||
extern void nd_jump_link(struct nameidata *nd, struct path *path);
|
||||
|
||||
static inline void nd_set_link(struct nameidata *nd, char *path)
|
||||
{
|
||||
nd->saved_names[nd->depth] = path;
|
||||
}
|
||||
|
||||
static inline char *nd_get_link(struct nameidata *nd)
|
||||
{
|
||||
return nd->saved_names[nd->depth];
|
||||
}
|
||||
extern void nd_set_link(struct nameidata *nd, char *path);
|
||||
extern char *nd_get_link(struct nameidata *nd);
|
||||
|
||||
static inline void nd_terminate_link(void *name, size_t len, size_t maxlen)
|
||||
{
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
#ifndef _LINUX_NS_COMMON_H
|
||||
#define _LINUX_NS_COMMON_H
|
||||
|
||||
struct proc_ns_operations;
|
||||
|
||||
struct ns_common {
|
||||
atomic_long_t stashed;
|
||||
const struct proc_ns_operations *ops;
|
||||
unsigned int inum;
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -8,6 +8,7 @@
|
||||
#include <linux/threads.h>
|
||||
#include <linux/nsproxy.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/ns_common.h>
|
||||
|
||||
struct pidmap {
|
||||
atomic_t nr_free;
|
||||
@@ -43,7 +44,7 @@ struct pid_namespace {
|
||||
kgid_t pid_gid;
|
||||
int hide_pid;
|
||||
int reboot; /* group exit code if this pidns was rebooted */
|
||||
unsigned int proc_inum;
|
||||
struct ns_common ns;
|
||||
};
|
||||
|
||||
extern struct pid_namespace init_pid_ns;
|
||||
|
||||
+23
-20
@@ -4,21 +4,18 @@
|
||||
#ifndef _LINUX_PROC_NS_H
|
||||
#define _LINUX_PROC_NS_H
|
||||
|
||||
#include <linux/ns_common.h>
|
||||
|
||||
struct pid_namespace;
|
||||
struct nsproxy;
|
||||
struct path;
|
||||
|
||||
struct proc_ns_operations {
|
||||
const char *name;
|
||||
int type;
|
||||
void *(*get)(struct task_struct *task);
|
||||
void (*put)(void *ns);
|
||||
int (*install)(struct nsproxy *nsproxy, void *ns);
|
||||
unsigned int (*inum)(void *ns);
|
||||
};
|
||||
|
||||
struct proc_ns {
|
||||
void *ns;
|
||||
const struct proc_ns_operations *ns_ops;
|
||||
struct ns_common *(*get)(struct task_struct *task);
|
||||
void (*put)(struct ns_common *ns);
|
||||
int (*install)(struct nsproxy *nsproxy, struct ns_common *ns);
|
||||
};
|
||||
|
||||
extern const struct proc_ns_operations netns_operations;
|
||||
@@ -43,32 +40,38 @@ enum {
|
||||
|
||||
extern int pid_ns_prepare_proc(struct pid_namespace *ns);
|
||||
extern void pid_ns_release_proc(struct pid_namespace *ns);
|
||||
extern struct file *proc_ns_fget(int fd);
|
||||
extern struct proc_ns *get_proc_ns(struct inode *);
|
||||
extern int proc_alloc_inum(unsigned int *pino);
|
||||
extern void proc_free_inum(unsigned int inum);
|
||||
extern bool proc_ns_inode(struct inode *inode);
|
||||
|
||||
#else /* CONFIG_PROC_FS */
|
||||
|
||||
static inline int pid_ns_prepare_proc(struct pid_namespace *ns) { return 0; }
|
||||
static inline void pid_ns_release_proc(struct pid_namespace *ns) {}
|
||||
|
||||
static inline struct file *proc_ns_fget(int fd)
|
||||
{
|
||||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
|
||||
static inline struct proc_ns *get_proc_ns(struct inode *inode) { return NULL; }
|
||||
|
||||
static inline int proc_alloc_inum(unsigned int *inum)
|
||||
{
|
||||
*inum = 1;
|
||||
return 0;
|
||||
}
|
||||
static inline void proc_free_inum(unsigned int inum) {}
|
||||
static inline bool proc_ns_inode(struct inode *inode) { return false; }
|
||||
|
||||
#endif /* CONFIG_PROC_FS */
|
||||
|
||||
static inline int ns_alloc_inum(struct ns_common *ns)
|
||||
{
|
||||
atomic_long_set(&ns->stashed, 0);
|
||||
return proc_alloc_inum(&ns->inum);
|
||||
}
|
||||
|
||||
#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 void *ns_get_path(struct path *path, struct task_struct *task,
|
||||
const struct proc_ns_operations *ns_ops);
|
||||
|
||||
extern int ns_get_name(char *buf, size_t size, struct task_struct *task,
|
||||
const struct proc_ns_operations *ns_ops);
|
||||
extern void nsfs_init(void);
|
||||
|
||||
#endif /* _LINUX_PROC_NS_H */
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
|
||||
#include <linux/kref.h>
|
||||
#include <linux/nsproxy.h>
|
||||
#include <linux/ns_common.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/err.h>
|
||||
|
||||
@@ -26,7 +27,7 @@ struct user_namespace {
|
||||
int level;
|
||||
kuid_t owner;
|
||||
kgid_t group;
|
||||
unsigned int proc_inum;
|
||||
struct ns_common ns;
|
||||
|
||||
/* Register of per-UID persistent keyrings for this namespace */
|
||||
#ifdef CONFIG_PERSISTENT_KEYRINGS
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
#include <linux/sched.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/nsproxy.h>
|
||||
#include <linux/ns_common.h>
|
||||
#include <linux/err.h>
|
||||
#include <uapi/linux/utsname.h>
|
||||
|
||||
@@ -23,7 +24,7 @@ struct uts_namespace {
|
||||
struct kref kref;
|
||||
struct new_utsname name;
|
||||
struct user_namespace *user_ns;
|
||||
unsigned int proc_inum;
|
||||
struct ns_common ns;
|
||||
};
|
||||
extern struct uts_namespace init_uts_ns;
|
||||
|
||||
|
||||
@@ -26,6 +26,7 @@
|
||||
#endif
|
||||
#include <net/netns/nftables.h>
|
||||
#include <net/netns/xfrm.h>
|
||||
#include <linux/ns_common.h>
|
||||
|
||||
struct user_namespace;
|
||||
struct proc_dir_entry;
|
||||
@@ -60,7 +61,7 @@ struct net {
|
||||
|
||||
struct user_namespace *user_ns; /* Owning user namespace */
|
||||
|
||||
unsigned int proc_inum;
|
||||
struct ns_common ns;
|
||||
|
||||
struct proc_dir_entry *proc_net;
|
||||
struct proc_dir_entry *proc_net_stat;
|
||||
|
||||
@@ -72,5 +72,6 @@
|
||||
#define MTD_INODE_FS_MAGIC 0x11307854
|
||||
#define ANON_INODE_FS_MAGIC 0x09041934
|
||||
#define BTRFS_TEST_MAGIC 0x73727279
|
||||
#define NSFS_MAGIC 0x6e736673
|
||||
|
||||
#endif /* __LINUX_MAGIC_H__ */
|
||||
|
||||
Reference in New Issue
Block a user