|
@@ -781,7 +781,8 @@ static struct atm_vcc *find_vcc(struct atm_dev *dev, short vpi, int vci)
|
|
|
sk_for_each(s, node, head) {
|
|
|
vcc = atm_sk(s);
|
|
|
if (vcc->dev == dev && vcc->vci == vci &&
|
|
|
- vcc->vpi == vpi && vcc->qos.rxtp.traffic_class != ATM_NONE)
|
|
|
+ vcc->vpi == vpi && vcc->qos.rxtp.traffic_class != ATM_NONE &&
|
|
|
+ test_bit(ATM_VF_READY, &vcc->flags))
|
|
|
goto out;
|
|
|
}
|
|
|
vcc = NULL;
|
|
@@ -907,6 +908,10 @@ static void pclose(struct atm_vcc *vcc)
|
|
|
clear_bit(ATM_VF_ADDR, &vcc->flags);
|
|
|
clear_bit(ATM_VF_READY, &vcc->flags);
|
|
|
|
|
|
+ /* Hold up vcc_destroy_socket() (our caller) until solos_bh() in the
|
|
|
+ tasklet has finished processing any incoming packets (and, more to
|
|
|
+ the point, using the vcc pointer). */
|
|
|
+ tasklet_unlock_wait(&card->tlet);
|
|
|
return;
|
|
|
}
|
|
|
|