@@ -2741,10 +2741,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,
@@ -3422,10 +3428,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;
@@ -3437,8 +3450,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)
@@ -4380,6 +4401,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;
@@ -4447,10 +4470,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;
}
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@ssi.bg> --- net/netfilter/ipvs/ip_vs_ctl.c | 36 +++++++++++++++++++++++++++++----- 1 file changed, 31 insertions(+), 5 deletions(-)