Hello, I would also like to maintain this package, since my infrastructure requires it working.
This would be my first package (so i would have to go through new maintainer), but i'm very familiar with openiscsi internals. gotta keep systems working... Attached, you can find my patch for iscsitarget working with debian's 4.5 kernel on arm7i. Julia Longtin
diff --git a/Makefile b/Makefile index 32efe5e..9a841b1 100644 --- a/Makefile +++ b/Makefile @@ -1 +1,2 @@ +subdir-ccflags-y = -Wall -Werror obj-m = kernel/ diff --git a/kernel/block-io.c b/kernel/block-io.c index 00365b5..d7222c6 100644 --- a/kernel/block-io.c +++ b/kernel/block-io.c @@ -29,11 +29,13 @@ struct tio_work { struct completion tio_complete; }; -static void blockio_bio_endio(struct bio *bio, int error) +/* dropped error parameter in 4.3. */ +static void blockio_bio_endio(struct bio *bio) { + int error; struct tio_work *tio_work = bio->bi_private; - error = test_bit(BIO_UPTODATE, &bio->bi_flags) ? error : -EIO; + error = -(bio->bi_error); if (error) atomic_set(&tio_work->error, error); @@ -68,7 +70,7 @@ blockio_make_request(struct iet_volume *volume, struct tio *tio, int rw) /* Calculate max_pages for bio_alloc (memory saver) */ if (bdev_q) - max_pages = bio_get_nr_vecs(bio_data->bdev); + max_pages = BIO_MAX_PAGES; tio_work = kzalloc(sizeof (*tio_work), GFP_KERNEL); if (!tio_work) diff --git a/kernel/conn.c b/kernel/conn.c index 3ae6881..01bdb6f 100644 --- a/kernel/conn.c +++ b/kernel/conn.c @@ -87,13 +87,14 @@ static void iet_state_change(struct sock *sk) target->nthread_info.old_state_change(sk); } -static void iet_data_ready(struct sock *sk, int len) +/* dropped len is 3.15. */ +static void iet_data_ready(struct sock *sk) { struct iscsi_conn *conn = sk->sk_user_data; struct iscsi_target *target = conn->session->target; nthread_wakeup(target); - target->nthread_info.old_data_ready(sk, len); + target->nthread_info.old_data_ready(sk); } /* diff --git a/kernel/iscsi.c b/kernel/iscsi.c index 7f20568..432d113 100644 --- a/kernel/iscsi.c +++ b/kernel/iscsi.c @@ -489,8 +489,8 @@ static void cmnd_skip_pdu(struct iscsi_cmnd *cmnd) } conn->read_iov[i].iov_base = addr; conn->read_iov[i].iov_len = size; - conn->read_msg.msg_iov = conn->read_iov; - conn->read_msg.msg_iovlen = ++i; + conn->read_msg.msg_iter.iov = conn->read_iov; + conn->read_msg.msg_iter.nr_segs = ++i; } static void iscsi_cmnd_reject(struct iscsi_cmnd *req, int reason) @@ -718,7 +718,7 @@ static int cmnd_recv_pdu(struct iscsi_conn *conn, struct tio *tio, u32 offset, u idx = offset >> PAGE_CACHE_SHIFT; offset &= ~PAGE_CACHE_MASK; - conn->read_msg.msg_iov = conn->read_iov; + conn->read_msg.msg_iter.iov = conn->read_iov; conn->read_size = size = (size + 3) & -4; conn->read_overflow = 0; @@ -730,14 +730,14 @@ static int cmnd_recv_pdu(struct iscsi_conn *conn, struct tio *tio, u32 offset, u conn->read_iov[i].iov_base = addr + offset; if (offset + size <= PAGE_CACHE_SIZE) { conn->read_iov[i].iov_len = size; - conn->read_msg.msg_iovlen = ++i; + conn->read_msg.msg_iter.nr_segs = ++i; break; } conn->read_iov[i].iov_len = PAGE_CACHE_SIZE - offset; size -= conn->read_iov[i].iov_len; offset = 0; if (++i >= ISCSI_CONN_IOV_MAX) { - conn->read_msg.msg_iovlen = i; + conn->read_msg.msg_iter.nr_segs = i; conn->read_overflow = size; conn->read_size -= size; break; @@ -879,6 +879,7 @@ static void scsi_cmnd_exec(struct iscsi_cmnd *cmnd) } } +/* handle a nop-out packet. */ static int nop_out_start(struct iscsi_conn *conn, struct iscsi_cmnd *cmnd) { u32 size, tmp; @@ -918,7 +919,7 @@ static int nop_out_start(struct iscsi_conn *conn, struct iscsi_cmnd *cmnd) if ((size = cmnd->pdu.datasize)) { size = (size + 3) & -4; - conn->read_msg.msg_iov = conn->read_iov; + conn->read_msg.msg_iter.iov = conn->read_iov; if (cmnd->pdu.bhs.itt != cpu_to_be32(ISCSI_RESERVED_TAG)) { struct tio *tio; int pg_cnt = get_pgcnt(size); @@ -946,7 +947,7 @@ static int nop_out_start(struct iscsi_conn *conn, struct iscsi_cmnd *cmnd) } assert(!size); conn->read_overflow = size; - conn->read_msg.msg_iovlen = i; + conn->read_msg.msg_iter.nr_segs = i; } out: diff --git a/kernel/iscsi.h b/kernel/iscsi.h index 3bc687e..657e96a 100644 --- a/kernel/iscsi.h +++ b/kernel/iscsi.h @@ -81,7 +81,8 @@ struct network_thread_info { spinlock_t nthread_lock; void (*old_state_change)(struct sock *); - void (*old_data_ready)(struct sock *, int); + /* changes in 3.15 */ + void (*old_data_ready)(struct sock *); void (*old_write_space)(struct sock *); }; diff --git a/kernel/iscsi_hdr.h b/kernel/iscsi_hdr.h index ec119b7..02b6f6d 100644 --- a/kernel/iscsi_hdr.h +++ b/kernel/iscsi_hdr.h @@ -16,6 +16,7 @@ #define __packed __attribute__ ((packed)) #endif +/* This structure is packed so that it matches rfc3720 when transmitted over tcp. */ struct iscsi_hdr { u8 opcode; /* 0 */ u8 flags; diff --git a/kernel/nthread.c b/kernel/nthread.c index 20db2c5..9479159 100644 --- a/kernel/nthread.c +++ b/kernel/nthread.c @@ -39,12 +39,12 @@ void nthread_wakeup(struct iscsi_target *target) static inline void iscsi_conn_init_read(struct iscsi_conn *conn, void *data, size_t len) { - len = (len + 3) & -4; // XXX ??? + len = PAD_TO_4_BYTES(len); conn->read_iov[0].iov_base = data; conn->read_iov[0].iov_len = len; - conn->read_msg.msg_iov = conn->read_iov; - conn->read_msg.msg_iovlen = 1; - conn->read_size = (len + 3) & -4; + conn->read_msg.msg_iter.iov = conn->read_iov; + conn->read_msg.msg_iter.nr_segs = 1; + conn->read_size = len; } static void iscsi_conn_read_ahs(struct iscsi_conn *conn, struct iscsi_cmnd *cmnd) @@ -83,16 +83,10 @@ static int is_data_available(struct iscsi_conn *conn) static void forward_iov(struct msghdr *msg, int len) { - while (msg->msg_iov->iov_len <= len) { - len -= msg->msg_iov->iov_len; - msg->msg_iov++; - msg->msg_iovlen--; - } - - msg->msg_iov->iov_base = (char *) msg->msg_iov->iov_base + len; - msg->msg_iov->iov_len -= len; + iov_iter_advance(&msg->msg_iter, len); } +/* recieve data from an established connection. */ static int do_recv(struct iscsi_conn *conn, int state) { mm_segment_t oldfs; @@ -110,13 +104,15 @@ static int do_recv(struct iscsi_conn *conn, int state) goto out; } - msg.msg_iov = iov; - msg.msg_iovlen = min_t(size_t, conn->read_msg.msg_iovlen, ISCSI_CONN_IOV_MAX); - for (i = 0, len = 0; i < msg.msg_iovlen; i++) { - iov[i] = conn->read_msg.msg_iov[i]; - len += iov[i].iov_len; + memset(&msg, 0, sizeof(struct msghdr)); + + for (i = 0, len = 0; i < conn->read_msg.msg_iter.nr_segs; i++) { + iov[i] = conn->read_msg.msg_iter.iov[i]; + len += iov[i].iov_len; } + iov_iter_init(&msg.msg_iter, WRITE, iov, min_t(size_t, conn->read_msg.msg_iter.nr_segs, ISCSI_CONN_IOV_MAX), len); + oldfs = get_fs(); set_fs(get_ds()); res = sock_recvmsg(conn->sock, &msg, len, MSG_DONTWAIT | MSG_NOSIGNAL); @@ -128,7 +124,7 @@ static int do_recv(struct iscsi_conn *conn, int state) case -ERESTARTSYS: break; default: - eprintk("%d\n", res); + eprintk("recv returned %d when asking for %d bytes(max)\n", res, len); conn_close(conn); break; } diff --git a/kernel/target_disk.c b/kernel/target_disk.c index 459b210..baa5ba3 100644 --- a/kernel/target_disk.c +++ b/kernel/target_disk.c @@ -353,6 +353,8 @@ static void build_request_sense_response(struct iscsi_cmnd *cmnd) tio_set(tio, 18, 0); } +/* not used? */ +#if 0 static void build_service_action_in_response(struct iscsi_cmnd *cmnd) { struct tio *tio = cmnd->tio; @@ -380,6 +382,7 @@ static void build_service_action_in_response(struct iscsi_cmnd *cmnd) tio_set(tio, min_t(u32, alloc_len, 32), 0); } +#endif static void build_read_response(struct iscsi_cmnd *cmnd) { diff --git a/kernel/tio.c b/kernel/tio.c index 0df59f1..7dee29c 100644 --- a/kernel/tio.c +++ b/kernel/tio.c @@ -72,14 +72,14 @@ tio_add_data(struct tio_iterator *iter, size_t len) { struct tio *tio = iter->tio; - const size_t to_copy = min(tio->pg_cnt * PAGE_SIZE - iter->size, len); + const size_t to_copy = min((size_t)(tio->pg_cnt * PAGE_SIZE - iter->size), len); size_t residual = to_copy; BUG_ON(tio->size < iter->size); do { u8 *ptr = page_address(iter->tio->pvec[iter->pg_idx]) + iter->pg_off; - size_t chunk = min(PAGE_SIZE - iter->pg_off, residual); + size_t chunk = min((size_t)(PAGE_SIZE - iter->pg_off), residual); memcpy(ptr, data, chunk); residual -= chunk; if (residual ||
signature.asc
Description: Digital signature