@@ -133,7 +133,7 @@ static void xfrmi_dev_free(struct net_device *dev)
133
133
free_percpu (dev -> tstats );
134
134
}
135
135
136
- static int xfrmi_create2 (struct net_device * dev )
136
+ static int xfrmi_create (struct net_device * dev )
137
137
{
138
138
struct xfrm_if * xi = netdev_priv (dev );
139
139
struct net * net = dev_net (dev );
@@ -156,72 +156,19 @@ static int xfrmi_create2(struct net_device *dev)
156
156
return err ;
157
157
}
158
158
159
- static struct xfrm_if * xfrmi_create (struct net * net , struct xfrm_if_parms * p )
160
- {
161
- struct net_device * dev ;
162
- struct xfrm_if * xi ;
163
- char name [IFNAMSIZ ];
164
- int err ;
165
-
166
- if (p -> name [0 ]) {
167
- strlcpy (name , p -> name , IFNAMSIZ );
168
- } else {
169
- err = - EINVAL ;
170
- goto failed ;
171
- }
172
-
173
- dev = alloc_netdev (sizeof (* xi ), name , NET_NAME_UNKNOWN , xfrmi_dev_setup );
174
- if (!dev ) {
175
- err = - EAGAIN ;
176
- goto failed ;
177
- }
178
-
179
- dev_net_set (dev , net );
180
-
181
- xi = netdev_priv (dev );
182
- xi -> p = * p ;
183
- xi -> net = net ;
184
- xi -> dev = dev ;
185
- xi -> phydev = dev_get_by_index (net , p -> link );
186
- if (!xi -> phydev ) {
187
- err = - ENODEV ;
188
- goto failed_free ;
189
- }
190
-
191
- err = xfrmi_create2 (dev );
192
- if (err < 0 )
193
- goto failed_dev_put ;
194
-
195
- return xi ;
196
-
197
- failed_dev_put :
198
- dev_put (xi -> phydev );
199
- failed_free :
200
- free_netdev (dev );
201
- failed :
202
- return ERR_PTR (err );
203
- }
204
-
205
- static struct xfrm_if * xfrmi_locate (struct net * net , struct xfrm_if_parms * p ,
206
- int create )
159
+ static struct xfrm_if * xfrmi_locate (struct net * net , struct xfrm_if_parms * p )
207
160
{
208
161
struct xfrm_if __rcu * * xip ;
209
162
struct xfrm_if * xi ;
210
163
struct xfrmi_net * xfrmn = net_generic (net , xfrmi_net_id );
211
164
212
165
for (xip = & xfrmn -> xfrmi [0 ];
213
166
(xi = rtnl_dereference (* xip )) != NULL ;
214
- xip = & xi -> next ) {
215
- if (xi -> p .if_id == p -> if_id ) {
216
- if (create )
217
- return ERR_PTR (- EEXIST );
218
-
167
+ xip = & xi -> next )
168
+ if (xi -> p .if_id == p -> if_id )
219
169
return xi ;
220
- }
221
- }
222
- if (!create )
223
- return ERR_PTR (- ENODEV );
224
- return xfrmi_create (net , p );
170
+
171
+ return NULL ;
225
172
}
226
173
227
174
static void xfrmi_dev_uninit (struct net_device * dev )
@@ -689,21 +636,33 @@ static int xfrmi_newlink(struct net *src_net, struct net_device *dev,
689
636
struct netlink_ext_ack * extack )
690
637
{
691
638
struct net * net = dev_net (dev );
692
- struct xfrm_if_parms * p ;
639
+ struct xfrm_if_parms p ;
693
640
struct xfrm_if * xi ;
641
+ int err ;
694
642
695
- xi = netdev_priv (dev );
696
- p = & xi -> p ;
697
-
698
- xfrmi_netlink_parms (data , p );
643
+ xfrmi_netlink_parms (data , & p );
699
644
700
645
if (!tb [IFLA_IFNAME ])
701
646
return - EINVAL ;
702
647
703
- nla_strlcpy (p -> name , tb [IFLA_IFNAME ], IFNAMSIZ );
648
+ nla_strlcpy (p . name , tb [IFLA_IFNAME ], IFNAMSIZ );
704
649
705
- xi = xfrmi_locate (net , p , 1 );
706
- return PTR_ERR_OR_ZERO (xi );
650
+ xi = xfrmi_locate (net , & p );
651
+ if (xi )
652
+ return - EEXIST ;
653
+
654
+ xi = netdev_priv (dev );
655
+ xi -> p = p ;
656
+ xi -> net = net ;
657
+ xi -> dev = dev ;
658
+ xi -> phydev = dev_get_by_index (net , p .link );
659
+ if (!xi -> phydev )
660
+ return - ENODEV ;
661
+
662
+ err = xfrmi_create (dev );
663
+ if (err < 0 )
664
+ dev_put (xi -> phydev );
665
+ return err ;
707
666
}
708
667
709
668
static void xfrmi_dellink (struct net_device * dev , struct list_head * head )
@@ -720,9 +679,8 @@ static int xfrmi_changelink(struct net_device *dev, struct nlattr *tb[],
720
679
721
680
xfrmi_netlink_parms (data , & xi -> p );
722
681
723
- xi = xfrmi_locate (net , & xi -> p , 0 );
724
-
725
- if (IS_ERR_OR_NULL (xi )) {
682
+ xi = xfrmi_locate (net , & xi -> p );
683
+ if (!xi ) {
726
684
xi = netdev_priv (dev );
727
685
} else {
728
686
if (xi -> dev != dev )
0 commit comments