struct sk_buff *head = qp->q.fragments;
 
                /* Send an ICMP "Fragment Reassembly Timeout" message. */
-               if ((head->dev = dev_get_by_index(net, qp->iif)) != NULL) {
+               rcu_read_lock();
+               head->dev = dev_get_by_index_rcu(net, qp->iif);
+               if (head->dev)
                        icmp_send(head, ICMP_TIME_EXCEEDED, ICMP_EXC_FRAGTIME, 0);
-                       dev_put(head->dev);
-               }
+               rcu_read_unlock();
        }
 out:
        spin_unlock(&qp->q.lock);
 
        fq_kill(fq);
 
        net = container_of(fq->q.net, struct net, ipv6.frags);
-       dev = dev_get_by_index(net, fq->iif);
+       rcu_read_lock();
+       dev = dev_get_by_index_rcu(net, fq->iif);
        if (!dev)
-               goto out;
+               goto out_rcu_unlock;
 
-       rcu_read_lock();
        IP6_INC_STATS_BH(net, __in6_dev_get(dev), IPSTATS_MIB_REASMTIMEOUT);
        IP6_INC_STATS_BH(net, __in6_dev_get(dev), IPSTATS_MIB_REASMFAILS);
-       rcu_read_unlock();
 
        /* Don't send error if the first segment did not arrive. */
        if (!(fq->q.last_in & INET_FRAG_FIRST_IN) || !fq->q.fragments)
-               goto out;
+               goto out_rcu_unlock;
 
        /*
           But use as source device on which LAST ARRIVED
         */
        fq->q.fragments->dev = dev;
        icmpv6_send(fq->q.fragments, ICMPV6_TIME_EXCEED, ICMPV6_EXC_FRAGTIME, 0, dev);
+out_rcu_unlock:
+       rcu_read_unlock();
 out:
-       if (dev)
-               dev_put(dev);
        spin_unlock(&fq->q.lock);
        fq_put(fq);
 }