From b330889bf44a46f10fa9121cf1bc3412697652c2 Mon Sep 17 00:00:00 2001 From: Vladislav Bolkhovitin Date: Sat, 27 Nov 2010 19:22:43 +0000 Subject: [PATCH] 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/trunk@2860 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 e62297085..10a539a65 100644 --- a/scst/src/scst_sysfs.c +++ b/scst/src/scst_sysfs.c @@ -1258,15 +1258,13 @@ void scst_tgt_sysfs_del(struct scst_tgt *tgt) tgt->tgt_kobj_release_cmpl = &c; 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); @@ -1767,9 +1765,9 @@ void scst_dev_sysfs_del(struct scst_device *dev) dev->dev_kobj_release_cmpl = &c; 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); @@ -3383,12 +3381,11 @@ void scst_acg_sysfs_del(struct scst_acg *acg) acg->acg_kobj_release_cmpl = &c; 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);