diff --git a/kmod/src/Makefile.kernelcompat b/kmod/src/Makefile.kernelcompat index dac5f514..3f6991c6 100644 --- a/kmod/src/Makefile.kernelcompat +++ b/kmod/src/Makefile.kernelcompat @@ -176,3 +176,12 @@ endif ifneq (,$(shell grep 'sock_create_kern.*struct net' include/linux/net.h)) ccflags-y += -DKC_SOCK_CREATE_KERN_NET=1 endif + +# +# v3.18-rc6-1619-gc0371da6047a +# +# iov_iter is now part of struct msghdr +# +ifneq (,$(shell grep 'struct iov_iter.*msg_iter' include/linux/socket.h)) +ccflags-y += -DKC_MSGHDR_STRUCT_IOV_ITER=1 +endif diff --git a/kmod/src/net.c b/kmod/src/net.c index cfa1b6d4..bbcff7db 100644 --- a/kmod/src/net.c +++ b/kmod/src/net.c @@ -549,12 +549,16 @@ static int recvmsg_full(struct socket *sock, void *buf, unsigned len) while (len) { memset(&msg, 0, sizeof(msg)); - msg.msg_iov = (struct iovec *)&kv; - msg.msg_iovlen = 1; msg.msg_flags = MSG_NOSIGNAL; kv.iov_base = buf; kv.iov_len = len; +#ifndef KC_MSGHDR_STRUCT_IOV_ITER + msg.msg_iov = (struct iovec *)&kv; + msg.msg_iovlen = 1; +#else + iov_iter_init(&msg.msg_iter, READ, (struct iovec *)&kv, len, 1); +#endif ret = kernel_recvmsg(sock, &msg, &kv, 1, len, msg.msg_flags); if (ret <= 0) return -ECONNABORTED; @@ -707,12 +711,16 @@ static int sendmsg_full(struct socket *sock, void *buf, unsigned len) while (len) { memset(&msg, 0, sizeof(msg)); - msg.msg_iov = (struct iovec *)&kv; - msg.msg_iovlen = 1; msg.msg_flags = MSG_NOSIGNAL; kv.iov_base = buf; kv.iov_len = len; +#ifndef KC_MSGHDR_STRUCT_IOV_ITER + msg.msg_iov = (struct iovec *)&kv; + msg.msg_iovlen = 1; +#else + iov_iter_init(&msg.msg_iter, WRITE, (struct iovec *)&kv, len, 1); +#endif ret = kernel_sendmsg(sock, &msg, &kv, 1, len); if (ret <= 0) return -ECONNABORTED; diff --git a/kmod/src/quorum.c b/kmod/src/quorum.c index ad83e344..f1b323bd 100644 --- a/kmod/src/quorum.c +++ b/kmod/src/quorum.c @@ -243,8 +243,10 @@ static int send_msg_members(struct super_block *sb, int type, u64 term, int only }; struct sockaddr_in sin; struct msghdr mh = { +#ifndef KC_MSGHDR_STRUCT_IOV_ITER .msg_iov = (struct iovec *)&kv, .msg_iovlen = 1, +#endif .msg_flags = MSG_DONTWAIT | MSG_NOSIGNAL, .msg_name = &sin, .msg_namelen = sizeof(sin), @@ -266,6 +268,9 @@ static int send_msg_members(struct super_block *sb, int type, u64 term, int only scoutfs_quorum_slot_sin(&qinf->qconf, i, &sin); now = ktime_get(); +#ifdef KC_MSGHDR_STRUCT_IOV_ITER + iov_iter_init(&mh.msg_iter, WRITE, (struct iovec *)&kv, sizeof(qmes), 1); +#endif ret = kernel_sendmsg(qinf->sock, &mh, &kv, 1, kv.iov_len); if (ret != kv.iov_len) failed++; @@ -308,8 +313,10 @@ static int recv_msg(struct super_block *sb, struct quorum_host_msg *msg, .iov_len = sizeof(struct scoutfs_quorum_message), }; struct msghdr mh = { +#ifndef KC_MSGHDR_STRUCT_IOV_ITER .msg_iov = (struct iovec *)&kv, .msg_iovlen = 1, +#endif .msg_flags = MSG_NOSIGNAL, }; @@ -331,6 +338,9 @@ static int recv_msg(struct super_block *sb, struct quorum_host_msg *msg, return ret; } +#ifdef KC_MSGHDR_STRUCT_IOV_ITER + iov_iter_init(&mh.msg_iter, READ, (struct iovec *)&kv, sizeof(struct scoutfs_quorum_message), 1); +#endif ret = kernel_recvmsg(qinf->sock, &mh, &kv, 1, kv.iov_len, mh.msg_flags); if (ret < 0) return ret;