From owner-freebsd-fs@FreeBSD.ORG Wed Oct 19 14:53:52 2011 Return-Path: Delivered-To: freebsd-fs@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id A7A0C1065673; Wed, 19 Oct 2011 14:53:52 +0000 (UTC) (envelope-from kaduk@mit.edu) Received: from dmz-mailsec-scanner-1.mit.edu (DMZ-MAILSEC-SCANNER-1.MIT.EDU [18.9.25.12]) by mx1.freebsd.org (Postfix) with ESMTP id 32B868FC12; Wed, 19 Oct 2011 14:53:51 +0000 (UTC) X-AuditID: 1209190c-b7fd26d0000008df-52-4e9ee47f8e7b Received: from mailhub-auth-3.mit.edu ( [18.9.21.43]) by dmz-mailsec-scanner-1.mit.edu (Symantec Messaging Gateway) with SMTP id 48.C4.02271.F74EE9E4; Wed, 19 Oct 2011 10:53:51 -0400 (EDT) Received: from outgoing.mit.edu (OUTGOING-AUTH.MIT.EDU [18.7.22.103]) by mailhub-auth-3.mit.edu (8.13.8/8.9.2) with ESMTP id p9JErpeG023501; Wed, 19 Oct 2011 10:53:51 -0400 Received: from multics.mit.edu (MULTICS.MIT.EDU [18.187.1.73]) (authenticated bits=56) (User authenticated as kaduk@ATHENA.MIT.EDU) by outgoing.mit.edu (8.13.6/8.12.4) with ESMTP id p9JErnOD026397 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NOT); Wed, 19 Oct 2011 10:53:50 -0400 (EDT) Received: (from kaduk@localhost) by multics.mit.edu (8.12.9.20060308) id p9JErnEL016061; Wed, 19 Oct 2011 10:53:49 -0400 (EDT) Date: Wed, 19 Oct 2011 10:53:48 -0400 (EDT) From: Benjamin Kaduk To: Kostik Belousov In-Reply-To: <20111019111746.GP50300@deviant.kiev.zoral.com.ua> Message-ID: References: <20111019111746.GP50300@deviant.kiev.zoral.com.ua> User-Agent: Alpine 1.10 (GSO 962 2008-03-14) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII; format=flowed X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrMIsWRmVeSWpSXmKPExsUixCmqrVv/ZJ6fwYOr8hbHHv9ks2iY9pjN Yu7f/YwOzB4zPs1n8dg56y57AFMUl01Kak5mWWqRvl0CV8afu00sBfOFKp4fbmJrYJzE3cXI ySEhYCJxdO1RNghbTOLCvfVANheHkMA+Rok9Ta1MEM4GRom3jd9YIJwDTBLbvh1kh3AaGCV6 N3eyg/SzCGhLLF+9E8xmE1CRmPlmI9hcEQFNiWub7jOB2MwCBhIz2uYzgtjCAuYS69ftYwWx OQXsJWZtPgdWwwtkb1r+CCwuJFAkMevNfLC4qICOxOr9U1ggagQlTs58wgIx01Li3J/rbBMY BWchSc1CklrAyLSKUTYlt0o3NzEzpzg1Wbc4OTEvL7VI11AvN7NELzWldBMjOGwleXYwvjmo dIhRgINRiYd3h9w8PyHWxLLiytxDjJIcTEqivM2PgUJ8SfkplRmJxRnxRaU5qcWHGCU4mJVE eF/dAMrxpiRWVqUW5cOkpDlYlMR5D+5w8BMSSE8sSc1OTS1ILYLJynBwKEnw/gMZKliUmp5a kZaZU4KQZuLgBBnOAzT8O0gNb3FBYm5xZjpE/hSjopQ473mQhABIIqM0D64XllZeMYoDvSLM +xukigeYkuC6XwENZgIafFRxLsjgkkSElFQDo2LU+tgmwcvBsz/M/qbSI7u5snL9vs02c5dE BJ/6n6Eur6L4eZLEjv9xIo/OZz2arN/PeSP1McuLD7I54X2pTko2KR5Pzy+a0TxlG29a+Cu2 dFGOyLJXk7nXryh6GRig9r/SmFvS2u6VTffcAHbuqP+qtTP7L8z3eNr1L+74S95zgg/6AwqL lFiKMxINtZiLihMBdIwNewYDAAA= Cc: freebsd-fs@freebsd.org, rmacklem@freebsd.org Subject: Re: lock status of dvp in lookup error return? X-BeenThere: freebsd-fs@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Filesystems List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 19 Oct 2011 14:53:52 -0000 On Wed, 19 Oct 2011, Kostik Belousov wrote: > On Wed, Oct 19, 2011 at 02:07:17AM -0400, Benjamin Kaduk wrote: >> Hi Rick, >> >> In tracking down a panic trying to recursively lock a vnode in openafs, I >> started questioning my behavior in the ISDOTDOT case, in particular >> whether to drop the dvp lock before the actual call over the network; this >> naturally led me to look at the NFS code as a reference. >> Unfortunately, this left me more confused than when I began ... >> >> sys/fs/nfs_clvnops.c, in nfs_lookup(): >> 1211 if (flags & ISDOTDOT) { >> 1212 ltype = NFSVOPISLOCKED(dvp); >> 1213 error = vfs_busy(mp, MBF_NOWAIT); >> 1214 if (error != 0) { >> 1215 vfs_ref(mp); >> 1216 NFSVOPUNLOCK(dvp, 0); >> 1217 error = vfs_busy(mp, 0); >> 1218 NFSVOPLOCK(dvp, ltype | LK_RETRY); >> >> If we fail to busy the mountpoint, drop the directory lock and try again, >> then relock dvp afterward. >> >> 1219 vfs_rel(mp); >> 1220 if (error == 0 && (dvp->v_iflag & VI_DOOMED)) { >> 1221 vfs_unbusy(mp); >> 1222 error = ENOENT; >> 1223 } >> 1224 if (error != 0) >> 1225 return (error); >> >> But if the second vfs_busy failed, or dvp is DOOMED, return with dvp >> locked. >> >> 1226 } >> 1227 NFSVOPUNLOCK(dvp, 0); >> >> But now we always unlock dvp. >> >> 1228 error = nfscl_nget(mp, dvp, nfhp, cnp, td, &np, >> NULL, >> 1229 cnp->cn_lkflags); >> >> The call to the network (?) >> >> 1230 if (error == 0) >> 1231 newvp = NFSTOV(np); >> 1232 vfs_unbusy(mp); >> 1233 if (newvp != dvp) >> 1234 NFSVOPLOCK(dvp, ltype | LK_RETRY); > Did you missed line 1234 ? > > The code is the copy of the vn_vget_ino(). The logic in the function > might be slightly easier to follow. Ah, I did miss that, thanks. Maybe 0200h is not the best time to do these things ... -Ben