From patchwork Thu Mar 28 20:22:25 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pablo Neira Ayuso X-Patchwork-Id: 232181 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 27E0F2C00A0 for ; Fri, 29 Mar 2013 07:22:49 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752893Ab3C1UWr (ORCPT ); Thu, 28 Mar 2013 16:22:47 -0400 Received: from mail.us.es ([193.147.175.20]:47319 "EHLO mail.us.es" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752386Ab3C1UWq (ORCPT ); Thu, 28 Mar 2013 16:22:46 -0400 Received: (qmail 6556 invoked from network); 28 Mar 2013 21:22:45 +0100 Received: from unknown (HELO us.es) (192.168.2.13) by us.es with SMTP; 28 Mar 2013 21:22:45 +0100 Received: (qmail 23319 invoked by uid 507); 28 Mar 2013 20:22:45 -0000 X-Qmail-Scanner-Diagnostics: from 127.0.0.1 by antivirus3 (envelope-from , uid 501) with qmail-scanner-2.10 (clamdscan: 0.97.7/16921. spamassassin: 3.3.2. Clear:RC:1(127.0.0.1):SA:0(-97.2/7.5):. Processed in 5.251187 secs); 28 Mar 2013 20:22:45 -0000 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on antivirus3 X-Spam-Level: X-Spam-Status: No, score=-97.2 required=7.5 tests=BAYES_50,RCVD_IN_PBL, RCVD_IN_RP_RNBL,RCVD_IN_SORBS_DUL,RDNS_DYNAMIC,USER_IN_WHITELIST autolearn=disabled version=3.3.2 X-Envelope-From: pablo@netfilter.org Received: from unknown (HELO antivirus3) (127.0.0.1) by us.es with SMTP; 28 Mar 2013 20:22:40 -0000 Received: from 192.168.1.13 (192.168.1.13) by antivirus3 (F-Secure/fsigk_smtp/407/antivirus3); Thu, 28 Mar 2013 21:22:40 +0100 (CET) X-Virus-Status: clean(F-Secure/fsigk_smtp/407/antivirus3) Received: (qmail 27530 invoked from network); 28 Mar 2013 21:22:40 +0100 Received: from 172.231.78.188.dynamic.jazztel.es (HELO localhost.localdomain) (pneira@us.es@188.78.231.172) by us.es with SMTP; 28 Mar 2013 21:22:40 +0100 From: pablo@netfilter.org To: netfilter-devel@vger.kernel.org Cc: kaber@trash.net, tomasz.bursztyka@linux.intel.com Subject: [PATCH 2/2] netfilter: nf_tables: set NLM_F_DUMP_INTR if dump is invalid Date: Thu, 28 Mar 2013 21:22:25 +0100 Message-Id: <1364502145-3701-3-git-send-email-pablo@netfilter.org> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1364502145-3701-1-git-send-email-pablo@netfilter.org> References: <1364502145-3701-1-git-send-email-pablo@netfilter.org> Sender: netfilter-devel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netfilter-devel@vger.kernel.org From: Pablo Neira Ayuso Use nl_dump_check_consistent to set NLM_F_DUMP_INTR to tell user-space that it has to retry in this dump. Just like in rtnetlink. Signed-off-by: Pablo Neira Ayuso --- include/net/netns/nftables.h | 2 +- net/netfilter/nf_tables_api.c | 11 +++++------ 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/include/net/netns/nftables.h b/include/net/netns/nftables.h index 14d9f14..dfeb8b9 100644 --- a/include/net/netns/nftables.h +++ b/include/net/netns/nftables.h @@ -12,8 +12,8 @@ struct netns_nftables { struct nft_af_info *bridge; u32 transaction_owner; struct list_head transaction_rules; + unsigned int base_seq; u8 gencursor; - u8 genctr; }; #endif diff --git a/net/netfilter/nf_tables_api.c b/net/netfilter/nf_tables_api.c index 16d1c7dc..bb3bb74 100644 --- a/net/netfilter/nf_tables_api.c +++ b/net/netfilter/nf_tables_api.c @@ -1400,8 +1400,8 @@ static int nf_tables_dump_rules(struct sk_buff *skb, unsigned int idx = 0, s_idx = cb->args[0]; struct net *net = sock_net(skb->sk); int family = nfmsg->nfgen_family; - u8 genctr = ACCESS_ONCE(net->nft.genctr); - u8 gencursor = ACCESS_ONCE(net->nft.gencursor); + + cb->seq = ACCESS_ONCE(net->nft.base_seq); list_for_each_entry(afi, &net->nft.af_info, list) { if (family != NFPROTO_UNSPEC && family != afi->family) @@ -1430,9 +1430,7 @@ cont: } } done: - /* Invalidate this dump, a transition to the new generation happened */ - if (gencursor != net->nft.gencursor || genctr != net->nft.genctr) - return -EBUSY; + nl_dump_check_consistent(cb, nlmsg_hdr(skb)); cb->args[0] = idx; return skb->len; @@ -1776,7 +1774,7 @@ static int nf_tables_commit(struct sock *nlsk, struct sk_buff *skb, return PTR_ERR(afi); /* Bump generation counter, invalidate any dump in progress */ - net->nft.genctr++; + while (++net->nft.base_seq == 0); /* A new generation has just started */ net->nft.gencursor = gencursor_next(net); @@ -3238,6 +3236,7 @@ static int nf_tables_init_net(struct net *net) { INIT_LIST_HEAD(&net->nft.af_info); INIT_LIST_HEAD(&net->nft.transaction_rules); + net->nft.base_seq = 1; return 0; }