diff options
Diffstat (limited to 'net/sched')
-rw-r--r-- | net/sched/cls_bpf.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/net/sched/cls_bpf.c b/net/sched/cls_bpf.c index 7eeffaf69c75..5faaa5425f7b 100644 --- a/net/sched/cls_bpf.c +++ b/net/sched/cls_bpf.c | |||
@@ -262,7 +262,8 @@ static int cls_bpf_prog_from_ops(struct nlattr **tb, struct cls_bpf_prog *prog) | |||
262 | return 0; | 262 | return 0; |
263 | } | 263 | } |
264 | 264 | ||
265 | static int cls_bpf_prog_from_efd(struct nlattr **tb, struct cls_bpf_prog *prog) | 265 | static int cls_bpf_prog_from_efd(struct nlattr **tb, struct cls_bpf_prog *prog, |
266 | const struct tcf_proto *tp) | ||
266 | { | 267 | { |
267 | struct bpf_prog *fp; | 268 | struct bpf_prog *fp; |
268 | char *name = NULL; | 269 | char *name = NULL; |
@@ -294,6 +295,9 @@ static int cls_bpf_prog_from_efd(struct nlattr **tb, struct cls_bpf_prog *prog) | |||
294 | prog->bpf_name = name; | 295 | prog->bpf_name = name; |
295 | prog->filter = fp; | 296 | prog->filter = fp; |
296 | 297 | ||
298 | if (fp->dst_needed) | ||
299 | netif_keep_dst(qdisc_dev(tp->q)); | ||
300 | |||
297 | return 0; | 301 | return 0; |
298 | } | 302 | } |
299 | 303 | ||
@@ -330,7 +334,7 @@ static int cls_bpf_modify_existing(struct net *net, struct tcf_proto *tp, | |||
330 | prog->exts_integrated = have_exts; | 334 | prog->exts_integrated = have_exts; |
331 | 335 | ||
332 | ret = is_bpf ? cls_bpf_prog_from_ops(tb, prog) : | 336 | ret = is_bpf ? cls_bpf_prog_from_ops(tb, prog) : |
333 | cls_bpf_prog_from_efd(tb, prog); | 337 | cls_bpf_prog_from_efd(tb, prog, tp); |
334 | if (ret < 0) { | 338 | if (ret < 0) { |
335 | tcf_exts_destroy(&exts); | 339 | tcf_exts_destroy(&exts); |
336 | return ret; | 340 | return ret; |