tcm: Add Documentation/target/tcm_mod_builder.py script andmini-HOWTO

From: Nicholas A. Bellinger
Date: Tue Aug 24 2010 - 16:57:24 EST


Greetings all,

The initial commit for the new tcm_mod_builder.py script has been pushed
into lio-core-2.6.git/lio-4.0! Included is a brief mini-HOWTO as to how
the TCM fabric module generation logic actually functions, and what is
currently supported. I thought instead of spamming the kernel lists
with 1K LOC of python for actually generating *new* TCM kernel fabric
modules, it might be easier to post the HOWTO to the list and a gitweb
URL of the script itself for those interested parties here:

http://www.kernel.org/pub/linux/kernel/people/nab/Documentation/target/tcm_mod_builder.py

So after a single day of python coding things are working remarkably
well, so far I am able to generate functioning ConfigFS skeletons with
proper target_core_fabric_lib.c Transport / WWPN handlers, eg:
multi-fabric transitional SPC-3 PR and ALUA (configfs attributes
included) that work right out of the box.

There are are a list of remaining TODO items at the bottom of the doc,
but I hope that people will actually give this script a shot and see for
themselves how easy the generation of new configfs code for TCM fabric
modules can really be!

Comments are welcome, Enjoy!

--nab

>>>>>>>>>> The TCM v4 fabric module script generator <<<<<<<<<<

Greetings all,

This document is intended to be a mini-HOWTO for using the tcm_mod_builder.py
script to generate a brand new functional TCM v4 fabric .ko module of your very own,
that once built can be immediately be loaded to start access the new TCM/ConfigFS
fabric skeleton, by simplying using:

modprobe $TCM_NEW_MOD
mkdir -p /sys/kernel/config/target/$TCM_NEW_MOD

This script will create a new drivers/target/$TCM_NEW_MOD/, and will do the following

*) Generate new API callers for drivers/target/target_core_fabric_configs.c logic
->make_nodeacl(), ->drop_nodeacl(), ->make_tpg(), ->drop_tpg()
->make_wwn(), ->drop_wwn(). These are created into $TCM_NEW_MOD/$TCM_NEW_MOD_configfs.c
*) Generate basic infrastructure for loading/unloading LKMs and TCM/ConfigFS fabric module
using a skeleton struct target_core_fabric_ops API template.
*) Based on user defined T10 Proto_Ident for the new fabric module being built,
the TransportID / Initiator and Target WWPN related handlers for
SPC-3 persistent reservation are automatically generated in $TCM_NEW_MOD/$TCM_NEW_MOD_fabric.c
using drivers/target/target_core_fabric_lib.c logic.
*) NOP API calls for all other Data I/O path and fabric dependent attribute logic
in $TCM_NEW_MOD/$TCM_NEW_MOD_fabric.c

So far the generation of new functional ConfigFS skeletons supports for FC,
SAS and iSCSI proto_idents, which is defined at the top of tcm_mod_builder.py:main().
Once proto_ident is selected in main(), and the handful of other global variables at top
of tcm_mod_builder.py are correct, actually running the script looks like:

target:/mnt/sdb/lio-core-2.6.git/Documentation/target# ./tcm_mod_builder.py
Writing file:
/mnt/sdb/lio-core-2.6.git/drivers/target/tcm_nab5000/tcm_nab5000_base.h
Using tcm_mod_scan_fabric_ops:
/mnt/sdb/lio-core-2.6.git/include/target/target_core_fabric_ops.h
Writing file:
/mnt/sdb/lio-core-2.6.git/drivers/target/tcm_nab5000/tcm_nab5000_fabric.c
Writing file:
/mnt/sdb/lio-core-2.6.git/drivers/target/tcm_nab5000/tcm_nab5000_fabric.h
Writing file:
/mnt/sdb/lio-core-2.6.git/drivers/target/tcm_nab5000/tcm_nab5000_configfs.c
Writing file: /mnt/sdb/lio-core-2.6.git/drivers/target/tcm_nab5000/Kbuild
Writing file: /mnt/sdb/lio-core-2.6.git/drivers/target/tcm_nab5000/Kconfig

*) Edit drivers/target/Kbuild and drivers/target/Kconfig before compling

Add the following line to Kbuild for the newly generated fabric module:

obj-$(CONFIG_TCM_NAB5000) += tcm_nab5000/

and the same for Kconfig:

source "drivers/target/tcm_nab5000/Kconfig"

*) Build using 'make modules', once completed you will have:

