summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@home.osdl.org>2003-10-04 21:11:08 -0700
committerLinus Torvalds <torvalds@home.osdl.org>2003-10-04 21:11:08 -0700
commitda3103c8efd7570939617bfa1f06fcdab9a9a11d (patch)
treef0e07dbc22384372c17d6b836f3a794fef62eed8 /kernel
parent799cc173710f8bac2e3d234445dbcf59483a872f (diff)
parent11d3c5ea4e4b16afcbe5f0966ed44b8b8f5ce5e5 (diff)
Merge bk://kernel.bkbits.net/davem/net-2.5
into home.osdl.org:/home/torvalds/v2.5/linux
Diffstat (limited to 'kernel')
-rw-r--r--kernel/acct.c2
-rw-r--r--kernel/exit.c22
-rw-r--r--kernel/fork.c14
-rw-r--r--kernel/kmod.c3
-rw-r--r--kernel/pid.c8
-rw-r--r--kernel/printk.c84
-rw-r--r--kernel/signal.c5
-rw-r--r--kernel/sys.c18
8 files changed, 105 insertions, 51 deletions
diff --git a/kernel/acct.c b/kernel/acct.c
index a679f4bb9854..37e98d713023 100644
--- a/kernel/acct.c
+++ b/kernel/acct.c
@@ -343,7 +343,7 @@ static void do_acct_process(long exitcode, struct file *file)
/* we really need to bite the bullet and change layout */
ac.ac_uid = current->uid;
ac.ac_gid = current->gid;
- ac.ac_tty = current->tty ? old_encode_dev(tty_devnum(current->tty)) : 0;
+ ac.ac_tty = process_tty(current) ? old_encode_dev(tty_devnum(process_tty(current))) : 0;
ac.ac_flag = 0;
if (current->flags & PF_FORKNOEXEC)
diff --git a/kernel/exit.c b/kernel/exit.c
index c565fd69d559..a87c12eed85d 100644
--- a/kernel/exit.c
+++ b/kernel/exit.c
@@ -119,13 +119,13 @@ int session_of_pgrp(int pgrp)
read_lock(&tasklist_lock);
for_each_task_pid(pgrp, PIDTYPE_PGID, p, l, pid)
- if (p->session > 0) {
- sid = p->session;
+ if (process_session(p) > 0) {
+ sid = process_session(p);
goto out;
}
p = find_task_by_pid(pgrp);
if (p)
- sid = p->session;
+ sid = process_session(p);
out:
read_unlock(&tasklist_lock);
@@ -153,7 +153,7 @@ static int will_become_orphaned_pgrp(int pgrp, task_t *ignored_task)
|| p->real_parent->pid == 1)
continue;
if (process_group(p->real_parent) != pgrp
- && p->real_parent->session == p->session) {
+ && process_session(p->real_parent) == process_session(p)) {
ret = 0;
break;
}
@@ -242,14 +242,14 @@ void __set_special_pids(pid_t session, pid_t pgrp)
{
struct task_struct *curr = current;
- if (curr->session != session) {
+ if (process_session(curr) != session) {
detach_pid(curr, PIDTYPE_SID);
- curr->session = session;
+ curr->signal->session = session;
attach_pid(curr, PIDTYPE_SID, session);
}
if (process_group(curr) != pgrp) {
detach_pid(curr, PIDTYPE_PGID);
- curr->group_leader->__pgrp = pgrp;
+ curr->signal->pgrp = pgrp;
attach_pid(curr, PIDTYPE_PGID, pgrp);
}
}
@@ -303,7 +303,7 @@ void daemonize(const char *name, ...)
exit_mm(current);
set_special_pids(1, 1);
- current->tty = NULL;
+ current->signal->tty = NULL;
/* Block and flush all signals */
sigfillset(&blocked);
@@ -509,7 +509,7 @@ static inline void reparent_thread(task_t *p, task_t *father, int traced)
* outside, so the child pgrp is now orphaned.
*/
if ((process_group(p) != process_group(father)) &&
- (p->session == father->session)) {
+ (process_session(p) == process_session(father))) {
int pgrp = process_group(p);
if (will_become_orphaned_pgrp(pgrp, NULL) && has_stopped_jobs(pgrp)) {
@@ -619,7 +619,7 @@ static void exit_notify(struct task_struct *tsk)
t = tsk->real_parent;
if ((process_group(t) != process_group(tsk)) &&
- (t->session == tsk->session) &&
+ (process_session(t) == process_session(tsk)) &&
will_become_orphaned_pgrp(process_group(tsk), tsk) &&
has_stopped_jobs(process_group(tsk))) {
__kill_pg_info(SIGHUP, (void *)1, process_group(tsk));
@@ -714,7 +714,7 @@ NORET_TYPE void do_exit(long code)
exit_itimers(tsk);
exit_thread();
- if (tsk->leader)
+ if (process_session_leader(tsk))
disassociate_ctty(1);
module_put(tsk->thread_info->exec_domain->module);
diff --git a/kernel/fork.c b/kernel/fork.c
index 2005c5c180de..f804f3124820 100644
--- a/kernel/fork.c
+++ b/kernel/fork.c
@@ -725,6 +725,12 @@ static inline int copy_signal(unsigned long clone_flags, struct task_struct * ts
sig->curr_target = NULL;
init_sigpending(&sig->shared_pending);
+ sig->tty = process_tty(current);
+ sig->pgrp = process_group(current);
+ sig->session = process_session(current);
+ sig->leader = 0; /* session leadership doesn't inherit */
+ sig->tty_old_pgrp = 0;
+
return 0;
}
@@ -771,7 +777,9 @@ struct task_struct *copy_process(unsigned long clone_flags,
* Thread groups must share signals as well, and detached threads
* can only be started up within the thread group.
*/
- if ((clone_flags & CLONE_THREAD) && !(clone_flags & CLONE_SIGHAND))
+ if ((clone_flags & CLONE_THREAD) &&
+ (clone_flags & (CLONE_SIGHAND|CLONE_DETACHED)) !=
+ (CLONE_SIGHAND|CLONE_DETACHED))
return ERR_PTR(-EINVAL);
/*
@@ -876,8 +884,6 @@ struct task_struct *copy_process(unsigned long clone_flags,
init_timer(&p->real_timer);
p->real_timer.data = (unsigned long) p;
- p->leader = 0; /* session leadership doesn't inherit */
- p->tty_old_pgrp = 0;
p->utime = p->stime = 0;
p->cutime = p->cstime = 0;
p->array = NULL;
@@ -1022,7 +1028,7 @@ struct task_struct *copy_process(unsigned long clone_flags,
if (thread_group_leader(p)) {
attach_pid(p, PIDTYPE_TGID, p->tgid);
attach_pid(p, PIDTYPE_PGID, process_group(p));
- attach_pid(p, PIDTYPE_SID, p->session);
+ attach_pid(p, PIDTYPE_SID, process_session(p));
if (p->pid)
__get_cpu_var(process_counts)++;
} else
diff --git a/kernel/kmod.c b/kernel/kmod.c
index 98d809689092..f5d658f704d9 100644
--- a/kernel/kmod.c
+++ b/kernel/kmod.c
@@ -47,7 +47,8 @@ char modprobe_path[256] = "/sbin/modprobe";
/**
* request_module - try to load a kernel module
- * @module_name: Name of module
+ * @fmt: printf style format string for the name of the module
+ * @varargs: arguements as specified in the format string
*
* Load a module using the user mode module loader. The function returns
* zero on success or a negative errno code on failure. Note that a
diff --git a/kernel/pid.c b/kernel/pid.c
index 713f54eaeda9..97bdf534c9f3 100644
--- a/kernel/pid.c
+++ b/kernel/pid.c
@@ -250,14 +250,14 @@ void switch_exec_pids(task_t *leader, task_t *thread)
attach_pid(thread, PIDTYPE_PID, thread->pid);
attach_pid(thread, PIDTYPE_TGID, thread->tgid);
- attach_pid(thread, PIDTYPE_PGID, leader->__pgrp);
- attach_pid(thread, PIDTYPE_SID, thread->session);
+ attach_pid(thread, PIDTYPE_PGID, thread->signal->pgrp);
+ attach_pid(thread, PIDTYPE_SID, thread->signal->session);
list_add_tail(&thread->tasks, &init_task.tasks);
attach_pid(leader, PIDTYPE_PID, leader->pid);
attach_pid(leader, PIDTYPE_TGID, leader->tgid);
- attach_pid(leader, PIDTYPE_PGID, leader->__pgrp);
- attach_pid(leader, PIDTYPE_SID, leader->session);
+ attach_pid(leader, PIDTYPE_PGID, leader->signal->pgrp);
+ attach_pid(leader, PIDTYPE_SID, leader->signal->session);
}
/*
diff --git a/kernel/printk.c b/kernel/printk.c
index 830b690f9692..caaa3e557ef6 100644
--- a/kernel/printk.c
+++ b/kernel/printk.c
@@ -29,11 +29,11 @@
#include <linux/delay.h>
#include <linux/smp.h>
#include <linux/security.h>
+#include <linux/bootmem.h>
#include <asm/uaccess.h>
-#define LOG_BUF_LEN (1 << CONFIG_LOG_BUF_SHIFT)
-#define LOG_BUF_MASK (LOG_BUF_LEN-1)
+#define __LOG_BUF_LEN (1 << CONFIG_LOG_BUF_SHIFT)
/* printk's without a loglevel use this.. */
#define DEFAULT_MESSAGE_LOGLEVEL 4 /* KERN_WARNING */
@@ -68,17 +68,21 @@ struct console *console_drivers;
*/
static spinlock_t logbuf_lock = SPIN_LOCK_UNLOCKED;
-static char log_buf[LOG_BUF_LEN];
+static char __log_buf[__LOG_BUF_LEN];
+static char *log_buf = __log_buf;
+static int log_buf_len = __LOG_BUF_LEN;
+
+#define LOG_BUF_MASK (log_buf_len-1)
#define LOG_BUF(idx) (log_buf[(idx) & LOG_BUF_MASK])
/*
- * The indices into log_buf are not constrained to LOG_BUF_LEN - they
+ * The indices into log_buf are not constrained to log_buf_len - they
* must be masked before subscripting
*/
-static unsigned long log_start; /* Index into log_buf: next char to be read by syslog() */
-static unsigned long con_start; /* Index into log_buf: next char to be sent to consoles */
-static unsigned long log_end; /* Index into log_buf: most-recently-written-char + 1 */
-static unsigned long logged_chars; /* Number of chars produced since last read+clear operation */
+static unsigned long log_start; /* Index into log_buf: next char to be read by syslog() */
+static unsigned long con_start; /* Index into log_buf: next char to be sent to consoles */
+static unsigned long log_end; /* Index into log_buf: most-recently-written-char + 1 */
+static unsigned long logged_chars; /* Number of chars produced since last read+clear operation */
struct console_cmdline console_cmdline[MAX_CMDLINECONSOLES];
static int preferred_console = -1;
@@ -141,6 +145,45 @@ static int __init console_setup(char *str)
__setup("console=", console_setup);
+static int __init log_buf_len_setup(char *str)
+{
+ unsigned long size = memparse(str, &str);
+
+ if (size > log_buf_len) {
+ unsigned long start, dest_idx, offset;
+ char * new_log_buf;
+
+ new_log_buf = alloc_bootmem(size);
+ if (!new_log_buf) {
+ printk("log_buf_len: allocation failed\n");
+ goto out;
+ }
+
+ spin_lock_irq(&logbuf_lock);
+ log_buf_len = size;
+ log_buf = new_log_buf;
+
+ offset = start = min(con_start, log_start);
+ dest_idx = 0;
+ while (start != log_end) {
+ log_buf[dest_idx] = __log_buf[start & (__LOG_BUF_LEN - 1)];
+ start++;
+ dest_idx++;
+ }
+ log_start -= offset;
+ con_start -= offset;
+ log_end -= offset;
+ spin_unlock_irq(&logbuf_lock);
+
+ printk("log_buf_len: %d\n", log_buf_len);
+ }
+out:
+
+ return 1;
+}
+
+__setup("log_buf_len=", log_buf_len_setup);
+
/*
* Commands to do_syslog:
*
@@ -213,8 +256,8 @@ int do_syslog(int type, char __user * buf, int len)
if (error)
goto out;
count = len;
- if (count > LOG_BUF_LEN)
- count = LOG_BUF_LEN;
+ if (count > log_buf_len)
+ count = log_buf_len;
spin_lock_irq(&logbuf_lock);
if (count > logged_chars)
count = logged_chars;
@@ -229,7 +272,7 @@ int do_syslog(int type, char __user * buf, int len)
*/
for(i = 0; i < count && !error; i++) {
j = limit-1-i;
- if (j+LOG_BUF_LEN < log_end)
+ if (j + log_buf_len < log_end)
break;
c = LOG_BUF(j);
spin_unlock_irq(&logbuf_lock);
@@ -302,12 +345,15 @@ static void __call_console_drivers(unsigned long start, unsigned long end)
/*
* Write out chars from start to end - 1 inclusive
*/
-static void _call_console_drivers(unsigned long start, unsigned long end, int msg_log_level)
+static void _call_console_drivers(unsigned long start,
+ unsigned long end, int msg_log_level)
{
- if (msg_log_level < console_loglevel && console_drivers && start != end) {
+ if (msg_log_level < console_loglevel &&
+ console_drivers && start != end) {
if ((start & LOG_BUF_MASK) > (end & LOG_BUF_MASK)) {
/* wrapped write */
- __call_console_drivers(start & LOG_BUF_MASK, LOG_BUF_LEN);
+ __call_console_drivers(start & LOG_BUF_MASK,
+ log_buf_len);
__call_console_drivers(0, end & LOG_BUF_MASK);
} else {
__call_console_drivers(start, end);
@@ -370,11 +416,11 @@ static void emit_log_char(char c)
{
LOG_BUF(log_end) = c;
log_end++;
- if (log_end - log_start > LOG_BUF_LEN)
- log_start = log_end - LOG_BUF_LEN;
- if (log_end - con_start > LOG_BUF_LEN)
- con_start = log_end - LOG_BUF_LEN;
- if (logged_chars < LOG_BUF_LEN)
+ if (log_end - log_start > log_buf_len)
+ log_start = log_end - log_buf_len;
+ if (log_end - con_start > log_buf_len)
+ con_start = log_end - log_buf_len;
+ if (logged_chars < log_buf_len)
logged_chars++;
}
diff --git a/kernel/signal.c b/kernel/signal.c
index 852da1a009da..469deaeeff56 100644
--- a/kernel/signal.c
+++ b/kernel/signal.c
@@ -593,7 +593,8 @@ static int check_kill_permission(int sig, struct siginfo *info,
error = -EPERM;
if ((!info || ((unsigned long)info != 1 &&
(unsigned long)info != 2 && SI_FROMUSER(info)))
- && ((sig != SIGCONT) || (current->session != t->session))
+ && ((sig != SIGCONT) ||
+ (process_session(current) != process_session(t)))
&& (current->euid ^ t->suid) && (current->euid ^ t->uid)
&& (current->uid ^ t->suid) && (current->uid ^ t->uid)
&& !capable(CAP_KILL))
@@ -1102,7 +1103,7 @@ kill_sl_info(int sig, struct siginfo *info, pid_t sid)
retval = -ESRCH;
read_lock(&tasklist_lock);
for_each_task_pid(sid, PIDTYPE_SID, p, l, pid) {
- if (!p->leader)
+ if (!process_session_leader(p))
continue;
err = group_send_sig_info(sig, info, p);
if (retval)
diff --git a/kernel/sys.c b/kernel/sys.c
index 9eda26d6745c..6f8f43156ab3 100644
--- a/kernel/sys.c
+++ b/kernel/sys.c
@@ -951,7 +951,7 @@ asmlinkage long sys_setpgid(pid_t pid, pid_t pgid)
if (p->parent == current || p->real_parent == current) {
err = -EPERM;
- if (p->session != current->session)
+ if (process_session(p) != process_session(current))
goto out;
err = -EACCES;
if (p->did_exec)
@@ -963,7 +963,7 @@ asmlinkage long sys_setpgid(pid_t pid, pid_t pgid)
}
err = -EPERM;
- if (p->leader)
+ if (process_session_leader(p))
goto out;
if (pgid != pid) {
@@ -972,7 +972,7 @@ asmlinkage long sys_setpgid(pid_t pid, pid_t pgid)
struct list_head *l;
for_each_task_pid(pgid, PIDTYPE_PGID, p, l, pid)
- if (p->session == current->session)
+ if (process_session(p) == process_session(current))
goto ok_pgid;
goto out;
}
@@ -984,7 +984,7 @@ ok_pgid:
if (process_group(p) != pgid) {
detach_pid(p, PIDTYPE_PGID);
- p->group_leader->__pgrp = pgid;
+ p->signal->pgrp = pgid;
attach_pid(p, PIDTYPE_PGID, pgid);
}
@@ -1026,7 +1026,7 @@ asmlinkage long sys_getpgrp(void)
asmlinkage long sys_getsid(pid_t pid)
{
if (!pid) {
- return current->session;
+ return process_session(current);
} else {
int retval;
struct task_struct *p;
@@ -1038,7 +1038,7 @@ asmlinkage long sys_getsid(pid_t pid)
if(p) {
retval = security_task_getsid(p);
if (!retval)
- retval = p->session;
+ retval = process_session(p);
}
read_unlock(&tasklist_lock);
return retval;
@@ -1059,10 +1059,10 @@ asmlinkage long sys_setsid(void)
if (pid)
goto out;
- current->leader = 1;
+ current->signal->leader = 1;
__set_special_pids(current->pid, current->pid);
- current->tty = NULL;
- current->tty_old_pgrp = 0;
+ current->signal->tty = NULL;
+ current->signal->tty_old_pgrp = 0;
err = process_group(current);
out:
write_unlock_irq(&tasklist_lock);