Merge branch 'akpm' (patches from Andrew)
Merge yet more updates from Andrew Morton: - various misc things - kexec updates - sysctl core updates - scripts/gdb udpates - checkpoint-restart updates - ipc updates - kernel/watchdog updates - Kees's "rough equivalent to the glibc _FORTIFY_SOURCE=1 feature" - "stackprotector: ascii armor the stack canary" - more MM bits - checkpatch updates * emailed patches from Andrew Morton <akpm@linux-foundation.org>: (96 commits) writeback: rework wb_[dec|inc]_stat family of functions ARM: samsung: usb-ohci: move inline before return type video: fbdev: omap: move inline before return type video: fbdev: intelfb: move inline before return type USB: serial: safe_serial: move __inline__ before return type drivers: tty: serial: move inline before return type drivers: s390: move static and inline before return type x86/efi: move asmlinkage before return type sh: move inline before return type MIPS: SMP: move asmlinkage before return type m68k: coldfire: move inline before return type ia64: sn: pci: move inline before type ia64: move inline before return type FRV: tlbflush: move asmlinkage before return type CRIS: gpio: move inline before return type ARM: HP Jornada 7XX: move inline before return type ARM: KVM: move asmlinkage before type checkpatch: improve the STORAGE_CLASS test mm, migration: do not trigger OOM killer when migrating memory drm/i915: use __GFP_RETRY_MAYFAIL ...
This commit is contained in:
@@ -1355,6 +1355,53 @@ static const struct file_operations proc_fault_inject_operations = {
|
||||
.write = proc_fault_inject_write,
|
||||
.llseek = generic_file_llseek,
|
||||
};
|
||||
|
||||
static ssize_t proc_fail_nth_write(struct file *file, const char __user *buf,
|
||||
size_t count, loff_t *ppos)
|
||||
{
|
||||
struct task_struct *task;
|
||||
int err, n;
|
||||
|
||||
task = get_proc_task(file_inode(file));
|
||||
if (!task)
|
||||
return -ESRCH;
|
||||
put_task_struct(task);
|
||||
if (task != current)
|
||||
return -EPERM;
|
||||
err = kstrtoint_from_user(buf, count, 10, &n);
|
||||
if (err)
|
||||
return err;
|
||||
if (n < 0 || n == INT_MAX)
|
||||
return -EINVAL;
|
||||
current->fail_nth = n + 1;
|
||||
return count;
|
||||
}
|
||||
|
||||
static ssize_t proc_fail_nth_read(struct file *file, char __user *buf,
|
||||
size_t count, loff_t *ppos)
|
||||
{
|
||||
struct task_struct *task;
|
||||
int err;
|
||||
|
||||
task = get_proc_task(file_inode(file));
|
||||
if (!task)
|
||||
return -ESRCH;
|
||||
put_task_struct(task);
|
||||
if (task != current)
|
||||
return -EPERM;
|
||||
if (count < 1)
|
||||
return -EINVAL;
|
||||
err = put_user((char)(current->fail_nth ? 'N' : 'Y'), buf);
|
||||
if (err)
|
||||
return err;
|
||||
current->fail_nth = 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
static const struct file_operations proc_fail_nth_operations = {
|
||||
.read = proc_fail_nth_read,
|
||||
.write = proc_fail_nth_write,
|
||||
};
|
||||
#endif
|
||||
|
||||
|
||||
@@ -3311,6 +3358,11 @@ static const struct pid_entry tid_base_stuff[] = {
|
||||
#endif
|
||||
#ifdef CONFIG_FAULT_INJECTION
|
||||
REG("make-it-fail", S_IRUGO|S_IWUSR, proc_fault_inject_operations),
|
||||
/*
|
||||
* Operations on the file check that the task is current,
|
||||
* so we create it with 0666 to support testing under unprivileged user.
|
||||
*/
|
||||
REG("fail-nth", 0666, proc_fail_nth_operations),
|
||||
#endif
|
||||
#ifdef CONFIG_TASK_IO_ACCOUNTING
|
||||
ONE("io", S_IRUSR, proc_tid_io_accounting),
|
||||
|
@@ -1078,16 +1078,30 @@ static int sysctl_err(const char *path, struct ctl_table *table, char *fmt, ...)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static int sysctl_check_table_array(const char *path, struct ctl_table *table)
|
||||
{
|
||||
int err = 0;
|
||||
|
||||
if ((table->proc_handler == proc_douintvec) ||
|
||||
(table->proc_handler == proc_douintvec_minmax)) {
|
||||
if (table->maxlen != sizeof(unsigned int))
|
||||
err |= sysctl_err(path, table, "array now allowed");
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
static int sysctl_check_table(const char *path, struct ctl_table *table)
|
||||
{
|
||||
int err = 0;
|
||||
for (; table->procname; table++) {
|
||||
if (table->child)
|
||||
err = sysctl_err(path, table, "Not a file");
|
||||
err |= sysctl_err(path, table, "Not a file");
|
||||
|
||||
if ((table->proc_handler == proc_dostring) ||
|
||||
(table->proc_handler == proc_dointvec) ||
|
||||
(table->proc_handler == proc_douintvec) ||
|
||||
(table->proc_handler == proc_douintvec_minmax) ||
|
||||
(table->proc_handler == proc_dointvec_minmax) ||
|
||||
(table->proc_handler == proc_dointvec_jiffies) ||
|
||||
(table->proc_handler == proc_dointvec_userhz_jiffies) ||
|
||||
@@ -1095,15 +1109,17 @@ static int sysctl_check_table(const char *path, struct ctl_table *table)
|
||||
(table->proc_handler == proc_doulongvec_minmax) ||
|
||||
(table->proc_handler == proc_doulongvec_ms_jiffies_minmax)) {
|
||||
if (!table->data)
|
||||
err = sysctl_err(path, table, "No data");
|
||||
err |= sysctl_err(path, table, "No data");
|
||||
if (!table->maxlen)
|
||||
err = sysctl_err(path, table, "No maxlen");
|
||||
err |= sysctl_err(path, table, "No maxlen");
|
||||
else
|
||||
err |= sysctl_check_table_array(path, table);
|
||||
}
|
||||
if (!table->proc_handler)
|
||||
err = sysctl_err(path, table, "No proc_handler");
|
||||
err |= sysctl_err(path, table, "No proc_handler");
|
||||
|
||||
if ((table->mode & (S_IRUGO|S_IWUGO)) != table->mode)
|
||||
err = sysctl_err(path, table, "bogus .mode 0%o",
|
||||
err |= sysctl_err(path, table, "bogus .mode 0%o",
|
||||
table->mode);
|
||||
}
|
||||
return err;
|
||||
|
Reference in New Issue
Block a user