# HG changeset patch # User Martin Troxler # Date 1294314440 -3600 # Node ID ca03a6737cb7052e389cb5e361b5e23bd2bec7a6 # Parent b67eb5c26716db5e3cdcda8b1f8447e19397b834 releasing of refcounted requests fixed: do not call EC_SLAVE_DBG without valid slave diff -r b67eb5c26716 -r ca03a6737cb7 master/cdev.c --- a/master/cdev.c Thu Jan 06 10:50:54 2011 +0100 +++ b/master/cdev.c Thu Jan 06 12:47:20 2011 +0100 @@ -864,9 +864,9 @@ if (!(request->slave = ec_master_find_slave( master, 0, data.slave_position))) { ec_mutex_unlock(&master->master_mutex); - kref_put(&request->refcount,ec_master_sdo_request_release); EC_MASTER_ERR(master, "Slave %u does not exist!\n", data.slave_position); + kref_put(&request->refcount,ec_master_sdo_request_release); return -EINVAL; } diff -r b67eb5c26716 -r ca03a6737cb7 master/fsm_master.c --- a/master/fsm_master.c Thu Jan 06 10:50:54 2011 +0100 +++ b/master/fsm_master.c Thu Jan 06 12:47:20 2011 +0100 @@ -1240,7 +1240,8 @@ void ec_master_sii_write_request_release(struct kref *ref) { ec_sii_write_request_t *request = container_of(ref, ec_sii_write_request_t, refcount); - EC_SLAVE_DBG(request->slave, 1, "Releasing SII write request %p.\n",request); + if (request->slave) + EC_SLAVE_DBG(request->slave, 1, "Releasing SII write request %p.\n",request); kfree(request->words); kfree(request); } @@ -1253,7 +1254,8 @@ void ec_master_reg_request_release(struct kref *ref) { ec_reg_request_t *request = container_of(ref, ec_reg_request_t, refcount); - EC_SLAVE_DBG(request->slave, 1, "Releasing reg request %p.\n",request); + if (request->slave) + EC_SLAVE_DBG(request->slave, 1, "Releasing reg request %p.\n",request); if (request->data) kfree(request->data); kfree(request); @@ -1267,7 +1269,8 @@ void ec_master_sdo_request_release(struct kref *ref) { ec_master_sdo_request_t *request = container_of(ref, ec_master_sdo_request_t, refcount); - EC_SLAVE_DBG(request->slave, 1, "Releasing SDO request %p.\n",request); + if (request->slave) + EC_SLAVE_DBG(request->slave, 1, "Releasing SDO request %p.\n",request); ec_sdo_request_clear(&request->req); kfree(request); } @@ -1280,7 +1283,8 @@ void ec_master_foe_request_release(struct kref *ref) { ec_master_foe_request_t *request = container_of(ref, ec_master_foe_request_t, refcount); - EC_SLAVE_DBG(request->slave, 1, "Releasing FoE request %p.\n",request); + if (request->slave) + EC_SLAVE_DBG(request->slave, 1, "Releasing FoE request %p.\n",request); ec_foe_request_clear(&request->req); kfree(request); } @@ -1293,7 +1297,8 @@ void ec_master_soe_request_release(struct kref *ref) { ec_master_soe_request_t *request = container_of(ref, ec_master_soe_request_t, refcount); - EC_SLAVE_DBG(request->slave, 1, "Releasing SoE request %p.\n",request); + if (request->slave) + EC_SLAVE_DBG(request->slave, 1, "Releasing SoE request %p.\n",request); ec_soe_request_clear(&request->req); kfree(request); }