From 54da56e62265bc3498ee8a70f7d8772015fe6629 Mon Sep 17 00:00:00 2001 From: Martin Troxler Date: Thu, 6 Jan 2011 12:47:20 +0100 Subject: [PATCH] releasing of refcounted requests fixed: do not call EC_SLAVE_DBG without valid slave --- master/cdev.c | 2 +- master/fsm_master.c | 15 ++++++++++----- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/master/cdev.c b/master/cdev.c index 01b6422c..4e292378 100644 --- a/master/cdev.c +++ b/master/cdev.c @@ -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; } diff --git a/master/fsm_master.c b/master/fsm_master.c index 98245f4f..3ccc4c86 100644 --- a/master/fsm_master.c +++ b/master/fsm_master.c @@ -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); }