Showing error 617

User: Jiri Slaby
Error type: Double Unlock
Error type description: Some lock is unlocked twice unintentionally in a sequence
File location: drivers/infiniband/core/cma.c
Line in file: 1156
Project: Linux Kernel
Project version: 2.6.28
Tools: Stanse (1.2)
Entered: 2011-11-07 22:20:57 UTC


Source:

1126                goto release_conn_id;
1127
1128        conn_id->cm_id.ib = cm_id;
1129        cm_id->context = conn_id;
1130        cm_id->cm_handler = cma_ib_handler;
1131
1132        ret = conn_id->id.event_handler(&conn_id->id, &event);
1133        if (!ret) {
1134                /*
1135                 * Acquire mutex to prevent user executing rdma_destroy_id()
1136                 * while we're accessing the cm_id.
1137                 */
1138                mutex_lock(&lock);
1139                if (cma_comp(conn_id, CMA_CONNECT) &&
1140                    !cma_is_ud_ps(conn_id->id.ps))
1141                        ib_send_cm_mra(cm_id, CMA_CM_MRA_SETTING, NULL, 0);
1142                mutex_unlock(&lock);
1143                mutex_unlock(&conn_id->handler_mutex);
1144                goto out;
1145        }
1146
1147        /* Destroy the CM ID by returning a non-zero value. */
1148        conn_id->cm_id.ib = NULL;
1149
1150release_conn_id:
1151        cma_exch(conn_id, CMA_DESTROYING);
1152        mutex_unlock(&conn_id->handler_mutex);
1153        rdma_destroy_id(&conn_id->id);
1154
1155out:
1156        mutex_unlock(&listen_id->handler_mutex);
1157        return ret;
1158}
1159
1160static __be64 cma_get_service_id(enum rdma_port_space ps, struct sockaddr *addr)
1161{
1162        return cpu_to_be64(((u64)ps << 16) + be16_to_cpu(cma_port(addr)));
1163}
1164
1165static void cma_set_compare_data(enum rdma_port_space ps, struct sockaddr *addr,
1166                                 struct ib_cm_compare_data *compare)
Show full sources