Received: with ECARTIS (v1.0.0; list xfs); Tue, 26 Aug 2008 14:33:25 -0700 (PDT) X-Spam-Checker-Version: SpamAssassin 3.3.0-r574664 (2007-09-11) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=BAYES_00 autolearn=ham version=3.3.0-r574664 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.168.28]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id m7QLXJEs017739 for ; Tue, 26 Aug 2008 14:33:20 -0700 X-ASG-Debug-ID: 1219786481-737b02110000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from py-out-1112.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 4CCEFFC70E6 for ; Tue, 26 Aug 2008 14:34:41 -0700 (PDT) Received: from py-out-1112.google.com (py-out-1112.google.com [64.233.166.177]) by cuda.sgi.com with ESMTP id Y28t5aDDcktrNDj0 for ; Tue, 26 Aug 2008 14:34:41 -0700 (PDT) Received: by py-out-1112.google.com with SMTP id f31so1521962pyh.4 for ; Tue, 26 Aug 2008 14:34:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:message-id:date:from:to :subject:cc:in-reply-to:mime-version:content-type :content-transfer-encoding:content-disposition:references; bh=tnEPDFlr3ypsefdXRdYUHdUyN9mfXikFl7qS7yCbEvw=; b=n/PcK3dYAjCtL26ZqQI93BDGn0vPMIj9RtocHpBM0eY/IBp6SfqQi9MTvTih6XY1dR XqxsKNgXT/jMefx5QZMnSZGNq7Ixz4wl3QCWYrAdD7AjV2t1yIh+ow4yBNmuOdbBBDaq Cgl2zk6Zs/i+hbQ/IpE7TzmITSDl78UxpBIHw= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=message-id:date:from:to:subject:cc:in-reply-to:mime-version :content-type:content-transfer-encoding:content-disposition :references; b=UamrfNCDxrfFHJCUTcBir5AW+2d9yVVOvsjP5ziI3vTpzL5uF1FCgSmjsvBKAESjEl UqpNoD4p469ENnEgHhmkvm3jR5uRGpkjz0tvsYhz/URj/RSxKf2embLR+LBa0FjgwQG6 PwjGvPHdODRphRXawbBoTt1LTL7Nqb4X6Bitw= Received: by 10.65.137.5 with SMTP id p5mr12418125qbn.50.1219786480888; Tue, 26 Aug 2008 14:34:40 -0700 (PDT) Received: by 10.65.38.8 with HTTP; Tue, 26 Aug 2008 14:34:40 -0700 (PDT) Message-ID: <6278d2220808261434o15dcbbfbge8138098bf453c0b@mail.gmail.com> Date: Tue, 26 Aug 2008 22:34:40 +0100 From: "Daniel J Blueman" To: "Dave Chinner" X-ASG-Orig-Subj: Re: [2.6.27-rc4] XFS i_lock vs i_iolock... Subject: Re: [2.6.27-rc4] XFS i_lock vs i_iolock... Cc: "Christoph Hellwig" , "Peter Zijlstra" , "Lachlan McIlroy" , "Linux Kernel" , xfs@oss.sgi.com In-Reply-To: <6278d2220808261313ve58a692r38c913356ee135e2@mail.gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Content-Disposition: inline References: <6278d2220808221412x28f4ac5dl508884c8030b364a@mail.gmail.com> <20080825010213.GO5706@disturbed> <48B21507.9050708@sgi.com> <20080825035542.GR5706@disturbed> <1219647573.20732.28.camel@twins> <20080825215532.GB28188@lst.de> <20080826024547.GX5706@disturbed> <6278d2220808261313ve58a692r38c913356ee135e2@mail.gmail.com> X-Barracuda-Connect: py-out-1112.google.com[64.233.166.177] X-Barracuda-Start-Time: 1219786483 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.52 X-Barracuda-Spam-Status: No, SCORE=-1.52 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE7568M X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.1.3805 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_RULE7568M Custom Rule 7568M X-Virus-Scanned: ClamAV 0.91.2/8094/Tue Aug 26 12:45:52 2008 on oss.sgi.com X-Virus-Status: Clean X-archive-position: 17734 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: daniel.blueman@gmail.com Precedence: bulk X-list: xfs On Tue, Aug 26, 2008 at 9:13 PM, Daniel J Blueman wrote: > Hi Dave, > > On Tue, Aug 26, 2008 at 3:45 AM, Dave Chinner wrote: >> On Mon, Aug 25, 2008 at 11:55:32PM +0200, Christoph Hellwig wrote: >>> On Mon, Aug 25, 2008 at 08:59:33AM +0200, Peter Zijlstra wrote: >>> > How can you take two locks in one go? It seems to me you always need to >>> > take them one after another, and as soon as you do that, you have >>> > ordering constraints. >>> >>> Yes, you would. Except that in all other places we only have a single >>> iolock involved, so the ordering of the second iolock and second ilock >>> don't matter. >>> >>> Because of that I think declaring that xfs_lock_two_inodes can just >>> lock on lock type at a time might be the better solution. >> >> Agreed. Patch below. >> >> Cheers, >> >> Dave. >> -- >> Dave Chinner >> david@fromorbit.com >> >> XFS: prevent lockdep false positives when locking two inodes >> >> If we call xfs_lock_two_inodes() to grab both the iolock and >> the ilock, then drop the ilocks on both inodes, then grab >> them again (as xfs_swap_extents() does) then lockdep will >> report a locking order problem. This is a false positive. >> >> To avoid this, disallow xfs_lock_two_inodes() fom locking both >> inode locks at once - force calers to make two separate calls. >> This means that nested dropping and regaining of the ilocks >> will retain the same lockdep subclass and so lockdep will >> not see anything wrong with this code. >> >> Signed-off-by: Dave Chinner >> --- >> fs/xfs/xfs_dfrag.c | 9 ++++++++- >> fs/xfs/xfs_vnodeops.c | 10 ++++++++++ >> 2 files changed, 18 insertions(+), 1 deletions(-) >> >> diff --git a/fs/xfs/xfs_dfrag.c b/fs/xfs/xfs_dfrag.c >> index 760f4c5..75b0cd4 100644 >> --- a/fs/xfs/xfs_dfrag.c >> +++ b/fs/xfs/xfs_dfrag.c >> @@ -149,7 +149,14 @@ xfs_swap_extents( >> >> sbp = &sxp->sx_stat; >> >> - xfs_lock_two_inodes(ip, tip, lock_flags); >> + /* >> + * we have to do two separate lock calls here to keep lockdep >> + * happy. If we try to get all the locks in one call, lock will >> + * report false positives when we drop the ILOCK and regain them >> + * below. >> + */ >> + xfs_lock_two_inodes(ip, tip, XFS_IOLOCK_EXCL); >> + xfs_lock_two_inodes(ip, tip, XFS_ILOCK_EXCL); >> locked = 1; >> >> /* Verify that both files have the same format */ >> diff --git a/fs/xfs/xfs_vnodeops.c b/fs/xfs/xfs_vnodeops.c >> index f108102..cb1b5fd 100644 >> --- a/fs/xfs/xfs_vnodeops.c >> +++ b/fs/xfs/xfs_vnodeops.c >> @@ -1836,6 +1836,12 @@ again: >> #endif >> } >> >> +/* >> + * xfs_lock_two_inodes() can only be used to lock one type of lock >> + * at a time - the iolock or the ilock, but not both at once. If >> + * we lock both at once, lockdep will report false positives saying >> + * we have violated locking orders. >> + */ >> void >> xfs_lock_two_inodes( >> xfs_inode_t *ip0, >> @@ -1846,7 +1852,11 @@ xfs_lock_two_inodes( >> int attempts = 0; >> xfs_log_item_t *lp; >> >> +#ifdef DEBUG >> + if (lock_mode & (XFS_IOLOCK_SHARED|XFS_IOLOCK_EXCL)) >> + ASSERT((lock_mode & (XFS_ILOCK_SHARED|XFS_ILOCK_EXCL)) == 0); >> ASSERT(ip0->i_ino != ip1->i_ino); >> +#endif >> >> if (ip0->i_ino > ip1->i_ino) { >> temp = ip0; > > Good to get your patch and HCH's ack...thanks! > > I'll pursue testing and touchdown in < 24 hrs. Excellent - confirmed it addresses the lockdep report I was seeing before and doesn't introduce any regressions. Thanks, Daniel -- Daniel J Blueman