|
@@ -451,13 +451,11 @@ int call_usermodehelper_exec(struct subprocess_info *sub_info,
|
|
|
enum umh_wait wait)
|
|
|
{
|
|
|
DECLARE_COMPLETION_ONSTACK(done);
|
|
|
- int retval;
|
|
|
+ int retval = 0;
|
|
|
|
|
|
helper_lock();
|
|
|
- if (sub_info->path[0] == '\0') {
|
|
|
- retval = 0;
|
|
|
+ if (sub_info->path[0] == '\0')
|
|
|
goto out;
|
|
|
- }
|
|
|
|
|
|
if (!khelper_wq || usermodehelper_disabled) {
|
|
|
retval = -EBUSY;
|
|
@@ -468,13 +466,14 @@ int call_usermodehelper_exec(struct subprocess_info *sub_info,
|
|
|
sub_info->wait = wait;
|
|
|
|
|
|
queue_work(khelper_wq, &sub_info->work);
|
|
|
- if (wait == UMH_NO_WAIT) /* task has freed sub_info */
|
|
|
- return 0;
|
|
|
+ if (wait == UMH_NO_WAIT) /* task has freed sub_info */
|
|
|
+ goto unlock;
|
|
|
wait_for_completion(&done);
|
|
|
retval = sub_info->retval;
|
|
|
|
|
|
- out:
|
|
|
+out:
|
|
|
call_usermodehelper_freeinfo(sub_info);
|
|
|
+unlock:
|
|
|
helper_unlock();
|
|
|
return retval;
|
|
|
}
|