From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933321AbcITRGR (ORCPT ); Tue, 20 Sep 2016 13:06:17 -0400 Received: from out03.mta.xmission.com ([166.70.13.233]:46095 "EHLO out03.mta.xmission.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S933209AbcITRGN (ORCPT ); Tue, 20 Sep 2016 13:06:13 -0400 From: ebiederm@xmission.com (Eric W. Biederman) To: Ian Kent Cc: Mateusz Guzik , NeilBrown , Andrew Morton , autofs mailing list , Kernel Mailing List , Al Viro , linux-fsdevel , Omar Sandoval References: <20160914061434.24714.490.stgit@pluto.themaw.net> <20160914061445.24714.68331.stgit@pluto.themaw.net> <20160917201000.omswgttgyzcu7jt6@mguzik> <1474248973.3204.14.camel@themaw.net> Date: Tue, 20 Sep 2016 11:50:56 -0500 In-Reply-To: <1474248973.3204.14.camel@themaw.net> (Ian Kent's message of "Mon, 19 Sep 2016 09:36:13 +0800") Message-ID: <87oa3iikgf.fsf@x220.int.ebiederm.org> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.5 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-XM-SPF: eid=1bmOU6-00080K-W5;;;mid=<87oa3iikgf.fsf@x220.int.ebiederm.org>;;;hst=in02.mta.xmission.com;;;ip=97.119.97.64;;;frm=ebiederm@xmission.com;;;spf=neutral X-XM-AID: U2FsdGVkX18oSH5wB5hIuOdn3iVoGAYX790cZR0dwuY= X-SA-Exim-Connect-IP: 97.119.97.64 X-SA-Exim-Mail-From: ebiederm@xmission.com X-Spam-Report: * -1.0 ALL_TRUSTED Passed through trusted hosts only via SMTP * 0.0 TVD_RCVD_IP Message was received from an IP address * 1.5 XMNoVowels Alpha-numberic number with no vowels * 0.7 XMSubLong Long Subject * 0.0 T_TM2_M_HEADER_IN_MSG BODY: No description available. * 0.8 BAYES_50 BODY: Bayes spam probability is 40 to 60% * [score: 0.5000] * -0.0 DCC_CHECK_NEGATIVE Not listed in DCC * [sa08 1397; Body=1 Fuz1=1 Fuz2=1] * 0.1 XMSolicitRefs_0 Weightloss drug * 0.0 T_TooManySym_01 4+ unique symbols in subject X-Spam-DCC: XMission; sa08 1397; Body=1 Fuz1=1 Fuz2=1 X-Spam-Combo: **;Ian Kent X-Spam-Relay-Country: X-Spam-Timing: total 10735 ms - load_scoreonly_sql: 0.04 (0.0%), signal_user_changed: 17 (0.2%), b_tie_ro: 16 (0.2%), parse: 0.82 (0.0%), extract_message_metadata: 17 (0.2%), get_uri_detail_list: 1.53 (0.0%), tests_pri_-1000: 7 (0.1%), tests_pri_-950: 1.20 (0.0%), tests_pri_-900: 0.92 (0.0%), tests_pri_-400: 31 (0.3%), check_bayes: 30 (0.3%), b_tokenize: 10 (0.1%), b_tok_get_all: 10 (0.1%), b_comp_prob: 2.9 (0.0%), b_tok_touch_all: 3.5 (0.0%), b_finish: 0.82 (0.0%), tests_pri_0: 681 (6.3%), check_dkim_signature: 0.45 (0.0%), check_dkim_adsp: 61 (0.6%), tests_pri_500: 9975 (92.9%), poll_dns_idle: 9924 (92.4%), rewrite_mail: 0.00 (0.0%) Subject: Re: [PATCH 3/4] autofs - make mountpoint checks namespace aware X-Spam-Flag: No X-SA-Exim-Version: 4.2.1 (built Thu, 05 May 2016 13:38:54 -0600) X-SA-Exim-Scanned: Yes (on in02.mta.xmission.com) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Ian Kent writes: > On Sat, 2016-09-17 at 22:10 +0200, Mateusz Guzik wrote: >> On Wed, Sep 14, 2016 at 02:14:45PM +0800, Ian Kent wrote: >> > If an automount mount is clone(2)ed into a file system that is >> > propagation private, when it later expires in the originating >> > namespace subsequent calls to autofs ->d_automount() for that >> > dentry in the original namespace will return ELOOP until the >> > mount is manually umounted in the cloned namespace. >> > >> > In the same way, if an autofs mount is triggered by automount(8) >> > running within a container the dentry will be seen as mounted in >> > the root init namespace and calls to ->d_automount() in that namespace >> > will return ELOOP until the mount is umounted within the container. >> > >> > Also, have_submounts() can return an incorect result when a mount >> > exists in a namespace other than the one being checked. >> > >> > @@ -460,7 +460,7 @@ static int autofs4_d_manage(struct dentry *dentry, bool >> > rcu_walk) >> > >> > if (ino->flags & AUTOFS_INF_WANT_EXPIRE) >> > return 0; >> > - if (d_mountpoint(dentry)) >> > + if (is_local_mountpoint(dentry)) >> > return 0; >> > inode = d_inode_rcu(dentry); >> > if (inode && S_ISLNK(inode->i_mode)) >> >> This change is within RCU lookup. >> >> is_local_mountpoint may end up calling __is_local_mountpoint, which will >> optionally take the namespace_sem lock, resulting in a splat: > > Yes, that's a serious problem I missed. > > snip ... > >> I don't know this code. Perhaps it will be perfectly fine performance wise to >> just drop out of RCU lookup in this case. > > It's a bit worse than that. > > I think being able to continue the rcu-walk for an already mounted dentry that > is not being expired is an important part of the performance improvement given > by the series that added this. > > Can you confirm that Neil? > > But for the case here the existing test can allow rcu-walk to continue for a > dentry that would attempt to trigger an automount so it's also a bug in the > existing code. I don't think the existing code is buggy. As I read __follow_mount_rcu if DCACHE_NEED_AUTOMOUNT is set on the dentry after return from d_manage the code will break out of the rcu walk. > Any thoughts on how we can handle this Neil, I'm having a bit of trouble working > out how to resolve this one. I believe in this case d_mountpoint is enough for the rcu walk case. If the mountpoint turns out not to be local __follow_mount_rcu will kick out of the rcu walk as it will return false. Because: return !mounted && !(path->dentry->d_flags & DCACHE_NEED_AUTOMOUNT); I am not quite certain about the non-rcu case. That can't be is_local_mountpoint as that is inside a spinlock and is_local_mountpoint can sleep. Perhaps d_mountpoint is simply correct for autofs4_d_manage. Eric