You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Conflicts: drivers/net/ieee802154/fakehard.c A bug fix went into 'net' for ieee802154/fakehard.c, which is removed in 'net-next'. Add build fix into the merge from Stephen Rothwell in openvswitch, the logging macros take a new initial 'log' argument, a new call was added in 'net' so when we merge that in here we have to explicitly add the new 'log' arg to it else the build fails. Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -1863,6 +1863,12 @@ ip_set_sockfn_get(struct sock *sk, int optval, void __user *user, int *len)
|
||||
if (*op < IP_SET_OP_VERSION) {
|
||||
/* Check the version at the beginning of operations */
|
||||
struct ip_set_req_version *req_version = data;
|
||||
|
||||
if (*len < sizeof(struct ip_set_req_version)) {
|
||||
ret = -EINVAL;
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (req_version->version != IPSET_PROTOCOL) {
|
||||
ret = -EPROTO;
|
||||
goto done;
|
||||
|
||||
@@ -846,6 +846,8 @@ ip_vs_prepare_tunneled_skb(struct sk_buff *skb, int skb_af,
|
||||
new_skb = skb_realloc_headroom(skb, max_headroom);
|
||||
if (!new_skb)
|
||||
goto error;
|
||||
if (skb->sk)
|
||||
skb_set_owner_w(new_skb, skb->sk);
|
||||
consume_skb(skb);
|
||||
skb = new_skb;
|
||||
}
|
||||
|
||||
@@ -611,12 +611,16 @@ __nf_conntrack_confirm(struct sk_buff *skb)
|
||||
*/
|
||||
NF_CT_ASSERT(!nf_ct_is_confirmed(ct));
|
||||
pr_debug("Confirming conntrack %p\n", ct);
|
||||
/* We have to check the DYING flag inside the lock to prevent
|
||||
a race against nf_ct_get_next_corpse() possibly called from
|
||||
user context, else we insert an already 'dead' hash, blocking
|
||||
further use of that particular connection -JM */
|
||||
|
||||
/* We have to check the DYING flag after unlink to prevent
|
||||
* a race against nf_ct_get_next_corpse() possibly called from
|
||||
* user context, else we insert an already 'dead' hash, blocking
|
||||
* further use of that particular connection -JM.
|
||||
*/
|
||||
nf_ct_del_from_dying_or_unconfirmed_list(ct);
|
||||
|
||||
if (unlikely(nf_ct_is_dying(ct))) {
|
||||
nf_ct_add_to_dying_list(ct);
|
||||
nf_conntrack_double_unlock(hash, reply_hash);
|
||||
local_bh_enable();
|
||||
return NF_ACCEPT;
|
||||
@@ -636,8 +640,6 @@ __nf_conntrack_confirm(struct sk_buff *skb)
|
||||
zone == nf_ct_zone(nf_ct_tuplehash_to_ctrack(h)))
|
||||
goto out;
|
||||
|
||||
nf_ct_del_from_dying_or_unconfirmed_list(ct);
|
||||
|
||||
/* Timer relative to confirmation time, not original
|
||||
setting time, otherwise we'd get timer wrap in
|
||||
weird delay cases. */
|
||||
|
||||
@@ -3484,13 +3484,8 @@ static void nft_chain_commit_update(struct nft_trans *trans)
|
||||
}
|
||||
}
|
||||
|
||||
/* Schedule objects for release via rcu to make sure no packets are accesing
|
||||
* removed rules.
|
||||
*/
|
||||
static void nf_tables_commit_release_rcu(struct rcu_head *rt)
|
||||
static void nf_tables_commit_release(struct nft_trans *trans)
|
||||
{
|
||||
struct nft_trans *trans = container_of(rt, struct nft_trans, rcu_head);
|
||||
|
||||
switch (trans->msg_type) {
|
||||
case NFT_MSG_DELTABLE:
|
||||
nf_tables_table_destroy(&trans->ctx);
|
||||
@@ -3612,10 +3607,11 @@ static int nf_tables_commit(struct sk_buff *skb)
|
||||
}
|
||||
}
|
||||
|
||||
synchronize_rcu();
|
||||
|
||||
list_for_each_entry_safe(trans, next, &net->nft.commit_list, list) {
|
||||
list_del(&trans->list);
|
||||
trans->ctx.nla = NULL;
|
||||
call_rcu(&trans->rcu_head, nf_tables_commit_release_rcu);
|
||||
nf_tables_commit_release(trans);
|
||||
}
|
||||
|
||||
nf_tables_gen_notify(net, skb, NFT_MSG_NEWGEN);
|
||||
@@ -3623,13 +3619,8 @@ static int nf_tables_commit(struct sk_buff *skb)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Schedule objects for release via rcu to make sure no packets are accesing
|
||||
* aborted rules.
|
||||
*/
|
||||
static void nf_tables_abort_release_rcu(struct rcu_head *rt)
|
||||
static void nf_tables_abort_release(struct nft_trans *trans)
|
||||
{
|
||||
struct nft_trans *trans = container_of(rt, struct nft_trans, rcu_head);
|
||||
|
||||
switch (trans->msg_type) {
|
||||
case NFT_MSG_NEWTABLE:
|
||||
nf_tables_table_destroy(&trans->ctx);
|
||||
@@ -3725,11 +3716,12 @@ static int nf_tables_abort(struct sk_buff *skb)
|
||||
}
|
||||
}
|
||||
|
||||
synchronize_rcu();
|
||||
|
||||
list_for_each_entry_safe_reverse(trans, next,
|
||||
&net->nft.commit_list, list) {
|
||||
list_del(&trans->list);
|
||||
trans->ctx.nla = NULL;
|
||||
call_rcu(&trans->rcu_head, nf_tables_abort_release_rcu);
|
||||
nf_tables_abort_release(trans);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -47,6 +47,8 @@ static const int nfnl_group2type[NFNLGRP_MAX+1] = {
|
||||
[NFNLGRP_CONNTRACK_EXP_NEW] = NFNL_SUBSYS_CTNETLINK_EXP,
|
||||
[NFNLGRP_CONNTRACK_EXP_UPDATE] = NFNL_SUBSYS_CTNETLINK_EXP,
|
||||
[NFNLGRP_CONNTRACK_EXP_DESTROY] = NFNL_SUBSYS_CTNETLINK_EXP,
|
||||
[NFNLGRP_NFTABLES] = NFNL_SUBSYS_NFTABLES,
|
||||
[NFNLGRP_ACCT_QUOTA] = NFNL_SUBSYS_ACCT,
|
||||
};
|
||||
|
||||
void nfnl_lock(__u8 subsys_id)
|
||||
@@ -464,7 +466,12 @@ static void nfnetlink_rcv(struct sk_buff *skb)
|
||||
static int nfnetlink_bind(int group)
|
||||
{
|
||||
const struct nfnetlink_subsystem *ss;
|
||||
int type = nfnl_group2type[group];
|
||||
int type;
|
||||
|
||||
if (group <= NFNLGRP_NONE || group > NFNLGRP_MAX)
|
||||
return -EINVAL;
|
||||
|
||||
type = nfnl_group2type[group];
|
||||
|
||||
rcu_read_lock();
|
||||
ss = nfnetlink_get_subsys(type);
|
||||
@@ -514,6 +521,9 @@ static int __init nfnetlink_init(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = NFNLGRP_NONE + 1; i <= NFNLGRP_MAX; i++)
|
||||
BUG_ON(nfnl_group2type[i] == NFNL_SUBSYS_NONE);
|
||||
|
||||
for (i=0; i<NFNL_SUBSYS_COUNT; i++)
|
||||
mutex_init(&table[i].mutex);
|
||||
|
||||
|
||||
@@ -21,45 +21,17 @@
|
||||
#include <linux/netfilter_ipv6/ip6_tables.h>
|
||||
#include <net/netfilter/nf_tables.h>
|
||||
|
||||
static const struct {
|
||||
const char *name;
|
||||
u8 type;
|
||||
} table_to_chaintype[] = {
|
||||
{ "filter", NFT_CHAIN_T_DEFAULT },
|
||||
{ "raw", NFT_CHAIN_T_DEFAULT },
|
||||
{ "security", NFT_CHAIN_T_DEFAULT },
|
||||
{ "mangle", NFT_CHAIN_T_ROUTE },
|
||||
{ "nat", NFT_CHAIN_T_NAT },
|
||||
{ },
|
||||
};
|
||||
|
||||
static int nft_compat_table_to_chaintype(const char *table)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; table_to_chaintype[i].name != NULL; i++) {
|
||||
if (strcmp(table_to_chaintype[i].name, table) == 0)
|
||||
return table_to_chaintype[i].type;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int nft_compat_chain_validate_dependency(const char *tablename,
|
||||
const struct nft_chain *chain)
|
||||
{
|
||||
enum nft_chain_type type;
|
||||
const struct nft_base_chain *basechain;
|
||||
|
||||
if (!tablename || !(chain->flags & NFT_BASE_CHAIN))
|
||||
return 0;
|
||||
|
||||
type = nft_compat_table_to_chaintype(tablename);
|
||||
if (type < 0)
|
||||
return -EINVAL;
|
||||
|
||||
basechain = nft_base_chain(chain);
|
||||
if (basechain->type->type != type)
|
||||
if (strcmp(tablename, "nat") == 0 &&
|
||||
basechain->type->type != NFT_CHAIN_T_NAT)
|
||||
return -EINVAL;
|
||||
|
||||
return 0;
|
||||
@@ -117,7 +89,7 @@ nft_target_set_tgchk_param(struct xt_tgchk_param *par,
|
||||
struct xt_target *target, void *info,
|
||||
union nft_entry *entry, u8 proto, bool inv)
|
||||
{
|
||||
par->net = &init_net;
|
||||
par->net = ctx->net;
|
||||
par->table = ctx->table->name;
|
||||
switch (ctx->afi->family) {
|
||||
case AF_INET:
|
||||
@@ -324,7 +296,7 @@ nft_match_set_mtchk_param(struct xt_mtchk_param *par, const struct nft_ctx *ctx,
|
||||
struct xt_match *match, void *info,
|
||||
union nft_entry *entry, u8 proto, bool inv)
|
||||
{
|
||||
par->net = &init_net;
|
||||
par->net = ctx->net;
|
||||
par->table = ctx->table->name;
|
||||
switch (ctx->afi->family) {
|
||||
case AF_INET:
|
||||
@@ -374,7 +346,7 @@ nft_match_init(const struct nft_ctx *ctx, const struct nft_expr *expr,
|
||||
union nft_entry e = {};
|
||||
int ret;
|
||||
|
||||
ret = nft_compat_chain_validate_dependency(match->name, ctx->chain);
|
||||
ret = nft_compat_chain_validate_dependency(match->table, ctx->chain);
|
||||
if (ret < 0)
|
||||
goto err;
|
||||
|
||||
@@ -448,7 +420,7 @@ static int nft_match_validate(const struct nft_ctx *ctx,
|
||||
if (!(hook_mask & match->hooks))
|
||||
return -EINVAL;
|
||||
|
||||
ret = nft_compat_chain_validate_dependency(match->name,
|
||||
ret = nft_compat_chain_validate_dependency(match->table,
|
||||
ctx->chain);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
Reference in New Issue
Block a user