[PATCH][SCST]: Implementation of subdirectories sessions, luns, ini_group inside targets/<target_name>/target/.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This patch implements the creation of the subdirectories sessions, luns, ini_group
inside targets/<target_name>/target/.

Also it makes some changes on scst_unregister since the scst_tgt can't just be
kfreed as long as it has a kobject embedded on it. Resuming, the scst_unregister
call kobject_put and on the kobject release functions there is a call to scst_release
(which is the same as scst_unregister was).

Signed-off-by: Daniel Debonzi <debonzi@xxxxxxxxxxxxxxxxxx>
Index: scst/include/scst.h
===================================================================
--- scst/include/scst.h	(revision 851)
+++ scst/include/scst.h	(working copy)
@@ -961,7 +961,10 @@ struct scst_tgt {
 	/* Name on the default security group ("Default_target_name") */
 	char *default_group_name;

-	struct kobject *tgt_kobj; /* kobject for this struct. */
+	struct kobject tgt_kobj; /* main kobject for this struct. */
+	struct kobject *tgt_sess_kobj;
+	struct kobject *tgt_luns_kobj;
+	struct kobject *tgt_ini_grp_kobj;
 };

 /* Hash size and hash fn for hash based lun translation */
Index: scst/src/scst_main.c
===================================================================
--- scst/src/scst_main.c	(revision 851)
+++ scst/src/scst_main.c	(working copy)
@@ -375,6 +375,10 @@ struct scst_tgt *scst_register(struct sc
 	mutex_unlock(&scst_mutex);
 	scst_resume_activity();

+	rc = scst_create_tgt_child_kobjs(tgt);
+	if (rc < 0)
+		goto out_child_kobjs_err;
+
 	PRINT_INFO("Target %s (%p) for template %s registered successfully",
 		target_name, tgt, vtt->name);

@@ -382,6 +386,11 @@ out:
 	TRACE_EXIT();
 	return tgt;

+out_child_kobjs_err:
+	scst_destroy_tgt_kobj(tgt);
+	TRACE_EXIT();
+	return NULL;
+
 out_kobj_err:
 	scst_cleanup_proc_target_entries(tgt);

@@ -416,6 +425,13 @@ static inline int test_sess_list(struct

 void scst_unregister(struct scst_tgt *tgt)
 {
+	scst_destroy_tgt_child_kobjs(tgt);
+	scst_destroy_tgt_kobj(tgt);
+}
+EXPORT_SYMBOL(scst_unregister);
+
+void scst_release(struct scst_tgt *tgt)
+{
 	struct scst_session *sess;
 	struct scst_tgt_template *vtt = tgt->tgtt;

@@ -452,7 +468,6 @@ again:
 	list_del(&tgt->tgt_list_entry);

 	scst_cleanup_proc_target_entries(tgt);
-	scst_destroy_tgt_kobj(tgt);

 	kfree(tgt->default_group_name);

@@ -468,8 +483,8 @@ again:

 	TRACE_EXIT();
 	return;
+
 }
-EXPORT_SYMBOL(scst_unregister);

 static int scst_susp_wait(bool interruptible)
 {
Index: scst/src/scst_priv.h
===================================================================
--- scst/src/scst_priv.h	(revision 851)
+++ scst/src/scst_priv.h	(working copy)
@@ -390,6 +390,12 @@ int scst_create_tgtt_kobj(struct scst_tg
 void scst_destroy_tgtt_kobj(struct scst_tgt_template *vtt);
 int scst_create_tgt_kobj(struct scst_tgt *tgt);
 void scst_destroy_tgt_kobj(struct scst_tgt *tgt);
+int scst_create_tgt_child_kobjs(struct scst_tgt *tgt);
+void scst_destroy_tgt_child_kobjs(struct scst_tgt *tgt);
+
+/* kobjects release functions */
+/*releases the scst_tgt sent to scst_unregister */
+void scst_release(struct scst_tgt *tgt);

 int scst_get_cdb_len(const uint8_t *cdb);

Index: scst/src/scst_sysfs.c
===================================================================
--- scst/src/scst_sysfs.c	(revision 851)
+++ scst/src/scst_sysfs.c	(working copy)
@@ -43,16 +43,31 @@ void scst_destroy_tgtt_kobj(struct scst_
 	kobject_put(vtt->tgtt_kobj);
 }

+void scst_tgt_release(struct kobject *kobj)
+{
+	struct scst_tgt *tgt;
+
+	TRACE_ENTRY();
+
+	tgt = container_of(kobj, struct scst_tgt, tgt_kobj);
+	scst_release(tgt);
+
+	TRACE_EXIT();
+}
+
+struct kobj_type tgt_ktype = {
+	.release = scst_tgt_release,
+};
+
 int scst_create_tgt_kobj(struct scst_tgt *tgt)
 {
 	int retval = 0;

 	TRACE_ENTRY();

-	tgt->tgt_kobj = kobject_create_and_add(tgt->default_group_name,
-					       tgt->tgtt->tgtt_kobj);
-	if (!tgt->tgt_kobj)
-		retval = -EINVAL;
+	retval = kobject_init_and_add(&tgt->tgt_kobj, &tgt_ktype,
+				      tgt->tgtt->tgtt_kobj,
+				      tgt->default_group_name);

 	TRACE_EXIT_RES(retval);
 	return retval;
@@ -60,7 +75,50 @@ int scst_create_tgt_kobj(struct scst_tgt

 void scst_destroy_tgt_kobj(struct scst_tgt *tgt)
 {
-	kobject_put(tgt->tgt_kobj);
+	kobject_put(&tgt->tgt_kobj);
+}
+
+int scst_create_tgt_child_kobjs(struct scst_tgt *tgt)
+{
+	int retval = 0;
+
+	TRACE_ENTRY();
+
+	tgt->tgt_sess_kobj = kobject_create_and_add("sessions", &tgt->tgt_kobj);
+	if (!tgt->tgt_sess_kobj) {
+		retval = -EINVAL;
+		goto sess_kobj_err;
+	}
+
+	tgt->tgt_luns_kobj = kobject_create_and_add("luns", &tgt->tgt_kobj);
+	if (!tgt->tgt_luns_kobj) {
+		retval = -EINVAL;
+		goto luns_kobj_err;
+	}
+
+	tgt->tgt_ini_grp_kobj = kobject_create_and_add("ini_group",
+						       &tgt->tgt_kobj);
+	if (!tgt->tgt_ini_grp_kobj) {
+		retval = -EINVAL;
+		goto ini_grp_kobj_err;
+	}
+
+out:
+	TRACE_EXIT_RES(retval);
+	return retval;
+ini_grp_kobj_err:
+	kobject_put(tgt->tgt_luns_kobj);
+luns_kobj_err:
+	kobject_put(tgt->tgt_sess_kobj);
+sess_kobj_err:
+	goto out;
+}
+
+void scst_destroy_tgt_child_kobjs(struct scst_tgt *tgt)
+{
+	kobject_put(tgt->tgt_sess_kobj);
+	kobject_put(tgt->tgt_luns_kobj);
+	kobject_put(tgt->tgt_ini_grp_kobj);
 }

 static ssize_t scst_threads_show(struct kobject *kobj, struct kobj_attribute *attr,
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [SCSI Target Devel]     [Linux SCSI Target Infrastructure]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Samba]     [Device Mapper]
  Powered by Linux