diff options
Diffstat (limited to 'include/linux/sysctl.h')
| -rw-r--r-- | include/linux/sysctl.h | 106 | 
1 files changed, 67 insertions, 39 deletions
| diff --git a/include/linux/sysctl.h b/include/linux/sysctl.h index bb9127dd814b..c34b4c82b0dc 100644 --- a/include/linux/sysctl.h +++ b/include/linux/sysctl.h @@ -932,34 +932,14 @@ enum  #include <linux/list.h>  #include <linux/rcupdate.h>  #include <linux/wait.h> +#include <linux/rbtree.h>  /* For the /proc/sys support */  struct ctl_table;  struct nsproxy;  struct ctl_table_root; - -struct ctl_table_set { -	struct list_head list; -	struct ctl_table_set *parent; -	int (*is_seen)(struct ctl_table_set *); -}; - -extern void setup_sysctl_set(struct ctl_table_set *p, -	struct ctl_table_set *parent, -	int (*is_seen)(struct ctl_table_set *)); -  struct ctl_table_header; - -extern void sysctl_head_get(struct ctl_table_header *); -extern void sysctl_head_put(struct ctl_table_header *); -extern int sysctl_is_seen(struct ctl_table_header *); -extern struct ctl_table_header *sysctl_head_grab(struct ctl_table_header *); -extern struct ctl_table_header *sysctl_head_next(struct ctl_table_header *prev); -extern struct ctl_table_header *__sysctl_head_next(struct nsproxy *namespaces, -						struct ctl_table_header *prev); -extern void sysctl_head_finish(struct ctl_table_header *prev); -extern int sysctl_perm(struct ctl_table_root *root, -		struct ctl_table *table, int op); +struct ctl_dir;  typedef struct ctl_table ctl_table; @@ -1023,8 +1003,6 @@ static inline void *proc_sys_poll_event(struct ctl_table_poll *poll)  	return (void *)(unsigned long)atomic_read(&poll->event);  } -void proc_sys_poll_notify(struct ctl_table_poll *poll); -  #define __CTL_TABLE_POLL_INITIALIZER(name) {				\  	.event = ATOMIC_INIT(0),					\  	.wait = __WAIT_QUEUE_HEAD_INITIALIZER(name.wait) } @@ -1039,21 +1017,16 @@ struct ctl_table  	void *data;  	int maxlen;  	umode_t mode; -	struct ctl_table *child; -	struct ctl_table *parent;	/* Automatically set */ +	struct ctl_table *child;	/* Deprecated */  	proc_handler *proc_handler;	/* Callback for text formatting */  	struct ctl_table_poll *poll;  	void *extra1;  	void *extra2;  }; -struct ctl_table_root { -	struct list_head root_list; -	struct ctl_table_set default_set; -	struct ctl_table_set *(*lookup)(struct ctl_table_root *root, -					   struct nsproxy *namespaces); -	int (*permissions)(struct ctl_table_root *root, -			struct nsproxy *namespaces, struct ctl_table *table); +struct ctl_node { +	struct rb_node node; +	struct ctl_table_header *header;  };  /* struct ctl_table_header is used to maintain dynamic lists of @@ -1063,9 +1036,9 @@ struct ctl_table_header  	union {  		struct {  			struct ctl_table *ctl_table; -			struct list_head ctl_entry;  			int used;  			int count; +			int nreg;  		};  		struct rcu_head rcu;  	}; @@ -1073,9 +1046,27 @@ struct ctl_table_header  	struct ctl_table *ctl_table_arg;  	struct ctl_table_root *root;  	struct ctl_table_set *set; -	struct ctl_table *attached_by; -	struct ctl_table *attached_to; -	struct ctl_table_header *parent; +	struct ctl_dir *parent; +	struct ctl_node *node; +}; + +struct ctl_dir { +	/* Header must be at the start of ctl_dir */ +	struct ctl_table_header header; +	struct rb_root root; +}; + +struct ctl_table_set { +	int (*is_seen)(struct ctl_table_set *); +	struct ctl_dir dir; +}; + +struct ctl_table_root { +	struct ctl_table_set default_set; +	struct ctl_table_set *(*lookup)(struct ctl_table_root *root, +					   struct nsproxy *namespaces); +	int (*permissions)(struct ctl_table_root *root, +			struct nsproxy *namespaces, struct ctl_table *table);  };  /* struct ctl_path describes where in the hierarchy a table is added */ @@ -1083,16 +1074,53 @@ struct ctl_path {  	const char *procname;  }; +#ifdef CONFIG_SYSCTL + +void proc_sys_poll_notify(struct ctl_table_poll *poll); + +extern void setup_sysctl_set(struct ctl_table_set *p, +	struct ctl_table_root *root, +	int (*is_seen)(struct ctl_table_set *)); +extern void retire_sysctl_set(struct ctl_table_set *set); +  void register_sysctl_root(struct ctl_table_root *root); +struct ctl_table_header *__register_sysctl_table( +	struct ctl_table_set *set, +	const char *path, struct ctl_table *table);  struct ctl_table_header *__register_sysctl_paths( -	struct ctl_table_root *root, struct nsproxy *namespaces, +	struct ctl_table_set *set,  	const struct ctl_path *path, struct ctl_table *table); +struct ctl_table_header *register_sysctl(const char *path, struct ctl_table *table);  struct ctl_table_header *register_sysctl_table(struct ctl_table * table);  struct ctl_table_header *register_sysctl_paths(const struct ctl_path *path,  						struct ctl_table *table);  void unregister_sysctl_table(struct ctl_table_header * table); -int sysctl_check_table(struct nsproxy *namespaces, struct ctl_table *table); + +extern int sysctl_init(void); +#else /* CONFIG_SYSCTL */ +static inline struct ctl_table_header *register_sysctl_table(struct ctl_table * table) +{ +	return NULL; +} + +static inline struct ctl_table_header *register_sysctl_paths( +			const struct ctl_path *path, struct ctl_table *table) +{ +	return NULL; +} + +static inline void unregister_sysctl_table(struct ctl_table_header * table) +{ +} + +static inline void setup_sysctl_set(struct ctl_table_set *p, +	struct ctl_table_root *root, +	int (*is_seen)(struct ctl_table_set *)) +{ +} + +#endif /* CONFIG_SYSCTL */  #endif /* __KERNEL__ */ | 
