3.18.1-stable review
Greg Kroah-Hartman
maintainercover 3.18.1-stable review
This is the start of the stable review cycle for the 3.18.1 release. There are 19 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Tue Dec 16 20:18:16 UTC 2014. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
kernel.org/pub/linux/kernel/v3.0/stable-review/patch-3.18.1-rc1.gz
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 3.18.1-rc1
Takashi Iwai <[email protected]>
ALSA: usb-audio: Don't resubmit pending URBs at MIDI error recovery
Takashi Iwai <[email protected]>
ALSA: hda - Fix built-in mic at resume on Lenovo Ideapad S210
Takashi Iwai <[email protected]>
ALSA: hda - Add EAPD fixup for ASUS Z99He laptop
Al Viro <[email protected]>
deal with deadlock in d_walk()
Al Viro <[email protected]>
move d_rcu from overlapping d_child to overlapping d_alias
Larry Finger <[email protected]>
rtlwifi: rtl8192ce: Fix missing interrupt ready flag
Larry Finger <[email protected]>
rtlwifi: rtl8192ce: Fix kernel crashes due to missing callback entry
Larry Finger <[email protected]>
rtlwifi: rtl8192ce: Fix editing error that causes silent memory corruption
Daniel Borkmann <[email protected]>
netlink: use jhash as hashfn for rhashtable
Valdis Kletnieks <[email protected]>
net: fix suspicious rcu_dereference_check in net/sched/sch_fq_codel.c
David Vrabel <[email protected]>
xen-netfront: use correct linear area after linearizing an skb
Eric Dumazet <[email protected]>
tcp: fix more NULL deref after prequeue changes
Daniel Borkmann <[email protected]>
net: sctp: use MAX_HEADER for headroom reserve in output path
Eric Dumazet <[email protected]>
net: mvneta: fix race condition in mvneta_tx()
willy tarreau <[email protected]>
net: mvneta: fix Tx interrupt delay
Denis Kirjanov <[email protected]>
mips: bpf: Fix broken BPF_MOD
Pravin B Shelar <[email protected]>
openvswitch: Fix flow mask validation.
Tom Herbert <[email protected]>
gre: Set inner mac header in gro complete
Marcelo Leitner <[email protected]>
Fix race condition between vxlan_sock_add and vxlan_sock_release
-------------
Diffstat:
Makefile | 4 +- arch/mips/net/bpf_jit.c | 4 +- arch/powerpc/platforms/cell/spufs/inode.c | 2 +- drivers/net/ethernet/marvell/mvneta.c | 5 +- drivers/net/vxlan.c | 10 +--- drivers/net/wireless/rtlwifi/rtl8192ce/hw.c | 3 +- drivers/net/wireless/rtlwifi/rtl8192ce/sw.c | 3 + drivers/net/wireless/rtlwifi/rtl8192ce/trx.c | 24 ++++++-- drivers/net/wireless/rtlwifi/rtl8192ce/trx.h | 2 + drivers/net/xen-netfront.c | 3 + drivers/staging/lustre/lustre/llite/dcache.c | 2 +- drivers/staging/lustre/lustre/llite/llite_lib.c | 2 +- drivers/staging/lustre/lustre/llite/namei.c | 8 +-- fs/affs/amigaffs.c | 2 +- fs/autofs4/expire.c | 12 ++-- fs/autofs4/root.c | 2 +- fs/ceph/dir.c | 8 +-- fs/ceph/inode.c | 2 +- fs/cifs/inode.c | 2 +- fs/coda/cache.c | 2 +- fs/dcache.c | 80 ++++++++++++------------- fs/debugfs/inode.c | 2 +- fs/exportfs/expfs.c | 2 +- fs/libfs.c | 12 ++-- fs/ncpfs/dir.c | 2 +- fs/ncpfs/ncplib_kernel.h | 4 +- fs/nfs/getroot.c | 2 +- fs/notify/fsnotify.c | 4 +- fs/ocfs2/dcache.c | 2 +- include/linux/dcache.h | 8 +-- kernel/trace/trace.c | 4 +- kernel/trace/trace_events.c | 2 +- net/ipv4/gre_offload.c | 3 + net/ipv4/tcp_ipv4.c | 4 +- net/ipv6/tcp_ipv6.c | 28 ++++----- net/netlink/af_netlink.c | 2 +- net/openvswitch/flow_netlink.c | 4 +- net/sched/sch_fq_codel.c | 2 +- net/sctp/output.c | 4 +- security/selinux/selinuxfs.c | 6 +- sound/pci/hda/patch_analog.c | 1 + sound/pci/hda/patch_realtek.c | 1 + sound/usb/midi.c | 2 + 43 files changed, 156 insertions(+), 127 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/19 Fix race condition between vxlan_sock_add and vxlan_sock_release
3.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Marcelo Leitner <[email protected]>
[ Upstream commit 00c83b01d58068dfeb2e1351cca6fccf2a83fa8f ]
Currently, when trying to reuse a socket, vxlan_sock_add will grab vn->sock_lock, locate a reusable socket, inc refcount and release vn->sock_lock.
But vxlan_sock_release() will first decrement refcount, and then grab that lock. refcnt operations are atomic but as currently we have deferred works which hold vs->refcnt each, this might happen, leading to a use after free (specially after vxlan_igmp_leave):
CPU 1 CPU 2
deferred work vxlan_sock_add
... ...
spin_lock(&vn->sock_lock)
vs = vxlan_find_sock();
vxlan_sock_release
dec vs->refcnt, reaches 0
spin_lock(&vn->sock_lock)
vxlan_sock_hold(vs), refcnt=1
spin_unlock(&vn->sock_lock)
hlist_del_rcu(&vs->hlist);
vxlan_notify_del_rx_port(vs)
spin_unlock(&vn->sock_lock)So when we look for a reusable socket, we check if it wasn't freed already before reusing it.
--- drivers/net/vxlan.c | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-)
drivers/net/vxlan.c +3 -7
@@ -1995,9 +1995,8 @@ static int vxlan_init(struct net_devicespin_lock (&vn->sock_lock); vs =vxlan_find_sock (vxlan->net, ipv6 ?AF_INET6 :AF_INET , vxlan->dst_port); -if (vs) { +if (vs &&atomic_add_unless (&vs->refcnt,1 ,0 )) {/* If we have a socket with same port already, reuse it */ -atomic_inc (&vs->refcnt);vxlan_vs_add_dev (vs, vxlan); }else {/* otherwise make new socket outside of RTNL */
@@ -2396,12 +2395,9 @@ struct vxlan_sock *vxlan_sock_add(structspin_lock (&vn->sock_lock); vs =vxlan_find_sock (net, ipv6 ?AF_INET6 :AF_INET , port); -if (vs) { -if (vs->rcv == rcv) -atomic_inc (&vs->refcnt); -else +if (vs && ((vs->rcv != rcv) || + !atomic_add_unless (&vs->refcnt,1 ,0 ))) vs =ERR_PTR (-EBUSY ); - }spin_unlock (&vn->sock_lock);if (!vs)
Greg Kroah-Hartman
maintainerPATCH 2/19 gre: Set inner mac header in gro complete
In reply to Greg Kroah-Hartman3.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tom Herbert <[email protected]>
[ Upstream commit 6fb2a756739aa507c1fd5b8126f0bfc2f070dc46 ]
Set the inner mac header to point to the GRE payload when doing GRO. This is needed if we proceed to send the packet through GRE GSO which now uses the inner mac header instead of inner network header to determine the length of encapsulation headers.
--- net/ipv4/gre_offload.c | 3 +++ 1 file changed, 3 insertions(+)
net/ipv4/gre_offload.c +3 -0
@@ -247,6 +247,9 @@ static int gre_gro_complete(struct sk_bu err = ptype->callbacks.gro_complete (skb, nhoff + grehlen);rcu_read_unlock (); + +skb_set_inner_mac_header (skb, nhoff + grehlen); +return err; }
Greg Kroah-Hartman
maintainerPATCH 3/19 openvswitch: Fix flow mask validation.
In reply to Greg Kroah-Hartman3.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pravin B Shelar <[email protected]>
[ Upstream commit f2a01517f2a1040a0b156f171a7cefd748f2fd03 ]
Following patch fixes typo in the flow validation. This prevented installation of ARP and IPv6 flows.
--- net/openvswitch/flow_netlink.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
net/openvswitch/flow_netlink.c +2 -2
@@ -145,7 +145,7 @@ static bool match_validate(const structif (match->key->eth.type ==htons (ETH_P_ARP ) || match->key->eth.type ==htons (ETH_P_RARP )) { key_expected |=1 <<OVS_KEY_ATTR_ARP ; -if (match->mask && (match->mask->key.tp.src ==htons (0xff ))) +if (match->mask && (match->mask->key.eth.type ==htons (0xffff ))) mask_allowed |=1 <<OVS_KEY_ATTR_ARP ; }
@@ -220,7 +220,7 @@ static bool match_validate(const struct htons(NDISC_NEIGHBOUR_SOLICITATION) || match->key->tp.src == htons(NDISC_NEIGHBOUR_ADVERTISEMENT)) { key_expected |=1 <<OVS_KEY_ATTR_ND ; -if (match->mask && (match->mask->key.tp.src ==htons (0xffff ))) +if (match->mask && (match->mask->key.tp.src ==htons (0xff ))) mask_allowed |=1 <<OVS_KEY_ATTR_ND ; } }
Greg Kroah-Hartman
maintainerPATCH 4/19 mips: bpf: Fix broken BPF_MOD
In reply to Greg Kroah-Hartman3.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Denis Kirjanov <[email protected]>
[ Upstream commit 2e46477a12f6fd273e31a220b155d66e8352198c ]
Remove optimize_div() from BPF_MOD | BPF_K case
since we don't know the dividend and fix the emit_mod() by reading the mod operation result from HI register
--- arch/mips/net/bpf_jit.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/mips/net/bpf_jit.c +2 -2
@@ -426,7 +426,7 @@ static inline void emit_mod(unsigned intu32 *p = &ctx->target[ctx->idx];uasm_i_divu (&p, dst, src); p = &ctx->target[ctx->idx +1 ]; -uasm_i_mflo (&p, dst); +uasm_i_mfhi (&p, dst); } ctx->idx +=2 ;/* 2 insts */ }
@@ -971,7 +971,7 @@ load_ind:break ;case BPF_ALU |BPF_MOD |BPF_K :/* A %= k */ -if (k ==1 ||optimize_div (&k)) { +if (k ==1 ) { ctx->flags |=SEEN_A ;emit_jit_reg_move (r_A, r_zero, ctx); }else {
Greg Kroah-Hartman
maintainerPATCH 5/19 net: mvneta: fix Tx interrupt delay
In reply to Greg Kroah-Hartman3.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: willy tarreau <[email protected]>
[ Upstream commit aebea2ba0f7495e1a1c9ea5e753d146cb2f6b845 ]
The mvneta driver sets the amount of Tx coalesce packets to 16 by default. Normally that does not cause any trouble since the driver uses a much larger Tx ring size (532 packets). But some sockets might run with very small buffers, much smaller than the equivalent of 16 packets. This is what ping is doing for example, by setting SNDBUF to 324 bytes rounded up to 2kB by the kernel.
The problem is that there is no documented method to force a specific packet to emit an interrupt (eg: the last of the ring) nor is it possible to make the NIC emit an interrupt after a given delay.
In this case, it causes trouble, because when ping sends packets over its raw socket, the few first packets leave the system, and the first 15 packets will be emitted without an IRQ being generated, so without the skbs being freed. And since the socket's buffer is small, there's no way to reach that amount of packets, and the ping ends up with "send: no buffer available" after sending 6 packets. Running with 3 instances of ping in parallel is enough to hide the problem, because with 6 packets per instance, that's 18 packets total, which is enough to grant a Tx interrupt before all are sent.
The original driver in the LSP kernel worked around this design flaw by using a software timer to clean up the Tx descriptors. This timer was slow and caused terrible network performance on some Tx-bound workloads (such as routing) but was enough to make tools like ping work correctly.
Instead here, we simply set the packet counts before interrupt to 1. This ensures that each packet sent will produce an interrupt. NAPI takes care of coalescing interrupts since the interrupt is disabled once generated.
No measurable performance impact nor CPU usage were observed on small nor large packets, including when saturating the link on Tx, and this fixes tools like ping which rely on too small a send buffer. If one wants to increase this value for certain workloads where it is safe to do so, "ethtool -C $dev tx-frames" will override this default setting.
This fix needs to be applied to stable kernels starting with 3.10.
--- drivers/net/ethernet/marvell/mvneta.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/marvell/mvneta.c +1 -1
@@ -216,7 +216,7 @@/* Various constants */ /* Coalescing */ -#define MVNETA_TXDONE_COAL_PKTS 16 +#define MVNETA_TXDONE_COAL_PKTS 1#define MVNETA_RX_COAL_PKTS 32#define MVNETA_RX_COAL_USEC 100
Greg Kroah-Hartman
maintainerPATCH 6/19 net: mvneta: fix race condition in mvneta_tx()
In reply to Greg Kroah-Hartman3.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 5f478b41033606d325e420df693162e2524c2b94 ]
mvneta_tx() dereferences skb to get skb->len too late, as hardware might have completed the transmit and TX completion could have freed the skb from another cpu.
--- drivers/net/ethernet/marvell/mvneta.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/net/ethernet/marvell/mvneta.c +2 -1
@@ -1721,6 +1721,7 @@ static int mvneta_tx(struct sk_buff *skbu16 txq_id =skb_get_queue_mapping (skb);struct mvneta_tx_queue *txq = &pp->txqs[txq_id];struct mvneta_tx_desc *tx_desc; +int len = skb->len;int frags =0 ;u32 tx_cmd;
@@ -1788,7 +1789,7 @@ out:u64_stats_update_begin (&stats->syncp); stats->tx_packets++; - stats->tx_bytes += skb->len; + stats->tx_bytes += len;u64_stats_update_end (&stats->syncp); }else { dev->stats.tx_dropped++;
Greg Kroah-Hartman
maintainerPATCH 8/19 tcp: fix more NULL deref after prequeue changes
In reply to Greg Kroah-Hartman3.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 0f85feae6b710ced3abad5b2b47d31dfcb956b62 ]
When I cooked commit c3658e8d0f1 ("tcp: fix possible NULL dereference in tcp_vX_send_reset()") I missed other spots we could deref a NULL skb_dst(skb)
Again, if a socket is provided, we do not need skb_dst() to get a pointer to network namespace : sock_net(sk) is good enough.
--- net/ipv4/tcp_ipv4.c | 4 ++-- net/ipv6/tcp_ipv6.c | 28 ++++++++++++++-------------- 2 files changed, 16 insertions(+), 16 deletions(-)
net/ipv4/tcp_ipv4.c +2 -2
@@ -623,6 +623,7 @@ static void tcp_v4_send_reset(struct soc arg.iov[0 ].iov_base = (unsigned char *)&rep; arg.iov[0 ].iov_len =sizeof (rep.th); + net = sk ?sock_net (sk) :dev_net (skb_dst (skb)->dev);#ifdef CONFIG_TCP_MD5SIG hash_location =tcp_parse_md5sig_option (th);if (!sk && hash_location) {
@@ -633,7 +634,7 @@ static void tcp_v4_send_reset(struct soc* Incoming packet is checked with md5 hash with finding key, * no RST generated if md5 hash doesn't match. */ - sk1 =__inet_lookup_listener (dev_net (skb_dst (skb)->dev), + sk1 =__inet_lookup_listener (net, &tcp_hashinfo,ip_hdr (skb)->saddr, th->source,ip_hdr (skb)->daddr,ntohs (th->source),inet_iif (skb));
@@ -681,7 +682,6 @@ static void tcp_v4_send_reset(struct socif (sk) arg.bound_dev_if = sk->sk_bound_dev_if; - net =dev_net (skb_dst (skb)->dev); arg.tos =ip_hdr (skb)->tos; ip_send_unicast_reply(net, skb, &TCP_SKB_CB(skb)->header.h4.opt, ip_hdr(skb)->saddr, ip_hdr(skb)->daddr,
net/ipv6/tcp_ipv6.c +14 -14
@@ -787,16 +787,16 @@ static const struct tcp_request_sock_ops .queue_hash_add = inet6_csk_reqsk_queue_hash_add, }; -static void tcp_v6_send_response (struct sk_buff *skb,u32 seq,u32 ack,u32 win, -u32 tsval,u32 tsecr,int oif, -struct tcp_md5sig_key *key,int rst,u8 tclass, -u32 label) +static void tcp_v6_send_response (struct sock *sk,struct sk_buff *skb,u32 seq, +u32 ack,u32 win,u32 tsval,u32 tsecr, +int oif,struct tcp_md5sig_key *key,int rst, +u8 tclass,u32 label) {const struct tcphdr *th =tcp_hdr (skb);struct tcphdr *t1;struct sk_buff *buff;struct flowi6 fl6; -struct net *net =dev_net (skb_dst (skb)->dev); +struct net *net = sk ?sock_net (sk) :dev_net (skb_dst (skb)->dev);struct sock *ctl_sk = net->ipv6.tcp_sk;unsigned int tot_len =sizeof (struct tcphdr );struct dst_entry *dst;
@@ -946,7 +946,7 @@ static void tcp_v6_send_reset(struct soc (th->doff <<2 ); oif = sk ? sk->sk_bound_dev_if :0 ; -tcp_v6_send_response (skb, seq, ack_seq,0 ,0 ,0 , oif, key,1 ,0 ,0 ); +tcp_v6_send_response (sk, skb, seq, ack_seq,0 ,0 ,0 , oif, key,1 ,0 ,0 );#ifdef CONFIG_TCP_MD5SIG release_sk1:
@@ -957,13 +957,13 @@ release_sk1:#endif } -static void tcp_v6_send_ack (struct sk_buff *skb,u32 seq,u32 ack, -u32 win,u32 tsval,u32 tsecr,int oif, +static void tcp_v6_send_ack (struct sock *sk,struct sk_buff *skb,u32 seq, +u32 ack,u32 win,u32 tsval,u32 tsecr,int oif,struct tcp_md5sig_key *key,u8 tclass,u32 label) { -tcp_v6_send_response (skb, seq, ack, win, tsval, tsecr, oif, key,0 , tclass, - label); +tcp_v6_send_response (sk, skb, seq, ack, win, tsval, tsecr, oif, key,0 , + tclass, label); }static void tcp_v6_timewait_ack (struct sock *sk,struct sk_buff *skb)
@@ -971,7 +971,7 @@ static void tcp_v6_timewait_ack(struct sstruct inet_timewait_sock *tw =inet_twsk (sk);struct tcp_timewait_sock *tcptw =tcp_twsk (sk); - tcp_v6_send_ack(skb, tcptw->tw_snd_nxt, tcptw->tw_rcv_nxt, + tcp_v6_send_ack(sk, skb, tcptw->tw_snd_nxt, tcptw->tw_rcv_nxt, tcptw->tw_rcv_wnd >> tw->tw_rcv_wscale, tcp_time_stamp + tcptw->tw_ts_offset, tcptw->tw_ts_recent, tw->tw_bound_dev_if, tcp_twsk_md5_key(tcptw),
@@ -986,10 +986,10 @@ static void tcp_v6_reqsk_send_ack(struct/* sk->sk_state == TCP_LISTEN -> for regular TCP_SYN_RECV * sk->sk_state == TCP_SYN_RECV -> for Fast Open. */ -tcp_v6_send_ack (skb, (sk->sk_state ==TCP_LISTEN ) ? +tcp_v6_send_ack (sk, skb, (sk->sk_state ==TCP_LISTEN ) ?tcp_rsk (req)->snt_isn +1 :tcp_sk (sk)->snd_nxt, -tcp_rsk (req)->rcv_nxt, - req->rcv_wnd, tcp_time_stamp, req->ts_recent, sk->sk_bound_dev_if, +tcp_rsk (req)->rcv_nxt, req->rcv_wnd, + tcp_time_stamp, req->ts_recent, sk->sk_bound_dev_if,tcp_v6_md5_do_lookup (sk, &ipv6_hdr (skb)->daddr),0 ,0 ); }
Greg Kroah-Hartman
maintainerPATCH 9/19 xen-netfront: use correct linear area after linearizing an skb
In reply to Greg Kroah-Hartman3.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Vrabel <[email protected]>
[ Upstream commit 11d3d2a16cc1f05c6ece69a4392e99efb85666a6 ]
Commit 97a6d1bb2b658ac85ed88205ccd1ab809899884d (xen-netfront: Fix handling packets on compound pages with skb_linearize) attempted to fix a problem where an skb that would have required too many slots would be dropped causing TCP connections to stall.
However, it filled in the first slot using the original buffer and not the new one and would use the wrong offset and grant access to the wrong page.
Netback would notice the malformed request and stop all traffic on the VIF, reporting:
vif vif-3-0 vif3.0: txreq.offset: 85e, size: 4002, end: 6144 vif vif-3-0 vif3.0: fatal error; disabling device
--- drivers/net/xen-netfront.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/net/xen-netfront.c +3 -0
@@ -627,6 +627,9 @@ static int xennet_start_xmit(struct sk_b slots, skb->len);if (skb_linearize (skb)) goto drop; + data = skb->data; + offset =offset_in_page (data); + len =skb_headlen (skb); }spin_lock_irqsave (&queue->tx_lock, flags);
Greg Kroah-Hartman
maintainerPATCH 10/19 net: fix suspicious rcu_dereference_check in net/sched/sch_fq_codel.c
In reply to Greg Kroah-Hartman3.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: "[email protected]" <[email protected]>
[ Upstream commit 69204cf7eb9c5a72067ce6922d4699378251d053 ]
commit 46e5da40ae (net: qdisc: use rcu prefix and silence
sparse warnings) triggers a spurious warning:
net/sched/sch_fq_codel.c:97 suspicious rcu_dereference_check() usage!
The code should be using the _bh variant of rcu_dereference.
--- net/sched/sch_fq_codel.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/sched/sch_fq_codel.c +1 -1
@@ -94,7 +94,7 @@ static unsigned int fq_codel_classify(st TC_H_MIN(skb->priority) <= q->flows_cnt)return TC_H_MIN (skb->priority); - filter =rcu_dereference (q->filter_list); + filter =rcu_dereference_bh (q->filter_list);if (!filter)return fq_codel_hash (q, skb) +1 ;
Greg Kroah-Hartman
maintainerPATCH 11/19 netlink: use jhash as hashfn for rhashtable
In reply to Greg Kroah-Hartman3.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daniel Borkmann <[email protected]>
[ Upstream commit 7f19fc5e0b617593dcda0d9956adc78b559ef1f5 ]
For netlink, we shouldn't be using arch_fast_hash() as a hashing discipline, but rather jhash() instead.
Since netlink sockets can be opened by any user, a local attacker would be able to easily create collisions with the DPDK-derived arch_fast_hash(), which trades off performance for security by using crc32 CPU instructions on x86_64.
While it might have a legimite use case in other places, it should be avoided in netlink context, though. As rhashtable's API is very flexible, we could later on still decide on other hashing disciplines, if legitimate.
Reference: http://thread.gmane.org/gmane.linux.kernel/1844123
--- net/netlink/af_netlink.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/netlink/af_netlink.c +1 -1
@@ -3130,7 +3130,7 @@ static int __init netlink_proto_init(voi .head_offset = offsetof(struct netlink_sock, node), .key_offset = offsetof(struct netlink_sock, portid), .key_len = sizeof(u32), /* portid */ - .hashfn = arch_fast_hash, + .hashfn = jhash, .max_shift = 16, /* 64K */ .grow_decision = rht_grow_above_75, .shrink_decision = rht_shrink_below_30,
Greg Kroah-Hartman
maintainerPATCH 12/19 rtlwifi: rtl8192ce: Fix editing error that causes silent memory corruption
In reply to Greg Kroah-Hartman3.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Larry Finger <[email protected]>
commit 99a82f734aa6c6d397e029e6dfa933f04e0fa8c8 upstream.
In the major update of the rtlwifi-family of drivers, there was an editing mistake. Unfortunately, this particular error leads to memory corruption that silently leads to failure of the system. This patch is one of three needed to fix the kernel regression reported at https://bugzilla.kernel.org/show_bug.cgi?id=88951.
--- drivers/net/wireless/rtlwifi/rtl8192ce/trx.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-)
drivers/net/wireless/rtlwifi/rtl8192ce/trx.c +3 -4
@@ -720,16 +720,15 @@ u32 rtl92ce_get_desc(u8 *p_desc, bool isbreak ; } }else { -struct rx_desc_92c *pdesc = (struct rx_desc_92c *)p_desc;switch (desc_name) {case HW_DESC_OWN : - ret =GET_RX_DESC_OWN (pdesc); + ret =GET_RX_DESC_OWN (p_desc);break ;case HW_DESC_RXPKT_LEN : - ret =GET_RX_DESC_PKT_LEN (pdesc); + ret =GET_RX_DESC_PKT_LEN (p_desc);break ;case HW_DESC_RXBUFF_ADDR : - ret =GET_RX_STATUS_DESC_BUFF_ADDR (pdesc); + ret =GET_RX_DESC_BUFF_ADDR (p_desc);break ;default : RT_ASSERT(false, "ERR rxdesc :%d not process\n",
Greg Kroah-Hartman
maintainerPATCH 13/19 rtlwifi: rtl8192ce: Fix kernel crashes due to missing callback entry
In reply to Greg Kroah-Hartman3.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Larry Finger <[email protected]>
commit f892914c03131a445b926b82815b03162c19288e upstream.
In the major update of the rtlwifi-family of drivers, one of the callback entries was missed, which leads to memory corruption. Unfortunately, this corruption never caused a kernel oops, but showed up in other parts of the system. This patch is one of three needed to fix the kernel regression reported at
https://bugzilla.kernel.org/show_bug.cgi?id=88951.
--- drivers/net/wireless/rtlwifi/rtl8192ce/sw.c | 3 +++ drivers/net/wireless/rtlwifi/rtl8192ce/trx.c | 17 +++++++++++++++++ drivers/net/wireless/rtlwifi/rtl8192ce/trx.h | 2 ++ 3 files changed, 22 insertions(+)
drivers/net/wireless/rtlwifi/rtl8192ce/sw.c +3 -0
@@ -228,6 +228,7 @@ static struct rtl_hal_ops rtl8192ce_hal_ .led_control = rtl92ce_led_control, .set_desc = rtl92ce_set_desc, .get_desc = rtl92ce_get_desc, + .is_tx_desc_closed = rtl92ce_is_tx_desc_closed, .tx_polling = rtl92ce_tx_polling, .enable_hw_sec = rtl92ce_enable_hw_security_config, .set_key = rtl92ce_set_key,
@@ -271,6 +272,8 @@ static struct rtl_hal_cfg rtl92ce_hal_cf .maps[MAC_RCR_ACRC32] = ACRC32, .maps[MAC_RCR_ACF] = ACF, .maps[MAC_RCR_AAP] = AAP, + .maps[MAC_HIMR] = REG_HIMR, + .maps[MAC_HIMRE] = REG_HIMRE, .maps[EFUSE_TEST] = REG_EFUSE_TEST, .maps[EFUSE_CTRL] = REG_EFUSE_CTRL,
drivers/net/wireless/rtlwifi/rtl8192ce/trx.c +17 -0
@@ -739,6 +739,23 @@ u32 rtl92ce_get_desc(u8 *p_desc, bool isreturn ret; } +bool rtl92ce_is_tx_desc_closed (struct ieee80211_hw *hw, +u8 hw_queue,u16 index) +{ +struct rtl_pci *rtlpci =rtl_pcidev (rtl_pcipriv (hw)); +struct rtl8192_tx_ring *ring = &rtlpci->tx_ring[hw_queue]; +u8 *entry = (u8 *)(&ring->desc[ring->idx]); +u8 own = (u8 )rtl92ce_get_desc (entry, true,HW_DESC_OWN ); + +/*beacon packet will only use the first +*descriptor defautly,and the own may not +*be cleared by the hardware +*/ +if (own) +return false; +return true; +} +void rtl92ce_tx_polling (struct ieee80211_hw *hw,u8 hw_queue) {struct rtl_priv *rtlpriv =rtl_priv (hw);
drivers/net/wireless/rtlwifi/rtl8192ce/trx.h +2 -0
@@ -723,6 +723,8 @@ bool rtl92ce_rx_query_desc(struct ieee80void rtl92ce_set_desc (struct ieee80211_hw *hw,u8 *pdesc,bool istx,u8 desc_name,u8 *val);u32 rtl92ce_get_desc (u8 *pdesc,bool istx,u8 desc_name); +bool rtl92ce_is_tx_desc_closed (struct ieee80211_hw *hw, +u8 hw_queue,u16 index);void rtl92ce_tx_polling (struct ieee80211_hw *hw,u8 hw_queue); void rtl92ce_tx_fill_cmddesc(struct ieee80211_hw *hw, u8 *pdesc, bool b_firstseg, bool b_lastseg,
Greg Kroah-Hartman
maintainerPATCH 14/19 rtlwifi: rtl8192ce: Fix missing interrupt ready flag
In reply to Greg Kroah-Hartman3.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Larry Finger <[email protected]>
commit 87141db0848aa20c43d453f5545efc8f390d4372 upstream.
Proper operation with the rewritten PCI mini driver requires that a flag be set when interrupts are enabled. This flag was missed. This patch is one of three needed to fix the kernel regression reported at https://bugzilla.kernel.org/show_bug.cgi?id=88951.
--- drivers/net/wireless/rtlwifi/rtl8192ce/hw.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/net/wireless/rtlwifi/rtl8192ce/hw.c +2 -1
@@ -1287,6 +1287,7 @@ void rtl92ce_enable_interrupt(struct ieertl_write_dword (rtlpriv,REG_HIMR , rtlpci->irq_mask[0 ] &0xFFFFFFFF );rtl_write_dword (rtlpriv,REG_HIMRE , rtlpci->irq_mask[1 ] &0xFFFFFFFF ); + rtlpci->irq_enabled = true; }void rtl92ce_disable_interrupt (struct ieee80211_hw *hw)
@@ -1296,7 +1297,7 @@ void rtl92ce_disable_interrupt(struct iertl_write_dword (rtlpriv,REG_HIMR ,IMR8190_DISABLED );rtl_write_dword (rtlpriv,REG_HIMRE ,IMR8190_DISABLED ); -synchronize_irq (rtlpci->pdev->irq); + rtlpci->irq_enabled = false; }static void _rtl92ce_poweroff_adapter (struct ieee80211_hw *hw)
Greg Kroah-Hartman
maintainerPATCH 15/19 move d_rcu from overlapping d_child to overlapping d_alias
In reply to Greg Kroah-Hartman3.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Al Viro <[email protected]>
commit 946e51f2bf37f1656916eb75bd0742ba33983c28 upstream.
--- arch/powerpc/platforms/cell/spufs/inode.c | 2 drivers/staging/lustre/lustre/llite/dcache.c | 2 drivers/staging/lustre/lustre/llite/llite_lib.c | 2 drivers/staging/lustre/lustre/llite/namei.c | 8 +-- fs/affs/amigaffs.c | 2 fs/autofs4/expire.c | 12 ++--- fs/autofs4/root.c | 2 fs/ceph/dir.c | 8 +-- fs/ceph/inode.c | 2 fs/cifs/inode.c | 2 fs/coda/cache.c | 2 fs/dcache.c | 53 +++++++++++------------- fs/debugfs/inode.c | 2 fs/exportfs/expfs.c | 2 fs/libfs.c | 12 ++--- fs/ncpfs/dir.c | 2 fs/ncpfs/ncplib_kernel.h | 4 - fs/nfs/getroot.c | 2 fs/notify/fsnotify.c | 4 - fs/ocfs2/dcache.c | 2 include/linux/dcache.h | 8 +-- kernel/trace/trace.c | 4 - kernel/trace/trace_events.c | 2 security/selinux/selinuxfs.c | 6 +- 24 files changed, 73 insertions(+), 74 deletions(-)
arch/powerpc/platforms/cell/spufs/inode.c +1 -1
@@ -164,7 +164,7 @@ static void spufs_prune_dir(struct dentrstruct dentry *dentry, *tmp;mutex_lock (&dir->d_inode->i_mutex); -list_for_each_entry_safe (dentry, tmp, &dir->d_subdirs, d_u.d_child) { +list_for_each_entry_safe (dentry, tmp, &dir->d_subdirs, d_child) {spin_lock (&dentry->d_lock);if (!(d_unhashed (dentry)) && dentry->d_inode) {dget_dlock (dentry);
drivers/staging/lustre/lustre/llite/dcache.c +1 -1
@@ -258,7 +258,7 @@ void ll_invalidate_aliases(struct inode inode->i_ino, inode->i_generation, inode);ll_lock_dcache (inode); -ll_d_hlist_for_each_entry (dentry, p, &inode->i_dentry, d_alias) { +ll_d_hlist_for_each_entry (dentry, p, &inode->i_dentry, d_u.d_alias) { CDEBUG(D_DENTRY, "dentry in drop %.*s (%p) parent %p " "inode %p flags %d\n", dentry->d_name.len, dentry->d_name.name, dentry, dentry->d_parent,
drivers/staging/lustre/lustre/llite/llite_lib.c +1 -1
@@ -711,7 +711,7 @@ void lustre_dump_dentry(struct dentry *dreturn ;list_for_each (tmp, &dentry->d_subdirs) { - struct dentry *d = list_entry(tmp, struct dentry, d_u.d_child); + struct dentry *d = list_entry(tmp, struct dentry, d_child);lustre_dump_dentry (d, recur -1 ); } }
drivers/staging/lustre/lustre/llite/namei.c +4 -4
@@ -167,14 +167,14 @@ static void ll_invalidate_negative_childstruct ll_d_hlist_node *p;ll_lock_dcache (dir); -ll_d_hlist_for_each_entry (dentry, p, &dir->i_dentry, d_alias) { +ll_d_hlist_for_each_entry (dentry, p, &dir->i_dentry, d_u.d_alias) {spin_lock (&dentry->d_lock);if (!list_empty (&dentry->d_subdirs)) {struct dentry *child;list_for_each_entry_safe (child, tmp_subdir, &dentry->d_subdirs, - d_u.d_child) { + d_child) {if (child->d_inode ==NULL )d_lustre_invalidate (child,1 ); }
@@ -362,7 +362,7 @@ static struct dentry *ll_find_alias(stru discon_alias = invalid_alias =NULL ;ll_lock_dcache (inode); -ll_d_hlist_for_each_entry (alias, p, &inode->i_dentry, d_alias) { +ll_d_hlist_for_each_entry (alias, p, &inode->i_dentry, d_u.d_alias) {LASSERT (alias != dentry);spin_lock (&alias->d_lock);
@@ -953,7 +953,7 @@ static void ll_get_child_fid(struct inod {struct dentry *parent, *child; - parent = ll_d_hlist_entry(dir->i_dentry, struct dentry, d_alias); + parent = ll_d_hlist_entry(dir->i_dentry, struct dentry, d_u.d_alias); child =d_lookup (parent, name);if (child) {if (child->d_inode)
fs/affs/amigaffs.c +1 -1
@@ -125,7 +125,7 @@ affs_fix_dcache(struct inode *inode, u32 {struct dentry *dentry;spin_lock (&inode->i_lock); -hlist_for_each_entry (dentry, &inode->i_dentry, d_alias) { +hlist_for_each_entry (dentry, &inode->i_dentry, d_u.d_alias) {if (entry_ino == (u32 )(long )dentry->d_fsdata) { dentry->d_fsdata = (void *)inode->i_ino;break ;
fs/autofs4/expire.c +6 -6
@@ -85,7 +85,7 @@ static struct dentry *get_next_positive_spin_lock (&root->d_lock);if (prev) - next = prev->d_u.d_child.next; + next = prev->d_child.next;else { prev =dget_dlock (root); next = prev->d_subdirs.next;
@@ -99,13 +99,13 @@ cont:return NULL ; } - q = list_entry(next, struct dentry, d_u.d_child); + q = list_entry(next, struct dentry, d_child);spin_lock_nested (&q->d_lock,DENTRY_D_LOCK_NESTED );/* Already gone or negative dentry (under construction) - try next */ if (!d_count (q) || !simple_positive (q)) {spin_unlock (&q->d_lock); - next = q->d_u.d_child.next; + next = q->d_child.next; goto cont; }dget_dlock (q);
@@ -155,13 +155,13 @@ again: goto relock; }spin_unlock (&p->d_lock); - next = p->d_u.d_child.next; + next = p->d_child.next; p = parent;if (next != &parent->d_subdirs)break ; } } - ret = list_entry(next, struct dentry, d_u.d_child); + ret = list_entry(next, struct dentry, d_child);spin_lock_nested (&ret->d_lock,DENTRY_D_LOCK_NESTED );/* Negative dentry - try next */
@@ -489,7 +489,7 @@ found:spin_lock (&sbi->lookup_lock);spin_lock (&expired->d_parent->d_lock);spin_lock_nested (&expired->d_lock,DENTRY_D_LOCK_NESTED ); -list_move (&expired->d_parent->d_subdirs, &expired->d_u.d_child); +list_move (&expired->d_parent->d_subdirs, &expired->d_child);spin_unlock (&expired->d_lock);spin_unlock (&expired->d_parent->d_lock);spin_unlock (&sbi->lookup_lock);
fs/autofs4/root.c +1 -1
@@ -687,7 +687,7 @@ static void autofs_clear_leaf_automount_/* only consider parents below dentrys in the root */ if (IS_ROOT (parent->d_parent))return ; - d_child = &dentry->d_u.d_child; + d_child = &dentry->d_child;/* Set parent managed if it's becoming empty */ if (d_child->next == &parent->d_subdirs && d_child->prev == &parent->d_subdirs)
fs/ceph/dir.c +4 -4
@@ -111,7 +111,7 @@ static int fpos_cmp(loff_t l, loff_t r)/* * When possible, we try to satisfy a readdir by peeking at the * dcache. We make this work by carefully ordering dentries on -* d_u.d_child when we initially get results back from the MDS, and +* d_child when we initially get results back from the MDS, and * falling back to a "normal" sync readdir if any dentries in the dir * are dropped. *
@@ -147,11 +147,11 @@ static int __dcache_readdir(struct file p = parent->d_subdirs.prev;dout (" initial p %p/%p\n" , p->prev, p->next); }else { - p = last->d_u.d_child.prev; + p = last->d_child.prev; } more: - dentry = list_entry(p, struct dentry, d_u.d_child); + dentry = list_entry(p, struct dentry, d_child); di =ceph_dentry (dentry);while (1 ) { dout(" p %p/%p %s d_subdirs %p/%p\n", p->prev, p->next,
@@ -174,7 +174,7 @@ more: !dentry->d_inode ? " null" : "");spin_unlock (&dentry->d_lock); p = p->prev; - dentry = list_entry(p, struct dentry, d_u.d_child); + dentry = list_entry(p, struct dentry, d_child); di =ceph_dentry (dentry); }
fs/ceph/inode.c +1 -1
@@ -1399,7 +1399,7 @@ retry_lookup:/* reorder parent's d_subdirs */ spin_lock (&parent->d_lock);spin_lock_nested (&dn->d_lock,DENTRY_D_LOCK_NESTED ); -list_move (&dn->d_u.d_child, &parent->d_subdirs); +list_move (&dn->d_child, &parent->d_subdirs);spin_unlock (&dn->d_lock);spin_unlock (&parent->d_lock); }
fs/cifs/inode.c +1 -1
@@ -895,7 +895,7 @@ inode_has_hashed_dentries(struct inode *struct dentry *dentry;spin_lock (&inode->i_lock); -hlist_for_each_entry (dentry, &inode->i_dentry, d_alias) { +hlist_for_each_entry (dentry, &inode->i_dentry, d_u.d_alias) {if (!d_unhashed (dentry) ||IS_ROOT (dentry)) {spin_unlock (&inode->i_lock);return true;
fs/coda/cache.c +1 -1
@@ -92,7 +92,7 @@ static void coda_flag_children(struct destruct dentry *de;spin_lock (&parent->d_lock); -list_for_each_entry (de, &parent->d_subdirs, d_u.d_child) { +list_for_each_entry (de, &parent->d_subdirs, d_child) {/* don't know what to do with negative dentries */ if (de->d_inode )coda_flag_inode (de->d_inode, flag);
fs/dcache.c +26 -27
200 lines not on this page · raw message
fs/debugfs/inode.c +1 -1
@@ -553,7 +553,7 @@ void debugfs_remove_recursive(struct den* use the d_u.d_child as the rcu head and corrupt this list. */ spin_lock (&parent->d_lock); -list_for_each_entry (child, &parent->d_subdirs, d_u.d_child) { +list_for_each_entry (child, &parent->d_subdirs, d_child) {if (!debugfs_positive (child))continue ;
fs/exportfs/expfs.c +1 -1
@@ -50,7 +50,7 @@ find_acceptable_alias(struct dentry *res inode = result->d_inode;spin_lock (&inode->i_lock); -hlist_for_each_entry (dentry, &inode->i_dentry, d_alias) { +hlist_for_each_entry (dentry, &inode->i_dentry, d_u.d_alias) {dget (dentry);spin_unlock (&inode->i_lock);if (toput)
fs/libfs.c +6 -6
@@ -114,18 +114,18 @@ loff_t dcache_dir_lseek(struct file *filspin_lock (&dentry->d_lock);/* d_lock not required for cursor */ -list_del (&cursor->d_u.d_child); +list_del (&cursor->d_child); p = dentry->d_subdirs.next;while (n && p != &dentry->d_subdirs) {struct dentry *next; - next = list_entry(p, struct dentry, d_u.d_child); + next = list_entry(p, struct dentry, d_child);spin_lock_nested (&next->d_lock,DENTRY_D_LOCK_NESTED );if (simple_positive (next)) n--;spin_unlock (&next->d_lock); p = p->next; } -list_add_tail (&cursor->d_u.d_child, p); +list_add_tail (&cursor->d_child, p);spin_unlock (&dentry->d_lock); } }
@@ -150,7 +150,7 @@ int dcache_readdir(struct file *file, st {struct dentry *dentry = file->f_path.dentry;struct dentry *cursor = file->private_data; -struct list_head *p, *q = &cursor->d_u.d_child; +struct list_head *p, *q = &cursor->d_child;if (!dir_emit_dots (file, ctx))return 0 ;
@@ -159,7 +159,7 @@ int dcache_readdir(struct file *file, stlist_move (q, &dentry->d_subdirs);for (p = q->next; p != &dentry->d_subdirs; p = p->next) { - struct dentry *next = list_entry(p, struct dentry, d_u.d_child); + struct dentry *next = list_entry(p, struct dentry, d_child);spin_lock_nested (&next->d_lock,DENTRY_D_LOCK_NESTED );if (!simple_positive (next)) {spin_unlock (&next->d_lock);
@@ -287,7 +287,7 @@ int simple_empty(struct dentry *dentry)int ret =0 ;spin_lock (&dentry->d_lock); -list_for_each_entry (child, &dentry->d_subdirs, d_u.d_child) { +list_for_each_entry (child, &dentry->d_subdirs, d_child) {spin_lock_nested (&child->d_lock,DENTRY_D_LOCK_NESTED );if (simple_positive (child)) {spin_unlock (&child->d_lock);
fs/ncpfs/dir.c +1 -1
@@ -403,7 +403,7 @@ ncp_dget_fpos(struct dentry *dentry, str/* If a pointer is invalid, we search the dentry. */ spin_lock (&parent->d_lock); -list_for_each_entry (dent, &parent->d_subdirs, d_u.d_child) { +list_for_each_entry (dent, &parent->d_subdirs, d_child) {if ((unsigned long )dent->d_fsdata == fpos) {if (dent->d_inode)dget (dent);
fs/ncpfs/ncplib_kernel.h +2 -2
@@ -191,7 +191,7 @@ ncp_renew_dentries(struct dentry *parentstruct dentry *dentry;spin_lock (&parent->d_lock); -list_for_each_entry (dentry, &parent->d_subdirs, d_u.d_child) { +list_for_each_entry (dentry, &parent->d_subdirs, d_child) {if (dentry->d_fsdata ==NULL )ncp_age_dentry (server, dentry);else
@@ -207,7 +207,7 @@ ncp_invalidate_dircache_entries(struct dstruct dentry *dentry;spin_lock (&parent->d_lock); -list_for_each_entry (dentry, &parent->d_subdirs, d_u.d_child) { +list_for_each_entry (dentry, &parent->d_subdirs, d_child) { dentry->d_fsdata =NULL ;ncp_age_dentry (server, dentry); }
fs/nfs/getroot.c +1 -1
@@ -58,7 +58,7 @@ static int nfs_superblock_set_dummy_root*/ spin_lock (&sb->s_root->d_inode->i_lock);spin_lock (&sb->s_root->d_lock); -hlist_del_init (&sb->s_root->d_alias); +hlist_del_init (&sb->s_root->d_u.d_alias);spin_unlock (&sb->s_root->d_lock);spin_unlock (&sb->s_root->d_inode->i_lock); }
fs/notify/fsnotify.c +2 -2
@@ -63,14 +63,14 @@ void __fsnotify_update_child_dentry_flagspin_lock (&inode->i_lock);/* run all of the dentries associated with this inode. Since this is a * directory, there damn well better only be one item on this list */ -hlist_for_each_entry (alias, &inode->i_dentry, d_alias) { +hlist_for_each_entry (alias, &inode->i_dentry, d_u.d_alias) {struct dentry *child;/* run all of the children of the original inode and fix their * d_flags to indicate parental interest (their parent is the * original inode) */ spin_lock (&alias->d_lock); -list_for_each_entry (child, &alias->d_subdirs, d_u.d_child) { +list_for_each_entry (child, &alias->d_subdirs, d_child) {if (!child->d_inode)continue ;
fs/ocfs2/dcache.c +1 -1
@@ -172,7 +172,7 @@ struct dentry *ocfs2_find_local_alias(ststruct dentry *dentry;spin_lock (&inode->i_lock); -hlist_for_each_entry (dentry, &inode->i_dentry, d_alias) { +hlist_for_each_entry (dentry, &inode->i_dentry, d_u.d_alias) {spin_lock (&dentry->d_lock);if (ocfs2_match_dentry (dentry, parent_blkno, skip_unhashed)) { trace_ocfs2_find_local_alias(dentry->d_name.len,
include/linux/dcache.h +4 -4
@@ -124,15 +124,15 @@ struct dentry {void *d_fsdata;/* fs-specific data */ struct list_head d_lru;/* LRU list */ +struct list_head d_child;/* child of parent list */ +struct list_head d_subdirs;/* our children */ /* -* d_child and d_rcu can share memory +* d_alias and d_rcu can share memory */ union { -struct list_head d_child;/* child of parent list */ +struct hlist_node d_alias;/* inode alias list */ struct rcu_head d_rcu; } d_u; -struct list_head d_subdirs;/* our children */ -struct hlist_node d_alias;/* inode alias list */ };/*
kernel/trace/trace.c +2 -2
@@ -6417,7 +6417,7 @@ static int instance_mkdir (struct inodeint ret;/* Paranoid: Make sure the parent is the "instances" directory */ - parent = hlist_entry(inode->i_dentry.first, struct dentry, d_alias); + parent = hlist_entry(inode->i_dentry.first, struct dentry, d_u.d_alias);if (WARN_ON_ONCE (parent != trace_instance_dir))return -ENOENT ;
@@ -6444,7 +6444,7 @@ static int instance_rmdir(struct inode *int ret;/* Paranoid: Make sure the parent is the "instances" directory */ - parent = hlist_entry(inode->i_dentry.first, struct dentry, d_alias); + parent = hlist_entry(inode->i_dentry.first, struct dentry, d_u.d_alias);if (WARN_ON_ONCE (parent != trace_instance_dir))return -ENOENT ;
kernel/trace/trace_events.c +1 -1
@@ -461,7 +461,7 @@ static void remove_event_file_dir(structif (dir) {spin_lock (&dir->d_lock);/* probably unneeded */ -list_for_each_entry (child, &dir->d_subdirs, d_u.d_child) { +list_for_each_entry (child, &dir->d_subdirs, d_child) {if (child->d_inode)/* probably unneeded */ child->d_inode->i_private =NULL ; }
security/selinux/selinuxfs.c +3 -3
@@ -1200,7 +1200,7 @@ static void sel_remove_entries(struct despin_lock (&de->d_lock); node = de->d_subdirs.next;while (node != &de->d_subdirs) { - struct dentry *d = list_entry(node, struct dentry, d_u.d_child); + struct dentry *d = list_entry(node, struct dentry, d_child);spin_lock_nested (&d->d_lock,DENTRY_D_LOCK_NESTED );list_del_init (node);
@@ -1674,12 +1674,12 @@ static void sel_remove_classes(void)list_for_each (class_node, &class_dir->d_subdirs) {struct dentry *class_subdir =list_entry (class_node, - struct dentry, d_u.d_child); + struct dentry, d_child);struct list_head *class_subdir_node;list_for_each (class_subdir_node, &class_subdir->d_subdirs) {struct dentry *d =list_entry (class_subdir_node, - struct dentry, d_u.d_child); + struct dentry, d_child);if (d->d_inode)if (d->d_inode->i_mode &S_IFDIR )
Re: [PATCH 3.18 15/19] move d_rcu from overlapping d_child to overlapping d_alias
Quoted 10 lines · Greg Kroah-Hartman
3.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Al Viro <[email protected]>
commit
946e51f2bf37f1656916eb75bd0742ba33983c28upstream.Signed-off-by Al Viro <[email protected]>Signed-off-by Greg Kroah-Hartman <[email protected]>
I noticed you don't have this (and the child commit) queued for 3.17.y. The backport wasn't exactly straight-forward because of the d_external stuff, but I took a swing at it. After that, the other commit was a quick cherry-pick.
Al, does the below look correct for a backport on top of 3.17.6? It builds, but I haven't tested it yet.
josh
From: Al Viro <[email protected]>
Date: Sun, 26 Oct 2014 19:19:16 -0400
Subject: [PATCH] move d_rcu from overlapping d_child to overlapping d_alias
--- arch/powerpc/platforms/cell/spufs/inode.c | 2 +- drivers/staging/lustre/lustre/llite/dcache.c | 2 +- drivers/staging/lustre/lustre/llite/llite_lib.c | 2 +- drivers/staging/lustre/lustre/llite/namei.c | 8 ++-- fs/affs/amigaffs.c | 2 +- fs/autofs4/expire.c | 12 +++--- fs/autofs4/root.c | 2 +- fs/ceph/dir.c | 8 ++-- fs/ceph/inode.c | 2 +- fs/cifs/inode.c | 2 +- fs/coda/cache.c | 2 +- fs/dcache.c | 52 ++++++++++++------------- fs/debugfs/inode.c | 2 +- fs/exportfs/expfs.c | 2 +- fs/libfs.c | 12 +++--- fs/ncpfs/dir.c | 2 +- fs/ncpfs/ncplib_kernel.h | 4 +- fs/nfs/getroot.c | 2 +- fs/notify/fsnotify.c | 4 +- fs/ocfs2/dcache.c | 2 +- include/linux/dcache.h | 8 ++-- kernel/trace/trace.c | 4 +- kernel/trace/trace_events.c | 2 +- security/selinux/selinuxfs.c | 6 +-- 24 files changed, 73 insertions(+), 73 deletions(-)
arch/powerpc/platforms/cell/spufs/inode.c +1 -1
@@ -164,7 +164,7 @@ static void spufs_prune_dir(struct dentry *dir)struct dentry *dentry, *tmp;mutex_lock (&dir->d_inode->i_mutex); -list_for_each_entry_safe (dentry, tmp, &dir->d_subdirs, d_u.d_child) { +list_for_each_entry_safe (dentry, tmp, &dir->d_subdirs, d_child) {spin_lock (&dentry->d_lock);if (!(d_unhashed (dentry)) && dentry->d_inode) {dget_dlock (dentry);
drivers/staging/lustre/lustre/llite/dcache.c +1 -1
@@ -258,7 +258,7 @@ void ll_invalidate_aliases(struct inode *inode) inode->i_ino, inode->i_generation, inode);ll_lock_dcache (inode); -ll_d_hlist_for_each_entry (dentry, p, &inode->i_dentry, d_alias) { +ll_d_hlist_for_each_entry (dentry, p, &inode->i_dentry, d_u.d_alias) { CDEBUG(D_DENTRY, "dentry in drop %.*s (%p) parent %p " "inode %p flags %d\n", dentry->d_name.len, dentry->d_name.name, dentry, dentry->d_parent,
drivers/staging/lustre/lustre/llite/llite_lib.c +1 -1
@@ -704,7 +704,7 @@ void lustre_dump_dentry(struct dentry *dentry, int recur)return ;list_for_each (tmp, &dentry->d_subdirs) { - struct dentry *d = list_entry(tmp, struct dentry, d_u.d_child); + struct dentry *d = list_entry(tmp, struct dentry, d_child);lustre_dump_dentry (d, recur -1 ); } }
drivers/staging/lustre/lustre/llite/namei.c +4 -4
@@ -167,14 +167,14 @@ static void ll_invalidate_negative_children(struct inode *dir)struct ll_d_hlist_node *p;ll_lock_dcache (dir); -ll_d_hlist_for_each_entry (dentry, p, &dir->i_dentry, d_alias) { +ll_d_hlist_for_each_entry (dentry, p, &dir->i_dentry, d_u.d_alias) {spin_lock (&dentry->d_lock);if (!list_empty (&dentry->d_subdirs)) {struct dentry *child;list_for_each_entry_safe (child, tmp_subdir, &dentry->d_subdirs, - d_u.d_child) { + d_child) {if (child->d_inode ==NULL )d_lustre_invalidate (child,1 ); }
@@ -362,7 +362,7 @@ static struct dentry *ll_find_alias(struct inode *inode, struct dentry *dentry) discon_alias = invalid_alias =NULL ;ll_lock_dcache (inode); -ll_d_hlist_for_each_entry (alias, p, &inode->i_dentry, d_alias) { +ll_d_hlist_for_each_entry (alias, p, &inode->i_dentry, d_u.d_alias) {LASSERT (alias != dentry);spin_lock (&alias->d_lock);
@@ -943,7 +943,7 @@ static void ll_get_child_fid(struct inode * dir, struct qstr *name, {struct dentry *parent, *child; - parent = ll_d_hlist_entry(dir->i_dentry, struct dentry, d_alias); + parent = ll_d_hlist_entry(dir->i_dentry, struct dentry, d_u.d_alias); child =d_lookup (parent, name);if (child) {if (child->d_inode)
fs/affs/amigaffs.c +1 -1
@@ -127,7 +127,7 @@ affs_fix_dcache(struct inode *inode, u32 entry_ino) {struct dentry *dentry;spin_lock (&inode->i_lock); -hlist_for_each_entry (dentry, &inode->i_dentry, d_alias) { +hlist_for_each_entry (dentry, &inode->i_dentry, d_u.d_alias) {if (entry_ino == (u32 )(long )dentry->d_fsdata) { dentry->d_fsdata = (void *)inode->i_ino;break ;
fs/autofs4/expire.c +6 -6
@@ -91,7 +91,7 @@ static struct dentry *get_next_positive_subdir(struct dentry *prev,spin_lock (&root->d_lock);if (prev) - next = prev->d_u.d_child.next; + next = prev->d_child.next;else { prev =dget_dlock (root); next = prev->d_subdirs.next;
@@ -105,13 +105,13 @@ cont:return NULL ; } - q = list_entry(next, struct dentry, d_u.d_child); + q = list_entry(next, struct dentry, d_child);spin_lock_nested (&q->d_lock,DENTRY_D_LOCK_NESTED );/* Already gone or negative dentry (under construction) - try next */ if (!d_count (q) || !simple_positive (q)) {spin_unlock (&q->d_lock); - next = q->d_u.d_child.next; + next = q->d_child.next; goto cont; }dget_dlock (q);
@@ -161,13 +161,13 @@ again: goto relock; }spin_unlock (&p->d_lock); - next = p->d_u.d_child.next; + next = p->d_child.next; p = parent;if (next != &parent->d_subdirs)break ; } } - ret = list_entry(next, struct dentry, d_u.d_child); + ret = list_entry(next, struct dentry, d_child);spin_lock_nested (&ret->d_lock,DENTRY_D_LOCK_NESTED );/* Negative dentry - try next */
@@ -460,7 +460,7 @@ found:spin_lock (&sbi->lookup_lock);spin_lock (&expired->d_parent->d_lock);spin_lock_nested (&expired->d_lock,DENTRY_D_LOCK_NESTED ); -list_move (&expired->d_parent->d_subdirs, &expired->d_u.d_child); +list_move (&expired->d_parent->d_subdirs, &expired->d_child);spin_unlock (&expired->d_lock);spin_unlock (&expired->d_parent->d_lock);spin_unlock (&sbi->lookup_lock);
fs/autofs4/root.c +1 -1
@@ -659,7 +659,7 @@ static void autofs_clear_leaf_automount_flags(struct dentry *dentry)/* only consider parents below dentrys in the root */ if (IS_ROOT (parent->d_parent))return ; - d_child = &dentry->d_u.d_child; + d_child = &dentry->d_child;/* Set parent managed if it's becoming empty */ if (d_child->next == &parent->d_subdirs && d_child->prev == &parent->d_subdirs)
fs/ceph/dir.c +4 -4
@@ -111,7 +111,7 @@ static int fpos_cmp(loff_t l, loff_t r)/* * When possible, we try to satisfy a readdir by peeking at the * dcache. We make this work by carefully ordering dentries on -* d_u.d_child when we initially get results back from the MDS, and +* d_child when we initially get results back from the MDS, and * falling back to a "normal" sync readdir if any dentries in the dir * are dropped. *
@@ -147,11 +147,11 @@ static int __dcache_readdir(struct file *file, struct dir_context *ctx, p = parent->d_subdirs.prev;dout (" initial p %p/%p\n" , p->prev, p->next); }else { - p = last->d_u.d_child.prev; + p = last->d_child.prev; } more: - dentry = list_entry(p, struct dentry, d_u.d_child); + dentry = list_entry(p, struct dentry, d_child); di =ceph_dentry (dentry);while (1 ) { dout(" p %p/%p %s d_subdirs %p/%p\n", p->prev, p->next,
@@ -174,7 +174,7 @@ more: !dentry->d_inode ? " null" : "");spin_unlock (&dentry->d_lock); p = p->prev; - dentry = list_entry(p, struct dentry, d_u.d_child); + dentry = list_entry(p, struct dentry, d_child); di =ceph_dentry (dentry); }
fs/ceph/inode.c +1 -1
@@ -1399,7 +1399,7 @@ retry_lookup:/* reorder parent's d_subdirs */ spin_lock (&parent->d_lock);spin_lock_nested (&dn->d_lock,DENTRY_D_LOCK_NESTED ); -list_move (&dn->d_u.d_child, &parent->d_subdirs); +list_move (&dn->d_child, &parent->d_subdirs);spin_unlock (&dn->d_lock);spin_unlock (&parent->d_lock); }
fs/cifs/inode.c +1 -1
@@ -887,7 +887,7 @@ inode_has_hashed_dentries(struct inode *inode)struct dentry *dentry;spin_lock (&inode->i_lock); -hlist_for_each_entry (dentry, &inode->i_dentry, d_alias) { +hlist_for_each_entry (dentry, &inode->i_dentry, d_u.d_alias) {if (!d_unhashed (dentry) ||IS_ROOT (dentry)) {spin_unlock (&inode->i_lock);return true;
fs/coda/cache.c +1 -1
@@ -92,7 +92,7 @@ static void coda_flag_children(struct dentry *parent, int flag)struct dentry *de;spin_lock (&parent->d_lock); -list_for_each_entry (de, &parent->d_subdirs, d_u.d_child) { +list_for_each_entry (de, &parent->d_subdirs, d_child) {/* don't know what to do with negative dentries */ if (de->d_inode )coda_flag_inode (de->d_inode, flag);
fs/dcache.c +26 -26
187 lines not on this page · raw message
fs/debugfs/inode.c +1 -1
@@ -553,7 +553,7 @@ void debugfs_remove_recursive(struct dentry *dentry)* use the d_u.d_child as the rcu head and corrupt this list. */ spin_lock (&parent->d_lock); -list_for_each_entry (child, &parent->d_subdirs, d_u.d_child) { +list_for_each_entry (child, &parent->d_subdirs, d_child) {if (!debugfs_positive (child))continue ;
fs/exportfs/expfs.c +1 -1
@@ -50,7 +50,7 @@ find_acceptable_alias(struct dentry *result, inode = result->d_inode;spin_lock (&inode->i_lock); -hlist_for_each_entry (dentry, &inode->i_dentry, d_alias) { +hlist_for_each_entry (dentry, &inode->i_dentry, d_u.d_alias) {dget (dentry);spin_unlock (&inode->i_lock);if (toput)
fs/libfs.c +6 -6
@@ -114,18 +114,18 @@ loff_t dcache_dir_lseek(struct file *file, loff_t offset, int whence)spin_lock (&dentry->d_lock);/* d_lock not required for cursor */ -list_del (&cursor->d_u.d_child); +list_del (&cursor->d_child); p = dentry->d_subdirs.next;while (n && p != &dentry->d_subdirs) {struct dentry *next; - next = list_entry(p, struct dentry, d_u.d_child); + next = list_entry(p, struct dentry, d_child);spin_lock_nested (&next->d_lock,DENTRY_D_LOCK_NESTED );if (simple_positive (next)) n--;spin_unlock (&next->d_lock); p = p->next; } -list_add_tail (&cursor->d_u.d_child, p); +list_add_tail (&cursor->d_child, p);spin_unlock (&dentry->d_lock); } }
@@ -150,7 +150,7 @@ int dcache_readdir(struct file *file, struct dir_context *ctx) {struct dentry *dentry = file->f_path.dentry;struct dentry *cursor = file->private_data; -struct list_head *p, *q = &cursor->d_u.d_child; +struct list_head *p, *q = &cursor->d_child;if (!dir_emit_dots (file, ctx))return 0 ;
@@ -159,7 +159,7 @@ int dcache_readdir(struct file *file, struct dir_context *ctx)list_move (q, &dentry->d_subdirs);for (p = q->next; p != &dentry->d_subdirs; p = p->next) { - struct dentry *next = list_entry(p, struct dentry, d_u.d_child); + struct dentry *next = list_entry(p, struct dentry, d_child);spin_lock_nested (&next->d_lock,DENTRY_D_LOCK_NESTED );if (!simple_positive (next)) {spin_unlock (&next->d_lock);
@@ -287,7 +287,7 @@ int simple_empty(struct dentry *dentry)int ret =0 ;spin_lock (&dentry->d_lock); -list_for_each_entry (child, &dentry->d_subdirs, d_u.d_child) { +list_for_each_entry (child, &dentry->d_subdirs, d_child) {spin_lock_nested (&child->d_lock,DENTRY_D_LOCK_NESTED );if (simple_positive (child)) {spin_unlock (&child->d_lock);
fs/ncpfs/dir.c +1 -1
@@ -406,7 +406,7 @@ ncp_dget_fpos(struct dentry *dentry, struct dentry *parent, unsigned long fpos)spin_lock (&parent->d_lock); next = parent->d_subdirs.next;while (next != &parent->d_subdirs) { - dent = list_entry(next, struct dentry, d_u.d_child); + dent = list_entry(next, struct dentry, d_child);if ((unsigned long )dent->d_fsdata == fpos) {if (dent->d_inode)dget (dent);
fs/ncpfs/ncplib_kernel.h +2 -2
@@ -194,7 +194,7 @@ ncp_renew_dentries(struct dentry *parent)spin_lock (&parent->d_lock); next = parent->d_subdirs.next;while (next != &parent->d_subdirs) { - dentry = list_entry(next, struct dentry, d_u.d_child); + dentry = list_entry(next, struct dentry, d_child);if (dentry->d_fsdata ==NULL )ncp_age_dentry (server, dentry);
@@ -216,7 +216,7 @@ ncp_invalidate_dircache_entries(struct dentry *parent)spin_lock (&parent->d_lock); next = parent->d_subdirs.next;while (next != &parent->d_subdirs) { - dentry = list_entry(next, struct dentry, d_u.d_child); + dentry = list_entry(next, struct dentry, d_child); dentry->d_fsdata =NULL ;ncp_age_dentry (server, dentry); next = next->next;
fs/nfs/getroot.c +1 -1
@@ -58,7 +58,7 @@ static int nfs_superblock_set_dummy_root(struct super_block *sb, struct inode *i*/ spin_lock (&sb->s_root->d_inode->i_lock);spin_lock (&sb->s_root->d_lock); -hlist_del_init (&sb->s_root->d_alias); +hlist_del_init (&sb->s_root->d_u.d_alias);spin_unlock (&sb->s_root->d_lock);spin_unlock (&sb->s_root->d_inode->i_lock); }
fs/notify/fsnotify.c +2 -2
@@ -63,14 +63,14 @@ void __fsnotify_update_child_dentry_flags(struct inode *inode)spin_lock (&inode->i_lock);/* run all of the dentries associated with this inode. Since this is a * directory, there damn well better only be one item on this list */ -hlist_for_each_entry (alias, &inode->i_dentry, d_alias) { +hlist_for_each_entry (alias, &inode->i_dentry, d_u.d_alias) {struct dentry *child;/* run all of the children of the original inode and fix their * d_flags to indicate parental interest (their parent is the * original inode) */ spin_lock (&alias->d_lock); -list_for_each_entry (child, &alias->d_subdirs, d_u.d_child) { +list_for_each_entry (child, &alias->d_subdirs, d_child) {if (!child->d_inode)continue ;
fs/ocfs2/dcache.c +1 -1
@@ -172,7 +172,7 @@ struct dentry *ocfs2_find_local_alias(struct inode *inode,struct dentry *dentry;spin_lock (&inode->i_lock); -hlist_for_each_entry (dentry, &inode->i_dentry, d_alias) { +hlist_for_each_entry (dentry, &inode->i_dentry, d_u.d_alias) {spin_lock (&dentry->d_lock);if (ocfs2_match_dentry (dentry, parent_blkno, skip_unhashed)) { trace_ocfs2_find_local_alias(dentry->d_name.len,
include/linux/dcache.h +4 -4
@@ -125,15 +125,15 @@ struct dentry {void *d_fsdata;/* fs-specific data */ struct list_head d_lru;/* LRU list */ +struct list_head d_child;/* child of parent list */ +struct list_head d_subdirs;/* our children */ /* -* d_child and d_rcu can share memory +* d_alias and d_rcu can share memory */ union { -struct list_head d_child;/* child of parent list */ +struct hlist_node d_alias;/* inode alias list */ struct rcu_head d_rcu; } d_u; -struct list_head d_subdirs;/* our children */ -struct hlist_node d_alias;/* inode alias list */ };/*
kernel/trace/trace.c +2 -2
@@ -6411,7 +6411,7 @@ static int instance_mkdir (struct inode *inode, struct dentry *dentry, umode_t mint ret;/* Paranoid: Make sure the parent is the "instances" directory */ - parent = hlist_entry(inode->i_dentry.first, struct dentry, d_alias); + parent = hlist_entry(inode->i_dentry.first, struct dentry, d_u.d_alias);if (WARN_ON_ONCE (parent != trace_instance_dir))return -ENOENT ;
@@ -6438,7 +6438,7 @@ static int instance_rmdir(struct inode *inode, struct dentry *dentry)int ret;/* Paranoid: Make sure the parent is the "instances" directory */ - parent = hlist_entry(inode->i_dentry.first, struct dentry, d_alias); + parent = hlist_entry(inode->i_dentry.first, struct dentry, d_u.d_alias);if (WARN_ON_ONCE (parent != trace_instance_dir))return -ENOENT ;
kernel/trace/trace_events.c +1 -1
@@ -461,7 +461,7 @@ static void remove_event_file_dir(struct ftrace_event_file *file)if (dir) {spin_lock (&dir->d_lock);/* probably unneeded */ -list_for_each_entry (child, &dir->d_subdirs, d_u.d_child) { +list_for_each_entry (child, &dir->d_subdirs, d_child) {if (child->d_inode)/* probably unneeded */ child->d_inode->i_private =NULL ; }
security/selinux/selinuxfs.c +3 -3
@@ -1200,7 +1200,7 @@ static void sel_remove_entries(struct dentry *de)spin_lock (&de->d_lock); node = de->d_subdirs.next;while (node != &de->d_subdirs) { - struct dentry *d = list_entry(node, struct dentry, d_u.d_child); + struct dentry *d = list_entry(node, struct dentry, d_child);spin_lock_nested (&d->d_lock,DENTRY_D_LOCK_NESTED );list_del_init (node);
@@ -1674,12 +1674,12 @@ static void sel_remove_classes(void)list_for_each (class_node, &class_dir->d_subdirs) {struct dentry *class_subdir =list_entry (class_node, - struct dentry, d_u.d_child); + struct dentry, d_child);struct list_head *class_subdir_node;list_for_each (class_subdir_node, &class_subdir->d_subdirs) {struct dentry *d =list_entry (class_subdir_node, - struct dentry, d_u.d_child); + struct dentry, d_child);if (d->d_inode)if (d->d_inode->i_mode &S_IFDIR )
Signature · 1 line
2.1.0
Greg Kroah-Hartman
maintainerRe: [PATCH 3.18 15/19] move d_rcu from overlapping d_child to overlapping d_alias
Quoted 5 lines · Josh Boyer
Quoted 4 lines · Greg Kroah-Hartman
3.18-stable review patch. If anyone has any objections, please let me know.
------------------
Quoted 8 lines
Quoted 6 lines
From: Al Viro <[email protected]>
commit
946e51f2bf37f1656916eb75bd0742ba33983c28upstream.Signed-off-by Al Viro <[email protected]>Signed-off-by Greg Kroah-Hartman <[email protected]>I noticed you don't have this (and the child commit) queued for 3.17.y.
That is because:
Quoted 3 lines
The backport wasn't exactly straight-forward because of the
d_externalstuff, but I took a swing at it. After that, the other commit was a quick cherry-pick.
It wasn't a "simple" backport, and I didn't have the time. I'm also going to drop 3.17 real-soon-now.
Quoted 2 lines
Al, does the below look correct for a backport on top of 3.17.6? It builds, but I haven't tested it yet.
Testing would be great to do :)
thanks,
greg k-h
Re: [PATCH 3.18 15/19] move d_rcu from overlapping d_child to overlapping d_alias
Quoted 15 lines · Greg Kroah-Hartman
Quoted 5 lines · Josh Boyer
Quoted 4 lines · Greg Kroah-Hartman
3.18-stable review patch. If anyone has any objections, please let me know.
------------------
Quoted 8 lines
Quoted 6 lines
From: Al Viro <[email protected]>
commit
946e51f2bf37f1656916eb75bd0742ba33983c28upstream.Signed-off-by Al Viro <[email protected]>Signed-off-by Greg Kroah-Hartman <[email protected]>I noticed you don't have this (and the child commit) queued for 3.17.y.
Quoted 8 lines
That is because:
Quoted 3 lines
The backport wasn't exactly straight-forward because of the
d_externalstuff, but I took a swing at it. After that, the other commit was a quick cherry-pick.It wasn't a "simple" backport, and I didn't have the time. I'm also going to drop 3.17 real-soon-now.
Right, figured. Fedora isn't going to rebase the stable releases to 3.18 until 3.18.2-ish, and this fixes an issue so I thought I'd give it a try.
Quoted 4 lines
Quoted 2 lines
Al, does the below look correct for a backport on top of 3.17.6? It builds, but I haven't tested it yet.
Testing would be great to do :)
Working on it. Just wanted to send it out early in case Al spotted something obviously wrong and wanted to yell at me for it.
josh
Re: [PATCH 3.18 15/19] move d_rcu from overlapping d_child to overlapping d_alias
Quoted 30 lines · Josh Boyer
Quoted 15 lines · Greg Kroah-Hartman
Quoted 5 lines · Josh Boyer
Quoted 4 lines · Greg Kroah-Hartman
3.18-stable review patch. If anyone has any objections, please let me know.
------------------
Quoted 8 lines
Quoted 6 lines
From: Al Viro <[email protected]>
commit
946e51f2bf37f1656916eb75bd0742ba33983c28upstream.Signed-off-by Al Viro <[email protected]>Signed-off-by Greg Kroah-Hartman <[email protected]>I noticed you don't have this (and the child commit) queued for 3.17.y.
Quoted 8 lines
That is because:
Quoted 3 lines
The backport wasn't exactly straight-forward because of the
d_externalstuff, but I took a swing at it. After that, the other commit was a quick cherry-pick.It wasn't a "simple" backport, and I didn't have the time. I'm also going to drop 3.17 real-soon-now.
Right, figured. Fedora isn't going to rebase the stable releases to 3.18 until 3.18.2-ish, and this fixes an issue so I thought I'd give it a try.
Quoted 7 lines
Quoted 4 lines
Quoted 2 lines
Al, does the below look correct for a backport on top of 3.17.6? It builds, but I haven't tested it yet.
Testing would be great to do :)
Working on it. Just wanted to send it out early in case Al spotted something obviously wrong and wanted to yell at me for it.
Finally got around to booting it. Something is definitely wrong. Sigh.
josh
Re: [PATCH 3.18 15/19] move d_rcu from overlapping d_child to overlapping d_alias
Quoted 34 lines · Josh Boyer
Quoted 33 lines · Josh Boyer
Quoted 15 lines · Greg Kroah-Hartman
Quoted 5 lines · Josh Boyer
Quoted 4 lines · Greg Kroah-Hartman
3.18-stable review patch. If anyone has any objections, please let me know.
------------------
Quoted 8 lines
Quoted 6 lines
From: Al Viro <[email protected]>
commit
946e51f2bf37f1656916eb75bd0742ba33983c28upstream.Signed-off-by Al Viro <[email protected]>Signed-off-by Greg Kroah-Hartman <[email protected]>I noticed you don't have this (and the child commit) queued for 3.17.y.
Quoted 8 lines
That is because:
Quoted 3 lines
The backport wasn't exactly straight-forward because of the
d_externalstuff, but I took a swing at it. After that, the other commit was a quick cherry-pick.It wasn't a "simple" backport, and I didn't have the time. I'm also going to drop 3.17 real-soon-now.
Right, figured. Fedora isn't going to rebase the stable releases to 3.18 until 3.18.2-ish, and this fixes an issue so I thought I'd give it a try.
Quoted 3 lines
Quoted 2 lines
Al, does the below look correct for a backport on top of 3.17.6? It builds, but I haven't tested it yet.
Quoted 6 lines
Quoted 4 lines
Quoted 1 line
Testing would be great to do :)
Working on it. Just wanted to send it out early in case Al spotted something obviously wrong and wanted to yell at me for it.
Finally got around to booting it. Something is definitely wrong. Sigh.
Start with moving WARN_ON() into dentry_free() (as it's done in mainline and for the same reason)...
Re: [PATCH 3.18 15/19] move d_rcu from overlapping d_child to overlapping d_alias
Quoted 37 lines · Al Viro
Quoted 36 lines · Josh Boyer
Quoted 35 lines · Josh Boyer
Quoted 15 lines · Greg Kroah-Hartman
Quoted 5 lines · Josh Boyer
Quoted 4 lines · Greg Kroah-Hartman
3.18-stable review patch. If anyone has any objections, please let me know.
------------------
Quoted 8 lines
Quoted 6 lines
From: Al Viro <[email protected]>
commit
946e51f2bf37f1656916eb75bd0742ba33983c28upstream.Signed-off-by Al Viro <[email protected]>Signed-off-by Greg Kroah-Hartman <[email protected]>I noticed you don't have this (and the child commit) queued for 3.17.y.
Quoted 8 lines
That is because:
Quoted 3 lines
The backport wasn't exactly straight-forward because of the
d_externalstuff, but I took a swing at it. After that, the other commit was a quick cherry-pick.It wasn't a "simple" backport, and I didn't have the time. I'm also going to drop 3.17 real-soon-now.
Right, figured. Fedora isn't going to rebase the stable releases to 3.18 until 3.18.2-ish, and this fixes an issue so I thought I'd give it a try.
Quoted 4 lines
Quoted 2 lines
Al, does the below look correct for a backport on top of 3.17.6? It builds, but I haven't tested it yet.
Testing would be great to do :)
Quoted 7 lines
Quoted 4 lines
Quoted 2 lines
Working on it. Just wanted to send it out early in case Al spotted something obviously wrong and wanted to yell at me for it.
Finally got around to booting it. Something is definitely wrong. Sigh.
Start with moving
WARN_ON()intodentry_free()(as it's done in mainline and for the same reason)...
Gah, yes. I'd just gotten to that hunk and realized it looked really really wrong. I'll give that a shot.
josh
Re: [PATCH 3.18 15/19] move d_rcu from overlapping d_child to overlapping d_alias
Quoted 41 lines · Josh Boyer
Quoted 40 lines · Al Viro
Quoted 39 lines · Josh Boyer
Quoted 37 lines · Josh Boyer
Quoted 15 lines · Greg Kroah-Hartman
Quoted 5 lines · Josh Boyer
Quoted 4 lines · Greg Kroah-Hartman
3.18-stable review patch. If anyone has any objections, please let me know.
------------------
Quoted 8 lines
Quoted 6 lines
From: Al Viro <[email protected]>
commit
946e51f2bf37f1656916eb75bd0742ba33983c28upstream.Signed-off-by Al Viro <[email protected]>Signed-off-by Greg Kroah-Hartman <[email protected]>I noticed you don't have this (and the child commit) queued for 3.17.y.
Quoted 8 lines
That is because:
Quoted 3 lines
The backport wasn't exactly straight-forward because of the
d_externalstuff, but I took a swing at it. After that, the other commit was a quick cherry-pick.It wasn't a "simple" backport, and I didn't have the time. I'm also going to drop 3.17 real-soon-now.
Right, figured. Fedora isn't going to rebase the stable releases to 3.18 until 3.18.2-ish, and this fixes an issue so I thought I'd give it a try.
Quoted 4 lines
Quoted 2 lines
Al, does the below look correct for a backport on top of 3.17.6? It builds, but I haven't tested it yet.
Testing would be great to do :)
Working on it. Just wanted to send it out early in case Al spotted something obviously wrong and wanted to yell at me for it.
Quoted 7 lines
Quoted 4 lines
Quoted 1 line
Finally got around to booting it. Something is definitely wrong. Sigh.
Start with moving
WARN_ON()intodentry_free()(as it's done in mainline and for the same reason)...Gah, yes. I'd just gotten to that hunk and realized it looked really really wrong. I'll give that a shot.
OK, that seems to be much better. It boots in a guest and things seem to be operating fine in a light touch test. I'll keep testing it today. Revised patch below.
josh
From: Al Viro <[email protected]>
Date: Sun, 26 Oct 2014 19:19:16 -0400
Subject: [PATCH] move d_rcu from overlapping d_child to overlapping d_alias
commit 946e51f2bf37f1656916eb75bd0742ba33983c28 upstream
--- arch/powerpc/platforms/cell/spufs/inode.c | 2 +- drivers/staging/lustre/lustre/llite/dcache.c | 2 +- drivers/staging/lustre/lustre/llite/llite_lib.c | 2 +- drivers/staging/lustre/lustre/llite/namei.c | 8 ++-- fs/affs/amigaffs.c | 2 +- fs/autofs4/expire.c | 12 +++--- fs/autofs4/root.c | 2 +- fs/ceph/dir.c | 8 ++-- fs/ceph/inode.c | 2 +- fs/cifs/inode.c | 2 +- fs/coda/cache.c | 2 +- fs/dcache.c | 52 ++++++++++++------------- fs/debugfs/inode.c | 2 +- fs/exportfs/expfs.c | 2 +- fs/libfs.c | 12 +++--- fs/ncpfs/dir.c | 2 +- fs/ncpfs/ncplib_kernel.h | 4 +- fs/nfs/getroot.c | 2 +- fs/notify/fsnotify.c | 4 +- fs/ocfs2/dcache.c | 2 +- include/linux/dcache.h | 8 ++-- kernel/trace/trace.c | 4 +- kernel/trace/trace_events.c | 2 +- security/selinux/selinuxfs.c | 6 +-- 24 files changed, 73 insertions(+), 73 deletions(-)
arch/powerpc/platforms/cell/spufs/inode.c +1 -1
@@ -164,7 +164,7 @@ static void spufs_prune_dir(struct dentry *dir)struct dentry *dentry, *tmp;mutex_lock (&dir->d_inode->i_mutex); -list_for_each_entry_safe (dentry, tmp, &dir->d_subdirs, d_u.d_child) { +list_for_each_entry_safe (dentry, tmp, &dir->d_subdirs, d_child) {spin_lock (&dentry->d_lock);if (!(d_unhashed (dentry)) && dentry->d_inode) {dget_dlock (dentry);
drivers/staging/lustre/lustre/llite/dcache.c +1 -1
@@ -258,7 +258,7 @@ void ll_invalidate_aliases(struct inode *inode) inode->i_ino, inode->i_generation, inode);ll_lock_dcache (inode); -ll_d_hlist_for_each_entry (dentry, p, &inode->i_dentry, d_alias) { +ll_d_hlist_for_each_entry (dentry, p, &inode->i_dentry, d_u.d_alias) { CDEBUG(D_DENTRY, "dentry in drop %.*s (%p) parent %p " "inode %p flags %d\n", dentry->d_name.len, dentry->d_name.name, dentry, dentry->d_parent,
drivers/staging/lustre/lustre/llite/llite_lib.c +1 -1
@@ -704,7 +704,7 @@ void lustre_dump_dentry(struct dentry *dentry, int recur)return ;list_for_each (tmp, &dentry->d_subdirs) { - struct dentry *d = list_entry(tmp, struct dentry, d_u.d_child); + struct dentry *d = list_entry(tmp, struct dentry, d_child);lustre_dump_dentry (d, recur -1 ); } }
drivers/staging/lustre/lustre/llite/namei.c +4 -4
@@ -167,14 +167,14 @@ static void ll_invalidate_negative_children(struct inode *dir)struct ll_d_hlist_node *p;ll_lock_dcache (dir); -ll_d_hlist_for_each_entry (dentry, p, &dir->i_dentry, d_alias) { +ll_d_hlist_for_each_entry (dentry, p, &dir->i_dentry, d_u.d_alias) {spin_lock (&dentry->d_lock);if (!list_empty (&dentry->d_subdirs)) {struct dentry *child;list_for_each_entry_safe (child, tmp_subdir, &dentry->d_subdirs, - d_u.d_child) { + d_child) {if (child->d_inode ==NULL )d_lustre_invalidate (child,1 ); }
@@ -362,7 +362,7 @@ static struct dentry *ll_find_alias(struct inode *inode, struct dentry *dentry) discon_alias = invalid_alias =NULL ;ll_lock_dcache (inode); -ll_d_hlist_for_each_entry (alias, p, &inode->i_dentry, d_alias) { +ll_d_hlist_for_each_entry (alias, p, &inode->i_dentry, d_u.d_alias) {LASSERT (alias != dentry);spin_lock (&alias->d_lock);
@@ -943,7 +943,7 @@ static void ll_get_child_fid(struct inode * dir, struct qstr *name, {struct dentry *parent, *child; - parent = ll_d_hlist_entry(dir->i_dentry, struct dentry, d_alias); + parent = ll_d_hlist_entry(dir->i_dentry, struct dentry, d_u.d_alias); child =d_lookup (parent, name);if (child) {if (child->d_inode)
fs/affs/amigaffs.c +1 -1
@@ -127,7 +127,7 @@ affs_fix_dcache(struct inode *inode, u32 entry_ino) {struct dentry *dentry;spin_lock (&inode->i_lock); -hlist_for_each_entry (dentry, &inode->i_dentry, d_alias) { +hlist_for_each_entry (dentry, &inode->i_dentry, d_u.d_alias) {if (entry_ino == (u32 )(long )dentry->d_fsdata) { dentry->d_fsdata = (void *)inode->i_ino;break ;
fs/autofs4/expire.c +6 -6
@@ -91,7 +91,7 @@ static struct dentry *get_next_positive_subdir(struct dentry *prev,spin_lock (&root->d_lock);if (prev) - next = prev->d_u.d_child.next; + next = prev->d_child.next;else { prev =dget_dlock (root); next = prev->d_subdirs.next;
@@ -105,13 +105,13 @@ cont:return NULL ; } - q = list_entry(next, struct dentry, d_u.d_child); + q = list_entry(next, struct dentry, d_child);spin_lock_nested (&q->d_lock,DENTRY_D_LOCK_NESTED );/* Already gone or negative dentry (under construction) - try next */ if (!d_count (q) || !simple_positive (q)) {spin_unlock (&q->d_lock); - next = q->d_u.d_child.next; + next = q->d_child.next; goto cont; }dget_dlock (q);
@@ -161,13 +161,13 @@ again: goto relock; }spin_unlock (&p->d_lock); - next = p->d_u.d_child.next; + next = p->d_child.next; p = parent;if (next != &parent->d_subdirs)break ; } } - ret = list_entry(next, struct dentry, d_u.d_child); + ret = list_entry(next, struct dentry, d_child);spin_lock_nested (&ret->d_lock,DENTRY_D_LOCK_NESTED );/* Negative dentry - try next */
@@ -460,7 +460,7 @@ found:spin_lock (&sbi->lookup_lock);spin_lock (&expired->d_parent->d_lock);spin_lock_nested (&expired->d_lock,DENTRY_D_LOCK_NESTED ); -list_move (&expired->d_parent->d_subdirs, &expired->d_u.d_child); +list_move (&expired->d_parent->d_subdirs, &expired->d_child);spin_unlock (&expired->d_lock);spin_unlock (&expired->d_parent->d_lock);spin_unlock (&sbi->lookup_lock);
fs/autofs4/root.c +1 -1
@@ -659,7 +659,7 @@ static void autofs_clear_leaf_automount_flags(struct dentry *dentry)/* only consider parents below dentrys in the root */ if (IS_ROOT (parent->d_parent))return ; - d_child = &dentry->d_u.d_child; + d_child = &dentry->d_child;/* Set parent managed if it's becoming empty */ if (d_child->next == &parent->d_subdirs && d_child->prev == &parent->d_subdirs)
fs/ceph/dir.c +4 -4
@@ -111,7 +111,7 @@ static int fpos_cmp(loff_t l, loff_t r)/* * When possible, we try to satisfy a readdir by peeking at the * dcache. We make this work by carefully ordering dentries on -* d_u.d_child when we initially get results back from the MDS, and +* d_child when we initially get results back from the MDS, and * falling back to a "normal" sync readdir if any dentries in the dir * are dropped. *
@@ -147,11 +147,11 @@ static int __dcache_readdir(struct file *file, struct dir_context *ctx, p = parent->d_subdirs.prev;dout (" initial p %p/%p\n" , p->prev, p->next); }else { - p = last->d_u.d_child.prev; + p = last->d_child.prev; } more: - dentry = list_entry(p, struct dentry, d_u.d_child); + dentry = list_entry(p, struct dentry, d_child); di =ceph_dentry (dentry);while (1 ) { dout(" p %p/%p %s d_subdirs %p/%p\n", p->prev, p->next,
@@ -174,7 +174,7 @@ more: !dentry->d_inode ? " null" : "");spin_unlock (&dentry->d_lock); p = p->prev; - dentry = list_entry(p, struct dentry, d_u.d_child); + dentry = list_entry(p, struct dentry, d_child); di =ceph_dentry (dentry); }
fs/ceph/inode.c +1 -1
@@ -1399,7 +1399,7 @@ retry_lookup:/* reorder parent's d_subdirs */ spin_lock (&parent->d_lock);spin_lock_nested (&dn->d_lock,DENTRY_D_LOCK_NESTED ); -list_move (&dn->d_u.d_child, &parent->d_subdirs); +list_move (&dn->d_child, &parent->d_subdirs);spin_unlock (&dn->d_lock);spin_unlock (&parent->d_lock); }
fs/cifs/inode.c +1 -1
@@ -887,7 +887,7 @@ inode_has_hashed_dentries(struct inode *inode)struct dentry *dentry;spin_lock (&inode->i_lock); -hlist_for_each_entry (dentry, &inode->i_dentry, d_alias) { +hlist_for_each_entry (dentry, &inode->i_dentry, d_u.d_alias) {if (!d_unhashed (dentry) ||IS_ROOT (dentry)) {spin_unlock (&inode->i_lock);return true;
fs/coda/cache.c +1 -1
@@ -92,7 +92,7 @@ static void coda_flag_children(struct dentry *parent, int flag)struct dentry *de;spin_lock (&parent->d_lock); -list_for_each_entry (de, &parent->d_subdirs, d_u.d_child) { +list_for_each_entry (de, &parent->d_subdirs, d_child) {/* don't know what to do with negative dentries */ if (de->d_inode )coda_flag_inode (de->d_inode, flag);
fs/dcache.c +26 -26
193 lines not on this page · raw message
fs/debugfs/inode.c +1 -1
@@ -553,7 +553,7 @@ void debugfs_remove_recursive(struct dentry *dentry)* use the d_u.d_child as the rcu head and corrupt this list. */ spin_lock (&parent->d_lock); -list_for_each_entry (child, &parent->d_subdirs, d_u.d_child) { +list_for_each_entry (child, &parent->d_subdirs, d_child) {if (!debugfs_positive (child))continue ;
fs/exportfs/expfs.c +1 -1
@@ -50,7 +50,7 @@ find_acceptable_alias(struct dentry *result, inode = result->d_inode;spin_lock (&inode->i_lock); -hlist_for_each_entry (dentry, &inode->i_dentry, d_alias) { +hlist_for_each_entry (dentry, &inode->i_dentry, d_u.d_alias) {dget (dentry);spin_unlock (&inode->i_lock);if (toput)
fs/libfs.c +6 -6
@@ -114,18 +114,18 @@ loff_t dcache_dir_lseek(struct file *file, loff_t offset, int whence)spin_lock (&dentry->d_lock);/* d_lock not required for cursor */ -list_del (&cursor->d_u.d_child); +list_del (&cursor->d_child); p = dentry->d_subdirs.next;while (n && p != &dentry->d_subdirs) {struct dentry *next; - next = list_entry(p, struct dentry, d_u.d_child); + next = list_entry(p, struct dentry, d_child);spin_lock_nested (&next->d_lock,DENTRY_D_LOCK_NESTED );if (simple_positive (next)) n--;spin_unlock (&next->d_lock); p = p->next; } -list_add_tail (&cursor->d_u.d_child, p); +list_add_tail (&cursor->d_child, p);spin_unlock (&dentry->d_lock); } }
@@ -150,7 +150,7 @@ int dcache_readdir(struct file *file, struct dir_context *ctx) {struct dentry *dentry = file->f_path.dentry;struct dentry *cursor = file->private_data; -struct list_head *p, *q = &cursor->d_u.d_child; +struct list_head *p, *q = &cursor->d_child;if (!dir_emit_dots (file, ctx))return 0 ;
@@ -159,7 +159,7 @@ int dcache_readdir(struct file *file, struct dir_context *ctx)list_move (q, &dentry->d_subdirs);for (p = q->next; p != &dentry->d_subdirs; p = p->next) { - struct dentry *next = list_entry(p, struct dentry, d_u.d_child); + struct dentry *next = list_entry(p, struct dentry, d_child);spin_lock_nested (&next->d_lock,DENTRY_D_LOCK_NESTED );if (!simple_positive (next)) {spin_unlock (&next->d_lock);
@@ -287,7 +287,7 @@ int simple_empty(struct dentry *dentry)int ret =0 ;spin_lock (&dentry->d_lock); -list_for_each_entry (child, &dentry->d_subdirs, d_u.d_child) { +list_for_each_entry (child, &dentry->d_subdirs, d_child) {spin_lock_nested (&child->d_lock,DENTRY_D_LOCK_NESTED );if (simple_positive (child)) {spin_unlock (&child->d_lock);
fs/ncpfs/dir.c +1 -1
@@ -406,7 +406,7 @@ ncp_dget_fpos(struct dentry *dentry, struct dentry *parent, unsigned long fpos)spin_lock (&parent->d_lock); next = parent->d_subdirs.next;while (next != &parent->d_subdirs) { - dent = list_entry(next, struct dentry, d_u.d_child); + dent = list_entry(next, struct dentry, d_child);if ((unsigned long )dent->d_fsdata == fpos) {if (dent->d_inode)dget (dent);
fs/ncpfs/ncplib_kernel.h +2 -2
@@ -194,7 +194,7 @@ ncp_renew_dentries(struct dentry *parent)spin_lock (&parent->d_lock); next = parent->d_subdirs.next;while (next != &parent->d_subdirs) { - dentry = list_entry(next, struct dentry, d_u.d_child); + dentry = list_entry(next, struct dentry, d_child);if (dentry->d_fsdata ==NULL )ncp_age_dentry (server, dentry);
@@ -216,7 +216,7 @@ ncp_invalidate_dircache_entries(struct dentry *parent)spin_lock (&parent->d_lock); next = parent->d_subdirs.next;while (next != &parent->d_subdirs) { - dentry = list_entry(next, struct dentry, d_u.d_child); + dentry = list_entry(next, struct dentry, d_child); dentry->d_fsdata =NULL ;ncp_age_dentry (server, dentry); next = next->next;
fs/nfs/getroot.c +1 -1
@@ -58,7 +58,7 @@ static int nfs_superblock_set_dummy_root(struct super_block *sb, struct inode *i*/ spin_lock (&sb->s_root->d_inode->i_lock);spin_lock (&sb->s_root->d_lock); -hlist_del_init (&sb->s_root->d_alias); +hlist_del_init (&sb->s_root->d_u.d_alias);spin_unlock (&sb->s_root->d_lock);spin_unlock (&sb->s_root->d_inode->i_lock); }
fs/notify/fsnotify.c +2 -2
@@ -63,14 +63,14 @@ void __fsnotify_update_child_dentry_flags(struct inode *inode)spin_lock (&inode->i_lock);/* run all of the dentries associated with this inode. Since this is a * directory, there damn well better only be one item on this list */ -hlist_for_each_entry (alias, &inode->i_dentry, d_alias) { +hlist_for_each_entry (alias, &inode->i_dentry, d_u.d_alias) {struct dentry *child;/* run all of the children of the original inode and fix their * d_flags to indicate parental interest (their parent is the * original inode) */ spin_lock (&alias->d_lock); -list_for_each_entry (child, &alias->d_subdirs, d_u.d_child) { +list_for_each_entry (child, &alias->d_subdirs, d_child) {if (!child->d_inode)continue ;
fs/ocfs2/dcache.c +1 -1
@@ -172,7 +172,7 @@ struct dentry *ocfs2_find_local_alias(struct inode *inode,struct dentry *dentry;spin_lock (&inode->i_lock); -hlist_for_each_entry (dentry, &inode->i_dentry, d_alias) { +hlist_for_each_entry (dentry, &inode->i_dentry, d_u.d_alias) {spin_lock (&dentry->d_lock);if (ocfs2_match_dentry (dentry, parent_blkno, skip_unhashed)) { trace_ocfs2_find_local_alias(dentry->d_name.len,
include/linux/dcache.h +4 -4
@@ -125,15 +125,15 @@ struct dentry {void *d_fsdata;/* fs-specific data */ struct list_head d_lru;/* LRU list */ +struct list_head d_child;/* child of parent list */ +struct list_head d_subdirs;/* our children */ /* -* d_child and d_rcu can share memory +* d_alias and d_rcu can share memory */ union { -struct list_head d_child;/* child of parent list */ +struct hlist_node d_alias;/* inode alias list */ struct rcu_head d_rcu; } d_u; -struct list_head d_subdirs;/* our children */ -struct hlist_node d_alias;/* inode alias list */ };/*
kernel/trace/trace.c +2 -2
@@ -6411,7 +6411,7 @@ static int instance_mkdir (struct inode *inode, struct dentry *dentry, umode_t mint ret;/* Paranoid: Make sure the parent is the "instances" directory */ - parent = hlist_entry(inode->i_dentry.first, struct dentry, d_alias); + parent = hlist_entry(inode->i_dentry.first, struct dentry, d_u.d_alias);if (WARN_ON_ONCE (parent != trace_instance_dir))return -ENOENT ;
@@ -6438,7 +6438,7 @@ static int instance_rmdir(struct inode *inode, struct dentry *dentry)int ret;/* Paranoid: Make sure the parent is the "instances" directory */ - parent = hlist_entry(inode->i_dentry.first, struct dentry, d_alias); + parent = hlist_entry(inode->i_dentry.first, struct dentry, d_u.d_alias);if (WARN_ON_ONCE (parent != trace_instance_dir))return -ENOENT ;
kernel/trace/trace_events.c +1 -1
@@ -461,7 +461,7 @@ static void remove_event_file_dir(struct ftrace_event_file *file)if (dir) {spin_lock (&dir->d_lock);/* probably unneeded */ -list_for_each_entry (child, &dir->d_subdirs, d_u.d_child) { +list_for_each_entry (child, &dir->d_subdirs, d_child) {if (child->d_inode)/* probably unneeded */ child->d_inode->i_private =NULL ; }
security/selinux/selinuxfs.c +3 -3
@@ -1200,7 +1200,7 @@ static void sel_remove_entries(struct dentry *de)spin_lock (&de->d_lock); node = de->d_subdirs.next;while (node != &de->d_subdirs) { - struct dentry *d = list_entry(node, struct dentry, d_u.d_child); + struct dentry *d = list_entry(node, struct dentry, d_child);spin_lock_nested (&d->d_lock,DENTRY_D_LOCK_NESTED );list_del_init (node);
@@ -1674,12 +1674,12 @@ static void sel_remove_classes(void)list_for_each (class_node, &class_dir->d_subdirs) {struct dentry *class_subdir =list_entry (class_node, - struct dentry, d_u.d_child); + struct dentry, d_child);struct list_head *class_subdir_node;list_for_each (class_subdir_node, &class_subdir->d_subdirs) {struct dentry *d =list_entry (class_subdir_node, - struct dentry, d_u.d_child); + struct dentry, d_child);if (d->d_inode)if (d->d_inode->i_mode &S_IFDIR )
Signature · 1 line
2.1.0
Re: [PATCH 3.18 15/19] move d_rcu from overlapping d_child to overlapping d_alias
In reply to Josh BoyerQuoted 12 lines · Josh Boyer
Quoted 10 lines · Greg Kroah-Hartman
3.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Al Viro <[email protected]>
commit
946e51f2bf37f1656916eb75bd0742ba33983c28upstream.Signed-off-by Al Viro <[email protected]>Signed-off-by Greg Kroah-Hartman <[email protected]>
Quoted 7 lines
I noticed you don't have this (and the child commit) queued for 3.17.y. The backport wasn't exactly straight-forward because of the
d_externalstuff, but I took a swing at it. After that, the other commit was a quick cherry-pick.Al, does the below look correct for a backport on top of 3.17.6? It builds, but I haven't tested it yet.
- WARN_ON(!hlist_unhashed(&dentry->d_alias));
+ WARN_ON(!hlist_unhashed(&dentry->d_u.d_alias));
i
in __d_free() is definitely *not* correct - where do you think has __d_free address come from? Right, dentry->d_u.d_rcu.func... Those checks belong in dentry_free(), before call_rcu() is called...
Greg Kroah-Hartman
maintainerPATCH 16/19 deal with deadlock in d_walk()
In reply to Greg Kroah-Hartman3.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Al Viro <[email protected]>
commit ca5358ef75fc69fee5322a38a340f5739d997c10 upstream.
... by not hitting rename_retry for reasons other than rename having happened. In other words, do _not_ restart when finding that between unlocking the child and locking the parent the former got into __dentry_kill(). Skip the killed siblings instead...
--- fs/dcache.c | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-)
fs/dcache.c +16 -15
@@ -495,7 +495,7 @@ static void __dentry_kill(struct dentry }/* if it was on the hash then remove it */ __d_drop (dentry); -list_del (&dentry->d_child); +__list_del_entry (&dentry->d_child);/* * Inform d_walk() that we are no longer attached to the * dentry tree
@@ -1082,33 +1082,31 @@ resume:/* * All done at this level ... ascend and resume the search. */ +rcu_read_lock (); +ascend:if (this_parent != parent) {struct dentry *child = this_parent; this_parent = child->d_parent; -rcu_read_lock ();spin_unlock (&child->d_lock);spin_lock (&this_parent->d_lock); -/* -* might go back up the wrong parent if we have had a rename -* or deletion -*/ -if (this_parent != child->d_parent || - (child->d_flags &DCACHE_DENTRY_KILLED ) || -need_seqretry (&rename_lock, seq)) { -spin_unlock (&this_parent->d_lock); -rcu_read_unlock (); +/* might go back up the wrong parent if we have had a rename. */ +if (need_seqretry (&rename_lock, seq)) goto rename_retry; + next = child->d_child.next; +while (unlikely (child->d_flags &DCACHE_DENTRY_KILLED )) { +if (next == &this_parent->d_subdirs) + goto ascend; + child = list_entry(next, struct dentry, d_child); + next = next->next; }rcu_read_unlock (); - next = child->d_child.next; goto resume; } -if (need_seqretry (&rename_lock, seq)) { -spin_unlock (&this_parent->d_lock); +if (need_seqretry (&rename_lock, seq)) goto rename_retry; - } +rcu_read_unlock ();if (finish)finish (data);
@@ -1118,6 +1116,9 @@ out_unlock:return ; rename_retry: +spin_unlock (&this_parent->d_lock); +rcu_read_unlock (); +BUG_ON (seq &1 );if (!retry)return ; seq =1 ;
Greg Kroah-Hartman
maintainerPATCH 17/19 ALSA: hda - Add EAPD fixup for ASUS Z99He laptop
In reply to Greg Kroah-Hartman3.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
commit f62f5eff3d40a56ad1cf0d81a6cac8dd8743e8a1 upstream.
The same fixup to enable EAPD is needed for ASUS Z99He with AD1986A codec like another ASUS machine.
--- sound/pci/hda/patch_analog.c | 1 + 1 file changed, 1 insertion(+)
sound/pci/hda/patch_analog.c +1 -0
@@ -332,6 +332,7 @@ static const struct hda_fixup ad1986a_fistatic const struct snd_pci_quirk ad1986a_fixup_tbl[] = {SND_PCI_QUIRK (0x103c ,0x30af ,"HP B2800" ,AD1986A_FIXUP_LAPTOP_IMIC ), +SND_PCI_QUIRK (0x1043 ,0x1443 ,"ASUS Z99He" ,AD1986A_FIXUP_EAPD ),SND_PCI_QUIRK (0x1043 ,0x1447 ,"ASUS A8JN" ,AD1986A_FIXUP_EAPD ),SND_PCI_QUIRK_MASK (0x1043 ,0xff00 ,0x8100 ,"ASUS P5" ,AD1986A_FIXUP_3STACK ),SND_PCI_QUIRK_MASK (0x1043 ,0xff00 ,0x8200 ,"ASUS M2" ,AD1986A_FIXUP_3STACK ),
Greg Kroah-Hartman
maintainerPATCH 18/19 ALSA: hda - Fix built-in mic at resume on Lenovo Ideapad S210
In reply to Greg Kroah-Hartman3.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
commit fedb2245cbb8d823e449ebdd48ba9bb35c071ce0 upstream.
The built-in mic boost volume gets almost muted after suspend/resume on Lenovo Ideapad S210.
Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=88121
--- sound/pci/hda/patch_realtek.c | 1 + 1 file changed, 1 insertion(+)
sound/pci/hda/patch_realtek.c +1 -0
@@ -4887,6 +4887,7 @@ static const struct snd_pci_quirk alc269SND_PCI_QUIRK (0x17aa ,0x2212 ,"Thinkpad T440" ,ALC292_FIXUP_TPT440_DOCK ),SND_PCI_QUIRK (0x17aa ,0x2214 ,"Thinkpad X240" ,ALC292_FIXUP_TPT440_DOCK ),SND_PCI_QUIRK (0x17aa ,0x2215 ,"Thinkpad" ,ALC269_FIXUP_LIMIT_INT_MIC_BOOST ), +SND_PCI_QUIRK (0x17aa ,0x3977 ,"IdeaPad S210" ,ALC283_FIXUP_INT_MIC ),SND_PCI_QUIRK (0x17aa ,0x3978 ,"IdeaPad Y410P" ,ALC269_FIXUP_NO_SHUTUP ),SND_PCI_QUIRK (0x17aa ,0x5013 ,"Thinkpad" ,ALC269_FIXUP_LIMIT_INT_MIC_BOOST ), SND_PCI_QUIRK(0x17aa, 0x501a, "Thinkpad", ALC283_FIXUP_INT_MIC),
Greg Kroah-Hartman
maintainerPATCH 19/19 ALSA: usb-audio: Dont resubmit pending URBs at MIDI error recovery
In reply to Greg Kroah-Hartman3.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
commit 66139a48cee1530c91f37c145384b4ee7043f0b7 upstream.
In snd_usbmidi_error_timer(), the driver tries to resubmit MIDI input URBs to reactivate the MIDI stream, but this causes the error when some of URBs are still pending like:
WARNING: CPU: 0 PID: 0 at ../drivers/usb/core/urb.c:339 usb_submit_urb+0x5f/0x70() URB ef705c40 submitted while active CPU: 0 PID: 0 Comm: swapper/0 Not tainted 3.16.6-2-desktop #1 Hardware name: FOXCONN TPS01/TPS01, BIOS 080015 03/23/2010 c0984bfa f4009ed4 c078deaf f4009ee4 c024c884 c09a135c f4009f00 00000000 c0984bfa 00000153 c061ac4f c061ac4f 00000009 00000001 ef705c40 e854d1c0 f4009eec c024c8d3 00000009 f4009ee4 c09a135c f4009f00 f4009f04 c061ac4f Call Trace: [<c0205df6>] try_stack_unwind+0x156/0x170 [<c020482a>] dump_trace+0x5a/0x1b0 [<c0205e56>] show_trace_log_lvl+0x46/0x50 [<c02049d1>] show_stack_log_lvl+0x51/0xe0 [<c0205eb7>] show_stack+0x27/0x50 [<c078deaf>] dump_stack+0x45/0x65 [<c024c884>] warn_slowpath_common+0x84/0xa0 [<c024c8d3>] warn_slowpath_fmt+0x33/0x40 [<c061ac4f>] usb_submit_urb+0x5f/0x70 [<f7974104>] snd_usbmidi_submit_urb+0x14/0x60 [snd_usbmidi_lib] [<f797483a>] snd_usbmidi_error_timer+0x6a/0xa0 [snd_usbmidi_lib] [<c02570c0>] call_timer_fn+0x30/0x130 [<c0257442>] run_timer_softirq+0x1c2/0x260 [<c0251493>] __do_softirq+0xc3/0x270 [<c0204732>] do_softirq_own_stack+0x22/0x30 [<c025186d>] irq_exit+0x8d/0xa0 [<c0795228>] smp_apic_timer_interrupt+0x38/0x50 [<c0794a3c>] apic_timer_interrupt+0x34/0x3c [<c0673d9e>] cpuidle_enter_state+0x3e/0xd0 [<c028bb8d>] cpu_idle_loop+0x29d/0x3e0 [<c028bd23>] cpu_startup_entry+0x53/0x60 [<c0bfac1e>] start_kernel+0x415/0x41a
For avoiding these errors, check the pending URBs and skip resubmitting such ones.
--- sound/usb/midi.c | 2 ++ 1 file changed, 2 insertions(+)
sound/usb/midi.c +2 -0
@@ -365,6 +365,8 @@ static void snd_usbmidi_error_timer(unsiif (in && in->error_resubmit) { in->error_resubmit =0 ;for (j =0 ; j <INPUT_URBS ; ++j) { +if (atomic_read (&in->urbs[j]->use_count)) +continue ; in->urbs[j]->dev = umidi->dev;snd_usbmidi_submit_urb (in->urbs[j],GFP_ATOMIC ); }
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 3.18.1 release. There are 19 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Tue Dec 16 20:18:16 UTC 2014. Anything received after that time might be too late.
Build results:
total: 133 pass: 133 fail: 0
Qemu tests:
total: 30 pass: 30 fail: 0
Details are available at http://server.roeck-us.net:8010/builders.
Guenter
Greg Kroah-Hartman
maintainerQuoted 10 lines · Guenter Roeck
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 3.18.1 release. There are 19 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Tue Dec 16 20:18:16 UTC 2014. Anything received after that time might be too late.
Quoted 7 lines
Build results:
total: 133 pass: 133 fail: 0Qemu tests:
total: 30 pass: 30 fail: 0Details are available at http://server.roeck-us.net:8010/builders.
Thanks for testing and letting me know about all of these.
greg k-h
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 3.18.1 release. There are 19 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Tue Dec 16 20:18:16 UTC 2014. Anything received after that time might be too late.
Quoted 8 lines
The whole patch series can be found in one patch at:
kernel.org/pub/linux/kernel/v3.0/stable-review/patch-3.18.1-rc1.gzand the diffstat can be found below.
thanks,
greg k-h
Compiled and booted on my test system. No dmesg regressions.
-- Shuah
Signature · 5 lines
Shuah Khan Sr. Linux Kernel Developer Samsung Open Source Group Samsung Research America (Silicon Valley) [email protected] | (970) 217-8978
Greg Kroah-Hartman
maintainerQuoted 13 lines · Shuah Khan
Quoted 12 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 3.18.1 release. There are 19 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Tue Dec 16 20:18:16 UTC 2014. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
kernel.org/pub/linux/kernel/v3.0/stable-review/patch-3.18.1-rc1.gzand the diffstat can be found below.
Quoted 6 lines
Quoted 4 lines
thanks,
greg k-h
Compiled and booted on my test system. No dmesg regressions.
Thanks for testing all 4 of these and letting me know.
greg k-h