]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
dm rq: clear kworker_task if kthread_run() returned an error
authorMike Snitzer <snitzer@redhat.com>
Tue, 18 Oct 2016 18:02:04 +0000 (14:02 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 10 Nov 2016 15:38:52 +0000 (16:38 +0100)
commit 937fa62e8a00d0b4bc2c0a40567d7c88ab2b2e8d upstream.

cleanup_mapped_device() calls kthread_stop() if kworker_task is
non-NULL.  Currently the assigned value could be a valid task struct or
an error code (e.g -ENOMEM).  Reset md->kworker_task to NULL if
kthread_run() returned an erorr.

Fixes: 7193a9defc ("dm rq: check kthread_run return for .request_fn request-based DM")
Reported-by: Tahsin Erdogan <tahsin@google.com>
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/md/dm-rq.c

index 5da86c8b6545abcf6fd5b7a1b80cb4d946e5b70d..2154596eedf33c8f129a9af8e287876729da0ecd 100644 (file)
@@ -835,8 +835,11 @@ int dm_old_init_request_queue(struct mapped_device *md)
        init_kthread_worker(&md->kworker);
        md->kworker_task = kthread_run(kthread_worker_fn, &md->kworker,
                                       "kdmwork-%s", dm_device_name(md));
-       if (IS_ERR(md->kworker_task))
-               return PTR_ERR(md->kworker_task);
+       if (IS_ERR(md->kworker_task)) {
+               int error = PTR_ERR(md->kworker_task);
+               md->kworker_task = NULL;
+               return error;
+       }
 
        elv_register_queue(md->queue);