@@ -427,6 +427,7 @@ static int bond_ipsec_add_sa(struct xfrm_state *xs,
427427 struct netlink_ext_ack * extack )
428428{
429429 struct net_device * bond_dev = xs -> xso .dev ;
430+ struct net_device * real_dev ;
430431 struct bond_ipsec * ipsec ;
431432 struct bonding * bond ;
432433 struct slave * slave ;
@@ -443,9 +444,10 @@ static int bond_ipsec_add_sa(struct xfrm_state *xs,
443444 return - ENODEV ;
444445 }
445446
446- if (!slave -> dev -> xfrmdev_ops ||
447- !slave -> dev -> xfrmdev_ops -> xdo_dev_state_add ||
448- netif_is_bond_master (slave -> dev )) {
447+ real_dev = slave -> dev ;
448+ if (!real_dev -> xfrmdev_ops ||
449+ !real_dev -> xfrmdev_ops -> xdo_dev_state_add ||
450+ netif_is_bond_master (real_dev )) {
449451 NL_SET_ERR_MSG_MOD (extack , "Slave does not support ipsec offload" );
450452 rcu_read_unlock ();
451453 return - EINVAL ;
@@ -456,9 +458,9 @@ static int bond_ipsec_add_sa(struct xfrm_state *xs,
456458 rcu_read_unlock ();
457459 return - ENOMEM ;
458460 }
459- xs -> xso .real_dev = slave -> dev ;
460461
461- err = slave -> dev -> xfrmdev_ops -> xdo_dev_state_add (xs , extack );
462+ xs -> xso .real_dev = real_dev ;
463+ err = real_dev -> xfrmdev_ops -> xdo_dev_state_add (xs , extack );
462464 if (!err ) {
463465 ipsec -> xs = xs ;
464466 INIT_LIST_HEAD (& ipsec -> list );
@@ -475,6 +477,7 @@ static int bond_ipsec_add_sa(struct xfrm_state *xs,
475477static void bond_ipsec_add_sa_all (struct bonding * bond )
476478{
477479 struct net_device * bond_dev = bond -> dev ;
480+ struct net_device * real_dev ;
478481 struct bond_ipsec * ipsec ;
479482 struct slave * slave ;
480483
@@ -483,12 +486,13 @@ static void bond_ipsec_add_sa_all(struct bonding *bond)
483486 if (!slave )
484487 goto out ;
485488
486- if (!slave -> dev -> xfrmdev_ops ||
487- !slave -> dev -> xfrmdev_ops -> xdo_dev_state_add ||
488- netif_is_bond_master (slave -> dev )) {
489+ real_dev = slave -> dev ;
490+ if (!real_dev -> xfrmdev_ops ||
491+ !real_dev -> xfrmdev_ops -> xdo_dev_state_add ||
492+ netif_is_bond_master (real_dev )) {
489493 spin_lock_bh (& bond -> ipsec_lock );
490494 if (!list_empty (& bond -> ipsec_list ))
491- slave_warn (bond_dev , slave -> dev ,
495+ slave_warn (bond_dev , real_dev ,
492496 "%s: no slave xdo_dev_state_add\n" ,
493497 __func__ );
494498 spin_unlock_bh (& bond -> ipsec_lock );
@@ -497,9 +501,9 @@ static void bond_ipsec_add_sa_all(struct bonding *bond)
497501
498502 spin_lock_bh (& bond -> ipsec_lock );
499503 list_for_each_entry (ipsec , & bond -> ipsec_list , list ) {
500- ipsec -> xs -> xso .real_dev = slave -> dev ;
501- if (slave -> dev -> xfrmdev_ops -> xdo_dev_state_add (ipsec -> xs , NULL )) {
502- slave_warn (bond_dev , slave -> dev , "%s: failed to add SA\n" , __func__ );
504+ ipsec -> xs -> xso .real_dev = real_dev ;
505+ if (real_dev -> xfrmdev_ops -> xdo_dev_state_add (ipsec -> xs , NULL )) {
506+ slave_warn (bond_dev , real_dev , "%s: failed to add SA\n" , __func__ );
503507 ipsec -> xs -> xso .real_dev = NULL ;
504508 }
505509 }
@@ -515,6 +519,7 @@ static void bond_ipsec_add_sa_all(struct bonding *bond)
515519static void bond_ipsec_del_sa (struct xfrm_state * xs )
516520{
517521 struct net_device * bond_dev = xs -> xso .dev ;
522+ struct net_device * real_dev ;
518523 struct bond_ipsec * ipsec ;
519524 struct bonding * bond ;
520525 struct slave * slave ;
@@ -532,16 +537,17 @@ static void bond_ipsec_del_sa(struct xfrm_state *xs)
532537 if (!xs -> xso .real_dev )
533538 goto out ;
534539
535- WARN_ON (xs -> xso .real_dev != slave -> dev );
540+ real_dev = slave -> dev ;
541+ WARN_ON (xs -> xso .real_dev != real_dev );
536542
537- if (!slave -> dev -> xfrmdev_ops ||
538- !slave -> dev -> xfrmdev_ops -> xdo_dev_state_delete ||
539- netif_is_bond_master (slave -> dev )) {
540- slave_warn (bond_dev , slave -> dev , "%s: no slave xdo_dev_state_delete\n" , __func__ );
543+ if (!real_dev -> xfrmdev_ops ||
544+ !real_dev -> xfrmdev_ops -> xdo_dev_state_delete ||
545+ netif_is_bond_master (real_dev )) {
546+ slave_warn (bond_dev , real_dev , "%s: no slave xdo_dev_state_delete\n" , __func__ );
541547 goto out ;
542548 }
543549
544- slave -> dev -> xfrmdev_ops -> xdo_dev_state_delete (xs );
550+ real_dev -> xfrmdev_ops -> xdo_dev_state_delete (xs );
545551out :
546552 spin_lock_bh (& bond -> ipsec_lock );
547553 list_for_each_entry (ipsec , & bond -> ipsec_list , list ) {
@@ -558,6 +564,7 @@ static void bond_ipsec_del_sa(struct xfrm_state *xs)
558564static void bond_ipsec_del_sa_all (struct bonding * bond )
559565{
560566 struct net_device * bond_dev = bond -> dev ;
567+ struct net_device * real_dev ;
561568 struct bond_ipsec * ipsec ;
562569 struct slave * slave ;
563570
@@ -568,21 +575,22 @@ static void bond_ipsec_del_sa_all(struct bonding *bond)
568575 return ;
569576 }
570577
578+ real_dev = slave -> dev ;
571579 spin_lock_bh (& bond -> ipsec_lock );
572580 list_for_each_entry (ipsec , & bond -> ipsec_list , list ) {
573581 if (!ipsec -> xs -> xso .real_dev )
574582 continue ;
575583
576- if (!slave -> dev -> xfrmdev_ops ||
577- !slave -> dev -> xfrmdev_ops -> xdo_dev_state_delete ||
578- netif_is_bond_master (slave -> dev )) {
579- slave_warn (bond_dev , slave -> dev ,
584+ if (!real_dev -> xfrmdev_ops ||
585+ !real_dev -> xfrmdev_ops -> xdo_dev_state_delete ||
586+ netif_is_bond_master (real_dev )) {
587+ slave_warn (bond_dev , real_dev ,
580588 "%s: no slave xdo_dev_state_delete\n" ,
581589 __func__ );
582590 } else {
583- slave -> dev -> xfrmdev_ops -> xdo_dev_state_delete (ipsec -> xs );
584- if (slave -> dev -> xfrmdev_ops -> xdo_dev_state_free )
585- slave -> dev -> xfrmdev_ops -> xdo_dev_state_free (ipsec -> xs );
591+ real_dev -> xfrmdev_ops -> xdo_dev_state_delete (ipsec -> xs );
592+ if (real_dev -> xfrmdev_ops -> xdo_dev_state_free )
593+ real_dev -> xfrmdev_ops -> xdo_dev_state_free (ipsec -> xs );
586594 }
587595 }
588596 spin_unlock_bh (& bond -> ipsec_lock );
0 commit comments