Date: Fri, 13 Apr 2012 12:53:56 +0000 (UTC) From: Gleb Smirnoff <glebius@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r234223 - projects/pf/head/sys/contrib/pf/net Message-ID: <201204131253.q3DCrvMJ080149@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
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; } }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201204131253.q3DCrvMJ080149>