]> rtime.felk.cvut.cz Git - can-eth-gw.git/blobdiff - kernel/canethgw.c
kernel/canethgw mutex_unlock bug fix
[can-eth-gw.git] / kernel / canethgw.c
index 1d1e95ec6f7e38b67f78a6a01158bfea4fa2ad17..25190f7e85ac193d0afb0f81efd62fec12a9d26f 100644 (file)
@@ -498,7 +498,8 @@ static int cegw_thread_start(void *data)
        kfree(data);
        mutex_lock(&cegw_mutex);
        if (cegw_state == CEGW_EXIT)
-               return -1;
+               goto out_err;
+
        /* stops threads if exist */
        cegw_thread_stop();
 
@@ -506,12 +507,13 @@ static int cegw_thread_start(void *data)
        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,
@@ -519,7 +521,7 @@ static int cegw_thread_start(void *data)
                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,
@@ -528,7 +530,7 @@ static int cegw_thread_start(void *data)
                kernel_sock_shutdown(udp_sock, SHUT_RDWR);
                sock_release(udp_sock);
                sock_release(can_sock);
-               return -1;
+               goto out_err;
        }
 
        /* start threads */
@@ -539,7 +541,7 @@ static int cegw_thread_start(void *data)
                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);
@@ -551,7 +553,7 @@ static int cegw_thread_start(void *data)
                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);
@@ -559,6 +561,9 @@ static int cegw_thread_start(void *data)
        mutex_unlock(&cegw_mutex);
        pr_devel("threads are running\n");
        return 0;
+out_err:
+       mutex_unlock(&cegw_mutex);
+       return -1;
 }
 
 /**