diff options
2 files changed, 527 insertions, 4 deletions
diff --git a/meta-networking/recipes-extended/iscsitarget/files/build_with_updated_interfaces_of_linux_v4.8_and_above.patch b/meta-networking/recipes-extended/iscsitarget/files/build_with_updated_interfaces_of_linux_v4.8_and_above.patch new file mode 100644 index 0000000000..e55c407a41 --- /dev/null +++ b/meta-networking/recipes-extended/iscsitarget/files/build_with_updated_interfaces_of_linux_v4.8_and_above.patch | |||
| @@ -0,0 +1,525 @@ | |||
| 1 | Resolve build error with linux kernel 4.8 | ||
| 2 | |||
| 3 | The below changes in kernel source, triggered iscsitarget | ||
| 4 | build fail with linux kernel v4.8. | ||
| 5 | |||
| 6 | 1. An extra 'flags' argument has been passed to vfs_readv/vfs_writev | ||
| 7 | syscalls in v4.8. So, set this argument to "0" for now | ||
| 8 | (as there is no real need for that). | ||
| 9 | Ref: https://github.com/torvalds/linux/commit/793b80ef14af56d20c998265287648ad34239b6f | ||
| 10 | Solves: | ||
| 11 | -- snip -- | ||
| 12 | TOPDIR/tmp-glibc/work/qemux86-oe-linux/iscsitarget/1.4.20.3+svn502-r0/iscsitarget-1.4.20.3+svn502/kernel/nthread.c: In function 'write_data': | ||
| 13 | TOPDIR/tmp-glibc/work/qemux86-oe-linux/iscsitarget/1.4.20.3+svn502-r0/iscsitarget-1.4.20.3+svn502/kernel/nthread.c:350:9: error: too few arguments to function 'vfs_writev' | ||
| 14 | res = vfs_writev(file, (struct iovec __user *) iop, count, &off); | ||
| 15 | ^~~~~~~~~~ | ||
| 16 | -- snip -- | ||
| 17 | |||
| 18 | 2. Redefine dropped PAGE_CACHE_* and page_cache_{get,release} definitions, | ||
| 19 | as they have been dropped with v4.8 | ||
| 20 | Ref: https://github.com/torvalds/linux/commit/1fa64f198b9f8d6ec0f7aec7c18dc94684391140 | ||
| 21 | Solves: | ||
| 22 | -- snip -- | ||
| 23 | TOPDIR/tmp-glibc/work/qemux86-oe-linux/iscsitarget/1.4.20.3+svn502-r0/iscsitarget-1.4.20.3+svn502/kernel/param.c: In function 'sess_param_check': | ||
| 24 | TOPDIR/tmp-glibc/work/qemux86-oe-linux/iscsitarget/1.4.20.3+svn502-r0/iscsitarget-1.4.20.3+svn502/kernel/param.c:48:41: error: 'PAGE_CACHE_SIZE' undeclared (first use in this function) | ||
| 25 | (u32) ((ISCSI_CONN_IOV_MAX - 1) * PAGE_CACHE_SIZE)); | ||
| 26 | ^ | ||
| 27 | -- snip -- | ||
| 28 | |||
| 29 | 3. Replace crypto_hash interfaces with crypto_ahash interfaces, | ||
| 30 | Ref: https://github.com/torvalds/linux/commit/896545098777564212b9e91af4c973f094649aa7 | ||
| 31 | Ref: https://www.redhat.com/archives/dm-devel/2016-January/msg00244.html | ||
| 32 | Solves: | ||
| 33 | -- snip -- | ||
| 34 | TOPDIR/tmp-glibc/work/qemux86-oe-linux/iscsitarget/1.4.20.3+svn502-r0/iscsitarget-1.4.20.3+svn502/kernel/digest.c: In function 'digest_init': | ||
| 35 | TOPDIR/tmp-glibc/work/qemux86-oe-linux/iscsitarget/1.4.20.3+svn502-r0/iscsitarget-1.4.20.3+svn502/kernel/digest.c:42:23: error: implicit declaration of function 'crypto_alloc_hash' [-Werror=implicit-function-declaration] | ||
| 36 | conn->rx_hash.tfm = crypto_alloc_hash("crc32c", 0, | ||
| 37 | ^~~~~~~~~~~~~~~~~ | ||
| 38 | TOPDIR/tmp-glibc/work/qemux86-oe-linux/iscsitarget/1.4.20.3+svn502-r0/iscsitarget-1.4.20.3+svn502/kernel/digest.c: In function 'digest_cleanup': | ||
| 39 | TOPDIR/tmp-glibc/work/qemux86-oe-linux/iscsitarget/1.4.20.3+svn502-r0/iscsitarget-1.4.20.3+svn502/kernel/digest.c:77:3: error: implicit declaration of function 'crypto_free_hash' [-Werror=implicit-function-declaration] | ||
| 40 | crypto_free_hash(conn->tx_hash.tfm); | ||
| 41 | ^~~~~~~~~~~~~~~~ | ||
| 42 | -- snip -- | ||
| 43 | |||
| 44 | 4. The earlier "rw" parameter has been set in "bi_rw" within | ||
| 45 | bio structure, hence remove "rw" argument. | ||
| 46 | Ref: https://github.com/torvalds/linux/commit/4e49ea4a3d276365bf7396c9b77b4d1d5923835a | ||
| 47 | Solves: | ||
| 48 | -- snip -- | ||
| 49 | TOPDIR/tmp-glibc/work/qemux86-oe-linux/iscsitarget/1.4.20.3+svn502-r0/iscsitarget-1.4.20.3+svn502/kernel/block-io.c:140:14: warning: passing argument 1 of 'submit_bio' makes pointer from integer without a cast [-Wint-conversion] | ||
| 50 | submit_bio(rw, bio); | ||
| 51 | ^~ | ||
| 52 | -- snip -- | ||
| 53 | |||
| 54 | 5. The 'len' argument from sk_data_ready() callback has been removed in | ||
| 55 | linux kernel v4.3 and above. | ||
| 56 | Ref: https://github.com/torvalds/linux/commit/676d23690fb62b5d51ba5d659935e9f7d9da9f8e | ||
| 57 | Solves: | ||
| 58 | -- snip -- | ||
| 59 | TOPDIR/tmp-glibc/work/qemux86-oe-linux/iscsitarget/1.4.20.3+svn502-r0/iscsitarget-1.4.20.3+svn502/kernel/conn.c: In function 'iet_socket_bind': | ||
| 60 | TOPDIR/tmp-glibc/work/qemux86-oe-linux/iscsitarget/1.4.20.3+svn502-r0/iscsitarget-1.4.20.3+svn502/kernel/conn.c:143:38: error: assignment from incompatible pointer type [-Werror=incompatible-pointer-types] | ||
| 61 | target->nthread_info.old_data_ready = conn->sock->sk->sk_data_ready; | ||
| 62 | ^ | ||
| 63 | TOPDIR/tmp-glibc/work/qemux86-oe-linux/iscsitarget/1.4.20.3+svn502-r0/iscsitarget-1.4.20.3+svn502/kernel/conn.c:144:32: error: assignment from incompatible pointer type [-Werror=incompatible-pointer-types] | ||
| 64 | conn->sock->sk->sk_data_ready = iet_data_ready; | ||
| 65 | ^ | ||
| 66 | -- snip -- | ||
| 67 | |||
| 68 | 6. | ||
| 69 | A. The "size" argument has been dropped from sock_recvmsg syscall in v4.8, | ||
| 70 | as all callers have it equal to msg_data_left(msg). | ||
| 71 | B. 'struct user_msghdr' is being used for userland-side msghdr instead | ||
| 72 | of 'struct msghdr', which is used for kernel-side msghdr in linux v3.19 | ||
| 73 | and above, so typecase it while calling sock_recvmsg syscall. | ||
| 74 | Ref: https://github.com/torvalds/linux/commit/2da62906b1e298695e1bb725927041cd59942c98 | ||
| 75 | https://github.com/torvalds/linux/commit/666547ff591cebdedc4679bf6b1b3f3383a8dea3 | ||
| 76 | Solves: | ||
| 77 | -- snip -- | ||
| 78 | TOPDIR/tmp-glibc/work-shared/qemux86/kernel-source/include/linux/net.h:222:5: note: expected 'struct msghdr *' but argument is of type 'struct user_msghdr *' | ||
| 79 | int sock_recvmsg(struct socket *sock, struct msghdr *msg, int flags); | ||
| 80 | ^~~~~~~~~~~~ | ||
| 81 | TOPDIR/tmp-glibc/work/qemux86-oe-linux/iscsitarget/1.4.20.3+svn502-r0/iscsitarget-1.4.20.3+svn502/kernel/nthread.c:129:8: error: too many arguments to function 'sock_recvmsg' | ||
| 82 | res = sock_recvmsg(conn->sock, &msg, len, MSG_DONTWAIT | MSG_NOSIGNAL); | ||
| 83 | ^~~~~~~~~~~~ | ||
| 84 | -- snip -- | ||
| 85 | |||
| 86 | Detailed error log is at: http://errors.yoctoproject.org/Errors/Details/83334/ | ||
| 87 | |||
| 88 | Upstream-Status: Pending | ||
| 89 | |||
| 90 | Signed-off-by: Jagadeesh Krishnanjanappa <jkrishnanjanappa@mvista.com> | ||
| 91 | |||
| 92 | diff -Naurp iscsitarget-1.4.20.3+svn502_org/kernel/block-io.c iscsitarget-1.4.20.3+svn502/kernel/block-io.c | ||
| 93 | --- iscsitarget-1.4.20.3+svn502_org/kernel/block-io.c 2016-09-25 19:45:01.814641016 +0530 | ||
| 94 | +++ iscsitarget-1.4.20.3+svn502/kernel/block-io.c 2016-09-25 19:47:59.666474094 +0530 | ||
| 95 | @@ -57,7 +57,6 @@ static int | ||
| 96 | blockio_make_request(struct iet_volume *volume, struct tio *tio, int rw) | ||
| 97 | { | ||
| 98 | struct blockio_data *bio_data = volume->private; | ||
| 99 | - struct request_queue *bdev_q = bdev_get_queue(bio_data->bdev); | ||
| 100 | struct tio_work *tio_work; | ||
| 101 | struct bio *tio_bio = NULL, *bio = NULL, *biotail = NULL; | ||
| 102 | struct blk_plug plug; | ||
| 103 | @@ -69,6 +68,7 @@ blockio_make_request(struct iet_volume * | ||
| 104 | int err = 0; | ||
| 105 | loff_t ppos = tio->offset; | ||
| 106 | #else | ||
| 107 | + struct request_queue *bdev_q = bdev_get_queue(bio_data->bdev); | ||
| 108 | int max_pages = 1; | ||
| 109 | int err = 0; | ||
| 110 | |||
| 111 | @@ -102,7 +102,11 @@ blockio_make_request(struct iet_volume * | ||
| 112 | /* bi_sector is ALWAYS in units of 512 bytes */ | ||
| 113 | bio->bi_iter.bi_sector = ppos >> 9; | ||
| 114 | bio->bi_bdev = bio_data->bdev; | ||
| 115 | +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 8, 0) | ||
| 116 | + bio->bi_end_io = (bio_end_io_t *) blockio_bio_endio; | ||
| 117 | +#else | ||
| 118 | bio->bi_end_io = blockio_bio_endio; | ||
| 119 | +#endif | ||
| 120 | bio->bi_private = tio_work; | ||
| 121 | |||
| 122 | if (tio_bio) | ||
| 123 | @@ -137,7 +141,12 @@ blockio_make_request(struct iet_volume * | ||
| 124 | tio_bio = tio_bio->bi_next; | ||
| 125 | bio->bi_next = NULL; | ||
| 126 | |||
| 127 | +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 8, 0) | ||
| 128 | + bio_set_op_attrs(bio, REQ_OP_WRITE, 0); | ||
| 129 | + submit_bio(bio); | ||
| 130 | +#else | ||
| 131 | submit_bio(rw, bio); | ||
| 132 | +#endif | ||
| 133 | } | ||
| 134 | |||
| 135 | blk_finish_plug(&plug); | ||
| 136 | diff -Naurp iscsitarget-1.4.20.3+svn502_org/kernel/conn.c iscsitarget-1.4.20.3+svn502/kernel/conn.c | ||
| 137 | --- iscsitarget-1.4.20.3+svn502_org/kernel/conn.c 2016-09-25 19:45:01.774641057 +0530 | ||
| 138 | +++ iscsitarget-1.4.20.3+svn502/kernel/conn.c 2016-09-25 19:47:59.666474094 +0530 | ||
| 139 | @@ -89,13 +89,21 @@ static void iet_state_change(struct sock | ||
| 140 | target->nthread_info.old_state_change(sk); | ||
| 141 | } | ||
| 142 | |||
| 143 | +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 3, 0) | ||
| 144 | +static void iet_data_ready(struct sock *sk) | ||
| 145 | +#else | ||
| 146 | static void iet_data_ready(struct sock *sk, int len) | ||
| 147 | +#endif | ||
| 148 | { | ||
| 149 | struct iscsi_conn *conn = sk->sk_user_data; | ||
| 150 | struct iscsi_target *target = conn->session->target; | ||
| 151 | |||
| 152 | nthread_wakeup(target); | ||
| 153 | +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 3, 0) | ||
| 154 | + target->nthread_info.old_data_ready(sk); | ||
| 155 | +#else | ||
| 156 | target->nthread_info.old_data_ready(sk, len); | ||
| 157 | +#endif | ||
| 158 | } | ||
| 159 | |||
| 160 | /* | ||
| 161 | @@ -140,8 +148,14 @@ static void iet_socket_bind(struct iscsi | ||
| 162 | target->nthread_info.old_state_change = conn->sock->sk->sk_state_change; | ||
| 163 | conn->sock->sk->sk_state_change = iet_state_change; | ||
| 164 | |||
| 165 | +#if 0//LINUX_VERSION_CODE >= KERNEL_VERSION(4, 8, 0) | ||
| 166 | + target->nthread_info.old_data_ready = (void (*) (struct sock *, int )) \ | ||
| 167 | + conn->sock->sk->sk_data_ready; | ||
| 168 | + conn->sock->sk->sk_data_ready = (void (*) (struct sock *)) iet_data_ready; | ||
| 169 | +#else | ||
| 170 | target->nthread_info.old_data_ready = conn->sock->sk->sk_data_ready; | ||
| 171 | conn->sock->sk->sk_data_ready = iet_data_ready; | ||
| 172 | +#endif | ||
| 173 | |||
| 174 | target->nthread_info.old_write_space = conn->sock->sk->sk_write_space; | ||
| 175 | conn->sock->sk->sk_write_space = iet_write_space; | ||
| 176 | diff -Naurp iscsitarget-1.4.20.3+svn502_org/kernel/digest.c iscsitarget-1.4.20.3+svn502/kernel/digest.c | ||
| 177 | --- iscsitarget-1.4.20.3+svn502_org/kernel/digest.c 2014-05-07 02:29:55.000000000 +0530 | ||
| 178 | +++ iscsitarget-1.4.20.3+svn502/kernel/digest.c 2016-09-25 19:47:59.666474094 +0530 | ||
| 179 | @@ -30,6 +30,9 @@ void digest_alg_available(unsigned int * | ||
| 180 | int digest_init(struct iscsi_conn *conn) | ||
| 181 | { | ||
| 182 | int err = 0; | ||
| 183 | +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 8, 0) | ||
| 184 | + struct crypto_ahash *tfm; | ||
| 185 | +#endif | ||
| 186 | |||
| 187 | if (!(conn->hdigest_type & DIGEST_ALL)) | ||
| 188 | conn->hdigest_type = DIGEST_NONE; | ||
| 189 | @@ -39,15 +42,40 @@ int digest_init(struct iscsi_conn *conn) | ||
| 190 | |||
| 191 | if (conn->hdigest_type & DIGEST_CRC32C || | ||
| 192 | conn->ddigest_type & DIGEST_CRC32C) { | ||
| 193 | +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 8, 0) | ||
| 194 | + tfm = crypto_alloc_ahash("crc32c", 0, CRYPTO_ALG_ASYNC); | ||
| 195 | + if (IS_ERR(tfm)) { | ||
| 196 | + tfm = NULL; | ||
| 197 | +#else | ||
| 198 | conn->rx_hash.tfm = crypto_alloc_hash("crc32c", 0, | ||
| 199 | CRYPTO_ALG_ASYNC); | ||
| 200 | conn->rx_hash.flags = 0; | ||
| 201 | if (IS_ERR(conn->rx_hash.tfm)) { | ||
| 202 | conn->rx_hash.tfm = NULL; | ||
| 203 | +#endif | ||
| 204 | err = -ENOMEM; | ||
| 205 | goto out; | ||
| 206 | } | ||
| 207 | - | ||
| 208 | +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 8, 0) | ||
| 209 | + conn->rx_hash = ahash_request_alloc(tfm, GFP_KERNEL); | ||
| 210 | + if (!conn->rx_hash) { | ||
| 211 | + pr_err("ahash_request_alloc() failed for conn->rx_hash\n"); | ||
| 212 | + crypto_free_ahash(tfm); | ||
| 213 | + err = -ENOMEM; | ||
| 214 | + goto out; | ||
| 215 | + } | ||
| 216 | + ahash_request_set_callback(conn->rx_hash, 0, NULL, NULL); | ||
| 217 | + conn->tx_hash = ahash_request_alloc(tfm, GFP_KERNEL); | ||
| 218 | + if(!conn->tx_hash) { | ||
| 219 | + pr_err("ahash_request_alloc() failed for conn->tx_hash\n"); | ||
| 220 | + ahash_request_free(conn->rx_hash); | ||
| 221 | + conn->rx_hash = NULL; | ||
| 222 | + crypto_free_ahash(tfm); | ||
| 223 | + err = -ENOMEM; | ||
| 224 | + goto out; | ||
| 225 | + } | ||
| 226 | + ahash_request_set_callback(conn->tx_hash, 0, NULL, NULL); | ||
| 227 | +#else | ||
| 228 | conn->tx_hash.tfm = crypto_alloc_hash("crc32c", 0, | ||
| 229 | CRYPTO_ALG_ASYNC); | ||
| 230 | conn->tx_hash.flags = 0; | ||
| 231 | @@ -56,6 +84,7 @@ int digest_init(struct iscsi_conn *conn) | ||
| 232 | err = -ENOMEM; | ||
| 233 | goto out; | ||
| 234 | } | ||
| 235 | +#endif | ||
| 236 | } | ||
| 237 | |||
| 238 | out: | ||
| 239 | @@ -73,10 +102,21 @@ out: | ||
| 240 | */ | ||
| 241 | void digest_cleanup(struct iscsi_conn *conn) | ||
| 242 | { | ||
| 243 | +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 8, 0) | ||
| 244 | + ahash_request_free(conn->tx_hash); | ||
| 245 | + if (conn->rx_hash) { | ||
| 246 | + struct crypto_ahash *tfm; | ||
| 247 | + tfm = crypto_ahash_reqtfm(conn->rx_hash); | ||
| 248 | + ahash_request_free(conn->rx_hash); | ||
| 249 | + crypto_free_ahash(tfm); | ||
| 250 | + } | ||
| 251 | + | ||
| 252 | +#else | ||
| 253 | if (conn->tx_hash.tfm) | ||
| 254 | crypto_free_hash(conn->tx_hash.tfm); | ||
| 255 | if (conn->rx_hash.tfm) | ||
| 256 | crypto_free_hash(conn->rx_hash.tfm); | ||
| 257 | +#endif | ||
| 258 | } | ||
| 259 | |||
| 260 | /** | ||
| 261 | @@ -160,8 +200,13 @@ static inline void __dbg_simulate_data_d | ||
| 262 | } | ||
| 263 | } | ||
| 264 | |||
| 265 | +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 8, 0) | ||
| 266 | +static void digest_header(struct ahash_request *hash, struct iscsi_pdu *pdu, | ||
| 267 | + u8 *crc) | ||
| 268 | +#else | ||
| 269 | static void digest_header(struct hash_desc *hash, struct iscsi_pdu *pdu, | ||
| 270 | u8 *crc) | ||
| 271 | +#endif | ||
| 272 | { | ||
| 273 | struct scatterlist sg[2]; | ||
| 274 | unsigned int nbytes = sizeof(struct iscsi_hdr); | ||
| 275 | @@ -174,16 +219,27 @@ static void digest_header(struct hash_de | ||
| 276 | nbytes += pdu->ahssize; | ||
| 277 | } | ||
| 278 | |||
| 279 | +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 8, 0) | ||
| 280 | + crypto_ahash_init(hash); | ||
| 281 | + ahash_request_set_crypt(hash, sg, crc, nbytes); | ||
| 282 | + crypto_ahash_update(hash); | ||
| 283 | + crypto_ahash_digest(hash); | ||
| 284 | +#else | ||
| 285 | crypto_hash_init(hash); | ||
| 286 | crypto_hash_update(hash, sg, nbytes); | ||
| 287 | crypto_hash_final(hash, crc); | ||
| 288 | +#endif | ||
| 289 | } | ||
| 290 | |||
| 291 | int digest_rx_header(struct iscsi_cmnd *cmnd) | ||
| 292 | { | ||
| 293 | u32 crc; | ||
| 294 | |||
| 295 | +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 8, 0) | ||
| 296 | + digest_header(cmnd->conn->rx_hash, &cmnd->pdu, (u8 *) &crc); | ||
| 297 | +#else | ||
| 298 | digest_header(&cmnd->conn->rx_hash, &cmnd->pdu, (u8 *) &crc); | ||
| 299 | +#endif | ||
| 300 | if (crc != cmnd->hdigest) | ||
| 301 | return -EIO; | ||
| 302 | |||
| 303 | @@ -192,11 +248,20 @@ int digest_rx_header(struct iscsi_cmnd * | ||
| 304 | |||
| 305 | void digest_tx_header(struct iscsi_cmnd *cmnd) | ||
| 306 | { | ||
| 307 | +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 8, 0) | ||
| 308 | + digest_header(cmnd->conn->tx_hash, &cmnd->pdu, (u8 *) &cmnd->hdigest); | ||
| 309 | +#else | ||
| 310 | digest_header(&cmnd->conn->tx_hash, &cmnd->pdu, (u8 *) &cmnd->hdigest); | ||
| 311 | +#endif | ||
| 312 | } | ||
| 313 | |||
| 314 | +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 8, 0) | ||
| 315 | +static void digest_data(struct ahash_request *hash, struct iscsi_cmnd *cmnd, | ||
| 316 | + struct tio *tio, u32 offset, u8 *crc) | ||
| 317 | +#else | ||
| 318 | static void digest_data(struct hash_desc *hash, struct iscsi_cmnd *cmnd, | ||
| 319 | struct tio *tio, u32 offset, u8 *crc) | ||
| 320 | +#endif | ||
| 321 | { | ||
| 322 | struct scatterlist *sg = cmnd->conn->hash_sg; | ||
| 323 | u32 size, length, npages; | ||
| 324 | @@ -214,7 +279,11 @@ static void digest_data(struct hash_desc | ||
| 325 | BUG_ON(npages > ISCSI_CONN_IOV_MAX); | ||
| 326 | |||
| 327 | sg_init_table(sg, ARRAY_SIZE(cmnd->conn->hash_sg)); | ||
| 328 | +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 8, 0) | ||
| 329 | + crypto_ahash_init(hash); | ||
| 330 | +#else | ||
| 331 | crypto_hash_init(hash); | ||
| 332 | +#endif | ||
| 333 | |||
| 334 | for (i = 0; size > 0; i++) { | ||
| 335 | length = min_t(u32, PAGE_CACHE_SIZE - offset, size); | ||
| 336 | @@ -225,8 +294,14 @@ static void digest_data(struct hash_desc | ||
| 337 | |||
| 338 | sg_mark_end(&sg[i - 1]); | ||
| 339 | |||
| 340 | +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 8, 0) | ||
| 341 | + ahash_request_set_crypt(hash, sg, crc, nbytes); | ||
| 342 | + crypto_ahash_update(hash); | ||
| 343 | + crypto_ahash_digest(hash); | ||
| 344 | +#else | ||
| 345 | crypto_hash_update(hash, sg, nbytes); | ||
| 346 | crypto_hash_final(hash, crc); | ||
| 347 | +#endif | ||
| 348 | } | ||
| 349 | |||
| 350 | int digest_rx_data(struct iscsi_cmnd *cmnd) | ||
| 351 | @@ -251,8 +326,11 @@ int digest_rx_data(struct iscsi_cmnd *cm | ||
| 352 | tio = cmnd->tio; | ||
| 353 | offset = 0; | ||
| 354 | } | ||
| 355 | - | ||
| 356 | +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 8, 0) | ||
| 357 | + digest_data(cmnd->conn->rx_hash, cmnd, tio, offset, (u8 *) &crc); | ||
| 358 | +#else | ||
| 359 | digest_data(&cmnd->conn->rx_hash, cmnd, tio, offset, (u8 *) &crc); | ||
| 360 | +#endif | ||
| 361 | |||
| 362 | if (!cmnd->conn->read_overflow && | ||
| 363 | (cmnd_opcode(cmnd) != ISCSI_OP_PDU_REJECT)) { | ||
| 364 | @@ -269,6 +347,11 @@ void digest_tx_data(struct iscsi_cmnd *c | ||
| 365 | struct iscsi_data_out_hdr *req = (struct iscsi_data_out_hdr *)&cmnd->pdu.bhs; | ||
| 366 | |||
| 367 | assert(tio); | ||
| 368 | +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 8, 0) | ||
| 369 | + digest_data(cmnd->conn->tx_hash, cmnd, tio, | ||
| 370 | + be32_to_cpu(req->buffer_offset), (u8 *) &cmnd->ddigest); | ||
| 371 | +#else | ||
| 372 | digest_data(&cmnd->conn->tx_hash, cmnd, tio, | ||
| 373 | be32_to_cpu(req->buffer_offset), (u8 *) &cmnd->ddigest); | ||
| 374 | +#endif | ||
| 375 | } | ||
| 376 | diff -Naurp iscsitarget-1.4.20.3+svn502_org/kernel/iscsi.h iscsitarget-1.4.20.3+svn502/kernel/iscsi.h | ||
| 377 | --- iscsitarget-1.4.20.3+svn502_org/kernel/iscsi.h 2016-09-25 19:45:01.734641099 +0530 | ||
| 378 | +++ iscsitarget-1.4.20.3+svn502/kernel/iscsi.h 2016-09-25 19:47:59.666474094 +0530 | ||
| 379 | @@ -14,6 +14,7 @@ | ||
| 380 | #include <linux/pagemap.h> | ||
| 381 | #include <linux/seq_file.h> | ||
| 382 | #include <linux/mm.h> | ||
| 383 | +#include <crypto/hash.h> | ||
| 384 | #include <linux/crypto.h> | ||
| 385 | #include <linux/scatterlist.h> | ||
| 386 | #include <net/sock.h> | ||
| 387 | @@ -81,7 +82,11 @@ struct network_thread_info { | ||
| 388 | spinlock_t nthread_lock; | ||
| 389 | |||
| 390 | void (*old_state_change)(struct sock *); | ||
| 391 | +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 3, 0) | ||
| 392 | + void (*old_data_ready)(struct sock *); | ||
| 393 | +#else | ||
| 394 | void (*old_data_ready)(struct sock *, int); | ||
| 395 | +#endif | ||
| 396 | void (*old_write_space)(struct sock *); | ||
| 397 | }; | ||
| 398 | |||
| 399 | @@ -275,8 +280,13 @@ struct iscsi_conn { | ||
| 400 | u32 write_offset; | ||
| 401 | int write_state; | ||
| 402 | |||
| 403 | +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 8, 0) | ||
| 404 | + struct ahash_request *rx_hash; | ||
| 405 | + struct ahash_request *tx_hash; | ||
| 406 | +#else | ||
| 407 | struct hash_desc rx_hash; | ||
| 408 | struct hash_desc tx_hash; | ||
| 409 | +#endif | ||
| 410 | struct scatterlist hash_sg[ISCSI_CONN_IOV_MAX]; | ||
| 411 | }; | ||
| 412 | |||
| 413 | @@ -552,4 +562,10 @@ enum cmnd_flags { | ||
| 414 | #define PRODUCT_ID "VIRTUAL-DISK" | ||
| 415 | #define PRODUCT_REV "0" | ||
| 416 | |||
| 417 | +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 8, 0) | ||
| 418 | +#define PAGE_CACHE_SHIFT PAGE_SHIFT | ||
| 419 | +#define PAGE_CACHE_SIZE PAGE_SIZE | ||
| 420 | +#define PAGE_CACHE_MASK PAGE_MASK | ||
| 421 | +#endif | ||
| 422 | + | ||
| 423 | #endif /* __ISCSI_H__ */ | ||
| 424 | diff -Naurp iscsitarget-1.4.20.3+svn502_org/kernel/nthread.c iscsitarget-1.4.20.3+svn502/kernel/nthread.c | ||
| 425 | --- iscsitarget-1.4.20.3+svn502_org/kernel/nthread.c 2016-09-25 19:45:01.734641099 +0530 | ||
| 426 | +++ iscsitarget-1.4.20.3+svn502/kernel/nthread.c 2016-09-25 19:47:59.666474094 +0530 | ||
| 427 | @@ -126,7 +126,12 @@ static int do_recv(struct iscsi_conn *co | ||
| 428 | |||
| 429 | oldfs = get_fs(); | ||
| 430 | set_fs(get_ds()); | ||
| 431 | +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 8, 0) | ||
| 432 | + res = sock_recvmsg(conn->sock, (struct msghdr *) &msg, \ | ||
| 433 | + MSG_DONTWAIT | MSG_NOSIGNAL); | ||
| 434 | +#else | ||
| 435 | res = sock_recvmsg(conn->sock, &msg, len, MSG_DONTWAIT | MSG_NOSIGNAL); | ||
| 436 | +#endif | ||
| 437 | set_fs(oldfs); | ||
| 438 | |||
| 439 | if (res <= 0) { | ||
| 440 | @@ -347,7 +352,11 @@ static int write_data(struct iscsi_conn | ||
| 441 | ; | ||
| 442 | oldfs = get_fs(); | ||
| 443 | set_fs(KERNEL_DS); | ||
| 444 | +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 8, 0) | ||
| 445 | + res = vfs_writev(file, (struct iovec __user *) iop, count, &off, 0); | ||
| 446 | +#else | ||
| 447 | res = vfs_writev(file, (struct iovec __user *) iop, count, &off); | ||
| 448 | +#endif | ||
| 449 | set_fs(oldfs); | ||
| 450 | dprintk(D_DATA, "%#Lx:%u: %d(%ld)\n", | ||
| 451 | (unsigned long long) conn->session->sid, conn->cid, | ||
| 452 | @@ -478,7 +487,11 @@ static int tx_ddigest(struct iscsi_cmnd | ||
| 453 | iov.iov_base = (char *) (&cmnd->ddigest) + (sizeof(u32) - rest); | ||
| 454 | iov.iov_len = rest; | ||
| 455 | |||
| 456 | +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 8, 0) | ||
| 457 | + res = kernel_sendmsg(cmnd->conn->sock, (struct msghdr *) &msg, &iov, 1, rest); | ||
| 458 | +#else | ||
| 459 | res = kernel_sendmsg(cmnd->conn->sock, &msg, &iov, 1, rest); | ||
| 460 | +#endif | ||
| 461 | |||
| 462 | if (res > 0) { | ||
| 463 | cmnd->conn->write_size -= res; | ||
| 464 | @@ -677,7 +690,12 @@ static void close_conn(struct iscsi_conn | ||
| 465 | |||
| 466 | write_lock_bh(&conn->sock->sk->sk_callback_lock); | ||
| 467 | conn->sock->sk->sk_state_change = target->nthread_info.old_state_change; | ||
| 468 | +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 8, 0) | ||
| 469 | + conn->sock->sk->sk_data_ready = (void (*) (struct sock *)) \ | ||
| 470 | + target->nthread_info.old_data_ready; | ||
| 471 | +#else | ||
| 472 | conn->sock->sk->sk_data_ready = target->nthread_info.old_data_ready; | ||
| 473 | +#endif | ||
| 474 | conn->sock->sk->sk_write_space = target->nthread_info.old_write_space; | ||
| 475 | write_unlock_bh(&conn->sock->sk->sk_callback_lock); | ||
| 476 | |||
| 477 | diff -Naurp iscsitarget-1.4.20.3+svn502_org/kernel/volume.c iscsitarget-1.4.20.3+svn502/kernel/volume.c | ||
| 478 | --- iscsitarget-1.4.20.3+svn502_org/kernel/volume.c 2016-09-25 19:45:01.734641099 +0530 | ||
| 479 | +++ iscsitarget-1.4.20.3+svn502/kernel/volume.c 2016-09-25 19:47:59.666474094 +0530 | ||
| 480 | @@ -84,12 +84,25 @@ static int set_scsisn(struct iet_volume | ||
| 481 | /* Generate a MD5 hash of the target IQN and LUN number */ | ||
| 482 | static void gen_scsiid(struct iet_volume *volume) | ||
| 483 | { | ||
| 484 | +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 8, 0) | ||
| 485 | + struct ahash_request *hash; | ||
| 486 | + struct crypto_ahash *tfm; | ||
| 487 | +#else | ||
| 488 | struct hash_desc hash; | ||
| 489 | +#endif | ||
| 490 | |||
| 491 | +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 8, 0) | ||
| 492 | + tfm = crypto_alloc_ahash("md5", 0, CRYPTO_ALG_ASYNC); | ||
| 493 | +#else | ||
| 494 | hash.tfm = crypto_alloc_hash("md5", 0, CRYPTO_ALG_ASYNC); | ||
| 495 | hash.flags = 0; | ||
| 496 | +#endif | ||
| 497 | |||
| 498 | +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 8, 0) | ||
| 499 | + if (!IS_ERR(tfm)) { | ||
| 500 | +#else | ||
| 501 | if (!IS_ERR(hash.tfm)) { | ||
| 502 | +#endif | ||
| 503 | struct scatterlist sg[2]; | ||
| 504 | unsigned int nbytes = 0; | ||
| 505 | |||
| 506 | @@ -102,11 +115,19 @@ static void gen_scsiid(struct iet_volume | ||
| 507 | sg_set_buf(&sg[1], &volume->lun, sizeof(volume->lun)); | ||
| 508 | nbytes += sizeof(volume->lun); | ||
| 509 | |||
| 510 | +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 8, 0) | ||
| 511 | + crypto_ahash_init(hash); | ||
| 512 | + ahash_request_set_crypt(hash, sg, volume->scsi_id, nbytes); | ||
| 513 | + crypto_ahash_update(hash); | ||
| 514 | + crypto_ahash_digest(hash); | ||
| 515 | + crypto_free_ahash(tfm); | ||
| 516 | +#else | ||
| 517 | crypto_hash_init(&hash); | ||
| 518 | crypto_hash_update(&hash, sg, nbytes); | ||
| 519 | crypto_hash_final(&hash, volume->scsi_id); | ||
| 520 | |||
| 521 | crypto_free_hash(hash.tfm); | ||
| 522 | +#endif | ||
| 523 | } else { | ||
| 524 | /* If no MD5 available set ID to TID and LUN */ | ||
| 525 | memcpy(volume->scsi_id, &volume->target->tid, | ||
diff --git a/meta-networking/recipes-extended/iscsitarget/iscsitarget_1.4.20.3+svn502.bb b/meta-networking/recipes-extended/iscsitarget/iscsitarget_1.4.20.3+svn502.bb index 4b5622b6e8..7279bc6378 100644 --- a/meta-networking/recipes-extended/iscsitarget/iscsitarget_1.4.20.3+svn502.bb +++ b/meta-networking/recipes-extended/iscsitarget/iscsitarget_1.4.20.3+svn502.bb | |||
| @@ -12,7 +12,8 @@ SRC_URI = "http://ftp.heanet.ie/mirrors/ubuntu/pool/universe/i/${BPN}/${BPN}_${P | |||
| 12 | file://use-kernel-makefile-to-get-kernel-version.patch \ | 12 | file://use-kernel-makefile-to-get-kernel-version.patch \ |
| 13 | file://fix-errors-observed-with-linux-3.19-and-greater.patch \ | 13 | file://fix-errors-observed-with-linux-3.19-and-greater.patch \ |
| 14 | file://access-sk_v6_daddr-iff-IPV6-defined.patch \ | 14 | file://access-sk_v6_daddr-iff-IPV6-defined.patch \ |
| 15 | file://build_with_updated_bio_struct_of_linux_v4.3_and_above.patch" | 15 | file://build_with_updated_bio_struct_of_linux_v4.3_and_above.patch \ |
| 16 | file://build_with_updated_interfaces_of_linux_v4.8_and_above.patch" | ||
| 16 | 17 | ||
| 17 | SRC_URI[md5sum] = "ef9bc823bbabd3c772208c00d5f2d089" | 18 | SRC_URI[md5sum] = "ef9bc823bbabd3c772208c00d5f2d089" |
| 18 | SRC_URI[sha256sum] = "d3196ccb78a43266dce28587bfe30d8ab4db7566d7bce96057dfbb84100babb5" | 19 | SRC_URI[sha256sum] = "d3196ccb78a43266dce28587bfe30d8ab4db7566d7bce96057dfbb84100babb5" |
| @@ -56,6 +57,3 @@ FILES_${PN} += "${sbindir} \ | |||
| 56 | 57 | ||
| 57 | RDEPENDS_${PN} = "kernel-module-iscsi-trgt" | 58 | RDEPENDS_${PN} = "kernel-module-iscsi-trgt" |
| 58 | RRECOMMENDS_${PN} = "kernel-module-crc32c kernel-module-libcrc32c" | 59 | RRECOMMENDS_${PN} = "kernel-module-crc32c kernel-module-libcrc32c" |
| 59 | |||
| 60 | # http://errors.yoctoproject.org/Errors/Details/83334/ | ||
| 61 | PNBLACKLIST[iscsitarget] ?= "BROKEN: not compatible with default kernel version 4.8" | ||