target:/mnt/sdb/lio-core-2.6.git# ls -la drivers/target/tcm_nab5000/
total 1292
drwxr-xr-x 2 root root 4096 2010-08-24 12:49 .
drwxr-xr-x 9 root root 4096 2010-08-24 12:10 ..
-rw-r--r-- 1 root root 8 2010-08-24 12:26 built-in.o
-rw-r--r-- 1 root root 136 2010-08-24 12:26 .built-in.o.cmd
-rw-r--r-- 1 root root 282 2010-08-24 13:06 Kbuild
-rw-r--r-- 1 root root 171 2010-08-24 13:06 Kconfig
-rw-r--r-- 1 root root 49 2010-08-24 12:49 modules.order
-rw-r--r-- 1 root root 738 2010-08-24 13:06 tcm_nab5000_base.h
-rw-r--r-- 1 root root 9096 2010-08-24 13:06 tcm_nab5000_configfs.c
-rw-r--r-- 1 root root 172584 2010-08-24 12:48 tcm_nab5000_configfs.o
-rw-r--r-- 1 root root 38842 2010-08-24 12:48 .tcm_nab5000_configfs.o.cmd
-rw-r--r-- 1 root root 5414 2010-08-24 13:06 tcm_nab5000_fabric.c
-rw-r--r-- 1 root root 2016 2010-08-24 13:06 tcm_nab5000_fabric.h
-rw-r--r-- 1 root root 187244 2010-08-24 12:48 tcm_nab5000_fabric.o
-rw-r--r-- 1 root root 40195 2010-08-24 12:48 .tcm_nab5000_fabric.o.cmd
-rw-r--r-- 1 root root 379449 2010-08-24 12:49 tcm_nab5000.ko
-rw-r--r-- 1 root root 264 2010-08-24 12:49 .tcm_nab5000.ko.cmd
-rw-r--r-- 1 root root 459 2010-08-24 12:49 tcm_nab5000.mod.c
-rw-r--r-- 1 root root 23780 2010-08-24 12:49 tcm_nab5000.mod.o
-rw-r--r-- 1 root root 22475 2010-08-24 12:49 .tcm_nab5000.mod.o.cmd
-rw-r--r-- 1 root root 356722 2010-08-24 12:48 tcm_nab5000.o
-rw-r--r-- 1 root root 211 2010-08-24 12:48 .tcm_nab5000.o.cmd

*) Load the new module, create a lun_0 configfs group, and add new TCM Core
IBLOCK backstore symlink to port:

target:/mnt/sdb/lio-core-2.6.git# insmod drivers/target/tcm_nab5000.ko
target:/mnt/sdb/lio-core-2.6.git# mkdir -p /sys/kernel/config/target/nab5000/iqn.foo/tpgt_1/lun/lun_0
target:/mnt/sdb/lio-core-2.6.git# cd /sys/kernel/config/target/nab5000/iqn.foo/tpgt_1/lun/lun_0/
target:/sys/kernel/config/target/nab5000/iqn.foo/tpgt_1/lun/lun_0# ln -s /sys/kernel/config/target/core/iblock_0/lvm_test0 nab5000_port

target:/sys/kernel/config/target/nab5000/iqn.foo/tpgt_1/lun/lun_0# cd -
target:/mnt/sdb/lio-core-2.6.git# tree /sys/kernel/config/target/nab5000/
/sys/kernel/config/target/nab5000/
|-- discovery_auth
|-- iqn.foo
| `-- tpgt_1
| |-- acls
| |-- attrib
| |-- lun
| | `-- lun_0
| | |-- alua_tg_pt_gp
| | |-- alua_tg_pt_offline
| | |-- alua_tg_pt_status
| | |-- alua_tg_pt_write_md
| | `-- nab5000_port -> ../../../../../../target/core/iblock_0/lvm_test0
| |-- np
| `-- param
`-- version

target:/mnt/sdb/lio-core-2.6.git# lsmod
Module Size Used by
tcm_nab5000 3923 4
iscsi_target_mod 189925 1
tcm_loop 13173 5
target_core_stgt 8049 0
target_core_pscsi 10472 1
target_core_file 7175 2
target_core_iblock 8164 2
target_core_mod 209392 44
tcm_nab5000,iscsi_target_mod,tcm_loop,target_core_stgt,target_core_pscsi,target_core_file,target_core_iblock
scsi_debug 56768 1
scsi_tgt 8658 1 target_core_stgt
configfs 20660 2 target_core_mod

----------------------------------------------------------------------

Future TODO items:

*) Make global variables in tcm_mod_builder.py accessable as parameters
*) Add more T10 proto_idents
*) Make tcm_mod_dump_fabric_ops() smater and generate function pointer
defs directly from include/target/target_core_fabric_ops.h:struct target_core_fabric_ops
structure members.
*) Make it optional to add drivers/target/K[build,config] lines in
order to build new module

August 24th, 2010
Nicholas A. Bellinger <nab@xxxxxxxxxxxxxxx>


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/