bcache: fixup multi-threaded bch_sectors_dirty_init() wake-up race
[linux-2.6-microblaze.git] / drivers / md / bcache / writeback.c
index a1d7609..3accfda 100644 (file)
@@ -1025,17 +1025,18 @@ retry_lock:
                if (atomic_read(&state.enough))
                        break;
 
+               atomic_inc(&state.started);
                state.infos[i].state = &state;
                state.infos[i].thread =
                        kthread_run(bch_dirty_init_thread, &state.infos[i],
                                    "bch_dirtcnt[%d]", i);
                if (IS_ERR(state.infos[i].thread)) {
                        pr_err("fails to run thread bch_dirty_init[%d]\n", i);
+                       atomic_dec(&state.started);
                        for (--i; i >= 0; i--)
                                kthread_stop(state.infos[i].thread);
                        goto out;
                }
-               atomic_inc(&state.started);
        }
 
 out: