It can only return 0 (success) or -ENOMEM.
Change return value to a pointer to secpath struct.
This avoids direct access to skb->sp:
err = secpath_set(skb);
if (!err) ..
skb->sp-> ...
Becomes:
sp = secpath_set(skb)
if (!sp) ..
sp-> ..
This reduces noise in followup patch which is going to remove skb->sp.
Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
 }
 
 struct sec_path *secpath_dup(struct sec_path *src);
-int secpath_set(struct sk_buff *skb);
+struct sec_path *secpath_set(struct sk_buff *skb);
 
 static inline void
 secpath_reset(struct sk_buff *skb)
 
 
        xo = xfrm_offload(skb);
        if (!xo || !(xo->flags & CRYPTO_DONE)) {
-               err = secpath_set(skb);
-               if (err)
+               struct sec_path *sp = secpath_set(skb);
+
+               if (!sp)
                        goto out;
 
-               if (skb->sp->len == XFRM_MAX_DEPTH)
+               if (sp->len == XFRM_MAX_DEPTH)
                        goto out;
 
                x = xfrm_state_lookup(dev_net(skb->dev), skb->mark,
                if (!x)
                        goto out;
 
-               skb->sp->xvec[skb->sp->len++] = x;
-               skb->sp->olen++;
+               sp->xvec[sp->len++] = x;
+               sp->olen++;
 
                xo = xfrm_offload(skb);
                if (!xo) {
 
 
        xo = xfrm_offload(skb);
        if (!xo || !(xo->flags & CRYPTO_DONE)) {
-               err = secpath_set(skb);
-               if (err)
+               struct sec_path *sp = secpath_set(skb);
+
+               if (!sp)
                        goto out;
 
-               if (skb->sp->len == XFRM_MAX_DEPTH)
+               if (sp->len == XFRM_MAX_DEPTH)
                        goto out;
 
                x = xfrm_state_lookup(dev_net(skb->dev), skb->mark,
                if (!x)
                        goto out;
 
-               skb->sp->xvec[skb->sp->len++] = x;
-               skb->sp->olen++;
+               sp->xvec[sp->len++] = x;
+               sp->olen++;
 
                xo = xfrm_offload(skb);
                if (!xo) {
 
 {
        struct net *net = dev_net(skb->dev);
        struct xfrm_state *x = NULL;
+       struct sec_path *sp;
        int i = 0;
 
-       if (secpath_set(skb)) {
+       sp = secpath_set(skb);
+       if (!sp) {
                XFRM_INC_STATS(net, LINUX_MIB_XFRMINERROR);
                goto drop;
        }
 
-       if (1 + skb->sp->len == XFRM_MAX_DEPTH) {
+       if (1 + sp->len == XFRM_MAX_DEPTH) {
                XFRM_INC_STATS(net, LINUX_MIB_XFRMINBUFFERERROR);
                goto drop;
        }
 
 }
 EXPORT_SYMBOL(secpath_dup);
 
-int secpath_set(struct sk_buff *skb)
+struct sec_path *secpath_set(struct sk_buff *skb)
 {
-       struct sec_path *sp;
+       struct sec_path *sp = skb->sp;
 
        /* Allocate new secpath or COW existing one. */
-       if (!skb->sp || refcount_read(&skb->sp->refcnt) != 1) {
+       if (!sp || refcount_read(&sp->refcnt) != 1) {
                sp = secpath_dup(skb->sp);
                if (!sp)
-                       return -ENOMEM;
+                       return NULL;
 
                if (skb->sp)
                        secpath_put(skb->sp);
                skb->sp = sp;
        }
-       return 0;
+
+       return sp;
 }
 EXPORT_SYMBOL(secpath_set);
 
        bool xfrm_gro = false;
        bool crypto_done = false;
        struct xfrm_offload *xo = xfrm_offload(skb);
+       struct sec_path *sp;
 
        if (encap_type < 0) {
                x = xfrm_input_state(skb);
                break;
        }
 
-       err = secpath_set(skb);
-       if (err) {
+       sp = secpath_set(skb);
+       if (!sp) {
                XFRM_INC_STATS(net, LINUX_MIB_XFRMINERROR);
                goto drop;
        }