git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@2720 d57e44dd-8a1f-0410-8b47-8ef2f437770f
This commit is contained in:
Vladislav Bolkhovitin
2010-11-17 11:40:08 +00:00
parent 900a70d873
commit 52820b5d57
4 changed files with 16 additions and 12 deletions

View File

@@ -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) {

View File

@@ -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 */
};

View File

@@ -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)

View File

@@ -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);
}