/* When this is a kernel socket, we need to remove the owner pointer, * since we don't know whether the module will be dying at any given * point - HW */ if (!nlk->pid) { struct proto_ops *p_tmp; 
if (nlk->module) module_put(nlk->module); 
static int netlink_release(struct socket *sock){	struct sock *sk = sock->sk;	struct netlink_sock *nlk;	if (!sk)		return 0;	netlink_remove(sk);	nlk = nlk_sk(sk);	spin_lock(&nlk->cb_lock);	if (nlk->cb) {		nlk->cb->done(nlk->cb);		netlink_destroy_callback(nlk->cb);		nlk->cb = NULL;	}	spin_unlock(&nlk->cb_lock);	/* OK. Socket is unlinked, and, therefore,	   no new packets will arrive */	sock_orphan(sk);	sock->sk = NULL;	wake_up_interruptible_all(&nlk->wait);	skb_queue_purge(&sk->sk_write_queue);	if (nlk->pid && !nlk->groups) {		struct netlink_notify n = {						.protocol = sk->sk_protocol,						.pid = nlk->pid,					  };		notifier_call_chain(&netlink_chain, NETLINK_URELEASE, &n);	}		/* When this is a kernel socket, we need to remove the owner pointer,	 * since we don't know whether the module will be dying at any given	 * point - HW	 */	if (!nlk->pid) {		struct proto_ops *p_tmp;		netlink_table_grab();		p_tmp = nl_table[sk->sk_protocol].p_ops;		if (p_tmp != &netlink_ops) {			nl_table[sk->sk_protocol].p_ops = &netlink_ops;			kfree(p_tmp);		}		netlink_table_ungrab();	}		sock_put(sk);	return 0;}
10457	/local/tlutelli/issta_data/temp/c/2005_temp/2005/10457/77247bbb3094246be9d057e7be442cc708f123a8/af_netlink.c/clean/net/netlink/af_netlink.c