/* Returns either NULL on allocation failure, or a  */
struct subprocess_info* call_usermodehelper_setup(char *path, char **argv, char **envp, gfp_t gfp_mask)
/* Returns either NULL on allocation failure, or a  */
struct subprocess_info* call_usermodehelper_setup(char *path, char **argv, char **envp, gfp_t gfp_mask)
{
	struct subprocess_info *sub_info;
	sub_info = kzalloc(sizeof(struct subprocess_info), gfp_mask);
	if (!sub_info)
		goto out;
	INIT_WORK(&sub_info->work, __call_usermodehelper);
	sub_info->path = path;
	sub_info->argv = argv;
	sub_info->envp = envp;
	sub_info->cred = prepare_usermodehelper_creds();
	if (!sub_info->cred) {
		kfree(sub_info);
		return NULL;
	}
  out:
	return sub_info;
}