unsigned long *pg_vec = NULL;
struct tpacket_hdr **io_vec = NULL;
struct packet_opt *po = pkt_sk(sk);
- int order = 0;
+ int was_running, num, order = 0;
int err = 0;
if (req->tp_block_nr) {
/* Detach socket from network */
spin_lock(&po->bind_lock);
- if (po->running) {
+ was_running = po->running;
+ num = po->num;
+ if (was_running) {
__dev_remove_pack(&po->prot_hook);
po->num = 0;
po->running = 0;
+ __sock_put(sk);
}
spin_unlock(&po->bind_lock);
}
spin_lock(&po->bind_lock);
- if (po->running)
+ if (was_running && !po->running) {
+ sock_hold(sk);
+ po->running = 1;
+ po->num = num;
dev_add_pack(&po->prot_hook);
+ }
spin_unlock(&po->bind_lock);
release_sock(sk);