From: Eric Biggers <ebiggers3@gmail.com>
To: Richard Weinberger <richard@nod.at>
Cc: linux-fscrypt@vger.kernel.org,
linux-fsdevel <linux-fsdevel@vger.kernel.org>,
Eric Biggers <ebiggers@google.com>, Theodore Ts'o <tytso@mit.edu>,
Al Viro <viro@zeniv.linux.org.uk>,
David Gstir <david@sigma-star.at>,
David Oberhollenzer <david.oberhollenzer@sigma-star.at>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
"linux-mtd@lists.infradead.org" <linux-mtd@lists.infradead.org>,
Artem Bityutskiy <dedekind1@gmail.com>,
Adrian Hunter <adrian.hunter@intel.com>
Subject: Re: Question on fscrypt_d_revalidate() and fstest generic/429
Date: Mon, 15 May 2017 16:25:56 -0700 [thread overview]
Message-ID: <20170515232556.GA46783@gmail.com> (raw)
In-Reply-To: <489e1437-990f-3e88-d426-b47b82441009@nod.at>
On Mon, May 15, 2017 at 09:51:03PM +0200, Richard Weinberger wrote:
> >
> > The test is repeatedly creating and removing a directory "dir" while lookups are
> > being done in it. It seems the problem is that many dentries are being created
> > for "dir", and they pin many different inodes, all at the same time. This
> > actually happens for ext4 too; it just doesn't cause an observable error.
> >
> > I doubt it's the right solution to make fscrypt_d_revalidate() look at
> > ->i_nlink, since ->d_revalidate() is meant to validate the filename, not the
> > inode. I think there is probably a VFS bug that is causing the dentries to not
> > be freed.
>
> Not sure. Al? :-)
>
I can reproduce this on an unencrypted directory after updating path_init() in
fs/namei.c to always clear LOOKUP_RCU, so that all path lookups are done in
ref-walk mode. So I think fscrypt_d_revalidate() was only relevant because it
causes all path lookups to drop out of rcu-walk mode.
It seems that what's happening is the "dir" dentries are not being freed because
each one has a child dentry "file" that is a negative dentry. The "file" dentry
would normally be freed by shrink_dcache_parent() called from vfs_rmdir(), but
due to a race with stat("dir/file") the "file" dentry sometimes has nonzero
reference count at that time, causing it to remain in the subdirs list. So we
end up with a negative dentry "file" with 0 refcount and on the dentry LRU list,
and its parent the positive dentry "dir" with 1 refcount. And the test program
generates thousands of copies of that, with each "dir" referring to a different
inode, and they get freed only when the shrinker runs.
I'm not sure how to fix it...
Eric
next prev parent reply other threads:[~2017-05-15 23:25 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-05-15 14:39 Question on fscrypt_d_revalidate() and fstest generic/429 Richard Weinberger
2017-05-15 19:45 ` Eric Biggers
2017-05-15 19:51 ` Richard Weinberger
2017-05-15 23:25 ` Eric Biggers [this message]
2017-05-16 6:47 ` Richard Weinberger
2017-05-16 22:07 ` Eric Biggers
2017-05-16 22:27 ` Richard Weinberger
2017-05-15 23:50 ` Al Viro
2017-05-16 11:22 ` Richard Weinberger
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170515232556.GA46783@gmail.com \
--to=ebiggers3@gmail.com \
--cc=adrian.hunter@intel.com \
--cc=david.oberhollenzer@sigma-star.at \
--cc=david@sigma-star.at \
--cc=dedekind1@gmail.com \
--cc=ebiggers@google.com \
--cc=linux-fscrypt@vger.kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mtd@lists.infradead.org \
--cc=richard@nod.at \
--cc=tytso@mit.edu \
--cc=viro@zeniv.linux.org.uk \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.