JFFS2 swsusp / signal cleanup.

From: David Woodhouse
Date: Sat Oct 04 2003 - 06:28:51 EST


How's this look?

===== fs/jffs2/background.c 1.19 vs edited =====
--- 1.19/fs/jffs2/background.c Wed May 28 16:01:05 2003
+++ edited/fs/jffs2/background.c Sat Oct 4 12:23:52 2003
@@ -19,6 +19,7 @@
#include <linux/completion.h>
#include <linux/sched.h>
#include <linux/unistd.h>
+#include <linux/suspend.h>
#include "nodelist.h"


@@ -89,10 +90,10 @@
set_user_nice(current, 10);

for (;;) {
- spin_lock_irq(&current_sig_lock);
- siginitsetinv (&current->blocked, sigmask(SIGHUP) | sigmask(SIGKILL) | sigmask(SIGSTOP) | sigmask(SIGCONT));
- recalc_sigpending();
- spin_unlock_irq(&current_sig_lock);
+ allow_signal(SIGHUP);
+ allow_signal(SIGKILL);
+ allow_signal(SIGSTOP);
+ allow_signal(SIGCONT);

if (!thread_should_wake(c)) {
set_current_state (TASK_INTERRUPTIBLE);
@@ -104,6 +105,13 @@
schedule();
}

+ if (current->flags & PF_FREEZE) {
+ refrigerator(0); /* When this loses its stupid flush_signals()
+ and starts just calling recalc_sigpending(),
+ you can remove the following: */
+ recalc_sigpending();
+ }
+
cond_resched();

/* Put_super will send a SIGKILL and then wait on the sem.
@@ -112,9 +120,7 @@
siginfo_t info;
unsigned long signr;

- spin_lock_irq(&current_sig_lock);
- signr = dequeue_signal(current, &current->blocked, &info);
- spin_unlock_irq(&current_sig_lock);
+ signr = dequeue_signal_lock(current, &current->blocked, &info);

switch(signr) {
case SIGSTOP:
@@ -138,10 +144,7 @@
}
}
/* We don't want SIGHUP to interrupt us. STOP and KILL are OK though. */
- spin_lock_irq(&current_sig_lock);
- siginitsetinv (&current->blocked, sigmask(SIGKILL) | sigmask(SIGSTOP) | sigmask(SIGCONT));
- recalc_sigpending();
- spin_unlock_irq(&current_sig_lock);
+ disallow_signal(SIGHUP);

D1(printk(KERN_DEBUG "jffs2_garbage_collect_thread(): pass\n"));
jffs2_garbage_collect_pass(c);
===== include/linux/sched.h 1.168 vs edited =====
--- 1.168/include/linux/sched.h Thu Oct 2 08:12:14 2003
+++ edited/include/linux/sched.h Sat Oct 4 12:23:15 2003
@@ -577,6 +577,19 @@
extern void flush_signals(struct task_struct *);
extern void flush_signal_handlers(struct task_struct *, int force_default);
extern int dequeue_signal(struct task_struct *tsk, sigset_t *mask, siginfo_t *info);
+
+static inline int dequeue_signal_lock(struct task_struct *tsk, sigset_t *mask, siginfo_t *info)
+{
+ unsigned long flags;
+ int ret;
+
+ spin_lock_irqsave(&tsk->sighand->siglock, flags);
+ ret = dequeue_signal(tsk, mask, info);
+ spin_unlock_irqrestore(&tsk->sighand->siglock, flags);
+
+ return ret;
+}
+
extern void block_all_signals(int (*notifier)(void *priv), void *priv,
sigset_t *mask);
extern void unblock_all_signals(void);
@@ -674,6 +687,7 @@
extern void reparent_to_init(void);
extern void daemonize(const char *, ...);
extern int allow_signal(int);
+extern int disallow_signal(int);
extern task_t *child_reaper;

extern int do_execve(char *, char __user * __user *, char __user * __user *, struct pt_regs *);
===== kernel/exit.c 1.113 vs edited =====
--- 1.113/kernel/exit.c Sun Sep 21 22:49:52 2003
+++ edited/kernel/exit.c Sat Oct 4 12:11:54 2003
@@ -278,7 +278,20 @@
return 0;
}

+int disallow_signal(int sig)
+{
+ if (sig < 1 || sig > _NSIG)
+ return -EINVAL;
+
+ spin_lock_irq(&current->sighand->siglock);
+ sigaddset(&current->blocked, sig);
+ recalc_sigpending();
+ spin_unlock_irq(&current->sighand->siglock);
+ return 0;
+}
+
EXPORT_SYMBOL(allow_signal);
+EXPORT_SYMBOL(disallow_signal);

/*
* Put all the gunge required to become a kernel thread without

--
dwmw2


-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/