@@ -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 )
@@ -686,21 +633,33 @@ static int xfrmi_newlink(struct net *src_net, struct net_device *dev,
686
633
struct netlink_ext_ack * extack )
687
634
{
688
635
struct net * net = dev_net (dev );
689
- struct xfrm_if_parms * p ;
636
+ struct xfrm_if_parms p ;
690
637
struct xfrm_if * xi ;
638
+ int err ;
691
639
692
- xi = netdev_priv (dev );
693
- p = & xi -> p ;
694
-
695
- xfrmi_netlink_parms (data , p );
640
+ xfrmi_netlink_parms (data , & p );
696
641
697
642
if (!tb [IFLA_IFNAME ])
698
643
return - EINVAL ;
699
644
700
- nla_strlcpy (p -> name , tb [IFLA_IFNAME ], IFNAMSIZ );
645
+ nla_strlcpy (p . name , tb [IFLA_IFNAME ], IFNAMSIZ );
701
646
702
- xi = xfrmi_locate (net , p , 1 );
703
- return PTR_ERR_OR_ZERO (xi );
647
+ xi = xfrmi_locate (net , & p );
648
+ if (xi )
649
+ return - EEXIST ;
650
+
651
+ xi = netdev_priv (dev );
652
+ xi -> p = p ;
653
+ xi -> net = net ;
654
+ xi -> dev = dev ;
655
+ xi -> phydev = dev_get_by_index (net , p .link );
656
+ if (!xi -> phydev )
657
+ return - ENODEV ;
658
+
659
+ err = xfrmi_create (dev );
660
+ if (err < 0 )
661
+ dev_put (xi -> phydev );
662
+ return err ;
704
663
}
705
664
706
665
static void xfrmi_dellink (struct net_device * dev , struct list_head * head )
@@ -717,9 +676,8 @@ static int xfrmi_changelink(struct net_device *dev, struct nlattr *tb[],
717
676
718
677
xfrmi_netlink_parms (data , & xi -> p );
719
678
720
- xi = xfrmi_locate (net , & xi -> p , 0 );
721
-
722
- if (IS_ERR_OR_NULL (xi )) {
679
+ xi = xfrmi_locate (net , & xi -> p );
680
+ if (!xi ) {
723
681
xi = netdev_priv (dev );
724
682
} else {
725
683
if (xi -> dev != dev )
0 commit comments