saddr = inet->inet_saddr;
        if (ipv4_is_multicast(usin->sin_addr.s_addr)) {
                if (!oif || netif_index_is_l3_master(sock_net(sk), oif))
-                       oif = inet->mc_index;
+                       oif = READ_ONCE(inet->mc_index);
                if (!saddr)
-                       saddr = inet->mc_addr;
+                       saddr = READ_ONCE(inet->mc_addr);
        } else if (!oif) {
                oif = READ_ONCE(inet->uc_index);
        }
 
 
                if (!mreq.imr_ifindex) {
                        if (mreq.imr_address.s_addr == htonl(INADDR_ANY)) {
-                               inet->mc_index = 0;
-                               inet->mc_addr  = 0;
+                               WRITE_ONCE(inet->mc_index, 0);
+                               WRITE_ONCE(inet->mc_addr, 0);
                                err = 0;
                                break;
                        }
                    midx != sk->sk_bound_dev_if)
                        break;
 
-               inet->mc_index = mreq.imr_ifindex;
-               inet->mc_addr  = mreq.imr_address.s_addr;
+               WRITE_ONCE(inet->mc_index, mreq.imr_ifindex);
+               WRITE_ONCE(inet->mc_addr, mreq.imr_address.s_addr);
                err = 0;
                break;
        }
        case IP_UNICAST_IF:
                val = (__force int)htonl((__u32) READ_ONCE(inet->uc_index));
                goto copyval;
-       }
-
-       if (needs_rtnl)
-               rtnl_lock();
-       sockopt_lock_sock(sk);
-
-       switch (optname) {
        case IP_MULTICAST_IF:
        {
                struct in_addr addr;
                len = min_t(unsigned int, len, sizeof(struct in_addr));
-               addr.s_addr = inet->mc_addr;
-               sockopt_release_sock(sk);
+               addr.s_addr = READ_ONCE(inet->mc_addr);
 
                if (copy_to_sockptr(optlen, &len, sizeof(int)))
                        return -EFAULT;
                        return -EFAULT;
                return 0;
        }
+       }
+
+       if (needs_rtnl)
+               rtnl_lock();
+       sockopt_lock_sock(sk);
+
+       switch (optname) {
        case IP_MSFILTER:
        {
                struct ip_msfilter msf;
 
 
        if (ipv4_is_multicast(daddr)) {
                if (!ipc.oif || netif_index_is_l3_master(sock_net(sk), ipc.oif))
-                       ipc.oif = inet->mc_index;
+                       ipc.oif = READ_ONCE(inet->mc_index);
                if (!saddr)
-                       saddr = inet->mc_addr;
+                       saddr = READ_ONCE(inet->mc_addr);
        } else if (!ipc.oif)
                ipc.oif = READ_ONCE(inet->uc_index);
 
 
        uc_index = READ_ONCE(inet->uc_index);
        if (ipv4_is_multicast(daddr)) {
                if (!ipc.oif || netif_index_is_l3_master(sock_net(sk), ipc.oif))
-                       ipc.oif = inet->mc_index;
+                       ipc.oif = READ_ONCE(inet->mc_index);
                if (!saddr)
-                       saddr = inet->mc_addr;
+                       saddr = READ_ONCE(inet->mc_addr);
        } else if (!ipc.oif) {
                ipc.oif = uc_index;
        } else if (ipv4_is_lbcast(daddr) && uc_index) {
 
        uc_index = READ_ONCE(inet->uc_index);
        if (ipv4_is_multicast(daddr)) {
                if (!ipc.oif || netif_index_is_l3_master(sock_net(sk), ipc.oif))
-                       ipc.oif = inet->mc_index;
+                       ipc.oif = READ_ONCE(inet->mc_index);
                if (!saddr)
-                       saddr = inet->mc_addr;
+                       saddr = READ_ONCE(inet->mc_addr);
                connected = 0;
        } else if (!ipc.oif) {
                ipc.oif = uc_index;