summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorMike Christie <michaelc@cs.wisc.edu>2007-10-29 14:12:57 -0500
committerMike Christie <michaelc@cs.wisc.edu>2007-10-29 14:12:57 -0500
commitb17606d15a15724f296600cd4624d4e208da164b (patch)
tree451df020aa50f19264d9620b5b4483720b2ee94d /kernel
parent4573080f17d6926f6ae5e2185abebe1782e8e978 (diff)
downloadopen-iscsi-b17606d15a15724f296600cd4624d4e208da164b.tar.gz
sync with upstream 2.6.24
update for netlink and sg chaining changes.
Diffstat (limited to 'kernel')
-rw-r--r--kernel/Makefile2
-rw-r--r--kernel/iscsi_tcp.c40
-rw-r--r--kernel/libiscsi.c1
-rw-r--r--kernel/scsi_transport_iscsi.c84
-rw-r--r--kernel/scsi_transport_iscsi.h2
5 files changed, 53 insertions, 76 deletions
diff --git a/kernel/Makefile b/kernel/Makefile
index 93aff18..f0b814b 100644
--- a/kernel/Makefile
+++ b/kernel/Makefile
@@ -84,6 +84,8 @@ linux_2_6_22: has_20to21_patch
linux_2_6_23: $(unpatch_code)
+linux_2_6_24: $(unpatch_code)
+
do_unpatch_code:
echo "Un-patching source code for use with linux-2.6.14 and up ..."
patch -R -E -p1 < $(cur_patched)
diff --git a/kernel/iscsi_tcp.c b/kernel/iscsi_tcp.c
index 8296274..cc075bc 100644
--- a/kernel/iscsi_tcp.c
+++ b/kernel/iscsi_tcp.c
@@ -71,22 +71,6 @@ static int iscsi_tcp_hdr_recv_done(struct iscsi_tcp_conn *tcp_conn,
struct iscsi_segment *segment);
/*
- * This code is converted to use sg chaining, but scsi misc does
- * not yet have it or jen's tree may not have the currrent iscsi
- * driver and linus may have one or the other. When everyone is in
- * sync then remove this function, rename callers to sg_next and just
- * use scatterlist.h's definition.
- */
-static inline struct scatterlist *iscsi_sg_next(struct scatterlist *sg)
-{
- if (!sg) {
- BUG();
- return NULL;
- }
- return sg + 1;
-}
-
-/*
* Scatterlist handling: inside the iscsi_segment, we
* remember an index into the scatterlist, and set data/size
* to the current scatterlist entry. For highmem pages, we
@@ -147,12 +131,12 @@ iscsi_tcp_segment_map(struct iscsi_segment *segment, int recv)
* have to go the slow sendmsg path. We always map for the
* recv path.
*/
- if (page_count(sg->page) >= 1 && !recv)
+ if (page_count(sg_page(sg)) >= 1 && !recv)
return;
debug_tcp("iscsi_tcp_segment_map %s %p\n", recv ? "recv" : "xmit",
segment);
- segment->sg_mapped = kmap_atomic(sg->page, KM_SOFTIRQ0);
+ segment->sg_mapped = kmap_atomic(sg_page(sg), KM_SOFTIRQ0);
segment->data = segment->sg_mapped + sg->offset + segment->sg_offset;
}
@@ -210,15 +194,16 @@ iscsi_tcp_segment_done(struct iscsi_segment *segment, int recv, unsigned copied)
segment->size, recv ? "recv" : "xmit");
if (segment->hash && copied) {
/*
- * if a segment is mapped we must unmap it, because the
- * crypto layer will want to map it itself.
+ * If a segment is kmapd we must unmap it before sending
+ * to the crypto layer since that will try to kmap it again.
*/
iscsi_tcp_segment_unmap(segment);
+
if (!segment->data) {
- sg = *(segment->sg);
- sg.length = copied;
- sg.offset = segment->copied + segment->sg_offset +
- segment->sg->offset;
+ sg_init_table(&sg, 1);
+ sg_set_page(&sg, sg_page(segment->sg), copied,
+ segment->copied + segment->sg_offset +
+ segment->sg->offset);
} else
sg_init_one(&sg, segment->data + segment->copied,
copied);
@@ -243,7 +228,7 @@ iscsi_tcp_segment_done(struct iscsi_segment *segment, int recv, unsigned copied)
segment->total_size);
if (segment->total_copied < segment->total_size) {
/* Proceed to the next entry in the scatterlist. */
- iscsi_tcp_segment_init_sg(segment, iscsi_sg_next(segment->sg),
+ iscsi_tcp_segment_init_sg(segment, sg_next(segment->sg),
0);
iscsi_tcp_segment_map(segment, recv);
BUG_ON(segment->size == 0);
@@ -311,7 +296,7 @@ iscsi_tcp_xmit_segment(struct iscsi_tcp_conn *tcp_conn,
if (!segment->data) {
sg = segment->sg;
offset += segment->sg_offset + sg->offset;
- r = tcp_conn->sendpage(sk, sg->page, offset, copy,
+ r = tcp_conn->sendpage(sk, sg_page(sg), offset, copy,
flags);
} else {
struct msghdr msg = { .msg_flags = flags };
@@ -437,7 +422,7 @@ iscsi_segment_seek_sg(struct iscsi_segment *segment,
debug_scsi("iscsi_segment_seek_sg offset %u size %llu\n",
offset, size);
__iscsi_segment_init(segment, size, done, hash);
- for (i = 0; i < sg_count; i++, sg = iscsi_sg_next(sg)) {
+ for (i = 0; i < sg_count; i++, sg = sg_next(sg)) {
debug_scsi("sg %d, len %u offset %u\n", i, sg->length,
sg->offset);
if (offset < sg->length) {
@@ -1949,6 +1934,7 @@ static struct scsi_host_template iscsi_sht = {
.eh_device_reset_handler= iscsi_eh_device_reset,
.eh_host_reset_handler = iscsi_eh_host_reset,
.use_clustering = DISABLE_CLUSTERING,
+ .use_sg_chaining = ENABLE_SG_CHAINING,
.slave_configure = iscsi_tcp_slave_configure,
.proc_name = "iscsi_tcp",
.this_id = -1,
diff --git a/kernel/libiscsi.c b/kernel/libiscsi.c
index 16717cf..d175f14 100644
--- a/kernel/libiscsi.c
+++ b/kernel/libiscsi.c
@@ -33,7 +33,6 @@
#include <scsi/scsi_host.h>
#include <scsi/scsi.h>
#include <scsi/scsi_transport.h>
-
#include "iscsi_proto.h"
#include "scsi_transport_iscsi.h"
#include "libiscsi.h"
diff --git a/kernel/scsi_transport_iscsi.c b/kernel/scsi_transport_iscsi.c
index 6997e97..7e5e168 100644
--- a/kernel/scsi_transport_iscsi.c
+++ b/kernel/scsi_transport_iscsi.c
@@ -1119,61 +1119,49 @@ iscsi_if_recv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
}
/*
- * 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.
+ * Get message from skb. Each message is processed by iscsi_if_recv_msg.
+ * Malformed skbs with wrong lengths or invalid creds are not processed.
*/
static void
-iscsi_if_rx(struct sock *sk, int len)
+iscsi_if_rx(struct sk_buff *skb)
{
- struct sk_buff *skb;
-
mutex_lock(&rx_queue_mutex);
- while ((skb = skb_dequeue(&sk->sk_receive_queue)) != NULL) {
- if (NETLINK_CREDS(skb)->uid) {
- skb_pull(skb, skb->len);
- goto free_skb;
+ 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->len >= NLMSG_SPACE(0)) {
- int err;
- uint32_t rlen;
- struct nlmsghdr *nlh;
- struct iscsi_uevent *ev;
+ ev = NLMSG_DATA(nlh);
+ rlen = NLMSG_ALIGN(nlh->nlmsg_len);
+ if (rlen > skb->len)
+ rlen = skb->len;
- nlh = nlmsg_hdr(skb);
- if (nlh->nlmsg_len < sizeof(*nlh) ||
- skb->len < nlh->nlmsg_len) {
- break;
- }
-
- 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);
+ err = iscsi_if_recv_msg(skb, nlh);
+ if (err) {
+ ev->type = ISCSI_KEVENT_IF_ERROR;
+ ev->iferror = err;
}
-free_skb:
- kfree_skb(skb);
+ 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);
}
mutex_unlock(&rx_queue_mutex);
}
@@ -1555,7 +1543,7 @@ static __init int iscsi_transport_init(void)
if (err)
goto unregister_conn_class;
- nls = netlink_kernel_create(NETLINK_ISCSI, 1, iscsi_if_rx, NULL,
+ nls = netlink_kernel_create(&init_net, NETLINK_ISCSI, 1, iscsi_if_rx, NULL,
THIS_MODULE);
if (!nls) {
err = -ENOBUFS;
diff --git a/kernel/scsi_transport_iscsi.h b/kernel/scsi_transport_iscsi.h
index 26717c5..6bda9b9 100644
--- a/kernel/scsi_transport_iscsi.h
+++ b/kernel/scsi_transport_iscsi.h
@@ -24,6 +24,8 @@
#define SCSI_TRANSPORT_ISCSI_H
#include <linux/device.h>
+#include <linux/list.h>
+#include <linux/mutex.h>
#include "iscsi_if.h"
struct scsi_transport_template;