]> rtime.felk.cvut.cz Git - lincan.git/blobdiff - lincan/src/can_queue.c
Corrected CAN queues locking for corner case - i.e. partially connected queue.
[lincan.git] / lincan / src / can_queue.c
index 6395207b3d859ac394f67ac01986738cd41434a9..a1aa1dfb01fdfdcad82440a3e801ce3357a8490a 100644 (file)
@@ -586,8 +586,8 @@ int canqueue_disconnect_edge(struct canque_edge_t *qedge)
        } else {
                DEBUGQUE("canqueue_disconnect_edge called with not fully connected edge");
                if(inends) can_spin_lock_irqsave(&inends->ends_lock,flags);
-               if(outends) can_spin_lock(&outends->ends_lock);
-               flags=0;
+               else if(outends) can_spin_lock_irqsave(&outends->ends_lock,flags);
+               else flags=0;
        }
 
        can_spin_lock(&qedge->fifo.fifo_lock);
@@ -609,8 +609,8 @@ int canqueue_disconnect_edge(struct canque_edge_t *qedge)
        if(inends && outends) {
                canque_edge_unlock_both_ends(inends, outends, flags);
        } else {
-               if(outends) can_spin_unlock(&outends->ends_lock);
                if(inends) can_spin_unlock_irqrestore(&inends->ends_lock,flags);
+               else if(outends) can_spin_unlock_irqrestore(&outends->ends_lock,flags);
        }
 
        DEBUGQUE("canqueue_disconnect_edge %d returned %d\n",qedge->edge_num,ret);