releasing of refcounted requests fixed: do not call EC_SLAVE_DBG without valid slave

This commit is contained in:
Martin Troxler 2011-01-06 12:47:20 +01:00
parent 2b4a3b0c5c
commit 54da56e622
2 changed files with 11 additions and 6 deletions

View File

@ -864,9 +864,9 @@ int ec_cdev_ioctl_slave_sdo_upload(
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;
}

View File

@ -1240,7 +1240,8 @@ void ec_fsm_master_state_reg_request(
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_sii_write_request_release(struct kref *ref)
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_reg_request_release(struct kref *ref)
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_sdo_request_release(struct kref *ref)
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_foe_request_release(struct kref *ref)
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);
}