From owner-svn-src-projects@FreeBSD.ORG Fri Apr 13 12:53:57 2012 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 51114106566C; Fri, 13 Apr 2012 12:53:57 +0000 (UTC) (envelope-from glebius@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 3C1D08FC12; Fri, 13 Apr 2012 12:53:57 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q3DCrv3j080154; Fri, 13 Apr 2012 12:53:57 GMT (envelope-from glebius@svn.freebsd.org) Received: (from glebius@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q3DCrvMJ080149; Fri, 13 Apr 2012 12:53:57 GMT (envelope-from glebius@svn.freebsd.org) Message-Id: <201204131253.q3DCrvMJ080149@svn.freebsd.org> From: Gleb Smirnoff Date: Fri, 13 Apr 2012 12:53:56 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r234223 - projects/pf/head/sys/contrib/pf/net X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 13 Apr 2012 12:53:57 -0000 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; } }