diff options
Diffstat (limited to 'net/sched/ematch.c')
-rw-r--r-- | net/sched/ematch.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/net/sched/ematch.c b/net/sched/ematch.c index 63146d339d81..f3a104e323bd 100644 --- a/net/sched/ematch.c +++ b/net/sched/ematch.c | |||
@@ -84,9 +84,7 @@ | |||
84 | #include <linux/module.h> | 84 | #include <linux/module.h> |
85 | #include <linux/types.h> | 85 | #include <linux/types.h> |
86 | #include <linux/kernel.h> | 86 | #include <linux/kernel.h> |
87 | #include <linux/mm.h> | ||
88 | #include <linux/errno.h> | 87 | #include <linux/errno.h> |
89 | #include <linux/interrupt.h> | ||
90 | #include <linux/rtnetlink.h> | 88 | #include <linux/rtnetlink.h> |
91 | #include <linux/skbuff.h> | 89 | #include <linux/skbuff.h> |
92 | #include <net/pkt_cls.h> | 90 | #include <net/pkt_cls.h> |
@@ -224,6 +222,19 @@ static int tcf_em_validate(struct tcf_proto *tp, | |||
224 | 222 | ||
225 | if (em->ops == NULL) { | 223 | if (em->ops == NULL) { |
226 | err = -ENOENT; | 224 | err = -ENOENT; |
225 | #ifdef CONFIG_KMOD | ||
226 | __rtnl_unlock(); | ||
227 | request_module("ematch-kind-%u", em_hdr->kind); | ||
228 | rtnl_lock(); | ||
229 | em->ops = tcf_em_lookup(em_hdr->kind); | ||
230 | if (em->ops) { | ||
231 | /* We dropped the RTNL mutex in order to | ||
232 | * perform the module load. Tell the caller | ||
233 | * to replay the request. */ | ||
234 | module_put(em->ops->owner); | ||
235 | err = -EAGAIN; | ||
236 | } | ||
237 | #endif | ||
227 | goto errout; | 238 | goto errout; |
228 | } | 239 | } |
229 | 240 | ||