File tree 1 file changed +10
-4
lines changed
1 file changed +10
-4
lines changed Original file line number Diff line number Diff line change @@ -9700,14 +9700,17 @@ int bpf_xdp_link_attach(const union bpf_attr *attr, struct bpf_prog *prog)
9700
9700
struct net_device * dev ;
9701
9701
int err , fd ;
9702
9702
9703
+ rtnl_lock ();
9703
9704
dev = dev_get_by_index (net , attr -> link_create .target_ifindex );
9704
- if (!dev )
9705
+ if (!dev ) {
9706
+ rtnl_unlock ();
9705
9707
return - EINVAL ;
9708
+ }
9706
9709
9707
9710
link = kzalloc (sizeof (* link ), GFP_USER );
9708
9711
if (!link ) {
9709
9712
err = - ENOMEM ;
9710
- goto out_put_dev ;
9713
+ goto unlock ;
9711
9714
}
9712
9715
9713
9716
bpf_link_init (& link -> link , BPF_LINK_TYPE_XDP , & bpf_xdp_link_lops , prog );
@@ -9717,14 +9720,14 @@ int bpf_xdp_link_attach(const union bpf_attr *attr, struct bpf_prog *prog)
9717
9720
err = bpf_link_prime (& link -> link , & link_primer );
9718
9721
if (err ) {
9719
9722
kfree (link );
9720
- goto out_put_dev ;
9723
+ goto unlock ;
9721
9724
}
9722
9725
9723
- rtnl_lock ();
9724
9726
err = dev_xdp_attach_link (dev , NULL , link );
9725
9727
rtnl_unlock ();
9726
9728
9727
9729
if (err ) {
9730
+ link -> dev = NULL ;
9728
9731
bpf_link_cleanup (& link_primer );
9729
9732
goto out_put_dev ;
9730
9733
}
@@ -9734,6 +9737,9 @@ int bpf_xdp_link_attach(const union bpf_attr *attr, struct bpf_prog *prog)
9734
9737
dev_put (dev );
9735
9738
return fd ;
9736
9739
9740
+ unlock :
9741
+ rtnl_unlock ();
9742
+
9737
9743
out_put_dev :
9738
9744
dev_put (dev );
9739
9745
return err ;
You can’t perform that action at this time.
0 commit comments