[Stgt-devel] [patch] support different type in one target.
Albert Pauw
pauw
Sun Apr 1 20:25:23 CEST 2007
Unfortunately,
this patch does not update the Type field,
when the command "tgtadm --lld iscsi --op show --mode target" is given. The Type field is one field for the target only, there should be a Type field for every LUN when there are different types per LUN. Other than that, it does seem to work though.
Albert
--- snip ---
Hu Gang wrote:
this patch adding support mutiple scsi type as a modules.
Signed-off-by: hu gang <hugang at soulinfo.com>
---
usr/mmc.c | 5 +++++
usr/osd.c | 5 +++++
usr/sbc.c | 5 +++++
usr/target.c | 61 +++++++++++++++++++++++++++++++++++++++++++---------------
usr/tgtd.h | 4 ++++
5 files changed, 64 insertions(+), 16 deletions(-)
diff --git a/usr/mmc.c b/usr/mmc.c
index 4eab50b..cbba763 100644
--- a/usr/mmc.c
+++ b/usr/mmc.c
@@ -213,3 +213,8 @@ struct device_type_template mmc_template
[0xb0 ... 0xff] = {spc_illegal_op},
}
};
+
+__attribute__((constructor)) static void mmc_init(void)
+{
+ device_type_register(&mmc_template);
+}
diff --git a/usr/osd.c b/usr/osd.c
index da3853b..1612a20 100644
--- a/usr/osd.c
+++ b/usr/osd.c
@@ -209,3 +209,8 @@ struct device_type_template osd_template
[0xb0 ... 0xff] = {spc_illegal_op},
}
};
+
+__attribute__((constructor)) static void osd_init(void)
+{
+ device_type_register(&osd_template);
+}
diff --git a/usr/sbc.c b/usr/sbc.c
index edcd6e8..66c0c2e 100644
--- a/usr/sbc.c
+++ b/usr/sbc.c
@@ -465,3 +465,8 @@ struct device_type_template sbc_template
[0xb0 ... 0xff] = {spc_illegal_op},
}
};
+
+__attribute__((constructor)) static void sbc_init(void)
+{
+ device_type_register(&sbc_template);
+}
diff --git a/usr/target.c b/usr/target.c
index b49b143..e986985 100644
--- a/usr/target.c
+++ b/usr/target.c
@@ -36,8 +36,37 @@ #include "target.h"
#include "scsi.h"
#include "tgtadm.h"
-extern struct device_type_template sbc_template, mmc_template, osd_template,
- spt_template;
+static LIST_HEAD(type_list);
+
+int device_type_register(struct device_type_template *t)
+{
+ list_add_tail(&t->list_entry, &type_list);
+ return 0;
+}
+
+static struct device_type_template *device_type_find_name(const char *name)
+{
+ struct device_type_template *t;
+
+ list_for_each_entry(t, &type_list, list_entry) {
+ if (strcmp(name, t->name) == 0)
+ return t;
+ }
+
+ return NULL;
+}
+
+static struct device_type_template *device_type_find_type(unsigned char type)
+{
+ struct device_type_template *t;
+
+ list_for_each_entry(t, &type_list, list_entry) {
+ if (t->type == type)
+ return t;
+ }
+
+ return NULL;
+}
static LIST_HEAD(target_list);
@@ -205,6 +234,7 @@ int tgt_device_create(int tid, uint64_t
struct target *target;
struct scsi_lu *lu, *pos;
struct backingstore_template *bst;
+ struct device_type_template *tt;
dprintf("%d %" PRIu64 "\n", tid, lun);
@@ -237,23 +267,12 @@ int tgt_device_create(int tid, uint64_t
return TGTADM_NOMEM;
lu->bst = bst;
- switch (t_type) {
- case TYPE_DISK:
- lu->dev_type_template = sbc_template;
- break;
- case TYPE_ROM:
- lu->dev_type_template = mmc_template;
- break;
- case TYPE_OSD:
- lu->dev_type_template = osd_template;
- break;
- case TYPE_SPT:
- lu->dev_type_template = spt_template;
- break;
- default:
+ tt = device_type_find_type(t_type);
+ if (tt == NULL) {
free(lu);
return TGTADM_INVALID_REQUEST;
}
+ lu->dev_type_template = *tt;
err = tgt_device_path_update(target, lu, p);
if (err) {
@@ -1089,6 +1108,7 @@ int tgt_target_show_all(char *buf, int r
struct scsi_lu *lu;
struct acl_entry *acl;
struct it_nexus *nexus;
+ struct device_type_template *dtt;
list_for_each_entry(target, &target_list, target_siblings) {
shprintf(total, buf, rest,
@@ -1148,6 +1168,15 @@ int tgt_target_show_all(char *buf, int r
list_for_each_entry(acl, &target->acl_list, aclent_list)
shprintf(total, buf, rest, _TAB2 "%s\n", acl->address);
}
+
+ shprintf(total, buf, rest, "Device type:\n");
+ list_for_each_entry(dtt, &type_list, list_entry) {
+ shprintf(total, buf, rest,
+ _TAB1 "Device Type: %d\n"
+ _TAB2 "Device Name: %s\n"
+ _TAB2 "Device Pid : %s\n",
+ dtt->type, dtt->name, dtt->pid ? dtt->pid : "");
+ }
return total;
overflow:
return max;
diff --git a/usr/tgtd.h b/usr/tgtd.h
index de7d889..413271e 100644
--- a/usr/tgtd.h
+++ b/usr/tgtd.h
@@ -49,8 +49,12 @@ struct device_type_template {
void (*device_init)(struct scsi_lu *dev);
struct device_type_operations ops[256];
+
+ struct list_head list_entry;
};
+extern int device_type_register(struct device_type_template *);
+
struct scsi_lu {
int fd;
uint64_t addr; /* persistent mapped address */
More information about the stgt
mailing list