diff options
| author | Jan Engelhardt <jengelh@medozas.de> | 2010-04-21 08:45:51 -0400 |
|---|---|---|
| committer | Patrick McHardy <kaber@trash.net> | 2010-04-21 08:45:51 -0400 |
| commit | d97a9e47ba148cfc41e354c5cd241f472273207c (patch) | |
| tree | 8e3a640118767fb4bd0496a8ffd390e55583fffa | |
| parent | 6c79bf0f2440fd250c8fce8d9b82fcf03d4e8350 (diff) | |
netfilter: x_tables: move sleeping allocation outside BH-disabled region
The jumpstack allocation needs to be moved out of the critical region.
Corrects this notice:
BUG: sleeping function called from invalid context at mm/slub.c:1705
[ 428.295762] in_atomic(): 1, irqs_disabled(): 0, pid: 9111, name: iptables
[ 428.295771] Pid: 9111, comm: iptables Not tainted 2.6.34-rc1 #2
[ 428.295776] Call Trace:
[ 428.295791] [<c012138e>] __might_sleep+0xe5/0xed
[ 428.295801] [<c019e8ca>] __kmalloc+0x92/0xfc
[ 428.295825] [<f865b3bb>] ? xt_jumpstack_alloc+0x36/0xff [x_tables]
Signed-off-by: Jan Engelhardt <jengelh@medozas.de>
Signed-off-by: Patrick McHardy <kaber@trash.net>
| -rw-r--r-- | net/netfilter/x_tables.c | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/net/netfilter/x_tables.c b/net/netfilter/x_tables.c index 3ae32340d4df..445de702b8b7 100644 --- a/net/netfilter/x_tables.c +++ b/net/netfilter/x_tables.c | |||
| @@ -801,6 +801,12 @@ xt_replace_table(struct xt_table *table, | |||
| 801 | struct xt_table_info *private; | 801 | struct xt_table_info *private; |
| 802 | int ret; | 802 | int ret; |
| 803 | 803 | ||
| 804 | ret = xt_jumpstack_alloc(newinfo); | ||
| 805 | if (ret < 0) { | ||
| 806 | *error = ret; | ||
| 807 | return NULL; | ||
| 808 | } | ||
| 809 | |||
| 804 | /* Do the substitution. */ | 810 | /* Do the substitution. */ |
| 805 | local_bh_disable(); | 811 | local_bh_disable(); |
| 806 | private = table->private; | 812 | private = table->private; |
| @@ -814,12 +820,6 @@ xt_replace_table(struct xt_table *table, | |||
| 814 | return NULL; | 820 | return NULL; |
| 815 | } | 821 | } |
| 816 | 822 | ||
| 817 | ret = xt_jumpstack_alloc(newinfo); | ||
| 818 | if (ret < 0) { | ||
| 819 | *error = ret; | ||
| 820 | return NULL; | ||
| 821 | } | ||
| 822 | |||
| 823 | table->private = newinfo; | 823 | table->private = newinfo; |
| 824 | newinfo->initial_entries = private->initial_entries; | 824 | newinfo->initial_entries = private->initial_entries; |
| 825 | 825 | ||
