|
@@ -2850,9 +2850,9 @@ static void addrconf_dad_timer(unsigned long data)
|
|
|
struct inet6_dev *idev = ifp->idev;
|
|
|
struct in6_addr mcaddr;
|
|
|
|
|
|
- read_lock_bh(&idev->lock);
|
|
|
- if (idev->dead) {
|
|
|
- read_unlock_bh(&idev->lock);
|
|
|
+ read_lock(&idev->lock);
|
|
|
+ if (idev->dead || !(idev->if_flags & IF_READY)) {
|
|
|
+ read_unlock(&idev->lock);
|
|
|
goto out;
|
|
|
}
|
|
|
|
|
@@ -2864,7 +2864,7 @@ static void addrconf_dad_timer(unsigned long data)
|
|
|
|
|
|
ifp->flags &= ~(IFA_F_TENTATIVE|IFA_F_OPTIMISTIC|IFA_F_DADFAILED);
|
|
|
spin_unlock(&ifp->lock);
|
|
|
- read_unlock_bh(&idev->lock);
|
|
|
+ read_unlock(&idev->lock);
|
|
|
|
|
|
addrconf_dad_completed(ifp);
|
|
|
|
|
@@ -2874,7 +2874,7 @@ static void addrconf_dad_timer(unsigned long data)
|
|
|
ifp->probes--;
|
|
|
addrconf_mod_timer(ifp, AC_DAD, ifp->idev->nd_parms->retrans_time);
|
|
|
spin_unlock(&ifp->lock);
|
|
|
- read_unlock_bh(&idev->lock);
|
|
|
+ read_unlock(&idev->lock);
|
|
|
|
|
|
/* send a neighbour solicitation for our addr */
|
|
|
addrconf_addr_solict_mult(&ifp->addr, &mcaddr);
|