iscsitarget: add new recipe

iSCSI Enterprise Target is aimed to develop an
open source iSCSI target with professional features,
that works well in enterprise environment under real
workload, and is scalable and versatile enough to meet the
challenge of future storage needs and developments.

Signed-off-by: Jagadeesh Krishnanjanappa <jkrishnanjanappa@mvista.com>
Signed-off-by: Martin Jansa <Martin.Jansa@gmail.com>
Signed-off-by: Joe MacDonald <joe_macdonald@mentor.com>
This commit is contained in:
Jagadeesh Krishnanjanappa
2015-08-26 23:14:29 +05:30
committed by Joe MacDonald
parent 4285293a31
commit fa855df1a0
3 changed files with 327 additions and 0 deletions

View File

@@ -0,0 +1,198 @@
Fix build errors with linux kernel v3.19 and above
Below errors came up while building iscsitarget for
qemux86-64 (and others) because,
1. 'struct user_msghdr' is being used for userland-side msghdr instead
of 'struct msghdr', which is used for kernel-side msghdr in linux v3.19
and above.
error snippet:
-- snip --
| /CGE7_SHDD/project_yocto_1.8/poky/build/tmp/work/qemux86_64-poky-linux/iscsitarget/1.4.20.3+svn502-r0/iscsitarget-1.4.20.3+svn502/kernel/iscsi.c: In function 'cmnd_skip_pdu':
| /CGE7_SHDD/project_yocto_1.8/poky/build/tmp/work/qemux86_64-poky-linux/iscsitarget/1.4.20.3+svn502-r0/iscsitarget-1.4.20.3+svn502/kernel/iscsi.c:492:16: error: 'struct msghdr' has no member named 'msg_iov'
| conn->read_msg.msg_iov = conn->read_iov;
-- CUT --
Reference:
https://github.com/torvalds/linux/commit/666547ff591cebdedc4679bf6b1b3f3383a8dea3
2. 'SERVICE_ACTION_IN' has been renamed to SERVICE_ACTION_IN_16 in linux v3.19
and above.
error snippet:
-- snip --
| /CGE7_SHDD/project_yocto_1.8/poky/build/tmp/work/qemux86_64-poky-linux/iscsitarget/1.4.20.3+svn502-r0/iscsitarget-1.4.20.3+svn502/kernel/iscsi.c: In function 'scsi_cmnd_start':
| /CGE7_SHDD/project_yocto_1.8/poky/build/tmp/work/qemux86_64-poky-linux/iscsitarget/1.4.20.3+svn502-r0/iscsitarget-1.4.20.3+svn502/kernel/iscsi.c:989:7: error: 'SERVICE_ACTION_IN' undeclared (first use in this function)
| case SERVICE_ACTION_IN:
-- CUT --
Reference:
https://github.com/torvalds/linux/commit/eb846d9f147455e4e5e1863bfb5e31974bb69b7c
3. In linux v3.19 and above, f_dentry member has been removed from
'struct file' structure.
error snippet:
-- snip --
| /CGE7_SHDD/project_yocto_1.8/poky/build/tmp/work/qemux86_64-poky-linux/iscsitarget/1.4.20.3+svn502-r0/iscsitarget-1.4.20.3+svn502/kernel/conn.c: In function 'iet_socket_bind':
| /CGE7_SHDD/project_yocto_1.8/poky/build/tmp/work/qemux86_64-poky-linux/iscsitarget/1.4.20.3+svn502-r0/iscsitarget-1.4.20.3+svn502/kernel/conn.c:130:34: error: 'struct file' has no member named 'f_dentry'
| conn->sock = SOCKET_I(conn->file->f_dentry->d_inode);
-- CUT --
new helper function file_inode(file) should be used instead.
References:
1. https://github.com/torvalds/linux/commit/78d28e651f97866d608d9b41f8ad291e65d47dd5
2. https://github.com/torvalds/linux/commit/496ad9aa8ef448058e36ca7a787c61f2e63f0f54
Upstream-Status: Pending
Signed-off-by: Jagadeesh Krishnanjanappa <jkrishnanjanappa@mvista.com>
--- iscsitarget-1.4.20.3+svn502_org/kernel/conn.c 2015-08-24 16:13:26.481924679 +0530
+++ iscsitarget-1.4.20.3+svn502/kernel/conn.c 2015-08-24 17:27:06.897653698 +0530
@@ -127,7 +127,11 @@ static void iet_socket_bind(struct iscsi
dprintk(D_GENERIC, "%llu\n", (unsigned long long) session->sid);
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0)
+ conn->sock = SOCKET_I(file_inode(conn->file));
+#else
conn->sock = SOCKET_I(conn->file->f_dentry->d_inode);
+#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0) */
conn->sock->sk->sk_user_data = conn;
write_lock_bh(&conn->sock->sk->sk_callback_lock);
--- iscsitarget-1.4.20.3+svn502_org/kernel/file-io.c 2015-08-24 16:13:26.481924679 +0530
+++ iscsitarget-1.4.20.3+svn502/kernel/file-io.c 2015-08-24 17:30:54.390131100 +0530
@@ -69,7 +69,11 @@ static int fileio_make_request(struct ie
static int fileio_sync(struct iet_volume *lu, struct tio *tio)
{
struct fileio_data *p = lu->private;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0)
+ struct inode *inode = file_inode(p->filp);
+#else
struct inode *inode = p->filp->f_dentry->d_inode;
+#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0) */
struct address_space *mapping = inode->i_mapping;
loff_t ppos, count;
int res;
@@ -213,7 +217,11 @@ static int fileio_attach(struct iet_volu
eprintk("%d\n", err);
goto out;
}
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0)
+ inode = file_inode(p->filp);
+#else
inode = p->filp->f_dentry->d_inode;
+#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0) */
if (S_ISREG(inode->i_mode))
;
--- iscsitarget-1.4.20.3+svn502_org/kernel/iscsi.c 2015-08-24 16:13:26.481924679 +0530
+++ iscsitarget-1.4.20.3+svn502/kernel/iscsi.c 2015-08-24 17:33:50.950490156 +0530
@@ -986,7 +986,11 @@ static void scsi_cmnd_start(struct iscsi
set_cmnd_lunit(req);
switch (req_hdr->scb[0]) {
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0)
+ case SERVICE_ACTION_IN_16:
+#else
case SERVICE_ACTION_IN:
+#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0) */
if ((req_hdr->scb[1] & 0x1f) != 0x10)
goto error;
case INQUIRY:
--- iscsitarget-1.4.20.3+svn502_org/kernel/iscsi.h 2015-08-24 16:13:26.481924679 +0530
+++ iscsitarget-1.4.20.3+svn502/kernel/iscsi.h 2015-08-24 17:35:31.354690051 +0530
@@ -257,7 +257,11 @@ struct iscsi_conn {
struct timer_list nop_timer;
struct iscsi_cmnd *read_cmnd;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0)
+ struct user_msghdr read_msg;
+#else
struct msghdr read_msg;
+#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0) */
struct iovec read_iov[ISCSI_CONN_IOV_MAX];
u32 read_size;
u32 read_overflow;
--- iscsitarget-1.4.20.3+svn502_org/kernel/nthread.c 2015-08-24 16:13:26.481924679 +0530
+++ iscsitarget-1.4.20.3+svn502/kernel/nthread.c 2015-08-24 17:41:56.187428925 +0530
@@ -80,8 +80,11 @@ static int is_data_available(struct iscs
set_fs(oldfs);
return (res >= 0) ? avail : res;
}
-
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0)
+static void forward_iov(struct user_msghdr *msg, int len)
+#else
static void forward_iov(struct msghdr *msg, int len)
+#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0) */
{
while (msg->msg_iov->iov_len <= len) {
len -= msg->msg_iov->iov_len;
@@ -96,7 +99,11 @@ static void forward_iov(struct msghdr *m
static int do_recv(struct iscsi_conn *conn, int state)
{
mm_segment_t oldfs;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0)
+ struct user_msghdr msg;
+#else
struct msghdr msg;
+#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0) */
struct iovec iov[ISCSI_CONN_IOV_MAX];
int i, len, res;
@@ -461,7 +468,11 @@ static void exit_tx(struct iscsi_conn *c
static int tx_ddigest(struct iscsi_cmnd *cmnd, int state)
{
int res, rest = cmnd->conn->write_size;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0)
+ struct user_msghdr msg = {.msg_flags = MSG_NOSIGNAL | MSG_DONTWAIT};
+#else
struct msghdr msg = {.msg_flags = MSG_NOSIGNAL | MSG_DONTWAIT};
+#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0) */
struct kvec iov;
iov.iov_base = (char *) (&cmnd->ddigest) + (sizeof(u32) - rest);
--- iscsitarget-1.4.20.3+svn502_org/kernel/target_disk.c 2015-08-24 16:13:26.481924679 +0530
+++ iscsitarget-1.4.20.3+svn502/kernel/target_disk.c 2015-08-24 17:43:42.167625159 +0530
@@ -606,7 +606,11 @@ static int disk_execute_cmnd(struct iscs
case REQUEST_SENSE:
send_data_rsp(cmnd, build_request_sense_response);
break;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0)
+ case SERVICE_ACTION_IN_16:
+#else
case SERVICE_ACTION_IN:
+#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0) */
send_data_rsp(cmnd, build_service_action_in_response);
break;
case READ_6:
--- iscsitarget-1.4.20.3+svn502_org/kernel/volume.c 2015-08-24 16:13:26.477924674 +0530
+++ iscsitarget-1.4.20.3+svn502/kernel/volume.c 2015-08-24 18:28:15.697074780 +0530
@@ -398,7 +398,11 @@ int is_volume_reserved(struct iet_volume
case READ_CAPACITY:
/* allowed commands when reserved */
break;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0)
+ case SERVICE_ACTION_IN_16:
+#else
case SERVICE_ACTION_IN:
+#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0) */
if ((scb[1] & 0x1F) == 0x10)
break;
/* fall through */
@@ -465,7 +469,11 @@ int is_volume_reserved(struct iet_volume
if (excl_access_ro && !registered)
err = -EBUSY;
break;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0)
+ case SERVICE_ACTION_IN_16:
+#else
case SERVICE_ACTION_IN:
+#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0) */
if ((scb[1] & 0x1F) == 0x10)
break;
/* fall through */

View File

@@ -0,0 +1,67 @@
Get linux kernel version from Makefile of kernel source
We get below messages while building iscsitarget,
-- snip --
x86_64-poky-linux-gcc: error:
/CGE7_SHDD/project_yocto_1.8/poky/build/tmp/work-shared/qemux86-64/kernel-source/include/linux/version.h:
No such file or directory
x86_64-poky-linux-gcc: fatal error: no input files
compilation terminated.
/bin/sh: line 0: [: too many arguments
/bin/sh: line 0: [: too many arguments
/bin/sh: line 0: [: too many arguments
/bin/sh: line 0: [: too many arguments
/bin/sh: line 0: [: too many arguments
/bin/sh: line 0: [: too many arguments
/bin/sh: line 0: [: too many arguments
/bin/sh: line 0: [: too many arguments
/bin/sh: line 0: [: too many arguments
/bin/sh: line 0: [: too many arguments
/bin/sh: line 0: [: too many arguments
/bin/sh: line 0: [: too many arguments
-- CUT --
These messages are due to absence of include/linux/version.h file in
kernel source directory and failed to compute linux kernel version.
So, use kernel source Makefile ( i.e $(KSRC)/Makefile) to find out
actual kernel version.
Upstream-Status: Pending
Signed-off-by: Jagadeesh Krishnanjanappa <jkrishnanjanappa@mvista.com>
--- iscsitarget-1.4.20.3+svn499_org/Makefile 2014-01-27 00:00:45.000000000 +0530
+++ iscsitarget-1.4.20.3+svn499/Makefile 2015-07-23 10:44:47.013600285 +0530
@@ -18,27 +18,11 @@ ifeq ($(KSRC),)
endif
-ifneq ($(wildcard $(KSRC)/include/generated/utsrelease.h),)
- VERSION_FILE := $(KSRC)/include/generated/utsrelease.h
-else
- ifneq ($(wildcard $(KSRC)/include/linux/utsrelease.h),)
- VERSION_FILE := $(KSRC)/include/linux/utsrelease.h
- else
- VERSION_FILE := $(KSRC)/include/linux/version.h
- endif
-endif
-
-KVER := $(shell $(CC) $(CFLAGS) $(LDFLAGS) -E -dM $(VERSION_FILE) | \
- grep UTS_RELEASE | awk '{ print $$3 }' | sed 's/\"//g')
-
KMOD := /lib/modules/$(KVER)/extra
-
-KMAJ := $(shell echo $(KVER) | \
- sed -e 's/^\([0-9][0-9]*\)\.[0-9][0-9]*\.[0-9][0-9]*.*/\1/')
-KMIN := $(shell echo $(KVER) | \
- sed -e 's/^[0-9][0-9]*\.\([0-9][0-9]*\)\.[0-9][0-9]*.*/\1/')
-KREV := $(shell echo $(KVER) | \
- sed -e 's/^[0-9][0-9]*\.[0-9][0-9]*\.\([0-9][0-9]*\).*/\1/')
+KMAJ := $(shell cat $(KSRC)/Makefile | grep ^VERSION | gawk -F " " '{ print $$NF }')
+KMIN := $(shell cat $(KSRC)/Makefile | grep ^PATCHLEVEL | gawk -F " " '{ print $$NF }')
+KREV := $(shell cat $(KSRC)/Makefile | grep ^SUBLEVEL | gawk -F " " '{ print $$NF }')
+KVER := ${KMAJ}.${KMIN}.${KREV}
kver_eq = $(shell [ $(KMAJ) -eq $(1) -a $(KMIN) -eq $(2) -a $(KREV) -eq $(3) ] && \
echo 1 || echo 0)

View File

@@ -0,0 +1,62 @@
DESCRIPTION = "iSCSI Enterprise Target is aimed to develop an \
open source iSCSI target with professional features, \
that works well in enterprise environment under real \
workload, and is scalable and versatile enough to meet the \
challenge of future storage needs and developments."
HOMEPAGE = "http://iscsitarget.sourceforge.net/"
LICENSE = "GPLv2"
LIC_FILES_CHKSUM = "file://COPYING;md5=6e233eda45c807aa29aeaa6d94bc48a2"
DEPENDS = "openssl virtual/kernel"
SRC_URI = "http://ftp.heanet.ie/mirrors/ubuntu/pool/universe/i/${BPN}/${BPN}_${PV}.orig.tar.gz \
file://use-kernel-makefile-to-get-kernel-version.patch \
file://fix-errors-observed-with-linux-3.19-and-greater.patch \
"
SRC_URI[md5sum] = "ef9bc823bbabd3c772208c00d5f2d089"
SRC_URI[sha256sum] = "d3196ccb78a43266dce28587bfe30d8ab4db7566d7bce96057dfbb84100babb5"
inherit module-base
# Add make_scripts task to create kernel scripts
addtask make_scripts after do_patch before do_compile
do_configure[noexec] = "1"
# make_scripts requires kernel source directory to create
# kernel scripts
do_make_scripts[depends] += "virtual/kernel:do_shared_workdir"
# Make sure we don't have race condition against "make scripts"
do_make_scripts[lockfiles] = "${TMPDIR}/kernel-scripts.lock"
do_compile() {
oe_runmake KSRC=${STAGING_KERNEL_DIR} CFLAGS='${CFLAGS}' LDFLAGS='' \
CC="${CC}" V=1
}
do_install() {
# Module
install -d ${D}/lib/modules/${KERNEL_VERSION}/kernel/iscsi
install -m 0644 kernel/iscsi_trgt.ko \
${D}/lib/modules/${KERNEL_VERSION}/kernel/iscsi/iscsi_trgt.ko
# Userspace utilities
install -d ${D}${sbindir}
install -m 0755 usr/ietd ${D}${sbindir}/ietd
install -m 0755 usr/ietadm ${D}${sbindir}/ietadm
# Config files, init scripts
mkdir -p ${D}${sysconfdir}/iet
install -m 0644 etc/ietd.conf ${D}/${sysconfdir}/iet/ietd.conf
install -m 0644 etc/initiators.allow ${D}${sysconfdir}/iet/initiators.allow
install -m 0644 etc/targets.allow ${D}${sysconfdir}/iet/targets.allow
mkdir -p ${D}${sysconfdir}/init.d
install -m 0755 etc/initd/initd ${D}${sysconfdir}/init.d/iscsi-target
install -m 0644 etc/initiators.deny ${D}${sysconfdir}/iet/initiators.deny
}
FILES_${PN} += "${sbindir} \
/lib \
${sysconfdir}"
RRECOMMENDS_${PN} = "kernel-module-crc32c kernel-module-libcrc32c"