kfree(data);
mutex_lock(&cegw_mutex);
if (cegw_state == CEGW_EXIT)
- return -1;
+ goto out_err;
+
/* stops threads if exist */
cegw_thread_stop();
if (sock_create_kern(PF_INET, SOCK_DGRAM, IPPROTO_UDP, &udp_sock)
!= 0) {
printk(KERN_ERR "canethgw: udp socket creation failed\n");
- return -1;
+ goto out_err;
}
if (sock_create_kern(PF_CAN, SOCK_RAW, CAN_RAW, &can_sock) != 0) {
printk(KERN_ERR "canethgw: can socket creation failed\n");
- return -1;
+ sock_release(udp_sock);
+ goto out_err;
}
if (kernel_bind(udp_sock, (struct sockaddr*)&udp_addr,
printk(KERN_ERR "canethgw: udp socket binding failed\n");
sock_release(udp_sock);
sock_release(can_sock);
- return -1;
+ goto out_err;
}
if (kernel_bind(can_sock, (struct sockaddr*) &can_addr,
kernel_sock_shutdown(udp_sock, SHUT_RDWR);
sock_release(udp_sock);
sock_release(can_sock);
- return -1;
+ goto out_err;
}
/* start threads */
cegw_state = CEGW_STOP;
sock_release(udp_sock);
sock_release(can_sock);
- return -1;
+ goto out_err;
}
get_task_struct(eth_to_can);
wake_up_process(eth_to_can);
kthread_stop(eth_to_can);
sock_release(udp_sock);
sock_release(can_sock);
- return -1;
+ goto out_err;
}
get_task_struct(can_to_eth);
wake_up_process(can_to_eth);
mutex_unlock(&cegw_mutex);
pr_devel("threads are running\n");
return 0;
+out_err:
+ mutex_unlock(&cegw_mutex);
+ return -1;
}
/**