if (cork->ttl != 0)
                ttl = cork->ttl;
        else if (rt->rt_type == RTN_MULTICAST)
-               ttl = inet->mc_ttl;
+               ttl = READ_ONCE(inet->mc_ttl);
        else
                ttl = ip_select_ttl(inet, &rt->dst);
 
 
 
                WRITE_ONCE(inet->min_ttl, val);
                return 0;
+       case IP_MULTICAST_TTL:
+               if (sk->sk_type == SOCK_STREAM)
+                       return -EINVAL;
+               if (optlen < 1)
+                       return -EINVAL;
+               if (val == -1)
+                       val = 1;
+               if (val < 0 || val > 255)
+                       return -EINVAL;
+               WRITE_ONCE(inet->mc_ttl, val);
+               return 0;
        }
 
        err = 0;
                        goto e_inval;
                inet->pmtudisc = val;
                break;
-       case IP_MULTICAST_TTL:
-               if (sk->sk_type == SOCK_STREAM)
-                       goto e_inval;
-               if (optlen < 1)
-                       goto e_inval;
-               if (val == -1)
-                       val = 1;
-               if (val < 0 || val > 255)
-                       goto e_inval;
-               inet->mc_ttl = val;
-               break;
        case IP_UNICAST_IF:
        {
                struct net_device *dev = NULL;
        case IP_MINTTL:
                val = READ_ONCE(inet->min_ttl);
                goto copyval;
+       case IP_MULTICAST_TTL:
+               val = READ_ONCE(inet->mc_ttl);
+               goto copyval;
        }
 
        if (needs_rtnl)
                }
                break;
        }
-       case IP_MULTICAST_TTL:
-               val = inet->mc_ttl;
-               break;
        case IP_UNICAST_IF:
                val = (__force int)htonl((__u32) inet->uc_index);
                break;
                        put_cmsg(&msg, SOL_IP, IP_PKTINFO, sizeof(info), &info);
                }
                if (inet_test_bit(TTL, sk)) {
-                       int hlim = inet->mc_ttl;
+                       int hlim = READ_ONCE(inet->mc_ttl);
+
                        put_cmsg(&msg, SOL_IP, IP_TTL, sizeof(hlim), &hlim);
                }
                if (inet_test_bit(TOS, sk)) {
 
 
        /* setsockopt(sock, SOL_IP, IP_MULTICAST_TTL, &ttl, sizeof(ttl)); */
        lock_sock(sk);
-       inet->mc_ttl = ttl;
+       WRITE_ONCE(inet->mc_ttl, ttl);
 #ifdef CONFIG_IP_VS_IPV6
        if (sk->sk_family == AF_INET6) {
                struct ipv6_pinfo *np = inet6_sk(sk);