}
 EXPORT_SYMBOL_GPL(fsg_common_set_inquiry_string);
 
-int fsg_common_run_thread(struct fsg_common *common)
-{
-       common->state = FSG_STATE_IDLE;
-       /* Tell the thread to start working */
-       common->thread_task =
-               kthread_create(fsg_main_thread, common, "file-storage");
-       if (IS_ERR(common->thread_task)) {
-               common->state = FSG_STATE_TERMINATED;
-               return PTR_ERR(common->thread_task);
-       }
-
-       DBG(common, "I/O thread pid: %d\n", task_pid_nr(common->thread_task));
-
-       wake_up_process(common->thread_task);
-
-       return 0;
-}
-EXPORT_SYMBOL_GPL(fsg_common_run_thread);
-
 static void fsg_common_release(struct kref *ref)
 {
        struct fsg_common *common = container_of(ref, struct fsg_common, ref);
        if (common->state != FSG_STATE_TERMINATED) {
                raise_exception(common, FSG_STATE_EXIT);
                wait_for_completion(&common->thread_notifier);
+               common->thread_task = NULL;
        }
 
        for (i = 0; i < ARRAY_SIZE(common->luns); ++i) {
                if (ret)
                        return ret;
                fsg_common_set_inquiry_string(fsg->common, NULL, NULL);
-               ret = fsg_common_run_thread(fsg->common);
-               if (ret)
+       }
+
+       if (!common->thread_task) {
+               common->state = FSG_STATE_IDLE;
+               common->thread_task =
+                       kthread_create(fsg_main_thread, common, "file-storage");
+               if (IS_ERR(common->thread_task)) {
+                       int ret = PTR_ERR(common->thread_task);
+                       common->thread_task = NULL;
+                       common->state = FSG_STATE_TERMINATED;
                        return ret;
+               }
+               DBG(common, "I/O thread pid: %d\n",
+                   task_pid_nr(common->thread_task));
+               wake_up_process(common->thread_task);
        }
 
        fsg->gadget = gadget;
 
 
 static int rndis_do_config(struct usb_configuration *c)
 {
-       struct fsg_opts *fsg_opts;
        int ret;
 
        if (gadget_is_otg(c->cdev->gadget)) {
                goto err_fsg;
        }
 
-       fsg_opts = fsg_opts_from_func_inst(fi_msg);
-       ret = fsg_common_run_thread(fsg_opts->common);
-       if (ret)
-               goto err_run;
-
        ret = usb_add_function(c, f_msg_rndis);
        if (ret)
                goto err_run;
 
 static int cdc_do_config(struct usb_configuration *c)
 {
-       struct fsg_opts *fsg_opts;
        int ret;
 
        if (gadget_is_otg(c->cdev->gadget)) {
                goto err_fsg;
        }
 
-       fsg_opts = fsg_opts_from_func_inst(fi_msg);
-       ret = fsg_common_run_thread(fsg_opts->common);
-       if (ret)
-               goto err_run;
-
        ret = usb_add_function(c, f_msg_multi);
        if (ret)
                goto err_run;
 
        struct usb_function *f_ecm;
        struct usb_function *f_obex2 = NULL;
        struct usb_function *f_msg;
-       struct fsg_opts *fsg_opts;
        int status = 0;
        int obex1_stat = -1;
        int obex2_stat = -1;
                goto err_ecm;
        }
 
-       fsg_opts = fsg_opts_from_func_inst(fi_msg);
-
-       status = fsg_common_run_thread(fsg_opts->common);
-       if (status)
-               goto err_msg;
-
        status = usb_add_function(c, f_msg);
        if (status)
                goto err_msg;