|
Lines 742-748
Link Here
|
| 742 |
int err; |
742 |
int err; |
| 743 |
u32 genid; |
743 |
u32 genid; |
| 744 |
u16 family = dst_orig->ops->family; |
744 |
u16 family = dst_orig->ops->family; |
|
|
745 |
unsigned long timeout = jiffies + 60 * HZ; |
| 746 |
int loops = 0; |
| 747 |
|
| 745 |
restart: |
748 |
restart: |
|
|
749 |
if (unlikely(time_after(jiffies, timeout))) { |
| 750 |
printk(KERN_NOTICE "xfrm_lookup bailing out after 60 seconds and %d loops\n", loops); |
| 751 |
dump_stack(); |
| 752 |
err = -EHOSTUNREACH; |
| 753 |
goto error_nopol; |
| 754 |
} |
| 755 |
++loops; |
| 756 |
|
| 746 |
genid = atomic_read(&flow_cache_genid); |
757 |
genid = atomic_read(&flow_cache_genid); |
| 747 |
policy = NULL; |
758 |
policy = NULL; |
| 748 |
if (sk && sk->sk_policy[1]) |
759 |
if (sk && sk->sk_policy[1]) |
|
Lines 847-853
Link Here
|
| 847 |
xfrm_pol_put(policy); |
858 |
xfrm_pol_put(policy); |
| 848 |
if (dst) |
859 |
if (dst) |
| 849 |
dst_free(dst); |
860 |
dst_free(dst); |
| 850 |
goto restart; |
861 |
|
|
|
862 |
err = -EHOSTUNREACH; |
| 863 |
goto error; |
| 851 |
} |
864 |
} |
| 852 |
dst->next = policy->bundles; |
865 |
dst->next = policy->bundles; |
| 853 |
policy->bundles = dst; |
866 |
policy->bundles = dst; |
|
Lines 860-867
Link Here
|
| 860 |
return 0; |
873 |
return 0; |
| 861 |
|
874 |
|
| 862 |
error: |
875 |
error: |
| 863 |
dst_release(dst_orig); |
|
|
| 864 |
xfrm_pol_put(policy); |
876 |
xfrm_pol_put(policy); |
|
|
877 |
error_nopol: |
| 878 |
dst_release(dst_orig); |
| 865 |
*dst_p = NULL; |
879 |
*dst_p = NULL; |
| 866 |
return err; |
880 |
return err; |
| 867 |
} |
881 |
} |