About Kernel Documentation Linux Kernel Contact Linux Resources Linux Blog

Documentation / target / tcm_mod_builder.py




Custom Search

Based on kernel version 4.8. Page generated on 2016-10-06 23:19 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 \"" + fabric_mod_name + "_base.h\"\n"
207		buf += "#include \"" + fabric_mod_name + "_fabric.h\"\n\n"
208	
209		buf += "static const struct target_core_fabric_ops " + fabric_mod_name + "_ops;\n\n"
210	
211		buf += "static struct se_portal_group *" + fabric_mod_name + "_make_tpg(\n"
212		buf += "	struct se_wwn *wwn,\n"
213		buf += "	struct config_group *group,\n"
214		buf += "	const char *name)\n"
215		buf += "{\n"
216		buf += "	struct " + fabric_mod_name + "_" + fabric_mod_port + "*" + fabric_mod_port + " = container_of(wwn,\n"
217		buf += "			struct " + fabric_mod_name + "_" + fabric_mod_port + ", " + fabric_mod_port + "_wwn);\n\n"
218		buf += "	struct " + fabric_mod_name + "_tpg *tpg;\n"
219		buf += "	unsigned long tpgt;\n"
220		buf += "	int ret;\n\n"
221		buf += "	if (strstr(name, \"tpgt_\") != name)\n"
222		buf += "		return ERR_PTR(-EINVAL);\n"
223		buf += "	if (kstrtoul(name + 5, 10, &tpgt) || tpgt > UINT_MAX)\n"
224		buf += "		return ERR_PTR(-EINVAL);\n\n"
225		buf += "	tpg = kzalloc(sizeof(struct " + fabric_mod_name + "_tpg), GFP_KERNEL);\n"
226		buf += "	if (!tpg) {\n"
227		buf += "		printk(KERN_ERR \"Unable to allocate struct " + fabric_mod_name + "_tpg\");\n"
228		buf += "		return ERR_PTR(-ENOMEM);\n"
229		buf += "	}\n"
230		buf += "	tpg->" + fabric_mod_port + " = " + fabric_mod_port + ";\n"
231		buf += "	tpg->" + fabric_mod_port + "_tpgt = tpgt;\n\n"
232	
233		if proto_ident == "FC":
234			buf += "	ret = core_tpg_register(wwn, &tpg->se_tpg, SCSI_PROTOCOL_FCP);\n"
235		elif proto_ident == "SAS":
236			buf += "	ret = core_tpg_register(wwn, &tpg->se_tpg, SCSI_PROTOCOL_SAS);\n"
237		elif proto_ident == "iSCSI":
238			buf += "	ret = core_tpg_register(wwn, &tpg->se_tpg, SCSI_PROTOCOL_ISCSI);\n"
239	
240		buf += "	if (ret < 0) {\n"
241		buf += "		kfree(tpg);\n"
242		buf += "		return NULL;\n"
243		buf += "	}\n"
244		buf += "	return &tpg->se_tpg;\n"
245		buf += "}\n\n"
246		buf += "static void " + fabric_mod_name + "_drop_tpg(struct se_portal_group *se_tpg)\n"
247		buf += "{\n"
248		buf += "	struct " + fabric_mod_name + "_tpg *tpg = container_of(se_tpg,\n"
249		buf += "				struct " + fabric_mod_name + "_tpg, se_tpg);\n\n"
250		buf += "	core_tpg_deregister(se_tpg);\n"
251		buf += "	kfree(tpg);\n"
252		buf += "}\n\n"
253	
254		buf += "static struct se_wwn *" + fabric_mod_name + "_make_" + fabric_mod_port + "(\n"
255		buf += "	struct target_fabric_configfs *tf,\n"
256		buf += "	struct config_group *group,\n"
257		buf += "	const char *name)\n"
258		buf += "{\n"
259		buf += "	struct " + fabric_mod_name + "_" + fabric_mod_port + " *" + fabric_mod_port + ";\n"
260	
261		if proto_ident == "FC" or proto_ident == "SAS":
262			buf += "	u64 wwpn = 0;\n\n"
263	
264		buf += "	/* if (" + fabric_mod_name + "_parse_wwn(name, &wwpn, 1) < 0)\n"
265		buf += "		return ERR_PTR(-EINVAL); */\n\n"
266		buf += "	" + fabric_mod_port + " = kzalloc(sizeof(struct " + fabric_mod_name + "_" + fabric_mod_port + "), GFP_KERNEL);\n"
267		buf += "	if (!" + fabric_mod_port + ") {\n"
268		buf += "		printk(KERN_ERR \"Unable to allocate struct " + fabric_mod_name + "_" + fabric_mod_port + "\");\n"
269		buf += "		return ERR_PTR(-ENOMEM);\n"
270		buf += "	}\n"
271	
272		if proto_ident == "FC" or proto_ident == "SAS":
273			buf += "	" + fabric_mod_port + "->" + fabric_mod_port + "_wwpn = wwpn;\n"
274	
275		buf += "	/* " + fabric_mod_name + "_format_wwn(&" + fabric_mod_port + "->" + fabric_mod_port + "_name[0], " + fabric_mod_name.upper() + "_NAMELEN, wwpn); */\n\n"
276		buf += "	return &" + fabric_mod_port + "->" + fabric_mod_port + "_wwn;\n"
277		buf += "}\n\n"
278		buf += "static void " + fabric_mod_name + "_drop_" + fabric_mod_port + "(struct se_wwn *wwn)\n"
279		buf += "{\n"
280		buf += "	struct " + fabric_mod_name + "_" + fabric_mod_port + " *" + fabric_mod_port + " = container_of(wwn,\n"
281		buf += "				struct " + fabric_mod_name + "_" + fabric_mod_port + ", " + fabric_mod_port + "_wwn);\n"
282		buf += "	kfree(" + fabric_mod_port + ");\n"
283		buf += "}\n\n"
284	
285		buf += "static const struct target_core_fabric_ops " + fabric_mod_name + "_ops = {\n"
286		buf += "	.module				= THIS_MODULE,\n"
287		buf += "	.name				= \"" + fabric_mod_name + "\",\n"
288		buf += "	.get_fabric_name		= " + fabric_mod_name + "_get_fabric_name,\n"
289		buf += "	.tpg_get_wwn			= " + fabric_mod_name + "_get_fabric_wwn,\n"
290		buf += "	.tpg_get_tag			= " + fabric_mod_name + "_get_tag,\n"
291		buf += "	.tpg_check_demo_mode		= " + fabric_mod_name + "_check_false,\n"
292		buf += "	.tpg_check_demo_mode_cache	= " + fabric_mod_name + "_check_true,\n"
293		buf += "	.tpg_check_demo_mode_write_protect = " + fabric_mod_name + "_check_true,\n"
294		buf += "	.tpg_check_prod_mode_write_protect = " + fabric_mod_name + "_check_false,\n"
295		buf += "	.tpg_get_inst_index		= " + fabric_mod_name + "_tpg_get_inst_index,\n"
296		buf += "	.release_cmd			= " + fabric_mod_name + "_release_cmd,\n"
297		buf += "	.sess_get_index			= " + fabric_mod_name + "_sess_get_index,\n"
298		buf += "	.sess_get_initiator_sid		= NULL,\n"
299		buf += "	.write_pending			= " + fabric_mod_name + "_write_pending,\n"
300		buf += "	.write_pending_status		= " + fabric_mod_name + "_write_pending_status,\n"
301		buf += "	.set_default_node_attributes	= " + fabric_mod_name + "_set_default_node_attrs,\n"
302		buf += "	.get_cmd_state			= " + fabric_mod_name + "_get_cmd_state,\n"
303		buf += "	.queue_data_in			= " + fabric_mod_name + "_queue_data_in,\n"
304		buf += "	.queue_status			= " + fabric_mod_name + "_queue_status,\n"
305		buf += "	.queue_tm_rsp			= " + fabric_mod_name + "_queue_tm_rsp,\n"
306		buf += "	.aborted_task			= " + fabric_mod_name + "_aborted_task,\n"
307		buf += "	/*\n"
308		buf += "	 * Setup function pointers for generic logic in target_core_fabric_configfs.c\n"
309		buf += "	 */\n"
310		buf += "	.fabric_make_wwn		= " + fabric_mod_name + "_make_" + fabric_mod_port + ",\n"
311		buf += "	.fabric_drop_wwn		= " + fabric_mod_name + "_drop_" + fabric_mod_port + ",\n"
312		buf += "	.fabric_make_tpg		= " + fabric_mod_name + "_make_tpg,\n"
313		buf += "	.fabric_drop_tpg		= " + fabric_mod_name + "_drop_tpg,\n"
314		buf += "};\n\n"
315	
316		buf += "static int __init " + fabric_mod_name + "_init(void)\n"
317		buf += "{\n"
318		buf += "	return target_register_template(&" + fabric_mod_name + "_ops);\n"
319		buf += "};\n\n"
320	
321		buf += "static void __exit " + fabric_mod_name + "_exit(void)\n"
322		buf += "{\n"
323		buf += "	target_unregister_template(&" + fabric_mod_name + "_ops);\n"
324		buf += "};\n\n"
325	
326		buf += "MODULE_DESCRIPTION(\"" + fabric_mod_name.upper() + " series fabric driver\");\n"
327		buf += "MODULE_LICENSE(\"GPL\");\n"
328		buf += "module_init(" + fabric_mod_name + "_init);\n"
329		buf += "module_exit(" + fabric_mod_name + "_exit);\n"
330	
331		ret = p.write(buf)
332		if ret:
333			tcm_mod_err("Unable to write f: " + f)
334	
335		p.close()
336	
337		return
338	
339	def tcm_mod_scan_fabric_ops(tcm_dir):
340	
341		fabric_ops_api = tcm_dir + "include/target/target_core_fabric.h"
342	
343		print "Using tcm_mod_scan_fabric_ops: " + fabric_ops_api
344		process_fo = 0;
345	
346		p = open(fabric_ops_api, 'r')
347	
348		line = p.readline()
349		while line:
350			if process_fo == 0 and re.search('struct target_core_fabric_ops {', line):
351				line = p.readline()
352				continue
353	
354			if process_fo == 0:
355				process_fo = 1;
356				line = p.readline()
357				# Search for function pointer
358				if not re.search('\(\*', line):
359					continue
360	
361				fabric_ops.append(line.rstrip())
362				continue
363	
364			line = p.readline()
365			# Search for function pointer
366			if not re.search('\(\*', line):
367				continue
368	
369			fabric_ops.append(line.rstrip())
370	
371		p.close()
372		return
373	
374	def tcm_mod_dump_fabric_ops(proto_ident, fabric_mod_dir_var, fabric_mod_name):
375		buf = ""
376		bufi = ""
377	
378		f = fabric_mod_dir_var + "/" + fabric_mod_name + "_fabric.c"
379		print "Writing file: " + f
380	
381		p = open(f, 'w')
382		if not p:
383			tcm_mod_err("Unable to open file: " + f)
384	
385		fi = fabric_mod_dir_var + "/" + fabric_mod_name + "_fabric.h"
386		print "Writing file: " + fi
387	
388		pi = open(fi, 'w')
389		if not pi:
390			tcm_mod_err("Unable to open file: " + fi)
391	
392		buf = "#include <linux/slab.h>\n"
393		buf += "#include <linux/kthread.h>\n"
394		buf += "#include <linux/types.h>\n"
395		buf += "#include <linux/list.h>\n"
396		buf += "#include <linux/types.h>\n"
397		buf += "#include <linux/string.h>\n"
398		buf += "#include <linux/ctype.h>\n"
399		buf += "#include <asm/unaligned.h>\n"
400		buf += "#include <scsi/scsi_common.h>\n"
401		buf += "#include <scsi/scsi_proto.h>\n"
402		buf += "#include <target/target_core_base.h>\n"
403		buf += "#include <target/target_core_fabric.h>\n"
404		buf += "#include \"" + fabric_mod_name + "_base.h\"\n"
405		buf += "#include \"" + fabric_mod_name + "_fabric.h\"\n\n"
406	
407		buf += "int " + fabric_mod_name + "_check_true(struct se_portal_group *se_tpg)\n"
408		buf += "{\n"
409		buf += "	return 1;\n"
410		buf += "}\n\n"
411		bufi += "int " + fabric_mod_name + "_check_true(struct se_portal_group *);\n"
412	
413		buf += "int " + fabric_mod_name + "_check_false(struct se_portal_group *se_tpg)\n"
414		buf += "{\n"
415		buf += "	return 0;\n"
416		buf += "}\n\n"
417		bufi += "int " + fabric_mod_name + "_check_false(struct se_portal_group *);\n"
418	
419		total_fabric_ops = len(fabric_ops)
420		i = 0
421	
422		while i < total_fabric_ops:
423			fo = fabric_ops[i]
424			i += 1
425	#		print "fabric_ops: " + fo
426	
427			if re.search('get_fabric_name', fo):
428				buf += "char *" + fabric_mod_name + "_get_fabric_name(void)\n"
429				buf += "{\n"
430				buf += "	return \"" + fabric_mod_name + "\";\n"
431				buf += "}\n\n"
432				bufi += "char *" + fabric_mod_name + "_get_fabric_name(void);\n"
433				continue
434	
435			if re.search('get_wwn', fo):
436				buf += "char *" + fabric_mod_name + "_get_fabric_wwn(struct se_portal_group *se_tpg)\n"
437				buf += "{\n"
438				buf += "	struct " + fabric_mod_name + "_tpg *tpg = container_of(se_tpg,\n"
439				buf += "				struct " + fabric_mod_name + "_tpg, se_tpg);\n"
440				buf += "	struct " + fabric_mod_name + "_" + fabric_mod_port + " *" + fabric_mod_port + " = tpg->" + fabric_mod_port + ";\n\n"
441				buf += "	return &" + fabric_mod_port + "->" + fabric_mod_port + "_name[0];\n"
442				buf += "}\n\n"
443				bufi += "char *" + fabric_mod_name + "_get_fabric_wwn(struct se_portal_group *);\n"
444	
445			if re.search('get_tag', fo):
446				buf += "u16 " + fabric_mod_name + "_get_tag(struct se_portal_group *se_tpg)\n"
447				buf += "{\n"
448				buf += "	struct " + fabric_mod_name + "_tpg *tpg = container_of(se_tpg,\n"
449				buf += "				struct " + fabric_mod_name + "_tpg, se_tpg);\n"
450				buf += "	return tpg->" + fabric_mod_port + "_tpgt;\n"
451				buf += "}\n\n"
452				bufi += "u16 " + fabric_mod_name + "_get_tag(struct se_portal_group *);\n"
453	
454			if re.search('tpg_get_inst_index\)\(', fo):
455				buf += "u32 " + fabric_mod_name + "_tpg_get_inst_index(struct se_portal_group *se_tpg)\n"
456				buf += "{\n"
457				buf += "	return 1;\n"
458				buf += "}\n\n"
459				bufi += "u32 " + fabric_mod_name + "_tpg_get_inst_index(struct se_portal_group *);\n"
460	
461			if re.search('\*release_cmd\)\(', fo):
462				buf += "void " + fabric_mod_name + "_release_cmd(struct se_cmd *se_cmd)\n"
463				buf += "{\n"
464				buf += "	return;\n"
465				buf += "}\n\n"
466				bufi += "void " + fabric_mod_name + "_release_cmd(struct se_cmd *);\n"
467	
468			if re.search('sess_get_index\)\(', fo):
469				buf += "u32 " + fabric_mod_name + "_sess_get_index(struct se_session *se_sess)\n"
470				buf += "{\n"
471				buf += "	return 0;\n"
472				buf += "}\n\n"
473				bufi += "u32 " + fabric_mod_name + "_sess_get_index(struct se_session *);\n"
474	
475			if re.search('write_pending\)\(', fo):
476				buf += "int " + fabric_mod_name + "_write_pending(struct se_cmd *se_cmd)\n"
477				buf += "{\n"
478				buf += "	return 0;\n"
479				buf += "}\n\n"
480				bufi += "int " + fabric_mod_name + "_write_pending(struct se_cmd *);\n"
481	
482			if re.search('write_pending_status\)\(', fo):
483				buf += "int " + fabric_mod_name + "_write_pending_status(struct se_cmd *se_cmd)\n"
484				buf += "{\n"
485				buf += "	return 0;\n"
486				buf += "}\n\n"
487				bufi += "int " + fabric_mod_name + "_write_pending_status(struct se_cmd *);\n"
488	
489			if re.search('set_default_node_attributes\)\(', fo):
490				buf += "void " + fabric_mod_name + "_set_default_node_attrs(struct se_node_acl *nacl)\n"
491				buf += "{\n"
492				buf += "	return;\n"
493				buf += "}\n\n"
494				bufi += "void " + fabric_mod_name + "_set_default_node_attrs(struct se_node_acl *);\n"
495	
496			if re.search('get_cmd_state\)\(', fo):
497				buf += "int " + fabric_mod_name + "_get_cmd_state(struct se_cmd *se_cmd)\n"
498				buf += "{\n"
499				buf += "	return 0;\n"
500				buf += "}\n\n"
501				bufi += "int " + fabric_mod_name + "_get_cmd_state(struct se_cmd *);\n"
502	
503			if re.search('queue_data_in\)\(', fo):
504				buf += "int " + fabric_mod_name + "_queue_data_in(struct se_cmd *se_cmd)\n"
505				buf += "{\n"
506				buf += "	return 0;\n"
507				buf += "}\n\n"
508				bufi += "int " + fabric_mod_name + "_queue_data_in(struct se_cmd *);\n"
509	
510			if re.search('queue_status\)\(', fo):
511				buf += "int " + fabric_mod_name + "_queue_status(struct se_cmd *se_cmd)\n"
512				buf += "{\n"
513				buf += "	return 0;\n"
514				buf += "}\n\n"
515				bufi += "int " + fabric_mod_name + "_queue_status(struct se_cmd *);\n"
516	
517			if re.search('queue_tm_rsp\)\(', fo):
518				buf += "void " + fabric_mod_name + "_queue_tm_rsp(struct se_cmd *se_cmd)\n"
519				buf += "{\n"
520				buf += "	return;\n"
521				buf += "}\n\n"
522				bufi += "void " + fabric_mod_name + "_queue_tm_rsp(struct se_cmd *);\n"
523	
524			if re.search('aborted_task\)\(', fo):
525				buf += "void " + fabric_mod_name + "_aborted_task(struct se_cmd *se_cmd)\n"
526				buf += "{\n"
527				buf += "	return;\n"
528				buf += "}\n\n"
529				bufi += "void " + fabric_mod_name + "_aborted_task(struct se_cmd *);\n"
530	
531		ret = p.write(buf)
532		if ret:
533			tcm_mod_err("Unable to write f: " + f)
534	
535		p.close()
536	
537		ret = pi.write(bufi)
538		if ret:
539			tcm_mod_err("Unable to write fi: " + fi)
540	
541		pi.close()
542		return
543	
544	def tcm_mod_build_kbuild(fabric_mod_dir_var, fabric_mod_name):
545	
546		buf = ""
547		f = fabric_mod_dir_var + "/Makefile"
548		print "Writing file: " + f
549	
550		p = open(f, 'w')
551		if not p:
552			tcm_mod_err("Unable to open file: " + f)
553	
554		buf += fabric_mod_name + "-objs			:= " + fabric_mod_name + "_fabric.o \\\n"
555		buf += "					   " + fabric_mod_name + "_configfs.o\n"
556		buf += "obj-$(CONFIG_" + fabric_mod_name.upper() + ")		+= " + fabric_mod_name + ".o\n"
557	
558		ret = p.write(buf)
559		if ret:
560			tcm_mod_err("Unable to write f: " + f)
561	
562		p.close()
563		return
564	
565	def tcm_mod_build_kconfig(fabric_mod_dir_var, fabric_mod_name):
566	
567		buf = ""
568		f = fabric_mod_dir_var + "/Kconfig"
569		print "Writing file: " + f
570	
571		p = open(f, 'w')
572		if not p:
573			tcm_mod_err("Unable to open file: " + f)
574	
575		buf = "config " + fabric_mod_name.upper() + "\n"
576		buf += "	tristate \"" + fabric_mod_name.upper() + " fabric module\"\n"
577		buf += "	depends on TARGET_CORE && CONFIGFS_FS\n"
578		buf += "	default n\n"
579		buf += "	---help---\n"
580		buf += "	Say Y here to enable the " + fabric_mod_name.upper() + " fabric module\n"
581	
582		ret = p.write(buf)
583		if ret:
584			tcm_mod_err("Unable to write f: " + f)
585	
586		p.close()
587		return
588	
589	def tcm_mod_add_kbuild(tcm_dir, fabric_mod_name):
590		buf = "obj-$(CONFIG_" + fabric_mod_name.upper() + ")	+= " + fabric_mod_name.lower() + "/\n"
591		kbuild = tcm_dir + "/drivers/target/Makefile"
592	
593		f = open(kbuild, 'a')
594		f.write(buf)
595		f.close()
596		return
597	
598	def tcm_mod_add_kconfig(tcm_dir, fabric_mod_name):
599		buf = "source \"drivers/target/" + fabric_mod_name.lower() + "/Kconfig\"\n"
600		kconfig = tcm_dir + "/drivers/target/Kconfig"
601	
602		f = open(kconfig, 'a')
603		f.write(buf)
604		f.close()
605		return
606	
607	def main(modname, proto_ident):
608	#	proto_ident = "FC"
609	#	proto_ident = "SAS"
610	#	proto_ident = "iSCSI"
611	
612		tcm_dir = os.getcwd();
613		tcm_dir += "/../../"
614		print "tcm_dir: " + tcm_dir
615		fabric_mod_name = modname
616		fabric_mod_dir = tcm_dir + "drivers/target/" + fabric_mod_name
617		print "Set fabric_mod_name: " + fabric_mod_name
618		print "Set fabric_mod_dir: " + fabric_mod_dir
619		print "Using proto_ident: " + proto_ident
620	
621		if proto_ident != "FC" and proto_ident != "SAS" and proto_ident != "iSCSI":
622			print "Unsupported proto_ident: " + proto_ident
623			sys.exit(1)
624	
625		ret = tcm_mod_create_module_subdir(fabric_mod_dir)
626		if ret:
627			print "tcm_mod_create_module_subdir() failed because module already exists!"
628			sys.exit(1)
629	
630		tcm_mod_build_base_includes(proto_ident, fabric_mod_dir, fabric_mod_name)
631		tcm_mod_scan_fabric_ops(tcm_dir)
632		tcm_mod_dump_fabric_ops(proto_ident, fabric_mod_dir, fabric_mod_name)
633		tcm_mod_build_configfs(proto_ident, fabric_mod_dir, fabric_mod_name)
634		tcm_mod_build_kbuild(fabric_mod_dir, fabric_mod_name)
635		tcm_mod_build_kconfig(fabric_mod_dir, fabric_mod_name)
636	
637		input = raw_input("Would you like to add " + fabric_mod_name + " to drivers/target/Makefile..? [yes,no]: ")
638		if input == "yes" or input == "y":
639			tcm_mod_add_kbuild(tcm_dir, fabric_mod_name)
640	
641		input = raw_input("Would you like to add " + fabric_mod_name + " to drivers/target/Kconfig..? [yes,no]: ")
642		if input == "yes" or input == "y":
643			tcm_mod_add_kconfig(tcm_dir, fabric_mod_name)
644	
645		return
646	
647	parser = optparse.OptionParser()
648	parser.add_option('-m', '--modulename', help='Module name', dest='modname',
649			action='store', nargs=1, type='string')
650	parser.add_option('-p', '--protoident', help='Protocol Ident', dest='protoident',
651			action='store', nargs=1, type='string')
652	
653	(opts, args) = parser.parse_args()
654	
655	mandatories = ['modname', 'protoident']
656	for m in mandatories:
657		if not opts.__dict__[m]:
658			print "mandatory option is missing\n"
659			parser.print_help()
660			exit(-1)
661	
662	if __name__ == "__main__":
663	
664		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.