From ddc2387ec540129147e073ea8ef8035f5feed122 Mon Sep 17 00:00:00 2001 From: Vladislav Bolkhovitin Date: Mon, 29 Nov 2010 17:57:19 +0000 Subject: [PATCH] Merge of the trunk's r2860: This patch fixes a class of race conditions in the ..._sysfs_del() functions: the kobject_put() calls should come after all kobject_del() calls because as long as the last kobject_del() call hasn't been invoked, a sysfs .show() or .store() callback may still be in progress that needs one of these kobjects. Signed-off-by: Bart Van Assche git-svn-id: http://svn.code.sf.net/p/scst/svn/branches/2.0.0.x@2869 d57e44dd-8a1f-0410-8b47-8ef2f437770f --- scst/src/scst_sysfs.c | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/scst/src/scst_sysfs.c b/scst/src/scst_sysfs.c index 522af69a0..8fdabd5d3 100644 --- a/scst/src/scst_sysfs.c +++ b/scst/src/scst_sysfs.c @@ -1224,15 +1224,13 @@ void scst_tgt_sysfs_del(struct scst_tgt *tgt) TRACE_ENTRY(); kobject_del(tgt->tgt_sess_kobj); - kobject_put(tgt->tgt_sess_kobj); - kobject_del(tgt->tgt_luns_kobj); - kobject_put(tgt->tgt_luns_kobj); - kobject_del(tgt->tgt_ini_grp_kobj); - kobject_put(tgt->tgt_ini_grp_kobj); - kobject_del(&tgt->tgt_kobj); + + kobject_put(tgt->tgt_sess_kobj); + kobject_put(tgt->tgt_luns_kobj); + kobject_put(tgt->tgt_ini_grp_kobj); kobject_put(&tgt->tgt_kobj); rc = wait_for_completion_timeout(&tgt->tgt_kobj_release_cmpl, HZ); @@ -1731,9 +1729,9 @@ void scst_dev_sysfs_del(struct scst_device *dev) TRACE_ENTRY(); kobject_del(dev->dev_exp_kobj); - kobject_put(dev->dev_exp_kobj); - kobject_del(&dev->dev_kobj); + + kobject_put(dev->dev_exp_kobj); kobject_put(&dev->dev_kobj); rc = wait_for_completion_timeout(&dev->dev_kobj_release_cmpl, HZ); @@ -3161,12 +3159,11 @@ void scst_acg_sysfs_del(struct scst_acg *acg) TRACE_ENTRY(); kobject_del(acg->luns_kobj); - kobject_put(acg->luns_kobj); - kobject_del(acg->initiators_kobj); - kobject_put(acg->initiators_kobj); - kobject_del(&acg->acg_kobj); + + kobject_put(acg->luns_kobj); + kobject_put(acg->initiators_kobj); kobject_put(&acg->acg_kobj); rc = wait_for_completion_timeout(&acg->acg_kobj_release_cmpl, HZ);