Commit be97fdb5 authored by Julian Anastasov's avatar Julian Anastasov Committed by Simon Horman

ipvs: generalize app registration in netns

	Get rid of the ftp_app pointer and allow applications
to be registered without adding fields in the netns_ipvs structure.

v2: fix coding style as suggested by Pablo Neira Ayuso <pablo@netfilter.org>
Signed-off-by: default avatarJulian Anastasov <ja@ssi.bg>
Signed-off-by: default avatarSimon Horman <horms@verge.net.au>
parent aaea4ed7
...@@ -808,8 +808,6 @@ struct netns_ipvs { ...@@ -808,8 +808,6 @@ struct netns_ipvs {
struct list_head rs_table[IP_VS_RTAB_SIZE]; struct list_head rs_table[IP_VS_RTAB_SIZE];
/* ip_vs_app */ /* ip_vs_app */
struct list_head app_list; struct list_head app_list;
/* ip_vs_ftp */
struct ip_vs_app *ftp_app;
/* ip_vs_proto */ /* ip_vs_proto */
#define IP_VS_PROTO_TAB_SIZE 32 /* must be power of 2 */ #define IP_VS_PROTO_TAB_SIZE 32 /* must be power of 2 */
struct ip_vs_proto_data *proto_data_table[IP_VS_PROTO_TAB_SIZE]; struct ip_vs_proto_data *proto_data_table[IP_VS_PROTO_TAB_SIZE];
...@@ -1179,7 +1177,8 @@ extern void ip_vs_service_net_cleanup(struct net *net); ...@@ -1179,7 +1177,8 @@ extern void ip_vs_service_net_cleanup(struct net *net);
* (from ip_vs_app.c) * (from ip_vs_app.c)
*/ */
#define IP_VS_APP_MAX_PORTS 8 #define IP_VS_APP_MAX_PORTS 8
extern int register_ip_vs_app(struct net *net, struct ip_vs_app *app); extern struct ip_vs_app *register_ip_vs_app(struct net *net,
struct ip_vs_app *app);
extern void unregister_ip_vs_app(struct net *net, struct ip_vs_app *app); extern void unregister_ip_vs_app(struct net *net, struct ip_vs_app *app);
extern int ip_vs_bind_app(struct ip_vs_conn *cp, struct ip_vs_protocol *pp); extern int ip_vs_bind_app(struct ip_vs_conn *cp, struct ip_vs_protocol *pp);
extern void ip_vs_unbind_app(struct ip_vs_conn *cp); extern void ip_vs_unbind_app(struct ip_vs_conn *cp);
......
...@@ -180,22 +180,38 @@ register_ip_vs_app_inc(struct net *net, struct ip_vs_app *app, __u16 proto, ...@@ -180,22 +180,38 @@ register_ip_vs_app_inc(struct net *net, struct ip_vs_app *app, __u16 proto,
} }
/* /* Register application for netns */
* ip_vs_app registration routine struct ip_vs_app *register_ip_vs_app(struct net *net, struct ip_vs_app *app)
*/
int register_ip_vs_app(struct net *net, struct ip_vs_app *app)
{ {
struct netns_ipvs *ipvs = net_ipvs(net); struct netns_ipvs *ipvs = net_ipvs(net);
/* increase the module use count */ struct ip_vs_app *a;
ip_vs_use_count_inc(); int err = 0;
if (!ipvs)
return ERR_PTR(-ENOENT);
mutex_lock(&__ip_vs_app_mutex); mutex_lock(&__ip_vs_app_mutex);
list_add(&app->a_list, &ipvs->app_list); list_for_each_entry(a, &ipvs->app_list, a_list) {
if (!strcmp(app->name, a->name)) {
err = -EEXIST;
goto out_unlock;
}
}
a = kmemdup(app, sizeof(*app), GFP_KERNEL);
if (!a) {
err = -ENOMEM;
goto out_unlock;
}
INIT_LIST_HEAD(&a->incs_list);
list_add(&a->a_list, &ipvs->app_list);
/* increase the module use count */
ip_vs_use_count_inc();
out_unlock:
mutex_unlock(&__ip_vs_app_mutex); mutex_unlock(&__ip_vs_app_mutex);
return 0; return err ? ERR_PTR(err) : a;
} }
...@@ -205,20 +221,29 @@ int register_ip_vs_app(struct net *net, struct ip_vs_app *app) ...@@ -205,20 +221,29 @@ int register_ip_vs_app(struct net *net, struct ip_vs_app *app)
*/ */
void unregister_ip_vs_app(struct net *net, struct ip_vs_app *app) void unregister_ip_vs_app(struct net *net, struct ip_vs_app *app)
{ {
struct ip_vs_app *inc, *nxt; struct netns_ipvs *ipvs = net_ipvs(net);
struct ip_vs_app *a, *anxt, *inc, *nxt;
if (!ipvs)
return;
mutex_lock(&__ip_vs_app_mutex); mutex_lock(&__ip_vs_app_mutex);
list_for_each_entry_safe(inc, nxt, &app->incs_list, a_list) { list_for_each_entry_safe(a, anxt, &ipvs->app_list, a_list) {
if (app && strcmp(app->name, a->name))
continue;
list_for_each_entry_safe(inc, nxt, &a->incs_list, a_list) {
ip_vs_app_inc_release(net, inc); ip_vs_app_inc_release(net, inc);
} }
list_del(&app->a_list); list_del(&a->a_list);
kfree(a);
mutex_unlock(&__ip_vs_app_mutex);
/* decrease the module use count */ /* decrease the module use count */
ip_vs_use_count_dec(); ip_vs_use_count_dec();
}
mutex_unlock(&__ip_vs_app_mutex);
} }
...@@ -586,5 +611,6 @@ int __net_init ip_vs_app_net_init(struct net *net) ...@@ -586,5 +611,6 @@ int __net_init ip_vs_app_net_init(struct net *net)
void __net_exit ip_vs_app_net_cleanup(struct net *net) void __net_exit ip_vs_app_net_cleanup(struct net *net)
{ {
unregister_ip_vs_app(net, NULL /* all */);
proc_net_remove(net, "ip_vs_app"); proc_net_remove(net, "ip_vs_app");
} }
...@@ -441,16 +441,10 @@ static int __net_init __ip_vs_ftp_init(struct net *net) ...@@ -441,16 +441,10 @@ static int __net_init __ip_vs_ftp_init(struct net *net)
if (!ipvs) if (!ipvs)
return -ENOENT; return -ENOENT;
app = kmemdup(&ip_vs_ftp, sizeof(struct ip_vs_app), GFP_KERNEL);
if (!app) app = register_ip_vs_app(net, &ip_vs_ftp);
return -ENOMEM; if (IS_ERR(app))
INIT_LIST_HEAD(&app->a_list); return PTR_ERR(app);
INIT_LIST_HEAD(&app->incs_list);
ipvs->ftp_app = app;
ret = register_ip_vs_app(net, app);
if (ret)
goto err_exit;
for (i = 0; i < ports_count; i++) { for (i = 0; i < ports_count; i++) {
if (!ports[i]) if (!ports[i])
...@@ -464,9 +458,7 @@ static int __net_init __ip_vs_ftp_init(struct net *net) ...@@ -464,9 +458,7 @@ static int __net_init __ip_vs_ftp_init(struct net *net)
return 0; return 0;
err_unreg: err_unreg:
unregister_ip_vs_app(net, app); unregister_ip_vs_app(net, &ip_vs_ftp);
err_exit:
kfree(ipvs->ftp_app);
return ret; return ret;
} }
/* /*
...@@ -474,10 +466,7 @@ static int __net_init __ip_vs_ftp_init(struct net *net) ...@@ -474,10 +466,7 @@ static int __net_init __ip_vs_ftp_init(struct net *net)
*/ */
static void __ip_vs_ftp_exit(struct net *net) static void __ip_vs_ftp_exit(struct net *net)
{ {
struct netns_ipvs *ipvs = net_ipvs(net); unregister_ip_vs_app(net, &ip_vs_ftp);
unregister_ip_vs_app(net, ipvs->ftp_app);
kfree(ipvs->ftp_app);
} }
static struct pernet_operations ip_vs_ftp_ops = { static struct pernet_operations ip_vs_ftp_ops = {
......
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