Commit 9e130954 authored by Eric W. Biederman's avatar Eric W. Biederman Committed by Greg Kroah-Hartman

net caif: Register properly as a pernet subsystem.

[ Upstream commit 8a8ee9af ]

caif is a subsystem and as such it needs to register with
register_pernet_subsys instead of register_pernet_device.

Among other problems using register_pernet_device was resulting in
net_generic being called before the caif_net structure was allocated.
Which has been causing net_generic to fail with either BUG_ON's or by
return NULL pointers.

A more ugly problem that could be caused is packets in flight why the
subsystem is shutting down.

To remove confusion also remove the cruft cause by inappropriately
trying to fix this bug.

With the aid of the previous patch I have tested this patch and
confirmed that using register_pernet_subsys makes the failure go away as
it should.
Signed-off-by: default avatarEric W. Biederman <ebiederm@xmission.com>
Acked-by: default avatarSjur Brændeland <sjur.brandeland@stericsson.com>
Tested-by: default avatarSasha Levin <levinsasha928@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 952f4da9
...@@ -53,7 +53,6 @@ struct cfcnfg *get_cfcnfg(struct net *net) ...@@ -53,7 +53,6 @@ struct cfcnfg *get_cfcnfg(struct net *net)
struct caif_net *caifn; struct caif_net *caifn;
BUG_ON(!net); BUG_ON(!net);
caifn = net_generic(net, caif_net_id); caifn = net_generic(net, caif_net_id);
BUG_ON(!caifn);
return caifn->cfg; return caifn->cfg;
} }
EXPORT_SYMBOL(get_cfcnfg); EXPORT_SYMBOL(get_cfcnfg);
...@@ -63,7 +62,6 @@ static struct caif_device_entry_list *caif_device_list(struct net *net) ...@@ -63,7 +62,6 @@ static struct caif_device_entry_list *caif_device_list(struct net *net)
struct caif_net *caifn; struct caif_net *caifn;
BUG_ON(!net); BUG_ON(!net);
caifn = net_generic(net, caif_net_id); caifn = net_generic(net, caif_net_id);
BUG_ON(!caifn);
return &caifn->caifdevs; return &caifn->caifdevs;
} }
...@@ -92,7 +90,6 @@ static struct caif_device_entry *caif_device_alloc(struct net_device *dev) ...@@ -92,7 +90,6 @@ static struct caif_device_entry *caif_device_alloc(struct net_device *dev)
struct caif_device_entry *caifd; struct caif_device_entry *caifd;
caifdevs = caif_device_list(dev_net(dev)); caifdevs = caif_device_list(dev_net(dev));
BUG_ON(!caifdevs);
caifd = kzalloc(sizeof(*caifd), GFP_KERNEL); caifd = kzalloc(sizeof(*caifd), GFP_KERNEL);
if (!caifd) if (!caifd)
...@@ -112,7 +109,7 @@ static struct caif_device_entry *caif_get(struct net_device *dev) ...@@ -112,7 +109,7 @@ static struct caif_device_entry *caif_get(struct net_device *dev)
struct caif_device_entry_list *caifdevs = struct caif_device_entry_list *caifdevs =
caif_device_list(dev_net(dev)); caif_device_list(dev_net(dev));
struct caif_device_entry *caifd; struct caif_device_entry *caifd;
BUG_ON(!caifdevs);
list_for_each_entry_rcu(caifd, &caifdevs->list, list) { list_for_each_entry_rcu(caifd, &caifdevs->list, list) {
if (caifd->netdev == dev) if (caifd->netdev == dev)
return caifd; return caifd;
...@@ -353,7 +350,7 @@ static struct notifier_block caif_device_notifier = { ...@@ -353,7 +350,7 @@ static struct notifier_block caif_device_notifier = {
static int caif_init_net(struct net *net) static int caif_init_net(struct net *net)
{ {
struct caif_net *caifn = net_generic(net, caif_net_id); struct caif_net *caifn = net_generic(net, caif_net_id);
BUG_ON(!caifn);
INIT_LIST_HEAD(&caifn->caifdevs.list); INIT_LIST_HEAD(&caifn->caifdevs.list);
mutex_init(&caifn->caifdevs.lock); mutex_init(&caifn->caifdevs.lock);
...@@ -418,7 +415,7 @@ static int __init caif_device_init(void) ...@@ -418,7 +415,7 @@ static int __init caif_device_init(void)
{ {
int result; int result;
result = register_pernet_device(&caif_net_ops); result = register_pernet_subsys(&caif_net_ops);
if (result) if (result)
return result; return result;
...@@ -431,7 +428,7 @@ static int __init caif_device_init(void) ...@@ -431,7 +428,7 @@ static int __init caif_device_init(void)
static void __exit caif_device_exit(void) static void __exit caif_device_exit(void)
{ {
unregister_pernet_device(&caif_net_ops); unregister_pernet_subsys(&caif_net_ops);
unregister_netdevice_notifier(&caif_device_notifier); unregister_netdevice_notifier(&caif_device_notifier);
dev_remove_pack(&caif_packet_type); dev_remove_pack(&caif_packet_type);
} }
......
...@@ -309,7 +309,6 @@ int caif_connect_client(struct net *net, struct caif_connect_request *conn_req, ...@@ -309,7 +309,6 @@ int caif_connect_client(struct net *net, struct caif_connect_request *conn_req,
int err; int err;
struct cfctrl_link_param param; struct cfctrl_link_param param;
struct cfcnfg *cfg = get_cfcnfg(net); struct cfcnfg *cfg = get_cfcnfg(net);
caif_assert(cfg != NULL);
rcu_read_lock(); rcu_read_lock();
err = caif_connect_req_to_link_param(cfg, conn_req, &param); err = caif_connect_req_to_link_param(cfg, conn_req, &param);
......
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