|
@@ -85,15 +85,15 @@ static int jffs2_garbage_collect_thread(void *_c)
|
|
|
for (;;) {
|
|
|
allow_signal(SIGHUP);
|
|
|
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"));
|
|
|
- /* Yes, there's a race here; we checked jffs2_thread_should_wake()
|
|
|
- before setting current->state to TASK_INTERRUPTIBLE. But it doesn't
|
|
|
- matter - We don't care if we miss a wakeup, because the GC thread
|
|
|
- is only an optimisation anyway. */
|
|
|
schedule();
|
|
|
- }
|
|
|
+ } else
|
|
|
+ spin_unlock(&c->erase_completion_lock);
|
|
|
+
|
|
|
|
|
|
/* This thread is purely an optimisation. But if it runs when
|
|
|
other things could be running, it actually makes things a
|