From: Al Viro <viro@ZenIV.linux.org.uk>
To: linux-kernel@vger.kernel.org
Cc: linux-fsdevel@vger.kernel.org,
Linus Torvalds <torvalds@linux-foundation.org>,
Neil Brown <neilb@suse.com>
Subject: [PATCHSET v2] ->follow_link() without dropping from RCU mode
Date: Wed, 9 Dec 2015 05:32:09 +0000 [thread overview]
Message-ID: <20151209053209.GV20997@ZenIV.linux.org.uk> (raw)
In-Reply-To: <20151117225752.GZ22011@ZenIV.linux.org.uk>
On Tue, Nov 17, 2015 at 10:57:52PM +0000, Al Viro wrote:
> Right now we stay in RCU mode for fast symlink traversal.
> However, anything trickier drops out of RCU mode - back in 4.2
> the symlink-related pile had grown too large to add this on top
> of everything else. Below is an attempt to do that now.
>
> Those who prefer to use git for review can find that series in
> git.kernel.org/pub/scm/linux/kernel/git/viro/vfs.git work.symlinks
Compared to the previous iteration:
* rebased to 4.4-rc4.
* NFS (in case of pagecache hit, of course) also stays in RCU mode.
* renamed inode_nohigh() as suggested by dchinner, moved to
fs/inode.c - less header PITA that way.
What's there:
01/11: switch befs long symlinks to page_symlink_operations
02/11: logfs: don't duplicate page_symlink_inode_operations
03/11: udf: don't duplicate page_symlink_inode_operations
04/11: ufs: get rid of ->setattr() for symlinks
Simplifying things a bit by switching them to page_symlink_operations
where possible.
05/11: namei: page_getlink() and page_follow_link_light() are the same thing
Get rid of some code duplication
06/11: don't put symlink bodies in pagecache into highmem
Bugfix for a long-standing mess. For pagecache-based symlinks we end
up with kmap() of the body for the duration of traversal. Which could take
a long time if we walk into e.g. slow automount along the way. It's DoSable,
actually. Not hard to fix - there's no reason to use GFP_HIGHUSER_MOVABLE
for those guys; GFP_USER serves just as well.
07/11: replace ->follow_link() with new method that could stay
Meat of the series - we switch to a new method (->get_link()) that
differs from ->follow_link() in getting dentry and inode separately; it
can be called in RCU mode (with NULL dentry) and it should bail out with
ERR_PTR(-ECHILD) if it needs non-RCU. All instances converted, most of them
by making them bail out immediately in RCU mode. Some are trivialy
RCU-safe, though; those do not bail out at all.
08/11: teach page_get_link() to work in RCU mode
09/11: teach shmem_get_link() to work in RCU mode
10/11: teach proc_self_get_link()/proc_thread_self_get_link()
11/11: teach nfs_get_link() to work in RCU mode
Teaching more instances to stay in RCU mode if they can. (8) and
(11) are similar to what Neil had done back in March, except for the lack of
kmap mess to deal with - that's one of the benefits of having (6) done...
Missing, probably worth adding: XFS, overlayfs. Maybe gfs2 - if it's
at all possible (not sure if it is). Maybe autofs4 as well.
Procfs magical symlinks definitely are *not* worth trying to handle
in RCU mode - ->d_revalidate() on them is such that it'll kick us out of
RCU mode before we even see that it's a symlink, let alone try to follow it.
Any help with review and testing would be welcome. FWIW, it seems to survive
the beating here.
next prev parent reply other threads:[~2015-12-09 5:32 UTC|newest]
Thread overview: 48+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-11-17 22:57 [PATCHSET] ->follow_link() without dropping from RCU mode Al Viro
2015-11-17 23:00 ` [PATCH 01/10] switch befs long symlinks to page_symlink_operations Al Viro
2015-11-17 23:00 ` [PATCH 02/10] logfs: don't duplicate page_symlink_inode_operations Al Viro
2015-11-17 23:00 ` [PATCH 03/10] udf: " Al Viro
2015-11-17 23:00 ` [PATCH 04/10] ufs: get rid of ->setattr() for symlinks Al Viro
2015-11-17 23:00 ` [PATCH 05/10] namei: page_getlink() and page_follow_link_light() are the same thing Al Viro
2015-11-17 23:00 ` [PATCH 06/10] [vfs] don't put symlink bodies in pagecache into highmem Al Viro
2015-11-19 23:02 ` Dave Chinner
2015-11-17 23:00 ` [PATCH 07/10] [vfs] replace ->follow_link() with new method that could stay in RCU mode Al Viro
2015-11-17 23:00 ` [PATCH 08/10] teach page_get_link() to work " Al Viro
2015-11-17 23:00 ` [PATCH 09/10] teach shmem_get_link() " Al Viro
2015-11-17 23:00 ` [PATCH 10/10] teach proc_self_get_link()/proc_thread_self_get_link() " Al Viro
2015-12-09 5:32 ` Al Viro [this message]
2015-12-09 5:34 ` [PATCH v2 01/11] switch befs long symlinks to page_symlink_operations Al Viro
2015-12-09 5:34 ` [PATCH v2 02/11] logfs: don't duplicate page_symlink_inode_operations Al Viro
2015-12-09 5:34 ` [PATCH v2 03/11] udf: " Al Viro
2015-12-09 5:34 ` [PATCH v2 04/11] ufs: get rid of ->setattr() for symlinks Al Viro
2015-12-09 5:34 ` [PATCH v2 05/11] namei: page_getlink() and page_follow_link_light() are the same thing Al Viro
2015-12-09 5:34 ` [PATCH v2 06/11] don't put symlink bodies in pagecache into highmem Al Viro
2016-01-14 13:22 ` Tomeu Vizoso
2016-01-14 15:25 ` Al Viro
2016-01-14 15:58 ` Tomeu Vizoso
2016-01-14 16:23 ` Al Viro
2016-01-14 16:57 ` Tomeu Vizoso
2016-01-14 17:13 ` Al Viro
2016-01-14 19:15 ` Tomeu Vizoso
2016-01-14 21:02 ` Al Viro
2016-01-14 21:40 ` Linus Torvalds
2016-01-14 22:25 ` Al Viro
2016-01-14 23:33 ` Al Viro
2016-01-14 23:58 ` Linus Torvalds
2016-01-15 0:05 ` Al Viro
2015-12-09 5:34 ` [PATCH v2 07/11] replace ->follow_link() with new method that could stay in RCU mode Al Viro
2015-12-09 5:34 ` [PATCH v2 08/11] teach page_get_link() to work " Al Viro
2015-12-09 5:34 ` [PATCH v2 09/11] teach shmem_get_link() " Al Viro
2015-12-09 5:34 ` [PATCH v2 10/11] teach proc_self_get_link()/proc_thread_self_get_link() " Al Viro
2015-12-09 5:34 ` [PATCH v2 11/11] teach nfs_get_link() " Al Viro
2015-12-09 17:24 ` [PATCHSET v2] ->follow_link() without dropping from " Linus Torvalds
2015-12-09 18:23 ` Al Viro
2015-12-10 0:10 ` Al Viro
2015-12-10 2:40 ` Al Viro
2015-12-11 1:54 ` Al Viro
2015-12-11 7:49 ` Rasmus Villemoes
2015-12-11 23:16 ` Al Viro
2015-12-12 2:00 ` Al Viro
2015-12-13 18:43 ` Rasmus Villemoes
2015-12-13 3:47 ` Al Viro
2015-12-09 21:57 ` NeilBrown
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=20151209053209.GV20997@ZenIV.linux.org.uk \
--to=viro@zeniv.linux.org.uk \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=neilb@suse.com \
--cc=torvalds@linux-foundation.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).