[redhat-lspp] RE: [IPSEC] flow: Cache negative results
Joy Latten
latten at austin.ibm.com
Mon Jan 15 16:49:56 UTC 2007
>> > Please let me know if this looks ok and I am not
>> > jumping the gun. This only applies to our lspp kernel
>> > and was built against lspp62 kernel.
>
>Actually, you would also want propagate non-ESRCH errors back
>up the chain as shown in the below:
>
>@@ -609,7 +609,7 @@ static int xfrm_policy_lookup(struct flo
> void **objp, atomic_t **obj_refp)
> {
> struct xfrm_policy *pol;
>- int ret = -ESRCH;
>+ int ret = 0;
>
> read_lock_bh(&xfrm_policy_lock);
> for (pol = xfrm_policy_list[dir]; pol; pol = pol->next) {
>@@ -626,12 +626,16 @@ static int xfrm_policy_lookup(struct flo
> if (!ret) {
> xfrm_pol_hold(pol);
> break;
>- }
>+ } else if (ret == -ESRCH)
>+ ret = 0;
>+ else
>+ goto fail;
> }
> }
> read_unlock_bh(&xfrm_policy_lock);
> if ((*objp = (void *) pol) != NULL)
> *obj_refp = &pol->refcnt;
>+fail:
> return ret;
> }
We jump to the fail without releasing the lock.
Instead of a "fail", how about just breaking from the loop
and falling through to release lock and return...
Joy
diff -urpN linux-2.6.18.ppc64.orig/net/xfrm/xfrm_policy.c linux-2.6.18.ppc64/net/xfrm/xfrm_policy.c
--- linux-2.6.18.ppc64.orig/net/xfrm/xfrm_policy.c 2007-01-11 15:56:23.000000000 -0600
+++ linux-2.6.18.ppc64/net/xfrm/xfrm_policy.c 2007-01-15 10:36:30.000000000 -0600
@@ -609,7 +609,7 @@ static int xfrm_policy_lookup(struct flo
void **objp, atomic_t **obj_refp)
{
struct xfrm_policy *pol;
- int ret = -ESRCH;
+ int ret = 0;
read_lock_bh(&xfrm_policy_lock);
for (pol = xfrm_policy_list[dir]; pol; pol = pol->next) {
@@ -626,7 +626,10 @@ static int xfrm_policy_lookup(struct flo
if (!ret) {
xfrm_pol_hold(pol);
break;
- }
+ } else if (ret == -ESRCH)
+ ret = 0;
+ else
+ break;
}
}
read_unlock_bh(&xfrm_policy_lock);
More information about the redhat-lspp
mailing list