#define CMSG_COMPAT_FIRSTHDR(msg)                      \
        (((msg)->msg_controllen) >= sizeof(struct compat_cmsghdr) ?     \
-        (struct compat_cmsghdr __user *)((msg)->msg_control) :         \
+        (struct compat_cmsghdr __user *)((msg)->msg_control_user) :    \
         (struct compat_cmsghdr __user *)NULL)
 
 #define CMSG_COMPAT_OK(ucmlen, ucmsg, mhdr) \
                struct compat_cmsghdr __user *cmsg, int cmsg_len)
 {
        char __user *ptr = (char __user *)cmsg + CMSG_COMPAT_ALIGN(cmsg_len);
-       if ((unsigned long)(ptr + 1 - (char __user *)msg->msg_control) >
+       if ((unsigned long)(ptr + 1 - (char __user *)msg->msg_control_user) >
                        msg->msg_controllen)
                return NULL;
        return (struct compat_cmsghdr __user *)ptr;
 
 int put_cmsg_compat(struct msghdr *kmsg, int level, int type, int len, void *data)
 {
-       struct compat_cmsghdr __user *cm = (struct compat_cmsghdr __user *) kmsg->msg_control;
+       struct compat_cmsghdr __user *cm = (struct compat_cmsghdr __user *) kmsg->msg_control_user;
        struct compat_cmsghdr cmhdr;
        struct old_timeval32 ctv;
        struct old_timespec32 cts[3];
        cmlen = CMSG_COMPAT_SPACE(len);
        if (kmsg->msg_controllen < cmlen)
                cmlen = kmsg->msg_controllen;
-       kmsg->msg_control += cmlen;
+       kmsg->msg_control_user += cmlen;
        kmsg->msg_controllen -= cmlen;
        return 0;
 }
 void scm_detach_fds_compat(struct msghdr *msg, struct scm_cookie *scm)
 {
        struct compat_cmsghdr __user *cm =
-               (struct compat_cmsghdr __user *)msg->msg_control;
+               (struct compat_cmsghdr __user *)msg->msg_control_user;
        unsigned int o_flags = (msg->msg_flags & MSG_CMSG_CLOEXEC) ? O_CLOEXEC : 0;
        int fdmax = min_t(int, scm_max_fds_compat(msg), scm->fp->count);
        int __user *cmsg_data = CMSG_COMPAT_DATA(cm);
                        cmlen = CMSG_COMPAT_SPACE(i * sizeof(int));
                        if (msg->msg_controllen < cmlen)
                                cmlen = msg->msg_controllen;
-                       msg->msg_control += cmlen;
+                       msg->msg_control_user += cmlen;
                        msg->msg_controllen -= cmlen;
                }
        }
 
        }
 
        cmlen = min(CMSG_SPACE(len), msg->msg_controllen);
-       msg->msg_control += cmlen;
+       if (msg->msg_control_is_user)
+               msg->msg_control_user += cmlen;
+       else
+               msg->msg_control += cmlen;
        msg->msg_controllen -= cmlen;
        return 0;
 
 void scm_detach_fds(struct msghdr *msg, struct scm_cookie *scm)
 {
        struct cmsghdr __user *cm =
-               (__force struct cmsghdr __user *)msg->msg_control;
+               (__force struct cmsghdr __user *)msg->msg_control_user;
        unsigned int o_flags = (msg->msg_flags & MSG_CMSG_CLOEXEC) ? O_CLOEXEC : 0;
        int fdmax = min_t(int, scm_max_fds(msg), scm->fp->count);
        int __user *cmsg_data = CMSG_USER_DATA(cm);
                        cmlen = CMSG_SPACE(i * sizeof(int));
                        if (msg->msg_controllen < cmlen)
                                cmlen = msg->msg_controllen;
-                       msg->msg_control += cmlen;
+                       msg->msg_control_user += cmlen;
                        msg->msg_controllen -= cmlen;
                }
        }
 
        struct msghdr cmsg_dummy;
 
        msg_control_addr = (unsigned long)zc->msg_control;
-       cmsg_dummy.msg_control = (void *)msg_control_addr;
+       cmsg_dummy.msg_control_user = (void __user *)msg_control_addr;
        cmsg_dummy.msg_controllen =
                (__kernel_size_t)zc->msg_controllen;
        cmsg_dummy.msg_flags = in_compat_syscall()
            zc->msg_controllen == cmsg_dummy.msg_controllen) {
                tcp_recv_timestamp(&cmsg_dummy, sk, tss);
                zc->msg_control = (__u64)
-                       ((uintptr_t)cmsg_dummy.msg_control);
+                       ((uintptr_t)cmsg_dummy.msg_control_user);
                zc->msg_controllen =
                        (__u64)cmsg_dummy.msg_controllen;
                zc->msg_flags = (__u32)cmsg_dummy.msg_flags;