diff options
author | Mike Christie <michaelc@cs.wisc.edu> | 2007-10-29 14:12:57 -0500 |
---|---|---|
committer | Mike Christie <michaelc@cs.wisc.edu> | 2007-10-29 14:12:57 -0500 |
commit | b17606d15a15724f296600cd4624d4e208da164b (patch) | |
tree | 451df020aa50f19264d9620b5b4483720b2ee94d /kernel | |
parent | 4573080f17d6926f6ae5e2185abebe1782e8e978 (diff) | |
download | open-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/Makefile | 2 | ||||
-rw-r--r-- | kernel/iscsi_tcp.c | 40 | ||||
-rw-r--r-- | kernel/libiscsi.c | 1 | ||||
-rw-r--r-- | kernel/scsi_transport_iscsi.c | 84 | ||||
-rw-r--r-- | kernel/scsi_transport_iscsi.h | 2 |
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; |