svn commit: r234223 - projects/pf/head/sys/contrib/pf/net
Gleb Smirnoff
glebius at FreeBSD.org
Fri Apr 13 12:53:57 UTC 2012
Author: glebius
Date: Fri Apr 13 12:53:56 2012
New Revision: 234223
URL: http://svn.freebsd.org/changeset/base/234223
Log:
- Don't use M_WAITOK when holding locks in pfi_dynaddr_setup().
- While here, make pfi_dynaddr_setup() and pf_tbladdr_setup()
return more informative errnos. Pass these errnos to applocation,
where it can be done easily.
Modified:
projects/pf/head/sys/contrib/pf/net/pf.c
projects/pf/head/sys/contrib/pf/net/pf_if.c
projects/pf/head/sys/contrib/pf/net/pf_ioctl.c
Modified: projects/pf/head/sys/contrib/pf/net/pf.c
==============================================================================
--- projects/pf/head/sys/contrib/pf/net/pf.c Fri Apr 13 11:12:18 2012 (r234222)
+++ projects/pf/head/sys/contrib/pf/net/pf.c Fri Apr 13 12:53:56 2012 (r234223)
@@ -1523,7 +1523,7 @@ pf_tbladdr_setup(struct pf_ruleset *rs,
if (aw->type != PF_ADDR_TABLE)
return (0);
if ((aw->p.tbl = pfr_attach_table(rs, aw->v.tblname)) == NULL)
- return (1);
+ return (ENOMEM);
return (0);
}
Modified: projects/pf/head/sys/contrib/pf/net/pf_if.c
==============================================================================
--- projects/pf/head/sys/contrib/pf/net/pf_if.c Fri Apr 13 11:12:18 2012 (r234222)
+++ projects/pf/head/sys/contrib/pf/net/pf_if.c Fri Apr 13 12:53:56 2012 (r234223)
@@ -394,17 +394,16 @@ pfi_dynaddr_setup(struct pf_addr_wrap *a
if (aw->type != PF_ADDR_DYNIFTL)
return (0);
- /* XXX: revisit! */
- if ((dyn = uma_zalloc(V_pfi_addr_z, M_WAITOK | M_ZERO))
- == NULL)
- return (1);
+
+ if ((dyn = uma_zalloc(V_pfi_addr_z, M_NOWAIT | M_ZERO)) == NULL)
+ return (ENOMEM);
if (!strcmp(aw->v.ifname, "self"))
dyn->pfid_kif = pfi_kif_get(IFG_ALL);
else
dyn->pfid_kif = pfi_kif_get(aw->v.ifname);
if (dyn->pfid_kif == NULL) {
- rv = 1;
+ rv = ENOENT;
goto _bad;
}
pfi_kif_ref(dyn->pfid_kif, PFI_KIF_REF_RULE);
@@ -425,12 +424,12 @@ pfi_dynaddr_setup(struct pf_addr_wrap *a
snprintf(tblname + strlen(tblname),
sizeof(tblname) - strlen(tblname), "/%d", dyn->pfid_net);
if ((ruleset = pf_find_or_create_ruleset(PF_RESERVED_ANCHOR)) == NULL) {
- rv = 1;
+ rv = ENOMEM;
goto _bad;
}
if ((dyn->pfid_kt = pfr_attach_table(ruleset, tblname)) == NULL) {
- rv = 1;
+ rv = ENOMEM;
goto _bad;
}
Modified: projects/pf/head/sys/contrib/pf/net/pf_ioctl.c
==============================================================================
--- projects/pf/head/sys/contrib/pf/net/pf_ioctl.c Fri Apr 13 11:12:18 2012 (r234222)
+++ projects/pf/head/sys/contrib/pf/net/pf_ioctl.c Fri Apr 13 12:53:56 2012 (r234223)
@@ -999,11 +999,13 @@ static int
pf_addr_setup(struct pf_ruleset *ruleset, struct pf_addr_wrap *addr,
sa_family_t af)
{
- if (pfi_dynaddr_setup(addr, af) ||
- pf_tbladdr_setup(ruleset, addr))
- return (EINVAL);
+ int error;
- return (0);
+ error = pfi_dynaddr_setup(addr, af);
+ if (error == 0)
+ error = pf_tbladdr_setup(ruleset, addr);
+
+ return (error);
}
static void
@@ -2292,12 +2294,12 @@ DIOCGETSTATES_full:
}
pfi_kif_ref(pa->kif, PFI_KIF_REF_RULE);
}
- if (pfi_dynaddr_setup(&pa->addr, pp->af)) {
+ error = pfi_dynaddr_setup(&pa->addr, pp->af);
+ if (error) {
pfi_dynaddr_remove(&pa->addr);
pfi_kif_unref(pa->kif, PFI_KIF_REF_RULE);
PF_UNLOCK();
uma_zfree(V_pf_pooladdr_z, pa);
- error = EINVAL;
break;
}
TAILQ_INSERT_TAIL(&V_pf_pabuf, pa, entries);
@@ -2418,13 +2420,13 @@ DIOCGETSTATES_full:
pfi_kif_ref(newpa->kif, PFI_KIF_REF_RULE);
} else
newpa->kif = NULL;
- if (pfi_dynaddr_setup(&newpa->addr, pca->af) ||
- pf_tbladdr_setup(ruleset, &newpa->addr)) {
+ if ((error = pfi_dynaddr_setup(&newpa->addr,
+ pca->af)) != 0 || ((error =
+ pf_tbladdr_setup(ruleset, &newpa->addr)) != 0 )) {
pfi_dynaddr_remove(&newpa->addr);
pfi_kif_unref(newpa->kif, PFI_KIF_REF_RULE);
PF_UNLOCK();
uma_zfree(V_pf_pooladdr_z, newpa);
- error = EINVAL;
break;
}
}
More information about the svn-src-projects
mailing list