Commit b89a8171 authored by Eric W. Biederman's avatar Eric W. Biederman Committed by Linus Torvalds

[PATCH] sysctl: Allow /proc/sys without sys_sysctl

Since sys_sysctl is deprecated start allow it to be compiled out.  This
should catch any remaining user space code that cares, and paves the way
for further sysctl cleanups.

[akpm@osdl.org: If sys_sysctl() is not compiled-in, emit a warning]
Signed-off-by: default avatarEric W. Biederman <ebiederm@xmission.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 57181784
...@@ -1942,7 +1942,7 @@ struct sysctl32 { ...@@ -1942,7 +1942,7 @@ struct sysctl32 {
unsigned int __unused[4]; unsigned int __unused[4];
}; };
#ifdef CONFIG_SYSCTL #ifdef CONFIG_SYSCTL_SYSCALL
asmlinkage long asmlinkage long
sys32_sysctl (struct sysctl32 __user *args) sys32_sysctl (struct sysctl32 __user *args)
{ {
......
...@@ -991,7 +991,7 @@ struct sysctl_args32 ...@@ -991,7 +991,7 @@ struct sysctl_args32
unsigned int __unused[4]; unsigned int __unused[4];
}; };
#ifdef CONFIG_SYSCTL #ifdef CONFIG_SYSCTL_SYSCALL
asmlinkage long sys32_sysctl(struct sysctl_args32 __user *args) asmlinkage long sys32_sysctl(struct sysctl_args32 __user *args)
{ {
...@@ -1032,7 +1032,7 @@ asmlinkage long sys32_sysctl(struct sysctl_args32 __user *args) ...@@ -1032,7 +1032,7 @@ asmlinkage long sys32_sysctl(struct sysctl_args32 __user *args)
return error; return error;
} }
#endif /* CONFIG_SYSCTL */ #endif /* CONFIG_SYSCTL_SYSCALL */
asmlinkage long sys32_newuname(struct new_utsname __user * name) asmlinkage long sys32_newuname(struct new_utsname __user * name)
{ {
......
...@@ -740,7 +740,7 @@ asmlinkage long compat_sys_umask(u32 mask) ...@@ -740,7 +740,7 @@ asmlinkage long compat_sys_umask(u32 mask)
return sys_umask((int)mask); return sys_umask((int)mask);
} }
#ifdef CONFIG_SYSCTL #ifdef CONFIG_SYSCTL_SYSCALL
struct __sysctl_args32 { struct __sysctl_args32 {
u32 name; u32 name;
int nlen; int nlen;
......
...@@ -708,7 +708,7 @@ asmlinkage long sys32_sendfile64(int out_fd, int in_fd, ...@@ -708,7 +708,7 @@ asmlinkage long sys32_sendfile64(int out_fd, int in_fd,
return ret; return ret;
} }
#ifdef CONFIG_SYSCTL #ifdef CONFIG_SYSCTL_SYSCALL
struct __sysctl_args32 { struct __sysctl_args32 {
u32 name; u32 name;
int nlen; int nlen;
......
...@@ -1016,7 +1016,7 @@ struct __sysctl_args32 { ...@@ -1016,7 +1016,7 @@ struct __sysctl_args32 {
asmlinkage long sys32_sysctl(struct __sysctl_args32 __user *args) asmlinkage long sys32_sysctl(struct __sysctl_args32 __user *args)
{ {
#ifndef CONFIG_SYSCTL #ifndef CONFIG_SYSCTL_SYSCALL
return -ENOSYS; return -ENOSYS;
#else #else
struct __sysctl_args32 tmp; struct __sysctl_args32 tmp;
......
...@@ -648,7 +648,7 @@ sys32_pause(void) ...@@ -648,7 +648,7 @@ sys32_pause(void)
} }
#ifdef CONFIG_SYSCTL #ifdef CONFIG_SYSCTL_SYSCALL
struct sysctl_ia32 { struct sysctl_ia32 {
unsigned int name; unsigned int name;
int nlen; int nlen;
......
...@@ -826,6 +826,25 @@ config PROC_VMCORE ...@@ -826,6 +826,25 @@ config PROC_VMCORE
help help
Exports the dump image of crashed kernel in ELF format. Exports the dump image of crashed kernel in ELF format.
config PROC_SYSCTL
bool "Sysctl support (/proc/sys)" if EMBEDDED
depends on PROC_FS
select SYSCTL
default y
---help---
The sysctl interface provides a means of dynamically changing
certain kernel parameters and variables on the fly without requiring
a recompile of the kernel or reboot of the system. The primary
interface is through /proc/sys. If you say Y here a tree of
modifiable sysctl entries will be generated beneath the
/proc/sys directory. They are explained in the files
in <file:Documentation/sysctl/>. Note that enabling this
option will enlarge the kernel by at least 8 KB.
As it is generally a good thing, you should say Y here unless
building a kernel for install/rescue disks or your system is very
limited in memory.
config SYSFS config SYSFS
bool "sysfs file system support" if EMBEDDED bool "sysfs file system support" if EMBEDDED
default y default y
......
...@@ -273,21 +273,24 @@ config UID16 ...@@ -273,21 +273,24 @@ config UID16
This enables the legacy 16-bit UID syscall wrappers. This enables the legacy 16-bit UID syscall wrappers.
config SYSCTL config SYSCTL
bool "Sysctl support" if EMBEDDED bool
default y
config SYSCTL_SYSCALL
bool "Sysctl syscall support"
default n
select SYSCTL
---help--- ---help---
The sysctl interface provides a means of dynamically changing Enable the deprecated sysctl system call. sys_sysctl uses
certain kernel parameters and variables on the fly without requiring binary paths that have been found to be a major pain to maintain
a recompile of the kernel or reboot of the system. The primary and use. The interface in /proc/sys is now the primary and what
interface consists of a system call, but if you say Y to "/proc everyone uses.
file system support", a tree of modifiable sysctl entries will be
generated beneath the /proc/sys directory. They are explained in the Nothing has been using the binary sysctl interface for some time
files in <file:Documentation/sysctl/>. Note that enabling this time now so nothing should break if you disable sysctl syscall
option will enlarge the kernel by at least 8 KB. support, and you kernel will get marginally smaller.
As it is generally a good thing, you should say Y here unless Unless you have an application that uses the sys_syscall interface
building a kernel for install/rescue disks or your system is very you should probably say N here.
limited in memory.
config KALLSYMS config KALLSYMS
bool "Load all symbols for debugging/kksymoops" if EMBEDDED bool "Load all symbols for debugging/kksymoops" if EMBEDDED
......
...@@ -137,8 +137,11 @@ extern int no_unaligned_warning; ...@@ -137,8 +137,11 @@ extern int no_unaligned_warning;
extern int max_lock_depth; extern int max_lock_depth;
#endif #endif
static int parse_table(int __user *, int, void __user *, size_t __user *, void __user *, size_t, #ifdef CONFIG_SYSCTL_SYSCALL
ctl_table *, void **); static int parse_table(int __user *, int, void __user *, size_t __user *,
void __user *, size_t, ctl_table *, void **);
#endif
static int proc_doutsstring(ctl_table *table, int write, struct file *filp, static int proc_doutsstring(ctl_table *table, int write, struct file *filp,
void __user *buffer, size_t *lenp, loff_t *ppos); void __user *buffer, size_t *lenp, loff_t *ppos);
...@@ -165,7 +168,7 @@ int sysctl_legacy_va_layout; ...@@ -165,7 +168,7 @@ int sysctl_legacy_va_layout;
/* /proc declarations: */ /* /proc declarations: */
#ifdef CONFIG_PROC_FS #ifdef CONFIG_PROC_SYSCTL
static ssize_t proc_readsys(struct file *, char __user *, size_t, loff_t *); static ssize_t proc_readsys(struct file *, char __user *, size_t, loff_t *);
static ssize_t proc_writesys(struct file *, const char __user *, size_t, loff_t *); static ssize_t proc_writesys(struct file *, const char __user *, size_t, loff_t *);
...@@ -1166,12 +1169,13 @@ static void start_unregistering(struct ctl_table_header *p) ...@@ -1166,12 +1169,13 @@ static void start_unregistering(struct ctl_table_header *p)
void __init sysctl_init(void) void __init sysctl_init(void)
{ {
#ifdef CONFIG_PROC_FS #ifdef CONFIG_PROC_SYSCTL
register_proc_table(root_table, proc_sys_root, &root_table_header); register_proc_table(root_table, proc_sys_root, &root_table_header);
init_irq_proc(); init_irq_proc();
#endif #endif
} }
#ifdef CONFIG_SYSCTL_SYSCALL
int do_sysctl(int __user *name, int nlen, void __user *oldval, size_t __user *oldlenp, int do_sysctl(int __user *name, int nlen, void __user *oldval, size_t __user *oldlenp,
void __user *newval, size_t newlen) void __user *newval, size_t newlen)
{ {
...@@ -1225,6 +1229,7 @@ asmlinkage long sys_sysctl(struct __sysctl_args __user *args) ...@@ -1225,6 +1229,7 @@ asmlinkage long sys_sysctl(struct __sysctl_args __user *args)
unlock_kernel(); unlock_kernel();
return error; return error;
} }
#endif /* CONFIG_SYSCTL_SYSCALL */
/* /*
* ctl_perm does NOT grant the superuser all rights automatically, because * ctl_perm does NOT grant the superuser all rights automatically, because
...@@ -1251,6 +1256,7 @@ static inline int ctl_perm(ctl_table *table, int op) ...@@ -1251,6 +1256,7 @@ static inline int ctl_perm(ctl_table *table, int op)
return test_perm(table->mode, op); return test_perm(table->mode, op);
} }
#ifdef CONFIG_SYSCTL_SYSCALL
static int parse_table(int __user *name, int nlen, static int parse_table(int __user *name, int nlen,
void __user *oldval, size_t __user *oldlenp, void __user *oldval, size_t __user *oldlenp,
void __user *newval, size_t newlen, void __user *newval, size_t newlen,
...@@ -1340,6 +1346,7 @@ int do_sysctl_strategy (ctl_table *table, ...@@ -1340,6 +1346,7 @@ int do_sysctl_strategy (ctl_table *table,
} }
return 0; return 0;
} }
#endif /* CONFIG_SYSCTL_SYSCALL */
/** /**
* register_sysctl_table - register a sysctl hierarchy * register_sysctl_table - register a sysctl hierarchy
...@@ -1427,7 +1434,7 @@ struct ctl_table_header *register_sysctl_table(ctl_table * table, ...@@ -1427,7 +1434,7 @@ struct ctl_table_header *register_sysctl_table(ctl_table * table,
else else
list_add_tail(&tmp->ctl_entry, &root_table_header.ctl_entry); list_add_tail(&tmp->ctl_entry, &root_table_header.ctl_entry);
spin_unlock(&sysctl_lock); spin_unlock(&sysctl_lock);
#ifdef CONFIG_PROC_FS #ifdef CONFIG_PROC_SYSCTL
register_proc_table(table, proc_sys_root, tmp); register_proc_table(table, proc_sys_root, tmp);
#endif #endif
return tmp; return tmp;
...@@ -1445,18 +1452,31 @@ void unregister_sysctl_table(struct ctl_table_header * header) ...@@ -1445,18 +1452,31 @@ void unregister_sysctl_table(struct ctl_table_header * header)
might_sleep(); might_sleep();
spin_lock(&sysctl_lock); spin_lock(&sysctl_lock);
start_unregistering(header); start_unregistering(header);
#ifdef CONFIG_PROC_FS #ifdef CONFIG_PROC_SYSCTL
unregister_proc_table(header->ctl_table, proc_sys_root); unregister_proc_table(header->ctl_table, proc_sys_root);
#endif #endif
spin_unlock(&sysctl_lock); spin_unlock(&sysctl_lock);
kfree(header); kfree(header);
} }
#else /* !CONFIG_SYSCTL */
struct ctl_table_header * register_sysctl_table(ctl_table * table,
int insert_at_head)
{
return NULL;
}
void unregister_sysctl_table(struct ctl_table_header * table)
{
}
#endif /* CONFIG_SYSCTL */
/* /*
* /proc/sys support * /proc/sys support
*/ */
#ifdef CONFIG_PROC_FS #ifdef CONFIG_PROC_SYSCTL
/* Scan the sysctl entries in table and add them all into /proc */ /* Scan the sysctl entries in table and add them all into /proc */
static void register_proc_table(ctl_table * table, struct proc_dir_entry *root, void *set) static void register_proc_table(ctl_table * table, struct proc_dir_entry *root, void *set)
...@@ -2318,6 +2338,7 @@ int proc_doulongvec_ms_jiffies_minmax(ctl_table *table, int write, ...@@ -2318,6 +2338,7 @@ int proc_doulongvec_ms_jiffies_minmax(ctl_table *table, int write,
#endif /* CONFIG_PROC_FS */ #endif /* CONFIG_PROC_FS */
#ifdef CONFIG_SYSCTL_SYSCALL
/* /*
* General sysctl support routines * General sysctl support routines
*/ */
...@@ -2460,11 +2481,19 @@ int sysctl_ms_jiffies(ctl_table *table, int __user *name, int nlen, ...@@ -2460,11 +2481,19 @@ int sysctl_ms_jiffies(ctl_table *table, int __user *name, int nlen,
return 1; return 1;
} }
#else /* CONFIG_SYSCTL */ #else /* CONFIG_SYSCTL_SYSCALL */
asmlinkage long sys_sysctl(struct __sysctl_args __user *args) asmlinkage long sys_sysctl(struct __sysctl_args __user *args)
{ {
static int msg_count;
if (msg_count < 5) {
msg_count++;
printk(KERN_INFO
"warning: process `%s' used the removed sysctl "
"system call\n", current->comm);
}
return -ENOSYS; return -ENOSYS;
} }
...@@ -2496,73 +2525,7 @@ int sysctl_ms_jiffies(ctl_table *table, int __user *name, int nlen, ...@@ -2496,73 +2525,7 @@ int sysctl_ms_jiffies(ctl_table *table, int __user *name, int nlen,
return -ENOSYS; return -ENOSYS;
} }
int proc_dostring(ctl_table *table, int write, struct file *filp, #endif /* CONFIG_SYSCTL_SYSCALL */
void __user *buffer, size_t *lenp, loff_t *ppos)
{
return -ENOSYS;
}
int proc_dointvec(ctl_table *table, int write, struct file *filp,
void __user *buffer, size_t *lenp, loff_t *ppos)
{
return -ENOSYS;
}
int proc_dointvec_bset(ctl_table *table, int write, struct file *filp,
void __user *buffer, size_t *lenp, loff_t *ppos)
{
return -ENOSYS;
}
int proc_dointvec_minmax(ctl_table *table, int write, struct file *filp,
void __user *buffer, size_t *lenp, loff_t *ppos)
{
return -ENOSYS;
}
int proc_dointvec_jiffies(ctl_table *table, int write, struct file *filp,
void __user *buffer, size_t *lenp, loff_t *ppos)
{
return -ENOSYS;
}
int proc_dointvec_userhz_jiffies(ctl_table *table, int write, struct file *filp,
void __user *buffer, size_t *lenp, loff_t *ppos)
{
return -ENOSYS;
}
int proc_dointvec_ms_jiffies(ctl_table *table, int write, struct file *filp,
void __user *buffer, size_t *lenp, loff_t *ppos)
{
return -ENOSYS;
}
int proc_doulongvec_minmax(ctl_table *table, int write, struct file *filp,
void __user *buffer, size_t *lenp, loff_t *ppos)
{
return -ENOSYS;
}
int proc_doulongvec_ms_jiffies_minmax(ctl_table *table, int write,
struct file *filp,
void __user *buffer,
size_t *lenp, loff_t *ppos)
{
return -ENOSYS;
}
struct ctl_table_header * register_sysctl_table(ctl_table * table,
int insert_at_head)
{
return NULL;
}
void unregister_sysctl_table(struct ctl_table_header * table)
{
}
#endif /* CONFIG_SYSCTL */
/* /*
* No sense putting this after each symbol definition, twice, * No sense putting this after each symbol definition, twice,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment