[NETFILTER]: ip6_tables: move counter allocation to seperate function
More resyncing with ip_tables.c as preparation for compat support. Signed-off-by: Patrick McHardy <kaber@trash.net> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
3b84e92b0d
commit
ed1a6f5e77
|
@ -943,17 +943,11 @@ get_counters(const struct xt_table_info *t,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static inline struct xt_counters *alloc_counters(struct xt_table *table)
|
||||||
copy_entries_to_user(unsigned int total_size,
|
|
||||||
struct xt_table *table,
|
|
||||||
void __user *userptr)
|
|
||||||
{
|
{
|
||||||
unsigned int off, num, countersize;
|
unsigned int countersize;
|
||||||
struct ip6t_entry *e;
|
|
||||||
struct xt_counters *counters;
|
struct xt_counters *counters;
|
||||||
struct xt_table_info *private = table->private;
|
struct xt_table_info *private = table->private;
|
||||||
int ret = 0;
|
|
||||||
void *loc_cpu_entry;
|
|
||||||
|
|
||||||
/* We need atomic snapshot of counters: rest doesn't change
|
/* We need atomic snapshot of counters: rest doesn't change
|
||||||
(other than comefrom, which userspace doesn't care
|
(other than comefrom, which userspace doesn't care
|
||||||
|
@ -962,13 +956,32 @@ copy_entries_to_user(unsigned int total_size,
|
||||||
counters = vmalloc_node(countersize, numa_node_id());
|
counters = vmalloc_node(countersize, numa_node_id());
|
||||||
|
|
||||||
if (counters == NULL)
|
if (counters == NULL)
|
||||||
return -ENOMEM;
|
return ERR_PTR(-ENOMEM);
|
||||||
|
|
||||||
/* First, sum counters... */
|
/* First, sum counters... */
|
||||||
write_lock_bh(&table->lock);
|
write_lock_bh(&table->lock);
|
||||||
get_counters(private, counters);
|
get_counters(private, counters);
|
||||||
write_unlock_bh(&table->lock);
|
write_unlock_bh(&table->lock);
|
||||||
|
|
||||||
|
return counters;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
copy_entries_to_user(unsigned int total_size,
|
||||||
|
struct xt_table *table,
|
||||||
|
void __user *userptr)
|
||||||
|
{
|
||||||
|
unsigned int off, num;
|
||||||
|
struct ip6t_entry *e;
|
||||||
|
struct xt_counters *counters;
|
||||||
|
struct xt_table_info *private = table->private;
|
||||||
|
int ret = 0;
|
||||||
|
void *loc_cpu_entry;
|
||||||
|
|
||||||
|
counters = alloc_counters(table);
|
||||||
|
if (IS_ERR(counters))
|
||||||
|
return PTR_ERR(counters);
|
||||||
|
|
||||||
/* choose the copy that is on ourc node/cpu */
|
/* choose the copy that is on ourc node/cpu */
|
||||||
loc_cpu_entry = private->entries[raw_smp_processor_id()];
|
loc_cpu_entry = private->entries[raw_smp_processor_id()];
|
||||||
if (copy_to_user(userptr, loc_cpu_entry, total_size) != 0) {
|
if (copy_to_user(userptr, loc_cpu_entry, total_size) != 0) {
|
||||||
|
|
Loading…
Reference in New Issue