diff --git a/iscsi-scst/kernel/conn.c b/iscsi-scst/kernel/conn.c index cdd5ece16..f05e5bfb4 100644 --- a/iscsi-scst/kernel/conn.c +++ b/iscsi-scst/kernel/conn.c @@ -128,7 +128,8 @@ static void iscsi_conn_release(struct kobject *kobj) TRACE_ENTRY(); conn = container_of(kobj, struct iscsi_conn, conn_kobj); - complete_all(&conn->conn_kobj_release_cmpl); + if (conn->conn_kobj_release_cmpl != NULL) + complete_all(conn->conn_kobj_release_cmpl); TRACE_EXIT(); return; @@ -236,18 +237,21 @@ static struct kobj_attribute iscsi_conn_state_attr = static void conn_sysfs_del(struct iscsi_conn *conn) { int rc; + DECLARE_COMPLETION_ONSTACK(c); TRACE_ENTRY(); + conn->conn_kobj_release_cmpl = &c; + kobject_del(&conn->conn_kobj); kobject_put(&conn->conn_kobj); - rc = wait_for_completion_timeout(&conn->conn_kobj_release_cmpl, HZ); + rc = wait_for_completion_timeout(conn->conn_kobj_release_cmpl, HZ); if (rc == 0) { PRINT_INFO("Waiting for releasing sysfs entry " "for conn %p (%d refs)...", conn, atomic_read(&conn->conn_kobj.kref.refcount)); - wait_for_completion(&conn->conn_kobj_release_cmpl); + wait_for_completion(conn->conn_kobj_release_cmpl); PRINT_INFO("Done waiting for releasing sysfs " "entry for conn %p", conn); } @@ -284,8 +288,6 @@ restart: } } - init_completion(&conn->conn_kobj_release_cmpl); - res = kobject_init_and_add(&conn->conn_kobj, &iscsi_conn_ktype, scst_sysfs_get_sess_kobj(session->scst_sess), addr); if (res != 0) { diff --git a/iscsi-scst/kernel/iscsi.h b/iscsi-scst/kernel/iscsi.h index 69a6f1f40..c0c353b7d 100644 --- a/iscsi-scst/kernel/iscsi.h +++ b/iscsi-scst/kernel/iscsi.h @@ -311,7 +311,7 @@ struct iscsi_conn { #ifndef CONFIG_SCST_PROC /* Don't need any protection */ struct kobject conn_kobj; - struct completion conn_kobj_release_cmpl; + struct completion *conn_kobj_release_cmpl; #endif /* CONFIG_SCST_PROC */ }; diff --git a/scst/src/scst_mem.h b/scst/src/scst_mem.h index 54a96c646..322fc8024 100644 --- a/scst/src/scst_mem.h +++ b/scst/src/scst_mem.h @@ -129,7 +129,7 @@ struct sgv_pool { struct kobject sgv_kobj; /* sysfs release completion */ - struct completion sgv_kobj_release_cmpl; + struct completion *sgv_kobj_release_cmpl; }; static inline struct scatterlist *sgv_pool_sg(struct sgv_pool_obj *obj) diff --git a/scst/src/scst_sysfs.c b/scst/src/scst_sysfs.c index dc461e512..23e335167 100644 --- a/scst/src/scst_sysfs.c +++ b/scst/src/scst_sysfs.c @@ -4189,7 +4189,8 @@ static void sgv_kobj_release(struct kobject *kobj) TRACE_ENTRY(); pool = container_of(kobj, struct sgv_pool, sgv_kobj); - complete_all(&pool->sgv_kobj_release_cmpl); + if (pool->sgv_kobj_release_cmpl != NULL) + complete_all(pool->sgv_kobj_release_cmpl); TRACE_EXIT(); return; @@ -4207,8 +4208,6 @@ int scst_sgv_sysfs_create(struct sgv_pool *pool) TRACE_ENTRY(); - init_completion(&pool->sgv_kobj_release_cmpl); - res = kobject_init_and_add(&pool->sgv_kobj, &sgv_pool_ktype, scst_sgv_kobj, pool->name); if (res != 0) { @@ -4224,18 +4223,21 @@ out: void scst_sgv_sysfs_del(struct sgv_pool *pool) { int rc; + DECLARE_COMPLETION_ONSTACK(c); TRACE_ENTRY(); + pool->sgv_kobj_release_cmpl = &c; + kobject_del(&pool->sgv_kobj); kobject_put(&pool->sgv_kobj); - rc = wait_for_completion_timeout(&pool->sgv_kobj_release_cmpl, HZ); + rc = wait_for_completion_timeout(pool->sgv_kobj_release_cmpl, HZ); if (rc == 0) { PRINT_INFO("Waiting for releasing sysfs entry " "for SGV pool %s (%d refs)...", pool->name, atomic_read(&pool->sgv_kobj.kref.refcount)); - wait_for_completion(&pool->sgv_kobj_release_cmpl); + wait_for_completion(pool->sgv_kobj_release_cmpl); PRINT_INFO("Done waiting for releasing sysfs " "entry for SGV pool %s", pool->name); }