Commit fa701bd2 authored by Krzysztof Halasa's avatar Krzysztof Halasa Committed by Jeff Garzik

WAN: protect HDLC proto list while insmod/rmmod

WAN: protect protocol list in hdlc.c with RTNL.
Signed-off-by: default avatarKrzysztof Hałasa <khc@pm.waw.pl>
Signed-off-by: default avatarJeff Garzik <jgarzik@redhat.com>
parent 4ecc8c06
...@@ -43,8 +43,7 @@ static const char* version = "HDLC support module revision 1.22"; ...@@ -43,8 +43,7 @@ static const char* version = "HDLC support module revision 1.22";
#undef DEBUG_LINK #undef DEBUG_LINK
static struct hdlc_proto *first_proto = NULL; static struct hdlc_proto *first_proto;
static int hdlc_change_mtu(struct net_device *dev, int new_mtu) static int hdlc_change_mtu(struct net_device *dev, int new_mtu)
{ {
...@@ -314,21 +313,25 @@ void detach_hdlc_protocol(struct net_device *dev) ...@@ -314,21 +313,25 @@ void detach_hdlc_protocol(struct net_device *dev)
void register_hdlc_protocol(struct hdlc_proto *proto) void register_hdlc_protocol(struct hdlc_proto *proto)
{ {
rtnl_lock();
proto->next = first_proto; proto->next = first_proto;
first_proto = proto; first_proto = proto;
rtnl_unlock();
} }
void unregister_hdlc_protocol(struct hdlc_proto *proto) void unregister_hdlc_protocol(struct hdlc_proto *proto)
{ {
struct hdlc_proto **p = &first_proto; struct hdlc_proto **p;
while (*p) {
if (*p == proto) { rtnl_lock();
*p = proto->next; p = &first_proto;
return; while (*p != proto) {
} BUG_ON(!*p);
p = &((*p)->next); p = &((*p)->next);
} }
*p = proto->next;
rtnl_unlock();
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment