From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id AE154C433EF for ; Fri, 15 Oct 2021 05:06:10 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id 32882611C2 for ; Fri, 15 Oct 2021 05:06:10 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org 32882611C2 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=kvack.org Received: by kanga.kvack.org (Postfix) id A05B0900002; Fri, 15 Oct 2021 01:06:09 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 9B59C6B0071; Fri, 15 Oct 2021 01:06:09 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 87CE4900002; Fri, 15 Oct 2021 01:06:09 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0022.hostedemail.com [216.40.44.22]) by kanga.kvack.org (Postfix) with ESMTP id 78AE26B006C for ; Fri, 15 Oct 2021 01:06:09 -0400 (EDT) Received: from smtpin13.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay05.hostedemail.com (Postfix) with ESMTP id 27EE2181B10C3 for ; Fri, 15 Oct 2021 05:06:09 +0000 (UTC) X-FDA: 78697485258.13.1C61F6A Received: from mail-pj1-f46.google.com (mail-pj1-f46.google.com [209.85.216.46]) by imf05.hostedemail.com (Postfix) with ESMTP id 428C45081F13 for ; Fri, 15 Oct 2021 05:06:07 +0000 (UTC) Received: by mail-pj1-f46.google.com with SMTP id q2-20020a17090a2e0200b001a0fd4efd49so2212825pjd.1 for ; Thu, 14 Oct 2021 22:06:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=subject:from:to:cc:references:message-id:date:user-agent :mime-version:in-reply-to:content-language; bh=i7WL9pVPcMDjsku969cnvKBFvDdHPDmOdZUgDXlsap8=; b=phd54vDLQuKdhwbZcNVetmGgeFOKDk0BAnSaLIXGamuO8taT1z2+2YJRbO0VykLz1h 9or4CWlo0rJFWL/jTxotTLZHU+wTBVQrKFyyYKuwwocTkfuIzjoXZge3pem0whDQ5KjV OOT/gQhdAmetw3WnxV6E1YfrHRkzRNy+0p3yM16YfQKh1r4xbTO8WOk5qxiRxexD3WsC FsRaW6JewsyVCdPxEwvIQ1gCgmMI/H1NtplmHPzPASu5dOpjdTtAy4gqa5TL+su107Ob o7lLrCSJmAZhZr3cueTiSd3K74hdOTufl/zi6sV+84T0NDPug/SAvSSRnINd9zil1bzm wW3Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:subject:from:to:cc:references:message-id:date :user-agent:mime-version:in-reply-to:content-language; bh=i7WL9pVPcMDjsku969cnvKBFvDdHPDmOdZUgDXlsap8=; b=6G1phw04v/T463Nhkc9MoB4uvytfJrLbyRP0JjlQXR79VePpGbmhLISvFonGT1tmCI IzanTujL95jzgWmivfSabuN1PbKabWu9xqymntRNw1LiqvMJamtaEWsfl4MxrEj7YQso YHAv6zk/lp1qZxcgT386zz0pXvwLKyZQtrwpEa3/opmYZEzeFb98een4sS77s6L6cUKF I7x1c9Eu7gOGth7aZ8GsAOm3ieBmaS1fVP/KlqaE1k+oC60jzh0uwTA17+8GAi9QohnN FS6m9i3xzNO1FQx9fbUhsa/G/rHizyDNVqLXMEumgo4HLz16fsiCcac0JgdF7Vbkgxf9 Zpzg== X-Gm-Message-State: AOAM532df6huR4YYsLSMq9V6wWNHHXTzGkrSHK0xpJO7RSTJVq5mcakg LMavM9bkGwGJGKHStfbvCpPpb7bKWjztimqY X-Google-Smtp-Source: ABdhPJwnCXiXFxeLcpXv+yjqIqovxwtxLDmEvl9J+Oa+SKrCJvTpd8awYGoMx7RwyJi3gDD6BXovmg== X-Received: by 2002:a17:90a:4097:: with SMTP id l23mr25633735pjg.141.1634274367571; Thu, 14 Oct 2021 22:06:07 -0700 (PDT) Received: from [172.18.4.161] ([137.59.101.13]) by smtp.gmail.com with ESMTPSA id gk1sm2500033pjb.2.2021.10.14.22.06.05 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 14 Oct 2021 22:06:07 -0700 (PDT) Subject: Re: [PATCH] mm: backing-dev: use kfree_rcu() instead of synchronize_rcu_expedited() From: Zqiang To: Matthew Wilcox , hch@infradead.org Cc: akpm@linux-foundation.org, sunhao.th@gmail.com, linux-kernel@vger.kernel.org, linux-mm@kvack.org References: <20211014082433.30733-1-qiang.zhang1211@gmail.com> Message-ID: Date: Fri, 15 Oct 2021 13:06:02 +0800 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.11.0 MIME-Version: 1.0 In-Reply-To: Content-Type: multipart/alternative; boundary="------------7106F5FA48027D3B2AC59E04" Content-Language: en-US X-Rspamd-Queue-Id: 428C45081F13 X-Stat-Signature: cea9mboh3a881wdp73hagzcdmtwuh9g6 Authentication-Results: imf05.hostedemail.com; dkim=pass header.d=gmail.com header.s=20210112 header.b=phd54vDL; dmarc=pass (policy=none) header.from=gmail.com; spf=pass (imf05.hostedemail.com: domain of qiang.zhang1211@gmail.com designates 209.85.216.46 as permitted sender) smtp.mailfrom=qiang.zhang1211@gmail.com X-Rspamd-Server: rspam02 X-HE-Tag: 1634274367-543348 X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: This is a multi-part message in MIME format. --------------7106F5FA48027D3B2AC59E04 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: quoted-printable On 2021/10/15 =E4=B8=8A=E5=8D=8810:57, Qiang Zhang wrote: > > > Matthew Wilcox >=20 > =E4=BA=8E2021=E5=B9=B410=E6=9C=8814=E6=97=A5=E5=91=A8=E5=9B=9B =E4=B8=8B= =E5=8D=887:26=E5=86=99=E9=81=93=EF=BC=9A > > On Thu, Oct 14, 2021 at 04:24:33PM +0800, Zqiang wrote: > > The bdi_remove_from_list() is called in RCU softirq, however the > > synchronize_rcu_expedited() will produce sleep action, use > kfree_rcu() > > instead of it. > > > > Reported-by: Hao Sun > > > Signed-off-by: Zqiang > > > --- > >=C2=A0 include/linux/backing-dev-defs.h | 1 + > >=C2=A0 mm/backing-dev.c=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0| 4 +--- > >=C2=A0 2 files changed, 2 insertions(+), 3 deletions(-) > > > > diff --git a/include/linux/backing-dev-defs.h > b/include/linux/backing-dev-defs.h > > index 33207004cfde..35a093384518 100644 > > --- a/include/linux/backing-dev-defs.h > > +++ b/include/linux/backing-dev-defs.h > > @@ -202,6 +202,7 @@ struct backing_dev_info { > >=C2=A0 #ifdef CONFIG_DEBUG_FS > >=C2=A0 =C2=A0 =C2=A0 =C2=A0struct dentry *debug_dir; > >=C2=A0 #endif > > +=C2=A0 =C2=A0 =C2=A0struct rcu_head rcu; > >=C2=A0 }; > > >Instead of growing struct backing_dev_info, it seems to me this > rcu_head > >could be placed in a union with rb_node, since it will have been > removed > >from the bdi_tree by this point and the tree is never walked under > >RCU protection? > > > Thanks for your advice, I find this bdi_tree=C2=A0is traversed under th= e=20 > protection of a spin lock, not under the protection of RCU. > I find this modification does not avoid the problem described in=20 > patch, the=C2=A0flush_delayed_work() may be called in=C2=A0release_bdi(= ) > The same will cause problems. > may be=C2=A0 we can replace queue_rcu_work() of call_rcu(&inode->i_rcu,= =20 > i_callback) or do you have any better suggestions? > > Thanks > Zqiang diff --git a/fs/inode.c b/fs/inode.c index a49695f57e1e..300beb19aed6 100644 --- a/fs/inode.c +++ b/fs/inode.c @@ -219,9 +219,9 @@ void free_inode_nonrcu(struct inode *inode) =C2=A0} =C2=A0EXPORT_SYMBOL(free_inode_nonrcu); -static void i_callback(struct rcu_head *head) +static void i_callback(struct work_struct *work) =C2=A0{ -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 struct inode *inode =3D container_o= f(head, struct inode, i_rcu); +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 struct inode *inode =3D container_o= f(to_rcu_work(work), struct=20 inode, rwork); =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if (inode->free_inode) =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0 inode->free_inode(inode); =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 else @@ -248,7 +248,7 @@ static struct inode *alloc_inode(struct super_block *= sb) =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 return NULL; =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0 } =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0 inode->free_inode =3D ops->free_inode; -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0 i_callback(&inode->i_rcu); +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0 i_callback(&inode->rwork.work); =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0 return NULL; =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 } @@ -289,7 +289,8 @@ static void destroy_inode(struct inode *inode) =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 return= ; =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 } =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 inode->free_inode =3D ops->fr= ee_inode; -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 call_rcu(&inode->i_rcu, i_callback)= ; +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 INIT_RCU_WORK(&inode->rwork, i_call= back); +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 queue_rcu_work(system_wq, &inode->r= work); =C2=A0} =C2=A0/** diff --git a/include/linux/fs.h b/include/linux/fs.h index 8903a95611a2..006d769791a8 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -686,7 +686,7 @@ struct inode { =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 struct list_head=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0 i_wb_list;=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 /* b= acking dev=20 writeback list */ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 union { =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0 struct hlist_head=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 = i_dentry; -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0 struct rcu_head=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0 i_rcu; +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0 struct rcu_work=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0 rwork; =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 }; =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 atomic64_t=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 i_version; =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 atomic64_t=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 i_sequence; /* = see futex */ --------------7106F5FA48027D3B2AC59E04 Content-Type: text/html; charset=utf-8 Content-Transfer-Encoding: quoted-printable


On 2021/10/15 =E4=B8=8A=E5=8D=8810:57,= Qiang Zhang wrote:


Matthew Wilcox <willy@infradead.org> =E4=BA=8E2021=E5=B9=B410=E6=9C=8814=E6=97=A5=E5=91=A8=E5=9B=9B= =E4=B8=8B=E5=8D=887:26=E5=86=99=E9=81=93=EF=BC=9A
On Thu, Oct 14, 2021 at 04:24:33PM +0800, Zqiang wrote:
> The bdi_remove_from_list() is called in RCU softirq, however the
> synchronize_rcu_expedited() will produce sleep action, use kfree_rcu()
> instead of it.
>
> Reported-by: Hao Sun <sunhao.th@gmail.com>
> Signed-off-by: Zqiang <qiang.zhang1211@gmail.com><= br> > ---
>=C2=A0 include/linux/backing-dev-defs.h | 1 +
>=C2=A0 mm/backing-dev.c=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0| 4 +---
>=C2=A0 2 files changed, 2 insertions(+), 3 deletions(-) >
> diff --git a/include/linux/backing-dev-defs.h b/include/linux/backing-dev-defs.h
> index 33207004cfde..35a093384518 100644
> --- a/include/linux/backing-dev-defs.h
> +++ b/include/linux/backing-dev-defs.h
> @@ -202,6 +202,7 @@ struct backing_dev_info {
>=C2=A0 #ifdef CONFIG_DEBUG_FS
>=C2=A0 =C2=A0 =C2=A0 =C2=A0struct dentry *debug_dir;
>=C2=A0 #endif
> +=C2=A0 =C2=A0 =C2=A0struct rcu_head rcu;
>=C2=A0 };

>Instead of growing struct backing_dev_info, it seems to me this rcu_head
>could be placed in a union with rb_node, since it will have been removed
>from the bdi_tree by this point and the tree is never walked under
>RCU protection?


Thanks for your advice, I find this bdi_tree=C2=A0is trave= rsed under the protection of a spin lock, not under the protection of RCU.
I find this modification does not avoid the problem described in patch, the=C2=A0flush_delayed_work() may be call= ed in=C2=A0release_bdi()
The same will cause problems.
=C2=A0
may be=C2=A0 we can replace queue_rcu_work() of call_rcu(&inode->i_rcu, i_callback) or do you have any better suggestions?

Thanks
Zqiang
=C2=A0


diff --git a/fs/inode.c b/fs/inode.c
index a49695f57e1e..300beb19aed6 100644
--- a/fs/inode.c
+++ b/fs/inode.c
@@ -219,9 +219,9 @@ void free_inode_nonrcu(struct inode *inode)
=C2=A0}
=C2=A0EXPORT_SYMBOL(free_inode_nonrcu);
=C2=A0
-static void i_callback(struct rcu_head *head)
+static void i_callback(struct work_struct *work)
=C2=A0{
-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 struct inode *inode =3D conta= iner_of(head, struct inode, i_rcu);
+=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 struct inode *inode =3D conta= iner_of(to_rcu_work(work), struct inode, rwork);
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if (inode->free_inode= )
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0 inode->free_inode(inode);
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 else
@@ -248,7 +248,7 @@ static struct inode *alloc_inode(struct super_block *sb)
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 return NULL;
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0 }
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0 inode->free_inode =3D ops->free_inode;
-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0 i_callback(&inode->i_rcu);
+=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0 i_callback(&inode->rwork.work);
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0 return NULL;
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 }
=C2=A0
@@ -289,7 +289,8 @@ static void destroy_inode(struct inode *inode)<= br> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 ret= urn;
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 }
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 inode->free_inode =3D= ops->free_inode;
-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 call_rcu(&inode->i_rcu= , i_callback);
+=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 INIT_RCU_WORK(&inode->= rwork, i_callback);
+=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 queue_rcu_work(system_wq, &am= p;inode->rwork);
=C2=A0}
=C2=A0
=C2=A0/**
diff --git a/include/linux/fs.h b/include/linux/fs.h
index 8903a95611a2..006d769791a8 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -686,7 +686,7 @@ struct inode {
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 struct list_head=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 i_wb_list;=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= /* backing dev writeback list */
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 union {
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0 struct hlist_head=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= i_dentry;
-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0 struct rcu_head=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0 i_rcu;
+=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0 struct rcu_work=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0 rwork;
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 };
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 atomic64_t=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 i_version= ;
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 atomic64_t=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 i_sequenc= e; /* see futex */

--------------7106F5FA48027D3B2AC59E04--