diff options
Diffstat (limited to 'kernel/2.6.14-19_compat.patch')
-rw-r--r-- | kernel/2.6.14-19_compat.patch | 1247 |
1 files changed, 0 insertions, 1247 deletions
diff --git a/kernel/2.6.14-19_compat.patch b/kernel/2.6.14-19_compat.patch deleted file mode 100644 index 67f4f74..0000000 --- a/kernel/2.6.14-19_compat.patch +++ /dev/null @@ -1,1247 +0,0 @@ -diff --git a/iscsi_tcp.c b/iscsi_tcp.c -index 8ef3f41..14c6706 100644 ---- a/iscsi_tcp.c -+++ b/iscsi_tcp.c -@@ -445,11 +445,9 @@ static int iscsi_sw_tcp_pdu_init(struct iscsi_task *task, - if (!task->sc) - iscsi_sw_tcp_send_linear_data_prep(conn, task->data, count); - else { -- struct scsi_data_buffer *sdb = scsi_out(task->sc); -- -- err = iscsi_sw_tcp_send_data_prep(conn, sdb->table.sgl, -- sdb->table.nents, offset, -- count); -+ err = iscsi_sw_tcp_send_data_prep(conn, scsi_sglist(task->sc), -+ scsi_sg_count(task->sc), -+ offset, count); - } - - if (err) { -@@ -782,7 +780,11 @@ iscsi_sw_tcp_session_create(struct iscsi_endpoint *ep, uint16_t cmds_max, - shost->max_lun = iscsi_max_lun; - shost->max_id = 0; - shost->max_channel = 0; -+#ifndef SCSI_MAX_VARLEN_CDB_SIZE -+ shost->max_cmd_len = 16; -+#else - shost->max_cmd_len = SCSI_MAX_VARLEN_CDB_SIZE; -+#endif - - if (iscsi_host_add(shost, NULL)) - goto free_host; -@@ -830,6 +832,9 @@ static int iscsi_sw_tcp_slave_configure(struct scsi_device *sdev) - } - - static struct scsi_host_template iscsi_sw_tcp_sht = { -+#if LINUX_VERSION_CODE == KERNEL_VERSION(2,6,24) -+ .use_sg_chaining = ENABLE_SG_CHAINING, -+#endif - .module = THIS_MODULE, - .name = "iSCSI Initiator over TCP/IP", - .queuecommand = iscsi_queuecommand, -@@ -840,7 +845,7 @@ static struct scsi_host_template iscsi_sw_tcp_sht = { - .cmd_per_lun = ISCSI_DEF_CMD_PER_LUN, - .eh_abort_handler = iscsi_eh_abort, - .eh_device_reset_handler= iscsi_eh_device_reset, -- .eh_target_reset_handler= iscsi_eh_target_reset, -+ .eh_host_reset_handler = iscsi_eh_target_reset, - .use_clustering = DISABLE_CLUSTERING, - .slave_configure = iscsi_sw_tcp_slave_configure, - .proc_name = "iscsi_tcp", -diff --git a/iscsi_tcp.h b/iscsi_tcp.h -index f9a4044..ab20530 100644 ---- a/iscsi_tcp.h -+++ b/iscsi_tcp.h -@@ -22,6 +22,8 @@ - #ifndef ISCSI_SW_TCP_H - #define ISCSI_SW_TCP_H - -+#include "open_iscsi_compat.h" -+ - #include "libiscsi.h" - #include "libiscsi_tcp.h" - -diff --git a/libiscsi.c b/libiscsi.c -index 457ecfe..756b171 100644 ---- a/libiscsi.c -+++ b/libiscsi.c -@@ -24,7 +24,10 @@ - #include <linux/types.h> - #include <linux/kfifo.h> - #include <linux/delay.h> -+#include <linux/version.h> -+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,19) - #include <linux/log2.h> -+#endif - #include <asm/unaligned.h> - #include <net/tcp.h> - #include <scsi/scsi_cmnd.h> -@@ -38,6 +41,8 @@ - #include "scsi_transport_iscsi.h" - #include "libiscsi.h" - -+#include "open_iscsi_compat.h" -+ - /* Serial Number Arithmetic, 32 bits, less than, RFC1982 */ - #define SNA32_CHECK 2147483648UL - -@@ -199,7 +204,7 @@ static int iscsi_prep_bidi_ahs(struct iscsi_task *task) - sizeof(rlen_ahdr->reserved)); - rlen_ahdr->ahstype = ISCSI_AHSTYPE_RLENGTH; - rlen_ahdr->reserved = 0; -- rlen_ahdr->read_length = cpu_to_be32(scsi_in(sc)->length); -+ rlen_ahdr->read_length = cpu_to_be32(scsi_bufflen(sc)); - - debug_scsi("bidi-in rlen_ahdr->read_length(%d) " - "rlen_ahdr->ahslength(%d)\n", -@@ -267,7 +272,7 @@ static int iscsi_prep_scsi_cmd_pdu(struct iscsi_task *task) - return rc; - } - if (sc->sc_data_direction == DMA_TO_DEVICE) { -- unsigned out_len = scsi_out(sc)->length; -+ unsigned out_len = scsi_bufflen(sc); - struct iscsi_r2t_info *r2t = &task->unsol_r2t; - - hdr->data_length = cpu_to_be32(out_len); -@@ -313,7 +318,7 @@ static int iscsi_prep_scsi_cmd_pdu(struct iscsi_task *task) - } else { - hdr->flags |= ISCSI_FLAG_CMD_FINAL; - zero_data(hdr->dlength); -- hdr->data_length = cpu_to_be32(scsi_in(sc)->length); -+ hdr->data_length = cpu_to_be32(scsi_bufflen(sc)); - - if (sc->sc_data_direction == DMA_FROM_DEVICE) - hdr->flags |= ISCSI_FLAG_CMD_READ; -@@ -340,7 +345,7 @@ static int iscsi_prep_scsi_cmd_pdu(struct iscsi_task *task) - "bidirectional" : sc->sc_data_direction == DMA_TO_DEVICE ? - "write" : "read", conn->id, sc, sc->cmnd[0], task->itt, - scsi_bufflen(sc), -- scsi_bidi_cmnd(sc) ? scsi_in(sc)->length : 0, -+ scsi_bidi_cmnd(sc) ? scsi_bufflen(sc) : 0, - session->cmdsn, session->max_cmdsn - session->exp_cmdsn + 1); - return 0; - } -@@ -432,12 +437,7 @@ static void fail_command(struct iscsi_conn *conn, struct iscsi_task *task, - conn->session->queued_cmdsn--; - - sc->result = err; -- if (!scsi_bidi_cmnd(sc)) -- scsi_set_resid(sc, scsi_bufflen(sc)); -- else { -- scsi_out(sc)->resid = scsi_out(sc)->length; -- scsi_in(sc)->resid = scsi_in(sc)->length; -- } -+ scsi_set_resid(sc, scsi_bufflen(sc)); - - if (conn->task == task) - conn->task = NULL; -@@ -631,7 +631,7 @@ invalid_datalen: - goto out; - } - -- senselen = get_unaligned_be16(data); -+ senselen = be16_to_cpu(get_unaligned((__be16 *) data)); - if (datalen < senselen) - goto invalid_datalen; - -@@ -647,8 +647,8 @@ invalid_datalen: - - if (scsi_bidi_cmnd(sc) && res_count > 0 && - (rhdr->flags & ISCSI_FLAG_CMD_BIDI_OVERFLOW || -- res_count <= scsi_in(sc)->length)) -- scsi_in(sc)->resid = res_count; -+ res_count <= scsi_bufflen(sc))) -+ scsi_set_resid(sc, res_count); - else - sc->result = (DID_BAD_TARGET << 16) | rhdr->cmd_status; - } -@@ -697,8 +697,8 @@ iscsi_data_in_rsp(struct iscsi_conn *conn, struct iscsi_hdr *hdr, - - if (res_count > 0 && - (rhdr->flags & ISCSI_FLAG_CMD_OVERFLOW || -- res_count <= scsi_in(sc)->length)) -- scsi_in(sc)->resid = res_count; -+ res_count <= scsi_bufflen(sc))) -+ scsi_set_resid(sc, res_count); - else - sc->result = (DID_BAD_TARGET << 16) | rhdr->cmd_status; - } -@@ -1244,10 +1244,9 @@ again: - return rc; - } - --static void iscsi_xmitworker(struct work_struct *work) -+static void iscsi_xmitworker(void *data) - { -- struct iscsi_conn *conn = -- container_of(work, struct iscsi_conn, xmitwork); -+ struct iscsi_conn *conn = data; - int rc; - /* - * serialize Xmit worker on a per-connection basis. -@@ -1408,12 +1407,7 @@ prepd_fault: - fault: - spin_unlock(&session->lock); - debug_scsi("iscsi: cmd 0x%x is not queued (%d)\n", sc->cmnd[0], reason); -- if (!scsi_bidi_cmnd(sc)) -- scsi_set_resid(sc, scsi_bufflen(sc)); -- else { -- scsi_out(sc)->resid = scsi_out(sc)->length; -- scsi_in(sc)->resid = scsi_in(sc)->length; -- } -+ scsi_set_resid(sc, scsi_bufflen(sc)); - done(sc); - spin_lock(host->host_lock); - return 0; -@@ -1998,8 +1992,10 @@ int iscsi_host_add(struct Scsi_Host *shost, struct device *pdev) - if (!shost->can_queue) - shost->can_queue = ISCSI_DEF_XMIT_CMDS_MAX; - -+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,16) - if (!shost->transportt->eh_timed_out) - shost->transportt->eh_timed_out = iscsi_eh_cmd_timed_out; -+#endif - return scsi_add_host(shost, pdev); - } - EXPORT_SYMBOL_GPL(iscsi_host_add); -@@ -2295,7 +2291,7 @@ iscsi_conn_setup(struct iscsi_cls_session *cls_session, int dd_size, - INIT_LIST_HEAD(&conn->mgmtqueue); - INIT_LIST_HEAD(&conn->xmitqueue); - INIT_LIST_HEAD(&conn->requeue); -- INIT_WORK(&conn->xmitwork, iscsi_xmitworker); -+ INIT_WORK(&conn->xmitwork, iscsi_xmitworker, conn); - - /* allocate login_task used for the login/text sequences */ - spin_lock_bh(&session->lock); -diff --git a/libiscsi.h b/libiscsi.h -index a261e2c..1274bc9 100644 ---- a/libiscsi.h -+++ b/libiscsi.h -@@ -25,13 +25,16 @@ - - #include <linux/types.h> - #include <linux/wait.h> -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16) - #include <linux/mutex.h> --#include <linux/timer.h> --#include <linux/workqueue.h> -+#endif -+ - #include "iscsi_proto.h" - #include "iscsi_if.h" - #include "scsi_transport_iscsi.h" - -+#include "open_iscsi_compat.h" -+ - struct scsi_transport_template; - struct scsi_host_template; - struct scsi_device; -diff --git a/libiscsi_tcp.c b/libiscsi_tcp.c -index 92cb13d..ea7dd8d 100644 ---- a/libiscsi_tcp.c -+++ b/libiscsi_tcp.c -@@ -357,6 +357,17 @@ iscsi_segment_seek_sg(struct iscsi_segment *segment, - - debug_scsi("iscsi_segment_seek_sg offset %u size %llu\n", - offset, size); -+ -+ /* -+ * older kernels could send use_sg=0 for commands like sgio -+ * or scsi-ml commands. -+ */ -+ if (!sg_count) { -+ iscsi_segment_init_linear(segment, (void *)sg_list + offset, -+ size, done, hash); -+ return 0; -+ } -+ - __iscsi_segment_init(segment, size, done, hash); - for_each_sg(sg_list, sg, sg_count, i) { - debug_scsi("sg %d, len %u offset %u\n", i, sg->length, -@@ -469,7 +480,7 @@ static int iscsi_tcp_data_in(struct iscsi_conn *conn, struct iscsi_task *task) - struct iscsi_tcp_task *tcp_task = task->dd_data; - struct iscsi_data_rsp *rhdr = (struct iscsi_data_rsp *)tcp_conn->in.hdr; - int datasn = be32_to_cpu(rhdr->datasn); -- unsigned total_in_length = scsi_in(task->sc)->length; -+ unsigned total_in_length = scsi_bufflen(task->sc); - - iscsi_update_cmdsn(conn->session, (struct iscsi_nopin*)rhdr); - if (tcp_conn->in.datalen == 0) -@@ -557,11 +568,11 @@ static int iscsi_tcp_r2t_rsp(struct iscsi_conn *conn, struct iscsi_task *task) - r2t->data_length, session->max_burst); - - r2t->data_offset = be32_to_cpu(rhdr->data_offset); -- if (r2t->data_offset + r2t->data_length > scsi_out(task->sc)->length) { -+ if (r2t->data_offset + r2t->data_length > scsi_bufflen(task->sc)) { - iscsi_conn_printk(KERN_ERR, conn, - "invalid R2T with data len %u at offset %u " - "and total length %d\n", r2t->data_length, -- r2t->data_offset, scsi_out(task->sc)->length); -+ r2t->data_offset, scsi_bufflen(task->sc)); - __kfifo_put(tcp_task->r2tpool.queue, (void*)&r2t, - sizeof(void*)); - return ISCSI_ERR_DATALEN; -@@ -660,7 +671,6 @@ iscsi_tcp_hdr_dissect(struct iscsi_conn *conn, struct iscsi_hdr *hdr) - if (tcp_conn->in.datalen) { - struct iscsi_tcp_task *tcp_task = task->dd_data; - struct hash_desc *rx_hash = NULL; -- struct scsi_data_buffer *sdb = scsi_in(task->sc); - - /* - * Setup copy of Data-In into the Scsi_Cmnd -@@ -679,8 +689,8 @@ iscsi_tcp_hdr_dissect(struct iscsi_conn *conn, struct iscsi_hdr *hdr) - tcp_task->data_offset, - tcp_conn->in.datalen); - rc = iscsi_segment_seek_sg(&tcp_conn->in.segment, -- sdb->table.sgl, -- sdb->table.nents, -+ scsi_sglist(task->sc), -+ scsi_sg_count(task->sc), - tcp_task->data_offset, - tcp_conn->in.datalen, - iscsi_tcp_process_data_in, -diff --git a/libiscsi_tcp.h b/libiscsi_tcp.h -index 3bacef5..5ea284d 100644 ---- a/libiscsi_tcp.h -+++ b/libiscsi_tcp.h -@@ -21,6 +21,7 @@ - #ifndef LIBISCSI_TCP_H - #define LIBISCSI_TCP_H - -+#include "open_iscsi_compat.h" - #include "libiscsi.h" - - struct iscsi_tcp_conn; -diff --git a/open_iscsi_compat.h b/open_iscsi_compat.h -new file mode 100644 -index 0000000..2dbe4ce ---- /dev/null -+++ b/open_iscsi_compat.h -@@ -0,0 +1,303 @@ -+#ifndef OPEN_ISCSI_COMPAT -+#define OPEN_ISCSI_COMPAT -+ -+#include <linux/version.h> -+#include <linux/kernel.h> -+#include <scsi/scsi.h> -+#include <scsi/scsi_cmnd.h> -+ -+#ifndef SCAN_WILD_CARD -+#define SCAN_WILD_CARD ~0 -+#endif -+ -+#ifndef NIPQUAD_FMT -+#define NIPQUAD_FMT "%u.%u.%u.%u" -+#endif -+ -+#ifndef NIP6_FMT -+#define NIP6_FMT "%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x" -+#endif -+ -+#ifndef DEFINE_MUTEX -+ -+/* mutex changes from 2.6.16-rc1 and up */ -+#define DEFINE_MUTEX DECLARE_MUTEX -+#define mutex_lock down -+#define mutex_unlock up -+#define mutex semaphore -+#define mutex_init init_MUTEX -+#endif -+ -+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,12) -+ -+void int_to_scsilun(unsigned int lun, struct scsi_lun *scsilun) -+{ -+ int i; -+ -+ memset(scsilun->scsi_lun, 0, sizeof(scsilun->scsi_lun)); -+ -+ for (i = 0; i < sizeof(lun); i += 2) { -+ scsilun->scsi_lun[i] = (lun >> 8) & 0xFF; -+ scsilun->scsi_lun[i+1] = lun & 0xFF; -+ lun = lun >> 16; -+ } -+} -+ -+#define __nlmsg_put(skb, daemon_pid, seq, type, len, flags) \ -+ __nlmsg_put(skb, daemon_pid, 0, 0, len) -+ -+#endif -+ -+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,13) -+ -+#define gfp_t unsigned -+ -+void *kzalloc(size_t size, gfp_t flags) -+{ -+ void *ret = kmalloc(size, flags); -+ if (ret) -+ memset(ret, 0, size); -+} -+ -+#endif -+ -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) -+ -+#include "linux/crypto.h" -+ -+#define CRYPTO_ALG_ASYNC 0x00000080 -+struct hash_desc -+{ -+ struct crypto_tfm *tfm; -+ u32 flags; -+}; -+ -+static inline int crypto_hash_init(struct hash_desc *desc) -+{ -+ crypto_digest_init(desc->tfm); -+ return 0; -+} -+ -+static inline int crypto_hash_digest(struct hash_desc *desc, -+ struct scatterlist *sg, -+ unsigned int nbytes, u8 *out) -+{ -+ crypto_digest_digest(desc->tfm, sg, 1, out); -+ return nbytes; -+} -+ -+static inline int crypto_hash_update(struct hash_desc *desc, -+ struct scatterlist *sg, -+ unsigned int nbytes) -+{ -+ crypto_digest_update(desc->tfm, sg, 1); -+ return nbytes; -+} -+ -+static inline int crypto_hash_final(struct hash_desc *desc, u8 *out) -+{ -+ crypto_digest_final(desc->tfm, out); -+ return 0; -+} -+ -+static inline struct crypto_tfm *crypto_alloc_hash(const char *alg_name, -+ u32 type, u32 mask) -+{ -+ struct crypto_tfm *ret = crypto_alloc_tfm(alg_name ,type); -+ return ret ? ret : ERR_PTR(-ENOMEM); -+} -+ -+static inline void crypto_free_hash(struct crypto_tfm *tfm) -+{ -+ crypto_free_tfm(tfm); -+} -+ -+int kernel_getsockname(struct socket *sock, struct sockaddr *addr, -+ int *addrlen) -+{ -+ return sock->ops->getname(sock, addr, addrlen, 0); -+} -+ -+int kernel_getpeername(struct socket *sock, struct sockaddr *addr, -+ int *addrlen) -+{ -+ return sock->ops->getname(sock, addr, addrlen, 1); -+} -+ -+#endif -+ -+#ifndef bool -+#define bool int -+#endif -+ -+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,20) -+#ifdef RHEL_RELEASE_VERSION -+#if RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(5,2) -+static inline int is_power_of_2(unsigned long n) -+{ -+ return (n != 0 && ((n & (n - 1)) == 0)); -+} -+#endif -+#else -+/* not a redhat kernel */ -+static inline int is_power_of_2(unsigned long n) -+{ -+ return (n != 0 && ((n & (n - 1)) == 0)); -+} -+#endif -+#endif -+ -+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,21) -+ -+static inline struct nlmsghdr *nlmsg_hdr(const struct sk_buff *skb) -+{ -+ return (struct nlmsghdr *)skb->data; -+} -+ -+#endif -+ -+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,22) -+#ifdef RHEL_RELEASE_VERSION -+#if RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(5,2) -+static inline void *shost_priv(struct Scsi_Host *shost) -+{ -+ return (void *)shost->hostdata; -+} -+#endif -+#else -+/* not a redhat kernel */ -+static inline void *shost_priv(struct Scsi_Host *shost) -+{ -+ return (void *)shost->hostdata; -+} -+#endif -+ -+/* -+ * Note: We do not support bidi for the compat modules if the kernel -+ * does not have support. -+ */ -+#define scsi_sg_count(cmd) ((cmd)->use_sg) -+#define scsi_sglist(cmd) ((struct scatterlist *)(cmd)->request_buffer) -+#define scsi_bufflen(cmd) ((cmd)->request_bufflen) -+ -+#ifdef RHEL_RELEASE_VERSION -+#if RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(5,2) -+static inline void scsi_set_resid(struct scsi_cmnd *cmd, int resid) -+{ -+ cmd->resid = resid; -+} -+ -+static inline int scsi_get_resid(struct scsi_cmnd *cmd) -+{ -+ return cmd->resid; -+} -+#endif -+#else -+/* not a redhat kernel */ -+static inline void scsi_set_resid(struct scsi_cmnd *cmd, int resid) -+{ -+ cmd->resid = resid; -+} -+ -+static inline int scsi_get_resid(struct scsi_cmnd *cmd) -+{ -+ return cmd->resid; -+} -+#endif -+ -+#endif -+ -+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,23) -+ -+static inline unsigned long rounddown_pow_of_two(unsigned long n) -+{ -+ return 1UL << (fls_long(n) - 1); -+} -+ -+ -+static inline struct scatterlist *sg_next(struct scatterlist *sg) -+{ -+ if (!sg) { -+ BUG(); -+ return NULL; -+ } -+ return sg + 1; -+} -+ -+#define for_each_sg(sglist, sg, nr, __i) \ -+ for (__i = 0, sg = (sglist); __i < (nr); __i++, sg = sg_next(sg)) -+ -+#define sg_page(_sg) _sg->page -+ -+static inline void sg_set_page(struct scatterlist *sg, struct page *page, -+ unsigned int len, unsigned int offset) -+{ -+ sg->page = page; -+ sg->offset = offset; -+ sg->length = len; -+} -+ -+static inline void sg_init_table(struct scatterlist *sgl, unsigned int nents) -+{ -+ memset(sgl, 0, sizeof(*sgl) * nents); -+} -+#endif -+ -+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,24) -+ -+static inline int scsi_bidi_cmnd(struct scsi_cmnd *cmd) -+{ -+ return 0; -+} -+ -+#define netlink_kernel_release(_nls) \ -+ sock_release(_nls->sk_socket) -+ -+ -+#endif -+ -+ -+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,13) -+ -+#define netlink_kernel_create(net, uint, groups, input, cb_mutex, mod) \ -+ netlink_kernel_create(uint, input) -+ -+#elif LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,21) -+ -+#define netlink_kernel_create(net, uint, groups, input, cb_mutex, mod) \ -+ netlink_kernel_create(uint, groups, input, mod) -+ -+#elif LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,22) -+ -+#define netlink_kernel_create(net, uint, groups, input, cb_mutex, mod) \ -+ netlink_kernel_create(uint, groups, input, cb_mutex, mod) -+ -+#elif LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,23) -+ -+#define netlink_kernel_create(net, uint, groups, input, cb_mutex, mod) \ -+ netlink_kernel_create(uint, groups, input, cb_mutex, mod) -+ -+#endif -+ -+#ifndef DID_TRANSPORT_DISRUPTED -+#define DID_TRANSPORT_DISRUPTED DID_BUS_BUSY -+#endif -+ -+#ifndef DID_TRANSPORT_FAILFAST -+#define DID_TRANSPORT_FAILFAST DID_NO_CONNECT -+#endif -+ -+#ifndef SCSI_MLQUEUE_TARGET_BUSY -+#define SCSI_MLQUEUE_TARGET_BUSY SCSI_MLQUEUE_HOST_BUSY -+#endif -+ -+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,27) -+ -+#define BLK_EH_NOT_HANDLED EH_NOT_HANDLED -+#define BLK_EH_RESET_TIMER EH_RESET_TIMER -+ -+#define blk_eh_timer_return scsi_eh_timer_return -+ -+#endif -+ -+#endif -diff --git a/scsi_transport_iscsi.c b/scsi_transport_iscsi.c -index 4781d81..98d1351 100644 ---- a/scsi_transport_iscsi.c -+++ b/scsi_transport_iscsi.c -@@ -21,7 +21,10 @@ - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - #include <linux/module.h> -+#include <linux/version.h> -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16) - #include <linux/mutex.h> -+#endif - #include <net/tcp.h> - #include <scsi/scsi.h> - #include <scsi/scsi_host.h> -@@ -41,13 +44,13 @@ struct iscsi_internal { - struct scsi_transport_template t; - struct iscsi_transport *iscsi_transport; - struct list_head list; -- struct device dev; -+ struct class_device cdev; - -- struct device_attribute *host_attrs[ISCSI_HOST_ATTRS + 1]; -+ struct class_device_attribute *host_attrs[ISCSI_HOST_ATTRS + 1]; - struct transport_container conn_cont; -- struct device_attribute *conn_attrs[ISCSI_CONN_ATTRS + 1]; -+ struct class_device_attribute *conn_attrs[ISCSI_CONN_ATTRS + 1]; - struct transport_container session_cont; -- struct device_attribute *session_attrs[ISCSI_SESSION_ATTRS + 1]; -+ struct class_device_attribute *session_attrs[ISCSI_SESSION_ATTRS + 1]; - }; - - static atomic_t iscsi_session_nr; /* sysfs session id for next new session */ -@@ -64,12 +67,12 @@ static DEFINE_SPINLOCK(iscsi_transport_lock); - #define to_iscsi_internal(tmpl) \ - container_of(tmpl, struct iscsi_internal, t) - --#define dev_to_iscsi_internal(_dev) \ -- container_of(_dev, struct iscsi_internal, dev) -+#define cdev_to_iscsi_internal(_cdev) \ -+ container_of(_cdev, struct iscsi_internal, cdev) - --static void iscsi_transport_release(struct device *dev) -+static void iscsi_transport_release(struct class_device *cdev) - { -- struct iscsi_internal *priv = dev_to_iscsi_internal(dev); -+ struct iscsi_internal *priv = cdev_to_iscsi_internal(cdev); - kfree(priv); - } - -@@ -79,33 +82,31 @@ static void iscsi_transport_release(struct device *dev) - */ - static struct class iscsi_transport_class = { - .name = "iscsi_transport", -- .dev_release = iscsi_transport_release, -+ .release = iscsi_transport_release, - }; - - static ssize_t --show_transport_handle(struct device *dev, struct device_attribute *attr, -- char *buf) -+show_transport_handle(struct class_device *cdev, char *buf) - { -- struct iscsi_internal *priv = dev_to_iscsi_internal(dev); -+ struct iscsi_internal *priv = cdev_to_iscsi_internal(cdev); - return sprintf(buf, "%llu\n", (unsigned long long)iscsi_handle(priv->iscsi_transport)); - } --static DEVICE_ATTR(handle, S_IRUGO, show_transport_handle, NULL); -+static CLASS_DEVICE_ATTR(handle, S_IRUGO, show_transport_handle, NULL); - - #define show_transport_attr(name, format) \ - static ssize_t \ --show_transport_##name(struct device *dev, \ -- struct device_attribute *attr,char *buf) \ -+show_transport_##name(struct class_device *cdev, char *buf) \ - { \ -- struct iscsi_internal *priv = dev_to_iscsi_internal(dev); \ -+ struct iscsi_internal *priv = cdev_to_iscsi_internal(cdev); \ - return sprintf(buf, format"\n", priv->iscsi_transport->name); \ - } \ --static DEVICE_ATTR(name, S_IRUGO, show_transport_##name, NULL); -+static CLASS_DEVICE_ATTR(name, S_IRUGO, show_transport_##name, NULL); - - show_transport_attr(caps, "0x%x"); - - static struct attribute *iscsi_transport_attrs[] = { -- &dev_attr_handle.attr, -- &dev_attr_caps.attr, -+ &class_device_attr_handle.attr, -+ &class_device_attr_caps.attr, - NULL, - }; - -@@ -113,6 +114,7 @@ static struct attribute_group iscsi_transport_group = { - .attrs = iscsi_transport_attrs, - }; - -+#if 0 - /* - * iSCSI endpoint attrs - */ -@@ -236,9 +238,10 @@ struct iscsi_endpoint *iscsi_lookup_endpoint(u64 handle) - return ep; - } - EXPORT_SYMBOL_GPL(iscsi_lookup_endpoint); -+#endif - - static int iscsi_setup_host(struct transport_container *tc, struct device *dev, -- struct device *cdev) -+ struct class_device *cdev) - { - struct Scsi_Host *shost = dev_to_shost(dev); - struct iscsi_cls_host *ihost = shost->shost_data; -@@ -257,7 +260,7 @@ static int iscsi_setup_host(struct transport_container *tc, struct device *dev, - } - - static int iscsi_remove_host(struct transport_container *tc, struct device *dev, -- struct device *cdev) -+ struct class_device *cdev) - { - struct Scsi_Host *shost = dev_to_shost(dev); - struct iscsi_cls_host *ihost = shost->shost_data; -@@ -497,10 +500,9 @@ static int iscsi_user_scan(struct Scsi_Host *shost, uint channel, - iscsi_user_scan_session); - } - --static void iscsi_scan_session(struct work_struct *work) -+static void iscsi_scan_session(void *data) - { -- struct iscsi_cls_session *session = -- container_of(work, struct iscsi_cls_session, scan_work); -+ struct iscsi_cls_session *session = data; - struct Scsi_Host *shost = iscsi_session_to_shost(session); - struct iscsi_cls_host *ihost = shost->shost_data; - struct iscsi_scan_data scan_data; -@@ -513,11 +515,9 @@ static void iscsi_scan_session(struct work_struct *work) - atomic_dec(&ihost->nr_scans); - } - --static void session_recovery_timedout(struct work_struct *work) -+static void session_recovery_timedout(void *data) - { -- struct iscsi_cls_session *session = -- container_of(work, struct iscsi_cls_session, -- recovery_work.work); -+ struct iscsi_cls_session *session = data; - unsigned long flags; - - iscsi_cls_session_printk(KERN_INFO, session, -@@ -543,11 +543,9 @@ static void session_recovery_timedout(struct work_struct *work) - scsi_target_unblock(&session->dev); - } - --static void __iscsi_unblock_session(struct work_struct *work) -+static void __iscsi_unblock_session(void *data) - { -- struct iscsi_cls_session *session = -- container_of(work, struct iscsi_cls_session, -- unblock_work); -+ struct iscsi_cls_session *session = data; - struct Scsi_Host *shost = iscsi_session_to_shost(session); - struct iscsi_cls_host *ihost = shost->shost_data; - unsigned long flags; -@@ -567,10 +565,12 @@ static void __iscsi_unblock_session(struct work_struct *work) - * the async scanning code (drivers like iscsi_tcp do login and - * scanning from userspace). - */ -+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,19) - if (shost->hostt->scan_finished) { - if (queue_work(ihost->scan_workq, &session->scan_work)) - atomic_inc(&ihost->nr_scans); - } -+#endif - } - - /** -@@ -590,11 +590,9 @@ void iscsi_unblock_session(struct iscsi_cls_session *session) - } - EXPORT_SYMBOL_GPL(iscsi_unblock_session); - --static void __iscsi_block_session(struct work_struct *work) -+static void __iscsi_block_session(void *data) - { -- struct iscsi_cls_session *session = -- container_of(work, struct iscsi_cls_session, -- block_work); -+ struct iscsi_cls_session *session = data; - unsigned long flags; - - spin_lock_irqsave(&session->lock, flags); -@@ -611,11 +609,9 @@ void iscsi_block_session(struct iscsi_cls_session *session) - } - EXPORT_SYMBOL_GPL(iscsi_block_session); - --static void __iscsi_unbind_session(struct work_struct *work) -+static void __iscsi_unbind_session(void *data) - { -- struct iscsi_cls_session *session = -- container_of(work, struct iscsi_cls_session, -- unbind_work); -+ struct iscsi_cls_session *session = data; - struct Scsi_Host *shost = iscsi_session_to_shost(session); - struct iscsi_cls_host *ihost = shost->shost_data; - unsigned long flags; -@@ -658,12 +654,12 @@ iscsi_alloc_session(struct Scsi_Host *shost, struct iscsi_transport *transport, - session->transport = transport; - session->recovery_tmo = 120; - session->state = ISCSI_SESSION_FREE; -- INIT_DELAYED_WORK(&session->recovery_work, session_recovery_timedout); -+ INIT_WORK(&session->recovery_work, session_recovery_timedout, session); - INIT_LIST_HEAD(&session->sess_list); -- INIT_WORK(&session->unblock_work, __iscsi_unblock_session); -- INIT_WORK(&session->block_work, __iscsi_block_session); -- INIT_WORK(&session->unbind_work, __iscsi_unbind_session); -- INIT_WORK(&session->scan_work, iscsi_scan_session); -+ INIT_WORK(&session->unblock_work, __iscsi_unblock_session, session); -+ INIT_WORK(&session->block_work, __iscsi_block_session, session); -+ INIT_WORK(&session->unbind_work, __iscsi_unbind_session, session); -+ INIT_WORK(&session->scan_work, iscsi_scan_session, session); - spin_lock_init(&session->lock); - - /* this is released in the dev's release function */ -@@ -723,7 +719,8 @@ int iscsi_add_session(struct iscsi_cls_session *session, unsigned int target_id) - } - session->target_id = id; - -- dev_set_name(&session->dev, "session%u", session->sid); -+ snprintf(session->dev.bus_id, BUS_ID_SIZE, "session%u", -+ session->sid); - err = device_add(&session->dev); - if (err) { - iscsi_cls_session_printk(KERN_ERR, session, -@@ -822,7 +819,7 @@ void iscsi_remove_session(struct iscsi_cls_session *session) - scsi_target_unblock(&session->dev); - /* flush running scans then delete devices */ - flush_workqueue(ihost->scan_workq); -- __iscsi_unbind_session(&session->unbind_work); -+ __iscsi_unbind_session(session); - - /* hw iscsi may not have removed all connections from session */ - err = device_for_each_child(&session->dev, NULL, -@@ -896,7 +893,8 @@ iscsi_create_conn(struct iscsi_cls_session *session, int dd_size, uint32_t cid) - if (!get_device(&session->dev)) - goto free_conn; - -- dev_set_name(&conn->dev, "connection%d:%u", session->sid, cid); -+ snprintf(conn->dev.bus_id, BUS_ID_SIZE, "connection%d:%u", -+ session->sid, cid); - conn->dev.parent = &session->dev; - conn->dev.release = iscsi_conn_release; - err = device_register(&conn->dev); -@@ -1305,6 +1303,8 @@ static int - iscsi_if_transport_ep(struct iscsi_transport *transport, - struct iscsi_uevent *ev, int msg_type) - { -+ return -ENOSYS; -+#if 0 - struct iscsi_endpoint *ep; - struct sockaddr *dst_addr; - int rc = 0; -@@ -1345,6 +1345,8 @@ iscsi_if_transport_ep(struct iscsi_transport *transport, - break; - } - return rc; -+ -+#endif - } - - static int -@@ -1426,6 +1428,9 @@ iscsi_if_recv_msg(struct sk_buff *skb, struct nlmsghdr *nlh) - ev->u.c_session.queue_depth); - break; - case ISCSI_UEVENT_CREATE_BOUND_SESSION: -+ err = -ENOSYS; -+ break; -+#if 0 - ep = iscsi_lookup_endpoint(ev->u.c_bound_session.ep_handle); - if (!ep) { - err = -EINVAL; -@@ -1437,6 +1442,7 @@ iscsi_if_recv_msg(struct sk_buff *skb, struct nlmsghdr *nlh) - ev->u.c_bound_session.cmds_max, - ev->u.c_bound_session.queue_depth); - break; -+#endif - case ISCSI_UEVENT_DESTROY_SESSION: - session = iscsi_session_lookup(ev->u.d_session.sid); - if (session) -@@ -1519,55 +1525,70 @@ iscsi_if_recv_msg(struct sk_buff *skb, struct nlmsghdr *nlh) - } - - /* -- * Get message from skb. Each message is processed by iscsi_if_recv_msg. -- * Malformed skbs with wrong lengths or invalid creds are not processed. -+ * Get message from skb (based on rtnetlink_rcv_skb). Each message is -+ * processed by iscsi_if_recv_msg. Malformed skbs with wrong lengths or -+ * invalid creds are discarded silently. - */ - static void --iscsi_if_rx(struct sk_buff *skb) -+iscsi_if_rx(struct sock *sk, int len) - { -+ struct sk_buff *skb; -+ - mutex_lock(&rx_queue_mutex); -- while (skb->len >= NLMSG_SPACE(0)) { -- int err; -- uint32_t rlen; -- struct nlmsghdr *nlh; -- struct iscsi_uevent *ev; -- -- nlh = nlmsg_hdr(skb); -- if (nlh->nlmsg_len < sizeof(*nlh) || -- skb->len < nlh->nlmsg_len) { -- break; -+ while ((skb = skb_dequeue(&sk->sk_receive_queue)) != NULL) { -+ if (NETLINK_CREDS(skb)->uid) { -+ skb_pull(skb, skb->len); -+ goto free_skb; - } - -- ev = NLMSG_DATA(nlh); -- rlen = NLMSG_ALIGN(nlh->nlmsg_len); -- if (rlen > skb->len) -- rlen = skb->len; -+ while (skb->len >= NLMSG_SPACE(0)) { -+ int err; -+ uint32_t rlen; -+ struct nlmsghdr *nlh; -+ struct iscsi_uevent *ev; - -- err = iscsi_if_recv_msg(skb, nlh); -- if (err) { -- ev->type = ISCSI_KEVENT_IF_ERROR; -- ev->iferror = err; -- } -- do { -- /* -- * special case for GET_STATS: -- * on success - sending reply and stats from -- * inside of if_recv_msg(), -- * on error - fall through. -- */ -- if (ev->type == ISCSI_UEVENT_GET_STATS && !err) -+ nlh = nlmsg_hdr(skb); -+ if (nlh->nlmsg_len < sizeof(*nlh) || -+ skb->len < nlh->nlmsg_len) { - break; -- err = iscsi_if_send_reply( -- NETLINK_CREDS(skb)->pid, nlh->nlmsg_seq, -- nlh->nlmsg_type, 0, 0, ev, sizeof(*ev)); -- } while (err < 0 && err != -ECONNREFUSED); -- skb_pull(skb, rlen); -+ } -+ -+ ev = NLMSG_DATA(nlh); -+ rlen = NLMSG_ALIGN(nlh->nlmsg_len); -+ if (rlen > skb->len) -+ rlen = skb->len; -+ -+ err = iscsi_if_recv_msg(skb, nlh); -+ if (err) { -+ ev->type = ISCSI_KEVENT_IF_ERROR; -+ ev->iferror = err; -+ } -+ do { -+ /* -+ * special case for GET_STATS: -+ * on success - sending reply and stats from -+ * inside of if_recv_msg(), -+ * on error - fall through. -+ */ -+ if (ev->type == ISCSI_UEVENT_GET_STATS && !err) -+ break; -+ err = iscsi_if_send_reply( -+ NETLINK_CREDS(skb)->pid, nlh->nlmsg_seq, -+ nlh->nlmsg_type, 0, 0, ev, sizeof(*ev)); -+ } while (err < 0 && err != -ECONNREFUSED); -+ skb_pull(skb, rlen); -+ } -+free_skb: -+ kfree_skb(skb); - } - mutex_unlock(&rx_queue_mutex); - } - -+#define iscsi_cdev_to_conn(_cdev) \ -+ iscsi_dev_to_conn(_cdev->dev) -+ - #define ISCSI_CLASS_ATTR(_prefix,_name,_mode,_show,_store) \ --struct device_attribute dev_attr_##_prefix##_##_name = \ -+struct class_device_attribute class_device_attr_##_prefix##_##_name = \ - __ATTR(_name,_mode,_show,_store) - - /* -@@ -1575,10 +1596,9 @@ struct device_attribute dev_attr_##_prefix##_##_name = \ - */ - #define iscsi_conn_attr_show(param) \ - static ssize_t \ --show_conn_param_##param(struct device *dev, \ -- struct device_attribute *attr, char *buf) \ -+show_conn_param_##param(struct class_device *cdev, char *buf) \ - { \ -- struct iscsi_cls_conn *conn = iscsi_dev_to_conn(dev->parent); \ -+ struct iscsi_cls_conn *conn = iscsi_cdev_to_conn(cdev); \ - struct iscsi_transport *t = conn->transport; \ - return t->get_conn_param(conn, param, buf); \ - } -@@ -1602,16 +1622,17 @@ iscsi_conn_attr(address, ISCSI_PARAM_CONN_ADDRESS); - iscsi_conn_attr(ping_tmo, ISCSI_PARAM_PING_TMO); - iscsi_conn_attr(recv_tmo, ISCSI_PARAM_RECV_TMO); - -+#define iscsi_cdev_to_session(_cdev) \ -+ iscsi_dev_to_session(_cdev->dev) -+ - /* - * iSCSI session attrs - */ - #define iscsi_session_attr_show(param, perm) \ - static ssize_t \ --show_session_param_##param(struct device *dev, \ -- struct device_attribute *attr, char *buf) \ -+show_session_param_##param(struct class_device *cdev, char *buf) \ - { \ -- struct iscsi_cls_session *session = \ -- iscsi_dev_to_session(dev->parent); \ -+ struct iscsi_cls_session *session = iscsi_cdev_to_session(cdev); \ - struct iscsi_transport *t = session->transport; \ - \ - if (perm && !capable(CAP_SYS_ADMIN)) \ -@@ -1645,10 +1666,9 @@ iscsi_session_attr(ifacename, ISCSI_PARAM_IFACE_NAME, 0); - iscsi_session_attr(initiatorname, ISCSI_PARAM_INITIATOR_NAME, 0) - - static ssize_t --show_priv_session_state(struct device *dev, struct device_attribute *attr, -- char *buf) -+show_priv_session_state(struct class_device *cdev, char *buf) - { -- struct iscsi_cls_session *session = iscsi_dev_to_session(dev->parent); -+ struct iscsi_cls_session *session = iscsi_cdev_to_session(cdev); - return sprintf(buf, "%s\n", iscsi_session_state_name(session->state)); - } - static ISCSI_CLASS_ATTR(priv_sess, state, S_IRUGO, show_priv_session_state, -@@ -1656,11 +1676,9 @@ static ISCSI_CLASS_ATTR(priv_sess, state, S_IRUGO, show_priv_session_state, - - #define iscsi_priv_session_attr_show(field, format) \ - static ssize_t \ --show_priv_session_##field(struct device *dev, \ -- struct device_attribute *attr, char *buf) \ -+show_priv_session_##field(struct class_device *cdev, char *buf) \ - { \ -- struct iscsi_cls_session *session = \ -- iscsi_dev_to_session(dev->parent); \ -+ struct iscsi_cls_session *session = iscsi_cdev_to_session(cdev);\ - return sprintf(buf, format"\n", session->field); \ - } - -@@ -1675,10 +1693,9 @@ iscsi_priv_session_attr(recovery_tmo, "%d"); - */ - #define iscsi_host_attr_show(param) \ - static ssize_t \ --show_host_param_##param(struct device *dev, \ -- struct device_attribute *attr, char *buf) \ -+show_host_param_##param(struct class_device *cdev, char *buf) \ - { \ -- struct Scsi_Host *shost = transport_class_to_shost(dev); \ -+ struct Scsi_Host *shost = transport_class_to_shost(cdev); \ - struct iscsi_internal *priv = to_iscsi_internal(shost->transportt); \ - return priv->iscsi_transport->get_host_param(shost, param, buf); \ - } -@@ -1695,7 +1712,7 @@ iscsi_host_attr(initiatorname, ISCSI_HOST_PARAM_INITIATOR_NAME); - - #define SETUP_PRIV_SESSION_RD_ATTR(field) \ - do { \ -- priv->session_attrs[count] = &dev_attr_priv_sess_##field; \ -+ priv->session_attrs[count] = &class_device_attr_priv_sess_##field; \ - count++; \ - } while (0) - -@@ -1703,7 +1720,7 @@ do { \ - #define SETUP_SESSION_RD_ATTR(field, param_flag) \ - do { \ - if (tt->param_mask & param_flag) { \ -- priv->session_attrs[count] = &dev_attr_sess_##field; \ -+ priv->session_attrs[count] = &class_device_attr_sess_##field; \ - count++; \ - } \ - } while (0) -@@ -1711,7 +1728,7 @@ do { \ - #define SETUP_CONN_RD_ATTR(field, param_flag) \ - do { \ - if (tt->param_mask & param_flag) { \ -- priv->conn_attrs[count] = &dev_attr_conn_##field; \ -+ priv->conn_attrs[count] = &class_device_attr_conn_##field; \ - count++; \ - } \ - } while (0) -@@ -1719,7 +1736,7 @@ do { \ - #define SETUP_HOST_RD_ATTR(field, param_flag) \ - do { \ - if (tt->host_param_mask & param_flag) { \ -- priv->host_attrs[count] = &dev_attr_host_##field; \ -+ priv->host_attrs[count] = &class_device_attr_host_##field; \ - count++; \ - } \ - } while (0) -@@ -1808,19 +1825,21 @@ iscsi_register_transport(struct iscsi_transport *tt) - INIT_LIST_HEAD(&priv->list); - priv->daemon_pid = -1; - priv->iscsi_transport = tt; -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16) - priv->t.user_scan = iscsi_user_scan; -+#endif - if (!(tt->caps & CAP_DATA_PATH_OFFLOAD)) - priv->t.create_work_queue = 1; - -- priv->dev.class = &iscsi_transport_class; -- dev_set_name(&priv->dev, "%s", tt->name); -- err = device_register(&priv->dev); -+ priv->cdev.class = &iscsi_transport_class; -+ snprintf(priv->cdev.class_id, BUS_ID_SIZE, "%s", tt->name); -+ err = class_device_register(&priv->cdev); - if (err) - goto free_priv; - -- err = sysfs_create_group(&priv->dev.kobj, &iscsi_transport_group); -+ err = sysfs_create_group(&priv->cdev.kobj, &iscsi_transport_group); - if (err) -- goto unregister_dev; -+ goto unregister_cdev; - - /* host parameters */ - priv->t.host_attrs.ac.attrs = &priv->host_attrs[0]; -@@ -1899,9 +1918,8 @@ iscsi_register_transport(struct iscsi_transport *tt) - printk(KERN_NOTICE "iscsi: registered transport (%s)\n", tt->name); - return &priv->t; - --unregister_dev: -- device_unregister(&priv->dev); -- return NULL; -+unregister_cdev: -+ class_device_unregister(&priv->cdev); - free_priv: - kfree(priv); - return NULL; -@@ -1928,8 +1946,8 @@ int iscsi_unregister_transport(struct iscsi_transport *tt) - transport_container_unregister(&priv->session_cont); - transport_container_unregister(&priv->t.host_attrs); - -- sysfs_remove_group(&priv->dev.kobj, &iscsi_transport_group); -- device_unregister(&priv->dev); -+ sysfs_remove_group(&priv->cdev.kobj, &iscsi_transport_group); -+ class_device_unregister(&priv->cdev); - mutex_unlock(&rx_queue_mutex); - - return 0; -@@ -1949,13 +1967,14 @@ static __init int iscsi_transport_init(void) - if (err) - return err; - -+#if 0 - err = class_register(&iscsi_endpoint_class); - if (err) - goto unregister_transport_class; -- -+#endif - err = transport_class_register(&iscsi_host_class); - if (err) -- goto unregister_endpoint_class; -+ goto unregister_transport_class; - - err = transport_class_register(&iscsi_connection_class); - if (err) -@@ -1986,8 +2005,10 @@ unregister_conn_class: - transport_class_unregister(&iscsi_connection_class); - unregister_host_class: - transport_class_unregister(&iscsi_host_class); -+#if 0 - unregister_endpoint_class: - class_unregister(&iscsi_endpoint_class); -+#endif - unregister_transport_class: - class_unregister(&iscsi_transport_class); - return err; -@@ -2000,7 +2021,9 @@ static void __exit iscsi_transport_exit(void) - transport_class_unregister(&iscsi_connection_class); - transport_class_unregister(&iscsi_session_class); - transport_class_unregister(&iscsi_host_class); -+#if 0 - class_unregister(&iscsi_endpoint_class); -+#endif - class_unregister(&iscsi_transport_class); - } - -diff --git a/scsi_transport_iscsi.h b/scsi_transport_iscsi.h -index 27d067a..6fa17f6 100644 ---- a/scsi_transport_iscsi.h -+++ b/scsi_transport_iscsi.h -@@ -25,9 +25,14 @@ - - #include <linux/device.h> - #include <linux/list.h> -+#include <linux/version.h> -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16) - #include <linux/mutex.h> -+#endif - #include "iscsi_if.h" - -+#include "open_iscsi_compat.h" -+ - struct scsi_transport_template; - struct iscsi_transport; - struct iscsi_endpoint; -@@ -184,7 +189,7 @@ struct iscsi_cls_session { - - /* recovery fields */ - int recovery_tmo; -- struct delayed_work recovery_work; -+ struct work_struct recovery_work; - - unsigned int target_id; - --- -1.5.6.6 - |