diff options
Diffstat (limited to 'fs/jffs2/background.c')
| -rw-r--r-- | fs/jffs2/background.c | 41 | 
1 files changed, 25 insertions, 16 deletions
diff --git a/fs/jffs2/background.c b/fs/jffs2/background.c index 404111b016c..bb9cebc9ca8 100644 --- a/fs/jffs2/background.c +++ b/fs/jffs2/background.c @@ -10,6 +10,8 @@   *   */ +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt +  #include <linux/kernel.h>  #include <linux/jffs2.h>  #include <linux/mtd/mtd.h> @@ -42,12 +44,13 @@ int jffs2_start_garbage_collect_thread(struct jffs2_sb_info *c)  	tsk = kthread_run(jffs2_garbage_collect_thread, c, "jffs2_gcd_mtd%d", c->mtd->index);  	if (IS_ERR(tsk)) { -		printk(KERN_WARNING "fork failed for JFFS2 garbage collect thread: %ld\n", -PTR_ERR(tsk)); +		pr_warn("fork failed for JFFS2 garbage collect thread: %ld\n", +			-PTR_ERR(tsk));  		complete(&c->gc_thread_exit);  		ret = PTR_ERR(tsk);  	} else {  		/* Wait for it... */ -		D1(printk(KERN_DEBUG "JFFS2: Garbage collect thread is pid %d\n", tsk->pid)); +		jffs2_dbg(1, "Garbage collect thread is pid %d\n", tsk->pid);  		wait_for_completion(&c->gc_thread_start);  		ret = tsk->pid;  	} @@ -60,7 +63,7 @@ void jffs2_stop_garbage_collect_thread(struct jffs2_sb_info *c)  	int wait = 0;  	spin_lock(&c->erase_completion_lock);  	if (c->gc_task) { -		D1(printk(KERN_DEBUG "jffs2: Killing GC task %d\n", c->gc_task->pid)); +		jffs2_dbg(1, "Killing GC task %d\n", c->gc_task->pid);  		send_sig(SIGKILL, c->gc_task, 1);  		wait = 1;  	} @@ -72,10 +75,13 @@ void jffs2_stop_garbage_collect_thread(struct jffs2_sb_info *c)  static int jffs2_garbage_collect_thread(void *_c)  {  	struct jffs2_sb_info *c = _c; +	sigset_t hupmask; +	siginitset(&hupmask, sigmask(SIGHUP));  	allow_signal(SIGKILL);  	allow_signal(SIGSTOP);  	allow_signal(SIGCONT); +	allow_signal(SIGHUP);  	c->gc_task = current;  	complete(&c->gc_thread_start); @@ -84,18 +90,17 @@ static int jffs2_garbage_collect_thread(void *_c)  	set_freezable();  	for (;;) { -		allow_signal(SIGHUP); +		sigprocmask(SIG_UNBLOCK, &hupmask, NULL);  	again:  		spin_lock(&c->erase_completion_lock);  		if (!jffs2_thread_should_wake(c)) {  			set_current_state (TASK_INTERRUPTIBLE);  			spin_unlock(&c->erase_completion_lock); -			D1(printk(KERN_DEBUG "jffs2_garbage_collect_thread sleeping...\n")); +			jffs2_dbg(1, "%s(): sleeping...\n", __func__);  			schedule(); -		} else +		} else {  			spin_unlock(&c->erase_completion_lock); -			 - +		}  		/* Problem - immediately after bootup, the GCD spends a lot  		 * of time in places like jffs2_kill_fragtree(); so much so  		 * that userspace processes (like gdm and X) are starved @@ -109,7 +114,7 @@ static int jffs2_garbage_collect_thread(void *_c)  		schedule_timeout_interruptible(msecs_to_jiffies(50));  		if (kthread_should_stop()) { -			D1(printk(KERN_DEBUG "jffs2_garbage_collect_thread():  kthread_stop() called.\n")); +			jffs2_dbg(1, "%s(): kthread_stop() called\n", __func__);  			goto die;  		} @@ -126,28 +131,32 @@ static int jffs2_garbage_collect_thread(void *_c)  			switch(signr) {  			case SIGSTOP: -				D1(printk(KERN_DEBUG "jffs2_garbage_collect_thread(): SIGSTOP received.\n")); +				jffs2_dbg(1, "%s(): SIGSTOP received\n", +					  __func__);  				set_current_state(TASK_STOPPED);  				schedule();  				break;  			case SIGKILL: -				D1(printk(KERN_DEBUG "jffs2_garbage_collect_thread(): SIGKILL received.\n")); +				jffs2_dbg(1, "%s(): SIGKILL received\n", +					  __func__);  				goto die;  			case SIGHUP: -				D1(printk(KERN_DEBUG "jffs2_garbage_collect_thread(): SIGHUP received.\n")); +				jffs2_dbg(1, "%s(): SIGHUP received\n", +					  __func__);  				break;  			default: -				D1(printk(KERN_DEBUG "jffs2_garbage_collect_thread(): signal %ld received\n", signr)); +				jffs2_dbg(1, "%s(): signal %ld received\n", +					  __func__, signr);  			}  		}  		/* We don't want SIGHUP to interrupt us. STOP and KILL are OK though. */ -		disallow_signal(SIGHUP); +		sigprocmask(SIG_BLOCK, &hupmask, NULL); -		D1(printk(KERN_DEBUG "jffs2_garbage_collect_thread(): pass\n")); +		jffs2_dbg(1, "%s(): pass\n", __func__);  		if (jffs2_garbage_collect_pass(c) == -ENOSPC) { -			printk(KERN_NOTICE "No space for garbage collection. Aborting GC thread\n"); +			pr_notice("No space for garbage collection. Aborting GC thread\n");  			goto die;  		}  	}  | 
