From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-qt0-f194.google.com ([209.85.216.194]:37375 "EHLO mail-qt0-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751456AbdK3MAG (ORCPT ); Thu, 30 Nov 2017 07:00:06 -0500 Received: by mail-qt0-f194.google.com with SMTP id d15so8363710qte.4 for ; Thu, 30 Nov 2017 04:00:06 -0800 (PST) Message-ID: <1512043204.4132.1.camel@redhat.com> Subject: Re: [PATCH] ceph: decease session->s_trim_caps only after caps get trimmed From: Jeff Layton To: "Yan, Zheng" , ceph-devel@vger.kernel.org Cc: stable@vger.kernel.org Date: Thu, 30 Nov 2017 07:00:04 -0500 In-Reply-To: <20171130075358.7803-1-zyan@redhat.com> References: <20171130075358.7803-1-zyan@redhat.com> Content-Type: text/plain; charset="UTF-8" Mime-Version: 1.0 Content-Transfer-Encoding: 7bit Sender: stable-owner@vger.kernel.org List-ID: On Thu, 2017-11-30 at 15:53 +0800, Yan, Zheng wrote: > d_prune_aliases() does not prune dentry that has non-zero reference > count. If we want trim_caps() to trim 'N' caps, the first 'N' inodes > in session->s_caps are all directories with child dentry, trim_caps() > can fail to trim anything. > > Cc: stable@vger.kernel.org > Signed-off-by: "Yan, Zheng" > --- > fs/ceph/mds_client.c | 8 ++++++-- > 1 file changed, 6 insertions(+), 2 deletions(-) > > diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c > index 80339e278ad8..da181acd4a61 100644 > --- a/fs/ceph/mds_client.c > +++ b/fs/ceph/mds_client.c > @@ -1490,16 +1490,20 @@ static int trim_caps_cb(struct inode *inode, struct ceph_cap *cap, void *arg) > if ((used | wanted) & ~oissued & mine) > goto out; /* we need these caps */ > > - session->s_trim_caps--; > if (oissued) { > /* we aren't the only cap.. just remove us */ > __ceph_remove_cap(cap, true); > + session->s_trim_caps--; > } else { > + int refs; > /* try dropping referring dentries */ > spin_unlock(&ci->i_ceph_lock); > d_prune_aliases(inode); > + refs = atomic_read(&inode->i_count); > + if (refs == 1) > + session->s_trim_caps--; > dout("trim_caps_cb %p cap %p pruned, count now %d\n", > - inode, cap, atomic_read(&inode->i_count)); > + inode, cap, refs); > return 0; > } > Reviewed-by: Jeff Layton