2112 write_lock(&proto_list_lock);
2113 release_proto_idx(prot);
2114 list_del(&prot->node);
2115 write_unlock(&proto_list_lock);
2116
2117 if (prot->slab != NULL) {
2118 kmem_cache_destroy(prot->slab);
2119 prot->slab = NULL;
2120 }
2121
2122 if (prot->rsk_prot != NULL && prot->rsk_prot->slab != NULL) {
2123 kmem_cache_destroy(prot->rsk_prot->slab);
2124 kfree(prot->rsk_prot->slab_name);
2125 prot->rsk_prot->slab = NULL;
2126 }
2127
2128 if (prot->twsk_prot != NULL && prot->twsk_prot->twsk_slab != NULL) {
2129 kmem_cache_destroy(prot->twsk_prot->twsk_slab);
2130 kfree(prot->twsk_prot->twsk_slab_name);
2131 prot->twsk_prot->twsk_slab = NULL;
2132 }
2133}
2134
2135EXPORT_SYMBOL(proto_unregister);
2136
2137#ifdef CONFIG_PROC_FS
2138static void *proto_seq_start(struct seq_file *seq, loff_t *pos)
2139 __acquires(proto_list_lock)
2140{
2141 read_lock(&proto_list_lock);
2142 return seq_list_start_head(&proto_list, *pos);
2143}
2144
2145static void *proto_seq_next(struct seq_file *seq, void *v, loff_t *pos)
2146{
2147 return seq_list_next(v, &proto_list, pos);
2148}
2149
2150static void proto_seq_stop(struct seq_file *seq, void *v)
2151 __releases(proto_list_lock)
2152{