As conn_tab is per-net, better to show the current hash table size to users instead of the ip_vs_conn_tab_size (max). Signed-off-by: Julian Anastasov <ja@xxxxxx> --- net/netfilter/ipvs/ip_vs_ctl.c | 36 +++++++++++++++++++++++++++++----- 1 file changed, 31 insertions(+), 5 deletions(-) diff --git a/net/netfilter/ipvs/ip_vs_ctl.c b/net/netfilter/ipvs/ip_vs_ctl.c index a5a7d7027237..5e9babed6799 100644 --- a/net/netfilter/ipvs/ip_vs_ctl.c +++ b/net/netfilter/ipvs/ip_vs_ctl.c @@ -2742,10 +2742,16 @@ static void ip_vs_info_seq_stop(struct seq_file *seq, void *v) static int ip_vs_info_seq_show(struct seq_file *seq, void *v) { + struct net *net = seq_file_net(seq); + struct netns_ipvs *ipvs = net_ipvs(net); + if (v == SEQ_START_TOKEN) { + struct ip_vs_rht *tc = rcu_dereference(ipvs->conn_tab); + int csize = tc ? tc->size : 0; + seq_printf(seq, "IP Virtual Server version %d.%d.%d (size=%d)\n", - NVERSION(IP_VS_VERSION_CODE), ip_vs_conn_tab_size); + NVERSION(IP_VS_VERSION_CODE), csize); seq_puts(seq, "Prot LocalAddress:Port Scheduler Flags\n"); seq_puts(seq, @@ -3423,10 +3429,17 @@ do_ip_vs_get_ctl(struct sock *sk, int cmd, void __user *user, int *len) switch (cmd) { case IP_VS_SO_GET_VERSION: { + struct ip_vs_rht *t; + int csize = 0; char buf[64]; + rcu_read_lock(); + t = rcu_dereference(ipvs->conn_tab); + if (t) + csize = t->size; + rcu_read_unlock(); sprintf(buf, "IP Virtual Server version %d.%d.%d (size=%d)", - NVERSION(IP_VS_VERSION_CODE), ip_vs_conn_tab_size); + NVERSION(IP_VS_VERSION_CODE), csize); if (copy_to_user(user, buf, strlen(buf)+1) != 0) { ret = -EFAULT; goto out; @@ -3438,8 +3451,16 @@ do_ip_vs_get_ctl(struct sock *sk, int cmd, void __user *user, int *len) case IP_VS_SO_GET_INFO: { struct ip_vs_getinfo info; + struct ip_vs_rht *t; + int csize = 0; + + rcu_read_lock(); + t = rcu_dereference(ipvs->conn_tab); + if (t) + csize = t->size; + rcu_read_unlock(); info.version = IP_VS_VERSION_CODE; - info.size = ip_vs_conn_tab_size; + info.size = csize; info.num_services = atomic_read(&ipvs->num_services[IP_VS_AF_INET]); if (copy_to_user(user, &info, sizeof(info)) != 0) @@ -4381,6 +4402,8 @@ static int ip_vs_genl_get_cmd(struct sk_buff *skb, struct genl_info *info) int ret, cmd, reply_cmd; struct net *net = sock_net(skb->sk); struct netns_ipvs *ipvs = net_ipvs(net); + struct ip_vs_rht *t; + int csize; cmd = info->genlhdr->cmd; @@ -4448,10 +4471,13 @@ static int ip_vs_genl_get_cmd(struct sk_buff *skb, struct genl_info *info) } case IPVS_CMD_GET_INFO: + csize = 0; + t = rcu_dereference(ipvs->conn_tab); + if (t) + csize = t->size; if (nla_put_u32(msg, IPVS_INFO_ATTR_VERSION, IP_VS_VERSION_CODE) || - nla_put_u32(msg, IPVS_INFO_ATTR_CONN_TAB_SIZE, - ip_vs_conn_tab_size)) + nla_put_u32(msg, IPVS_INFO_ATTR_CONN_TAB_SIZE, csize)) goto nla_put_failure; break; } -- 2.44.0