About Kernel Documentation Linux Kernel Contact Linux Resources Linux Blog

Documentation / target / tcm_mod_builder.py




Custom Search

Based on kernel version 4.3. Page generated on 2015-11-02 12:51 EST.

1	#!/usr/bin/python
2	# The TCM v4 multi-protocol fabric module generation script for drivers/target/$NEW_MOD
3	#
4	# Copyright (c) 2010 Rising Tide Systems
5	# Copyright (c) 2010 Linux-iSCSI.org
6	#
7	# Author: nab@kernel.org
8	#
9	import os, sys
10	import subprocess as sub
11	import string
12	import re
13	import optparse
14	
15	tcm_dir = ""
16	
17	fabric_ops = []
18	fabric_mod_dir = ""
19	fabric_mod_port = ""
20	fabric_mod_init_port = ""
21	
22	def tcm_mod_err(msg):
23		print msg
24		sys.exit(1)
25	
26	def tcm_mod_create_module_subdir(fabric_mod_dir_var):
27	
28		if os.path.isdir(fabric_mod_dir_var) == True:
29			return 1
30	
31		print "Creating fabric_mod_dir: " + fabric_mod_dir_var
32		ret = os.mkdir(fabric_mod_dir_var)
33		if ret:
34			tcm_mod_err("Unable to mkdir " + fabric_mod_dir_var)
35	
36		return
37	
38	def tcm_mod_build_FC_include(fabric_mod_dir_var, fabric_mod_name):
39		global fabric_mod_port
40		global fabric_mod_init_port
41		buf = ""
42	
43		f = fabric_mod_dir_var + "/" + fabric_mod_name + "_base.h"
44		print "Writing file: " + f
45	
46		p = open(f, 'w');
47		if not p:
48			tcm_mod_err("Unable to open file: " + f)
49	
50		buf = "#define " + fabric_mod_name.upper() + "_VERSION	\"v0.1\"\n"
51		buf += "#define " + fabric_mod_name.upper() + "_NAMELEN	32\n"
52		buf += "\n"
53		buf += "struct " + fabric_mod_name + "_tpg {\n"
54		buf += "	/* FC lport target portal group tag for TCM */\n"
55		buf += "	u16 lport_tpgt;\n"
56		buf += "	/* Pointer back to " + fabric_mod_name + "_lport */\n"
57		buf += "	struct " + fabric_mod_name + "_lport *lport;\n"
58		buf += "	/* Returned by " + fabric_mod_name + "_make_tpg() */\n"
59		buf += "	struct se_portal_group se_tpg;\n"
60		buf += "};\n"
61		buf += "\n"
62		buf += "struct " + fabric_mod_name + "_lport {\n"
63		buf += "	/* Binary World Wide unique Port Name for FC Target Lport */\n"
64		buf += "	u64 lport_wwpn;\n"
65		buf += "	/* ASCII formatted WWPN for FC Target Lport */\n"
66		buf += "	char lport_name[" + fabric_mod_name.upper() + "_NAMELEN];\n"
67		buf += "	/* Returned by " + fabric_mod_name + "_make_lport() */\n"
68		buf += "	struct se_wwn lport_wwn;\n"
69		buf += "};\n"
70	
71		ret = p.write(buf)
72		if ret:
73			tcm_mod_err("Unable to write f: " + f)
74	
75		p.close()
76	
77		fabric_mod_port = "lport"
78		fabric_mod_init_port = "nport"
79	
80		return
81	
82	def tcm_mod_build_SAS_include(fabric_mod_dir_var, fabric_mod_name):
83		global fabric_mod_port
84		global fabric_mod_init_port
85		buf = ""
86	
87		f = fabric_mod_dir_var + "/" + fabric_mod_name + "_base.h"
88		print "Writing file: " + f
89	
90		p = open(f, 'w');
91		if not p:
92			tcm_mod_err("Unable to open file: " + f)
93	
94		buf = "#define " + fabric_mod_name.upper() + "_VERSION  \"v0.1\"\n"
95		buf += "#define " + fabric_mod_name.upper() + "_NAMELEN 32\n"
96		buf += "\n"
97		buf += "struct " + fabric_mod_name + "_tpg {\n"
98		buf += "	/* SAS port target portal group tag for TCM */\n"
99		buf += "	u16 tport_tpgt;\n"
100		buf += "	/* Pointer back to " + fabric_mod_name + "_tport */\n"
101		buf += "	struct " + fabric_mod_name + "_tport *tport;\n"
102		buf += "	/* Returned by " + fabric_mod_name + "_make_tpg() */\n"
103		buf += "	struct se_portal_group se_tpg;\n"
104		buf += "};\n\n"
105		buf += "struct " + fabric_mod_name + "_tport {\n"
106		buf += "	/* Binary World Wide unique Port Name for SAS Target port */\n"
107		buf += "	u64 tport_wwpn;\n"
108		buf += "	/* ASCII formatted WWPN for SAS Target port */\n"
109		buf += "	char tport_name[" + fabric_mod_name.upper() + "_NAMELEN];\n"
110		buf += "	/* Returned by " + fabric_mod_name + "_make_tport() */\n"
111		buf += "	struct se_wwn tport_wwn;\n"
112		buf += "};\n"
113	
114		ret = p.write(buf)
115		if ret:
116			tcm_mod_err("Unable to write f: " + f)
117	
118		p.close()
119	
120		fabric_mod_port = "tport"
121		fabric_mod_init_port = "iport"
122	
123		return
124	
125	def tcm_mod_build_iSCSI_include(fabric_mod_dir_var, fabric_mod_name):
126		global fabric_mod_port
127		global fabric_mod_init_port
128		buf = ""
129	
130		f = fabric_mod_dir_var + "/" + fabric_mod_name + "_base.h"
131		print "Writing file: " + f
132	
133		p = open(f, 'w');
134		if not p:
135			tcm_mod_err("Unable to open file: " + f)
136	
137		buf = "#define " + fabric_mod_name.upper() + "_VERSION  \"v0.1\"\n"
138		buf += "#define " + fabric_mod_name.upper() + "_NAMELEN 32\n"
139		buf += "\n"
140		buf += "struct " + fabric_mod_name + "_tpg {\n"
141		buf += "	/* iSCSI target portal group tag for TCM */\n"
142		buf += "	u16 tport_tpgt;\n"
143		buf += "	/* Pointer back to " + fabric_mod_name + "_tport */\n"
144		buf += "	struct " + fabric_mod_name + "_tport *tport;\n"
145		buf += "	/* Returned by " + fabric_mod_name + "_make_tpg() */\n"
146		buf += "	struct se_portal_group se_tpg;\n"
147		buf += "};\n\n"
148		buf += "struct " + fabric_mod_name + "_tport {\n"
149		buf += "	/* ASCII formatted TargetName for IQN */\n"
150		buf += "	char tport_name[" + fabric_mod_name.upper() + "_NAMELEN];\n"
151		buf += "	/* Returned by " + fabric_mod_name + "_make_tport() */\n"
152		buf += "	struct se_wwn tport_wwn;\n"
153		buf += "};\n"
154	
155		ret = p.write(buf)
156		if ret:
157			tcm_mod_err("Unable to write f: " + f)
158	
159		p.close()
160	
161		fabric_mod_port = "tport"
162		fabric_mod_init_port = "iport"
163	
164		return
165	
166	def tcm_mod_build_base_includes(proto_ident, fabric_mod_dir_val, fabric_mod_name):
167	
168		if proto_ident == "FC":
169			tcm_mod_build_FC_include(fabric_mod_dir_val, fabric_mod_name)
170		elif proto_ident == "SAS":
171			tcm_mod_build_SAS_include(fabric_mod_dir_val, fabric_mod_name)
172		elif proto_ident == "iSCSI":
173			tcm_mod_build_iSCSI_include(fabric_mod_dir_val, fabric_mod_name)
174		else:
175			print "Unsupported proto_ident: " + proto_ident
176			sys.exit(1)
177	
178		return
179	
180	def tcm_mod_build_configfs(proto_ident, fabric_mod_dir_var, fabric_mod_name):
181		buf = ""
182	
183		f = fabric_mod_dir_var + "/" + fabric_mod_name + "_configfs.c"
184		print "Writing file: " + f
185	
186	        p = open(f, 'w');
187	        if not p:
188	                tcm_mod_err("Unable to open file: " + f)
189	
190		buf = "#include <linux/module.h>\n"
191		buf += "#include <linux/moduleparam.h>\n"
192		buf += "#include <linux/version.h>\n"
193		buf += "#include <generated/utsrelease.h>\n"
194		buf += "#include <linux/utsname.h>\n"
195		buf += "#include <linux/init.h>\n"
196		buf += "#include <linux/slab.h>\n"
197		buf += "#include <linux/kthread.h>\n"
198		buf += "#include <linux/types.h>\n"
199		buf += "#include <linux/string.h>\n"
200		buf += "#include <linux/configfs.h>\n"
201		buf += "#include <linux/ctype.h>\n"
202		buf += "#include <asm/unaligned.h>\n"
203		buf += "#include <scsi/scsi_proto.h>\n\n"
204		buf += "#include <target/target_core_base.h>\n"
205		buf += "#include <target/target_core_fabric.h>\n"
206		buf += "#include <target/target_core_fabric_configfs.h>\n"
207		buf += "#include <target/configfs_macros.h>\n\n"
208		buf += "#include \"" + fabric_mod_name + "_base.h\"\n"
209		buf += "#include \"" + fabric_mod_name + "_fabric.h\"\n\n"
210	
211		buf += "static const struct target_core_fabric_ops " + fabric_mod_name + "_ops;\n\n"
212	
213		buf += "static struct se_portal_group *" + fabric_mod_name + "_make_tpg(\n"
214		buf += "	struct se_wwn *wwn,\n"
215		buf += "	struct config_group *group,\n"
216		buf += "	const char *name)\n"
217		buf += "{\n"
218		buf += "	struct " + fabric_mod_name + "_" + fabric_mod_port + "*" + fabric_mod_port + " = container_of(wwn,\n"
219		buf += "			struct " + fabric_mod_name + "_" + fabric_mod_port + ", " + fabric_mod_port + "_wwn);\n\n"
220		buf += "	struct " + fabric_mod_name + "_tpg *tpg;\n"
221		buf += "	unsigned long tpgt;\n"
222		buf += "	int ret;\n\n"
223		buf += "	if (strstr(name, \"tpgt_\") != name)\n"
224		buf += "		return ERR_PTR(-EINVAL);\n"
225		buf += "	if (kstrtoul(name + 5, 10, &tpgt) || tpgt > UINT_MAX)\n"
226		buf += "		return ERR_PTR(-EINVAL);\n\n"
227		buf += "	tpg = kzalloc(sizeof(struct " + fabric_mod_name + "_tpg), GFP_KERNEL);\n"
228		buf += "	if (!tpg) {\n"
229		buf += "		printk(KERN_ERR \"Unable to allocate struct " + fabric_mod_name + "_tpg\");\n"
230		buf += "		return ERR_PTR(-ENOMEM);\n"
231		buf += "	}\n"
232		buf += "	tpg->" + fabric_mod_port + " = " + fabric_mod_port + ";\n"
233		buf += "	tpg->" + fabric_mod_port + "_tpgt = tpgt;\n\n"
234	
235		if proto_ident == "FC":
236			buf += "	ret = core_tpg_register(wwn, &tpg->se_tpg, SCSI_PROTOCOL_FCP);\n"
237		elif proto_ident == "SAS":
238			buf += "	ret = core_tpg_register(wwn, &tpg->se_tpg, SCSI_PROTOCOL_SAS);\n"
239		elif proto_ident == "iSCSI":
240			buf += "	ret = core_tpg_register(wwn, &tpg->se_tpg, SCSI_PROTOCOL_ISCSI);\n"
241	
242		buf += "	if (ret < 0) {\n"
243		buf += "		kfree(tpg);\n"
244		buf += "		return NULL;\n"
245		buf += "	}\n"
246		buf += "	return &tpg->se_tpg;\n"
247		buf += "}\n\n"
248		buf += "static void " + fabric_mod_name + "_drop_tpg(struct se_portal_group *se_tpg)\n"
249		buf += "{\n"
250		buf += "	struct " + fabric_mod_name + "_tpg *tpg = container_of(se_tpg,\n"
251		buf += "				struct " + fabric_mod_name + "_tpg, se_tpg);\n\n"
252		buf += "	core_tpg_deregister(se_tpg);\n"
253		buf += "	kfree(tpg);\n"
254		buf += "}\n\n"
255	
256		buf += "static struct se_wwn *" + fabric_mod_name + "_make_" + fabric_mod_port + "(\n"
257		buf += "	struct target_fabric_configfs *tf,\n"
258		buf += "	struct config_group *group,\n"
259		buf += "	const char *name)\n"
260		buf += "{\n"
261		buf += "	struct " + fabric_mod_name + "_" + fabric_mod_port + " *" + fabric_mod_port + ";\n"
262	
263		if proto_ident == "FC" or proto_ident == "SAS":
264			buf += "	u64 wwpn = 0;\n\n"
265	
266		buf += "	/* if (" + fabric_mod_name + "_parse_wwn(name, &wwpn, 1) < 0)\n"
267		buf += "		return ERR_PTR(-EINVAL); */\n\n"
268		buf += "	" + fabric_mod_port + " = kzalloc(sizeof(struct " + fabric_mod_name + "_" + fabric_mod_port + "), GFP_KERNEL);\n"
269		buf += "	if (!" + fabric_mod_port + ") {\n"
270		buf += "		printk(KERN_ERR \"Unable to allocate struct " + fabric_mod_name + "_" + fabric_mod_port + "\");\n"
271		buf += "		return ERR_PTR(-ENOMEM);\n"
272		buf += "	}\n"
273	
274		if proto_ident == "FC" or proto_ident == "SAS":
275			buf += "	" + fabric_mod_port + "->" + fabric_mod_port + "_wwpn = wwpn;\n"
276	
277		buf += "	/* " + fabric_mod_name + "_format_wwn(&" + fabric_mod_port + "->" + fabric_mod_port + "_name[0], " + fabric_mod_name.upper() + "_NAMELEN, wwpn); */\n\n"
278		buf += "	return &" + fabric_mod_port + "->" + fabric_mod_port + "_wwn;\n"
279		buf += "}\n\n"
280		buf += "static void " + fabric_mod_name + "_drop_" + fabric_mod_port + "(struct se_wwn *wwn)\n"
281		buf += "{\n"
282		buf += "	struct " + fabric_mod_name + "_" + fabric_mod_port + " *" + fabric_mod_port + " = container_of(wwn,\n"
283		buf += "				struct " + fabric_mod_name + "_" + fabric_mod_port + ", " + fabric_mod_port + "_wwn);\n"
284		buf += "	kfree(" + fabric_mod_port + ");\n"
285		buf += "}\n\n"
286		buf += "static ssize_t " + fabric_mod_name + "_wwn_show_attr_version(\n"
287		buf += "	struct target_fabric_configfs *tf,\n"
288		buf += "	char *page)\n"
289		buf += "{\n"
290		buf += "	return sprintf(page, \"" + fabric_mod_name.upper() + " fabric module %s on %s/%s\"\n"
291		buf += "		\"on \"UTS_RELEASE\"\\n\", " + fabric_mod_name.upper() + "_VERSION, utsname()->sysname,\n"
292		buf += "		utsname()->machine);\n"
293		buf += "}\n\n"
294		buf += "TF_WWN_ATTR_RO(" + fabric_mod_name + ", version);\n\n"
295		buf += "static struct configfs_attribute *" + fabric_mod_name + "_wwn_attrs[] = {\n"
296		buf += "	&" + fabric_mod_name + "_wwn_version.attr,\n"
297		buf += "	NULL,\n"
298		buf += "};\n\n"
299	
300		buf += "static const struct target_core_fabric_ops " + fabric_mod_name + "_ops = {\n"
301		buf += "	.module				= THIS_MODULE,\n"
302		buf += "	.name				= \"" + fabric_mod_name + "\",\n"
303		buf += "	.get_fabric_name		= " + fabric_mod_name + "_get_fabric_name,\n"
304		buf += "	.tpg_get_wwn			= " + fabric_mod_name + "_get_fabric_wwn,\n"
305		buf += "	.tpg_get_tag			= " + fabric_mod_name + "_get_tag,\n"
306		buf += "	.tpg_check_demo_mode		= " + fabric_mod_name + "_check_false,\n"
307		buf += "	.tpg_check_demo_mode_cache	= " + fabric_mod_name + "_check_true,\n"
308		buf += "	.tpg_check_demo_mode_write_protect = " + fabric_mod_name + "_check_true,\n"
309		buf += "	.tpg_check_prod_mode_write_protect = " + fabric_mod_name + "_check_false,\n"
310		buf += "	.tpg_get_inst_index		= " + fabric_mod_name + "_tpg_get_inst_index,\n"
311		buf += "	.release_cmd			= " + fabric_mod_name + "_release_cmd,\n"
312		buf += "	.shutdown_session		= " + fabric_mod_name + "_shutdown_session,\n"
313		buf += "	.close_session			= " + fabric_mod_name + "_close_session,\n"
314		buf += "	.sess_get_index			= " + fabric_mod_name + "_sess_get_index,\n"
315		buf += "	.sess_get_initiator_sid		= NULL,\n"
316		buf += "	.write_pending			= " + fabric_mod_name + "_write_pending,\n"
317		buf += "	.write_pending_status		= " + fabric_mod_name + "_write_pending_status,\n"
318		buf += "	.set_default_node_attributes	= " + fabric_mod_name + "_set_default_node_attrs,\n"
319		buf += "	.get_cmd_state			= " + fabric_mod_name + "_get_cmd_state,\n"
320		buf += "	.queue_data_in			= " + fabric_mod_name + "_queue_data_in,\n"
321		buf += "	.queue_status			= " + fabric_mod_name + "_queue_status,\n"
322		buf += "	.queue_tm_rsp			= " + fabric_mod_name + "_queue_tm_rsp,\n"
323		buf += "	.aborted_task			= " + fabric_mod_name + "_aborted_task,\n"
324		buf += "	/*\n"
325		buf += "	 * Setup function pointers for generic logic in target_core_fabric_configfs.c\n"
326		buf += "	 */\n"
327		buf += "	.fabric_make_wwn		= " + fabric_mod_name + "_make_" + fabric_mod_port + ",\n"
328		buf += "	.fabric_drop_wwn		= " + fabric_mod_name + "_drop_" + fabric_mod_port + ",\n"
329		buf += "	.fabric_make_tpg		= " + fabric_mod_name + "_make_tpg,\n"
330		buf += "	.fabric_drop_tpg		= " + fabric_mod_name + "_drop_tpg,\n"
331		buf += "\n"
332		buf += "	.tfc_wwn_attrs			= " + fabric_mod_name + "_wwn_attrs,\n"
333		buf += "};\n\n"
334	
335		buf += "static int __init " + fabric_mod_name + "_init(void)\n"
336		buf += "{\n"
337		buf += "	return target_register_template(&" + fabric_mod_name + "_ops);\n"
338		buf += "};\n\n"
339	
340		buf += "static void __exit " + fabric_mod_name + "_exit(void)\n"
341		buf += "{\n"
342		buf += "	target_unregister_template(&" + fabric_mod_name + "_ops);\n"
343		buf += "};\n\n"
344	
345		buf += "MODULE_DESCRIPTION(\"" + fabric_mod_name.upper() + " series fabric driver\");\n"
346		buf += "MODULE_LICENSE(\"GPL\");\n"
347		buf += "module_init(" + fabric_mod_name + "_init);\n"
348		buf += "module_exit(" + fabric_mod_name + "_exit);\n"
349	
350		ret = p.write(buf)
351		if ret:
352			tcm_mod_err("Unable to write f: " + f)
353	
354		p.close()
355	
356		return
357	
358	def tcm_mod_scan_fabric_ops(tcm_dir):
359	
360		fabric_ops_api = tcm_dir + "include/target/target_core_fabric.h"
361	
362		print "Using tcm_mod_scan_fabric_ops: " + fabric_ops_api
363		process_fo = 0;
364	
365		p = open(fabric_ops_api, 'r')
366	
367		line = p.readline()
368		while line:
369			if process_fo == 0 and re.search('struct target_core_fabric_ops {', line):
370				line = p.readline()
371				continue
372	
373			if process_fo == 0:
374				process_fo = 1;
375				line = p.readline()
376				# Search for function pointer
377				if not re.search('\(\*', line):
378					continue
379	
380				fabric_ops.append(line.rstrip())
381				continue
382	
383			line = p.readline()
384			# Search for function pointer
385			if not re.search('\(\*', line):
386				continue
387	
388			fabric_ops.append(line.rstrip())
389	
390		p.close()
391		return
392	
393	def tcm_mod_dump_fabric_ops(proto_ident, fabric_mod_dir_var, fabric_mod_name):
394		buf = ""
395		bufi = ""
396	
397		f = fabric_mod_dir_var + "/" + fabric_mod_name + "_fabric.c"
398		print "Writing file: " + f
399	
400		p = open(f, 'w')
401		if not p:
402			tcm_mod_err("Unable to open file: " + f)
403	
404		fi = fabric_mod_dir_var + "/" + fabric_mod_name + "_fabric.h"
405		print "Writing file: " + fi
406	
407		pi = open(fi, 'w')
408		if not pi:
409			tcm_mod_err("Unable to open file: " + fi)
410	
411		buf = "#include <linux/slab.h>\n"
412		buf += "#include <linux/kthread.h>\n"
413		buf += "#include <linux/types.h>\n"
414		buf += "#include <linux/list.h>\n"
415		buf += "#include <linux/types.h>\n"
416		buf += "#include <linux/string.h>\n"
417		buf += "#include <linux/ctype.h>\n"
418		buf += "#include <asm/unaligned.h>\n"
419		buf += "#include <scsi/scsi_common.h>\n"
420		buf += "#include <scsi/scsi_proto.h>\n"
421		buf += "#include <target/target_core_base.h>\n"
422		buf += "#include <target/target_core_fabric.h>\n"
423		buf += "#include \"" + fabric_mod_name + "_base.h\"\n"
424		buf += "#include \"" + fabric_mod_name + "_fabric.h\"\n\n"
425	
426		buf += "int " + fabric_mod_name + "_check_true(struct se_portal_group *se_tpg)\n"
427		buf += "{\n"
428		buf += "	return 1;\n"
429		buf += "}\n\n"
430		bufi += "int " + fabric_mod_name + "_check_true(struct se_portal_group *);\n"
431	
432		buf += "int " + fabric_mod_name + "_check_false(struct se_portal_group *se_tpg)\n"
433		buf += "{\n"
434		buf += "	return 0;\n"
435		buf += "}\n\n"
436		bufi += "int " + fabric_mod_name + "_check_false(struct se_portal_group *);\n"
437	
438		total_fabric_ops = len(fabric_ops)
439		i = 0
440	
441		while i < total_fabric_ops:
442			fo = fabric_ops[i]
443			i += 1
444	#		print "fabric_ops: " + fo
445	
446			if re.search('get_fabric_name', fo):
447				buf += "char *" + fabric_mod_name + "_get_fabric_name(void)\n"
448				buf += "{\n"
449				buf += "	return \"" + fabric_mod_name + "\";\n"
450				buf += "}\n\n"
451				bufi += "char *" + fabric_mod_name + "_get_fabric_name(void);\n"
452				continue
453	
454			if re.search('get_wwn', fo):
455				buf += "char *" + fabric_mod_name + "_get_fabric_wwn(struct se_portal_group *se_tpg)\n"
456				buf += "{\n"
457				buf += "	struct " + fabric_mod_name + "_tpg *tpg = container_of(se_tpg,\n"
458				buf += "				struct " + fabric_mod_name + "_tpg, se_tpg);\n"
459				buf += "	struct " + fabric_mod_name + "_" + fabric_mod_port + " *" + fabric_mod_port + " = tpg->" + fabric_mod_port + ";\n\n"
460				buf += "	return &" + fabric_mod_port + "->" + fabric_mod_port + "_name[0];\n"
461				buf += "}\n\n"
462				bufi += "char *" + fabric_mod_name + "_get_fabric_wwn(struct se_portal_group *);\n"
463	
464			if re.search('get_tag', fo):
465				buf += "u16 " + fabric_mod_name + "_get_tag(struct se_portal_group *se_tpg)\n"
466				buf += "{\n"
467				buf += "	struct " + fabric_mod_name + "_tpg *tpg = container_of(se_tpg,\n"
468				buf += "				struct " + fabric_mod_name + "_tpg, se_tpg);\n"
469				buf += "	return tpg->" + fabric_mod_port + "_tpgt;\n"
470				buf += "}\n\n"
471				bufi += "u16 " + fabric_mod_name + "_get_tag(struct se_portal_group *);\n"
472	
473			if re.search('tpg_get_inst_index\)\(', fo):
474				buf += "u32 " + fabric_mod_name + "_tpg_get_inst_index(struct se_portal_group *se_tpg)\n"
475				buf += "{\n"
476				buf += "	return 1;\n"
477				buf += "}\n\n"
478				bufi += "u32 " + fabric_mod_name + "_tpg_get_inst_index(struct se_portal_group *);\n"
479	
480			if re.search('\*release_cmd\)\(', fo):
481				buf += "void " + fabric_mod_name + "_release_cmd(struct se_cmd *se_cmd)\n"
482				buf += "{\n"
483				buf += "	return;\n"
484				buf += "}\n\n"
485				bufi += "void " + fabric_mod_name + "_release_cmd(struct se_cmd *);\n"
486	
487			if re.search('shutdown_session\)\(', fo):
488				buf += "int " + fabric_mod_name + "_shutdown_session(struct se_session *se_sess)\n"
489				buf += "{\n"
490				buf += "	return 0;\n"
491				buf += "}\n\n"
492				bufi += "int " + fabric_mod_name + "_shutdown_session(struct se_session *);\n"
493	
494			if re.search('close_session\)\(', fo):
495				buf += "void " + fabric_mod_name + "_close_session(struct se_session *se_sess)\n"
496				buf += "{\n"
497				buf += "	return;\n"
498				buf += "}\n\n"
499				bufi += "void " + fabric_mod_name + "_close_session(struct se_session *);\n"
500	
501			if re.search('sess_get_index\)\(', fo):
502				buf += "u32 " + fabric_mod_name + "_sess_get_index(struct se_session *se_sess)\n"
503				buf += "{\n"
504				buf += "	return 0;\n"
505				buf += "}\n\n"
506				bufi += "u32 " + fabric_mod_name + "_sess_get_index(struct se_session *);\n"
507	
508			if re.search('write_pending\)\(', fo):
509				buf += "int " + fabric_mod_name + "_write_pending(struct se_cmd *se_cmd)\n"
510				buf += "{\n"
511				buf += "	return 0;\n"
512				buf += "}\n\n"
513				bufi += "int " + fabric_mod_name + "_write_pending(struct se_cmd *);\n"
514	
515			if re.search('write_pending_status\)\(', fo):
516				buf += "int " + fabric_mod_name + "_write_pending_status(struct se_cmd *se_cmd)\n"
517				buf += "{\n"
518				buf += "	return 0;\n"
519				buf += "}\n\n"
520				bufi += "int " + fabric_mod_name + "_write_pending_status(struct se_cmd *);\n"
521	
522			if re.search('set_default_node_attributes\)\(', fo):
523				buf += "void " + fabric_mod_name + "_set_default_node_attrs(struct se_node_acl *nacl)\n"
524				buf += "{\n"
525				buf += "	return;\n"
526				buf += "}\n\n"
527				bufi += "void " + fabric_mod_name + "_set_default_node_attrs(struct se_node_acl *);\n"
528	
529			if re.search('get_cmd_state\)\(', fo):
530				buf += "int " + fabric_mod_name + "_get_cmd_state(struct se_cmd *se_cmd)\n"
531				buf += "{\n"
532				buf += "	return 0;\n"
533				buf += "}\n\n"
534				bufi += "int " + fabric_mod_name + "_get_cmd_state(struct se_cmd *);\n"
535	
536			if re.search('queue_data_in\)\(', fo):
537				buf += "int " + fabric_mod_name + "_queue_data_in(struct se_cmd *se_cmd)\n"
538				buf += "{\n"
539				buf += "	return 0;\n"
540				buf += "}\n\n"
541				bufi += "int " + fabric_mod_name + "_queue_data_in(struct se_cmd *);\n"
542	
543			if re.search('queue_status\)\(', fo):
544				buf += "int " + fabric_mod_name + "_queue_status(struct se_cmd *se_cmd)\n"
545				buf += "{\n"
546				buf += "	return 0;\n"
547				buf += "}\n\n"
548				bufi += "int " + fabric_mod_name + "_queue_status(struct se_cmd *);\n"
549	
550			if re.search('queue_tm_rsp\)\(', fo):
551				buf += "void " + fabric_mod_name + "_queue_tm_rsp(struct se_cmd *se_cmd)\n"
552				buf += "{\n"
553				buf += "	return;\n"
554				buf += "}\n\n"
555				bufi += "void " + fabric_mod_name + "_queue_tm_rsp(struct se_cmd *);\n"
556	
557			if re.search('aborted_task\)\(', fo):
558				buf += "void " + fabric_mod_name + "_aborted_task(struct se_cmd *se_cmd)\n"
559				buf += "{\n"
560				buf += "	return;\n"
561				buf += "}\n\n"
562				bufi += "void " + fabric_mod_name + "_aborted_task(struct se_cmd *);\n"
563	
564		ret = p.write(buf)
565		if ret:
566			tcm_mod_err("Unable to write f: " + f)
567	
568		p.close()
569	
570		ret = pi.write(bufi)
571		if ret:
572			tcm_mod_err("Unable to write fi: " + fi)
573	
574		pi.close()
575		return
576	
577	def tcm_mod_build_kbuild(fabric_mod_dir_var, fabric_mod_name):
578	
579		buf = ""
580		f = fabric_mod_dir_var + "/Makefile"
581		print "Writing file: " + f
582	
583		p = open(f, 'w')
584		if not p:
585			tcm_mod_err("Unable to open file: " + f)
586	
587		buf += fabric_mod_name + "-objs			:= " + fabric_mod_name + "_fabric.o \\\n"
588		buf += "					   " + fabric_mod_name + "_configfs.o\n"
589		buf += "obj-$(CONFIG_" + fabric_mod_name.upper() + ")		+= " + fabric_mod_name + ".o\n"
590	
591		ret = p.write(buf)
592		if ret:
593			tcm_mod_err("Unable to write f: " + f)
594	
595		p.close()
596		return
597	
598	def tcm_mod_build_kconfig(fabric_mod_dir_var, fabric_mod_name):
599	
600		buf = ""
601		f = fabric_mod_dir_var + "/Kconfig"
602		print "Writing file: " + f
603	
604		p = open(f, 'w')
605		if not p:
606			tcm_mod_err("Unable to open file: " + f)
607	
608		buf = "config " + fabric_mod_name.upper() + "\n"
609		buf += "	tristate \"" + fabric_mod_name.upper() + " fabric module\"\n"
610		buf += "	depends on TARGET_CORE && CONFIGFS_FS\n"
611		buf += "	default n\n"
612		buf += "	---help---\n"
613		buf += "	Say Y here to enable the " + fabric_mod_name.upper() + " fabric module\n"
614	
615		ret = p.write(buf)
616		if ret:
617			tcm_mod_err("Unable to write f: " + f)
618	
619		p.close()
620		return
621	
622	def tcm_mod_add_kbuild(tcm_dir, fabric_mod_name):
623		buf = "obj-$(CONFIG_" + fabric_mod_name.upper() + ")	+= " + fabric_mod_name.lower() + "/\n"
624		kbuild = tcm_dir + "/drivers/target/Makefile"
625	
626		f = open(kbuild, 'a')
627		f.write(buf)
628		f.close()
629		return
630	
631	def tcm_mod_add_kconfig(tcm_dir, fabric_mod_name):
632		buf = "source \"drivers/target/" + fabric_mod_name.lower() + "/Kconfig\"\n"
633		kconfig = tcm_dir + "/drivers/target/Kconfig"
634	
635		f = open(kconfig, 'a')
636		f.write(buf)
637		f.close()
638		return
639	
640	def main(modname, proto_ident):
641	#	proto_ident = "FC"
642	#	proto_ident = "SAS"
643	#	proto_ident = "iSCSI"
644	
645		tcm_dir = os.getcwd();
646		tcm_dir += "/../../"
647		print "tcm_dir: " + tcm_dir
648		fabric_mod_name = modname
649		fabric_mod_dir = tcm_dir + "drivers/target/" + fabric_mod_name
650		print "Set fabric_mod_name: " + fabric_mod_name
651		print "Set fabric_mod_dir: " + fabric_mod_dir
652		print "Using proto_ident: " + proto_ident
653	
654		if proto_ident != "FC" and proto_ident != "SAS" and proto_ident != "iSCSI":
655			print "Unsupported proto_ident: " + proto_ident
656			sys.exit(1)
657	
658		ret = tcm_mod_create_module_subdir(fabric_mod_dir)
659		if ret:
660			print "tcm_mod_create_module_subdir() failed because module already exists!"
661			sys.exit(1)
662	
663		tcm_mod_build_base_includes(proto_ident, fabric_mod_dir, fabric_mod_name)
664		tcm_mod_scan_fabric_ops(tcm_dir)
665		tcm_mod_dump_fabric_ops(proto_ident, fabric_mod_dir, fabric_mod_name)
666		tcm_mod_build_configfs(proto_ident, fabric_mod_dir, fabric_mod_name)
667		tcm_mod_build_kbuild(fabric_mod_dir, fabric_mod_name)
668		tcm_mod_build_kconfig(fabric_mod_dir, fabric_mod_name)
669	
670		input = raw_input("Would you like to add " + fabric_mod_name + " to drivers/target/Makefile..? [yes,no]: ")
671		if input == "yes" or input == "y":
672			tcm_mod_add_kbuild(tcm_dir, fabric_mod_name)
673	
674		input = raw_input("Would you like to add " + fabric_mod_name + " to drivers/target/Kconfig..? [yes,no]: ")
675		if input == "yes" or input == "y":
676			tcm_mod_add_kconfig(tcm_dir, fabric_mod_name)
677	
678		return
679	
680	parser = optparse.OptionParser()
681	parser.add_option('-m', '--modulename', help='Module name', dest='modname',
682			action='store', nargs=1, type='string')
683	parser.add_option('-p', '--protoident', help='Protocol Ident', dest='protoident',
684			action='store', nargs=1, type='string')
685	
686	(opts, args) = parser.parse_args()
687	
688	mandatories = ['modname', 'protoident']
689	for m in mandatories:
690		if not opts.__dict__[m]:
691			print "mandatory option is missing\n"
692			parser.print_help()
693			exit(-1)
694	
695	if __name__ == "__main__":
696	
697		main(str(opts.modname), opts.protoident)
Hide Line Numbers
About Kernel Documentation Linux Kernel Contact Linux Resources Linux Blog

Information is copyright its respective author. All material is available from the Linux Kernel Source distributed under a GPL License. This page is provided as a free service by mjmwired.net.