@@ -119,7 +119,7 @@ static void xfrmi_dev_free(struct net_device *dev)
119
119
free_percpu (dev -> tstats );
120
120
}
121
121
122
- static int xfrmi_create2 (struct net_device * dev )
122
+ static int xfrmi_create (struct net_device * dev )
123
123
{
124
124
struct xfrm_if * xi = netdev_priv (dev );
125
125
struct net * net = dev_net (dev );
@@ -142,72 +142,19 @@ static int xfrmi_create2(struct net_device *dev)
142
142
return err ;
143
143
}
144
144
145
- static struct xfrm_if * xfrmi_create (struct net * net , struct xfrm_if_parms * p )
146
- {
147
- struct net_device * dev ;
148
- struct xfrm_if * xi ;
149
- char name [IFNAMSIZ ];
150
- int err ;
151
-
152
- if (p -> name [0 ]) {
153
- strlcpy (name , p -> name , IFNAMSIZ );
154
- } else {
155
- err = - EINVAL ;
156
- goto failed ;
157
- }
158
-
159
- dev = alloc_netdev (sizeof (* xi ), name , NET_NAME_UNKNOWN , xfrmi_dev_setup );
160
- if (!dev ) {
161
- err = - EAGAIN ;
162
- goto failed ;
163
- }
164
-
165
- dev_net_set (dev , net );
166
-
167
- xi = netdev_priv (dev );
168
- xi -> p = * p ;
169
- xi -> net = net ;
170
- xi -> dev = dev ;
171
- xi -> phydev = dev_get_by_index (net , p -> link );
172
- if (!xi -> phydev ) {
173
- err = - ENODEV ;
174
- goto failed_free ;
175
- }
176
-
177
- err = xfrmi_create2 (dev );
178
- if (err < 0 )
179
- goto failed_dev_put ;
180
-
181
- return xi ;
182
-
183
- failed_dev_put :
184
- dev_put (xi -> phydev );
185
- failed_free :
186
- free_netdev (dev );
187
- failed :
188
- return ERR_PTR (err );
189
- }
190
-
191
- static struct xfrm_if * xfrmi_locate (struct net * net , struct xfrm_if_parms * p ,
192
- int create )
145
+ static struct xfrm_if * xfrmi_locate (struct net * net , struct xfrm_if_parms * p )
193
146
{
194
147
struct xfrm_if __rcu * * xip ;
195
148
struct xfrm_if * xi ;
196
149
struct xfrmi_net * xfrmn = net_generic (net , xfrmi_net_id );
197
150
198
151
for (xip = & xfrmn -> xfrmi [0 ];
199
152
(xi = rtnl_dereference (* xip )) != NULL ;
200
- xip = & xi -> next ) {
201
- if (xi -> p .if_id == p -> if_id ) {
202
- if (create )
203
- return ERR_PTR (- EEXIST );
204
-
153
+ xip = & xi -> next )
154
+ if (xi -> p .if_id == p -> if_id )
205
155
return xi ;
206
- }
207
- }
208
- if (!create )
209
- return ERR_PTR (- ENODEV );
210
- return xfrmi_create (net , p );
156
+
157
+ return NULL ;
211
158
}
212
159
213
160
static void xfrmi_dev_uninit (struct net_device * dev )
@@ -675,21 +622,33 @@ static int xfrmi_newlink(struct net *src_net, struct net_device *dev,
675
622
struct netlink_ext_ack * extack )
676
623
{
677
624
struct net * net = dev_net (dev );
678
- struct xfrm_if_parms * p ;
625
+ struct xfrm_if_parms p ;
679
626
struct xfrm_if * xi ;
627
+ int err ;
680
628
681
- xi = netdev_priv (dev );
682
- p = & xi -> p ;
683
-
684
- xfrmi_netlink_parms (data , p );
629
+ xfrmi_netlink_parms (data , & p );
685
630
686
631
if (!tb [IFLA_IFNAME ])
687
632
return - EINVAL ;
688
633
689
- nla_strlcpy (p -> name , tb [IFLA_IFNAME ], IFNAMSIZ );
634
+ nla_strlcpy (p . name , tb [IFLA_IFNAME ], IFNAMSIZ );
690
635
691
- xi = xfrmi_locate (net , p , 1 );
692
- return PTR_ERR_OR_ZERO (xi );
636
+ xi = xfrmi_locate (net , & p );
637
+ if (xi )
638
+ return - EEXIST ;
639
+
640
+ xi = netdev_priv (dev );
641
+ xi -> p = p ;
642
+ xi -> net = net ;
643
+ xi -> dev = dev ;
644
+ xi -> phydev = dev_get_by_index (net , p .link );
645
+ if (!xi -> phydev )
646
+ return - ENODEV ;
647
+
648
+ err = xfrmi_create (dev );
649
+ if (err < 0 )
650
+ dev_put (xi -> phydev );
651
+ return err ;
693
652
}
694
653
695
654
static void xfrmi_dellink (struct net_device * dev , struct list_head * head )
@@ -706,9 +665,8 @@ static int xfrmi_changelink(struct net_device *dev, struct nlattr *tb[],
706
665
707
666
xfrmi_netlink_parms (data , & xi -> p );
708
667
709
- xi = xfrmi_locate (net , & xi -> p , 0 );
710
-
711
- if (IS_ERR_OR_NULL (xi )) {
668
+ xi = xfrmi_locate (net , & xi -> p );
669
+ if (!xi ) {
712
670
xi = netdev_priv (dev );
713
671
} else {
714
672
if (xi -> dev != dev )
0 commit comments