Changeset View
Changeset View
Standalone View
Standalone View
sys/netinet/in_pcb.c
Show First 20 Lines • Show All 2,203 Lines • ▼ Show 20 Lines | |||||
found: | found: | ||||
if (lookupflags & INPLOOKUP_WLOCKPCB) | if (lookupflags & INPLOOKUP_WLOCKPCB) | ||||
locked = INP_TRY_WLOCK(inp); | locked = INP_TRY_WLOCK(inp); | ||||
else if (lookupflags & INPLOOKUP_RLOCKPCB) | else if (lookupflags & INPLOOKUP_RLOCKPCB) | ||||
locked = INP_TRY_RLOCK(inp); | locked = INP_TRY_RLOCK(inp); | ||||
else | else | ||||
panic("%s: locking bug", __func__); | panic("%s: locking bug", __func__); | ||||
if (!locked) | if (__predict_false(locked && (inp->inp_flags2 & INP_FREED))) { | ||||
if (lookupflags & INPLOOKUP_WLOCKPCB) | |||||
INP_WUNLOCK(inp); | |||||
else | |||||
INP_RUNLOCK(inp); | |||||
INP_HASH_RUNLOCK(pcbinfo); | |||||
return (NULL); | |||||
} else if (!locked) | |||||
in_pcbref(inp); | in_pcbref(inp); | ||||
INP_GROUP_UNLOCK(pcbgroup); | INP_GROUP_UNLOCK(pcbgroup); | ||||
if (!locked) { | if (!locked) { | ||||
if (lookupflags & INPLOOKUP_WLOCKPCB) { | if (lookupflags & INPLOOKUP_WLOCKPCB) { | ||||
INP_WLOCK(inp); | INP_WLOCK(inp); | ||||
if (in_pcbrele_wlocked(inp)) | if (in_pcbrele_wlocked(inp)) | ||||
return (NULL); | return (NULL); | ||||
} else { | } else { | ||||
▲ Show 20 Lines • Show All 1,239 Lines • Show Last 20 Lines |