From owner-xfs@oss.sgi.com Thu May 1 00:21:02 2008 Received: with ECARTIS (v1.0.0; list xfs); Thu, 01 May 2008 00:21:19 -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.4 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-r574664 Received: from larry.melbourne.sgi.com (larry.melbourne.sgi.com [134.14.52.130]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with SMTP id m417Ku1G010798 for ; Thu, 1 May 2008 00:21:00 -0700 Received: from [134.14.55.78] (redback.melbourne.sgi.com [134.14.55.78]) by larry.melbourne.sgi.com (950413.SGI.8.6.12/950213.SGI.AUTOCF) via ESMTP id RAA13671; Thu, 1 May 2008 17:21:37 +1000 Message-ID: <48196FB6.9040503@sgi.com> Date: Thu, 01 May 2008 17:22:30 +1000 From: Lachlan McIlroy Reply-To: lachlan@sgi.com User-Agent: Thunderbird 2.0.0.12 (X11/20080213) MIME-Version: 1.0 To: David Chinner CC: xfs-dev , xfs-oss Subject: Re: [PATCH] Fix non-debug build for xfsidbg.c References: <20080430065937.GC108924158@sgi.com> <48181D04.4030902@sgi.com> <20080501004925.GU108924158@sgi.com> <48191FE8.9080607@sgi.com> <20080501030149.GC108924158@sgi.com> In-Reply-To: <20080501030149.GC108924158@sgi.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Virus-Scanned: ClamAV 0.91.2/6021/Wed Feb 27 15:55:48 2008 on oss.sgi.com X-Virus-Status: Clean X-archive-position: 15727 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: lachlan@sgi.com Precedence: bulk X-list: xfs Agree. David Chinner wrote: > On Thu, May 01, 2008 at 11:42:00AM +1000, Lachlan McIlroy wrote: >> Sorry I should have been clearer. What I actually meant was something >> like this: > > Whatever. It's not worth arguing about. I just want to get it fixed. > > Cheers, > > Dave. From owner-xfs@oss.sgi.com Thu May 1 05:25:38 2008 Received: with ECARTIS (v1.0.0; list xfs); Thu, 01 May 2008 05:25:45 -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.1 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-r574664 Received: from larry.melbourne.sgi.com (larry.melbourne.sgi.com [134.14.52.130]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with SMTP id m41CPVqr029657 for ; Thu, 1 May 2008 05:25:34 -0700 Received: from snort.melbourne.sgi.com (snort.melbourne.sgi.com [134.14.54.149]) by larry.melbourne.sgi.com (950413.SGI.8.6.12/950213.SGI.AUTOCF) via ESMTP id WAA18426; Thu, 1 May 2008 22:26:12 +1000 Received: from snort.melbourne.sgi.com (localhost [127.0.0.1]) by snort.melbourne.sgi.com (SGI-8.12.5/8.12.5) with ESMTP id m41CQBsT152437993; Thu, 1 May 2008 22:26:12 +1000 (AEST) Received: (from dgc@localhost) by snort.melbourne.sgi.com (SGI-8.12.5/8.12.5/Submit) id m41CQB2072884160; Thu, 1 May 2008 22:26:11 +1000 (AEST) X-Authentication-Warning: snort.melbourne.sgi.com: dgc set sender to dgc@sgi.com using -f Date: Thu, 1 May 2008 22:26:11 +1000 From: David Chinner To: xfs-dev Cc: xfs-oss Subject: [PATCH] Don't allow memory reclaim to wait on the filesystem in inode writeback Message-ID: <20080501122611.GK108924158@sgi.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.4.2.1i X-Virus-Scanned: ClamAV 0.91.2/6021/Wed Feb 27 15:55:48 2008 on oss.sgi.com X-Virus-Status: Clean X-archive-position: 15728 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: dgc@sgi.com Precedence: bulk X-list: xfs Don't allow memory reclaim to wait on the filesystem in inode writeback If we allow memory reclaim to wait on the pages under writeback in inode cluster writeback we could deadlock because we are currently holding the ILOCK on the initial writeback inode which is needed in data I/O completion to change the file size or do unwritten extent conversion before the pages are taken out of writeback state. Signed-off-by: Dave Chinner --- fs/xfs/xfs_inode.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) Index: 2.6.x-xfs-new/fs/xfs/xfs_inode.c =================================================================== --- 2.6.x-xfs-new.orig/fs/xfs/xfs_inode.c 2008-04-28 16:35:23.000000000 +1000 +++ 2.6.x-xfs-new/fs/xfs/xfs_inode.c 2008-05-01 20:04:55.151880341 +1000 @@ -2986,7 +2986,7 @@ xfs_iflush_cluster( ASSERT(pag->pag_ici_init); ilist_size = XFS_INODE_CLUSTER_SIZE(mp) * sizeof(xfs_inode_t *); - ilist = kmem_alloc(ilist_size, KM_MAYFAIL); + ilist = kmem_alloc(ilist_size, KM_NOFS); if (!ilist) return 0; From owner-xfs@oss.sgi.com Thu May 1 06:14:39 2008 Received: with ECARTIS (v1.0.0; list xfs); Thu, 01 May 2008 06:14:59 -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.5 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-r574664 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id m41DEcxp032091 for ; Thu, 1 May 2008 06:14:39 -0700 X-ASG-Debug-ID: 1209647721-3b9801e50000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 453901B2C9E2; Thu, 1 May 2008 06:15:21 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id PUruXy0pjnumestf; Thu, 01 May 2008 06:15:21 -0700 (PDT) Received: from hch by bombadil.infradead.org with local (Exim 4.68 #1 (Red Hat Linux)) id 1JrYd7-0005Sp-7h; Thu, 01 May 2008 13:15:21 +0000 Date: Thu, 1 May 2008 09:15:21 -0400 From: Christoph Hellwig To: David Chinner Cc: xfs-dev , xfs-oss X-ASG-Orig-Subj: Re: [PATCH] Don't allow memory reclaim to wait on the filesystem in inode writeback Subject: Re: [PATCH] Don't allow memory reclaim to wait on the filesystem in inode writeback Message-ID: <20080501131521.GA7435@infradead.org> References: <20080501122611.GK108924158@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20080501122611.GK108924158@sgi.com> User-Agent: Mutt/1.5.17 (2007-11-01) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1209647722 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: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.1, rules version 3.1.49360 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV 0.91.2/6021/Wed Feb 27 15:55:48 2008 on oss.sgi.com X-Virus-Status: Clean X-archive-position: 15729 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: hch@infradead.org Precedence: bulk X-list: xfs On Thu, May 01, 2008 at 10:26:11PM +1000, David Chinner wrote: > Index: 2.6.x-xfs-new/fs/xfs/xfs_inode.c > =================================================================== > --- 2.6.x-xfs-new.orig/fs/xfs/xfs_inode.c 2008-04-28 16:35:23.000000000 +1000 > +++ 2.6.x-xfs-new/fs/xfs/xfs_inode.c 2008-05-01 20:04:55.151880341 +1000 > @@ -2986,7 +2986,7 @@ xfs_iflush_cluster( > ASSERT(pag->pag_ici_init); > > ilist_size = XFS_INODE_CLUSTER_SIZE(mp) * sizeof(xfs_inode_t *); > - ilist = kmem_alloc(ilist_size, KM_MAYFAIL); > + ilist = kmem_alloc(ilist_size, KM_NOFS); > if (!ilist) > return 0; This should be KM_MAYFAIL | KM_NOFS, because KM_NOFS doesn't imply that the allocation may fail. From owner-xfs@oss.sgi.com Thu May 1 06:16:46 2008 Received: with ECARTIS (v1.0.0; list xfs); Thu, 01 May 2008 06:16:52 -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.5 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_43 autolearn=no 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 m41DGgur032203 for ; Thu, 1 May 2008 06:16:46 -0700 X-ASG-Debug-ID: 1209647845-256e02cf0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id C9EAB12A85E0; Thu, 1 May 2008 06:17:26 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id phuUvKxThILUli2k; Thu, 01 May 2008 06:17:26 -0700 (PDT) Received: from hch by bombadil.infradead.org with local (Exim 4.68 #1 (Red Hat Linux)) id 1JrYf7-0000ds-P3; Thu, 01 May 2008 13:17:25 +0000 Date: Thu, 1 May 2008 09:17:25 -0400 From: Christoph Hellwig To: Barry Naujok Cc: "xfs@oss.sgi.com" , xfs-dev X-ASG-Orig-Subj: Re: REVIEW: ASCII CI support in xfsprogs Subject: Re: REVIEW: ASCII CI support in xfsprogs Message-ID: <20080501131725.GB7435@infradead.org> References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.17 (2007-11-01) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1209647846 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: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.1, rules version 3.1.49361 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV 0.91.2/6021/Wed Feb 27 15:55:48 2008 on oss.sgi.com X-Virus-Status: Clean X-archive-position: 15730 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: hch@infradead.org Precedence: bulk X-list: xfs On Thu, May 01, 2008 at 02:37:11PM +1000, Barry Naujok wrote: > I've reworked xfsprogs userspace tools from scratch with ASCII CI support > only. Much simpler than previous patches with Unicode CI. > > One issue that sort of bugs me a bit is I've maintained the same output as > the original IRIX mkfs.xfs with CI mode: > naming =version 2 bsize=4096 mixed-case=Y|N > > where "N" = CI enabled and "Y" = normal case-senstive filesystem. > > Should this be changed to something clearer? I'd prefer something cleaner. Like case-insensitive=Y|N. Otherwise the patch looks fine, but I wonder if you shouldn't better backport the xfs_dir* files from the kernel completely instead of applying the changes selectively, otherwise we'll get totoally out of sync codebases. From owner-xfs@oss.sgi.com Thu May 1 08:24:52 2008 Received: with ECARTIS (v1.0.0; list xfs); Thu, 01 May 2008 08:25:10 -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=-1.1 required=5.0 tests=AWL,BAYES_00,MISSING_HEADERS autolearn=no version=3.3.0-r574664 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id m41FOk1p009340 for ; Thu, 1 May 2008 08:24:52 -0700 X-ASG-Debug-ID: 1209655530-6dd902520000-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 F253E1B8E55B for ; Thu, 1 May 2008 08:25:30 -0700 (PDT) Received: from py-out-1112.google.com (py-out-1112.google.com [64.233.166.181]) by cuda.sgi.com with ESMTP id UU1Qvs2DVaNIWn75 for ; Thu, 01 May 2008 08:25:30 -0700 (PDT) Received: by py-out-1112.google.com with SMTP id j37so1039332pyc.4 for ; Thu, 01 May 2008 08:25:30 -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:subject:cc:in-reply-to:mime-version:content-type:content-transfer-encoding:content-disposition:references; bh=sOEWQ6rzADVWjt4DPjskmMRZfaygH1o5jjU0Urvwo7I=; b=SX2S2GcPJFm/ORM58APyHWl71crEpbmxW7rs5eOBK2Cb24BdC35sP5iyoPs4ImQ5Eu9R0+OM+uQsGWxkuGdo2lEN1EtaKGhkOc1MTj7NJbGLI7RVQn6/0iIsPy3seHFyZ9/PsyZIhSE7ljKTtYi/Ptomgzucmow+UDyVpgSaZQE= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=message-id:date:from:subject:cc:in-reply-to:mime-version:content-type:content-transfer-encoding:content-disposition:references; b=NgFWJ2rtz4GhosqqKZMN8ccFbSOrXUTYVuwcUMY2HZ46ujqCZY3eKYLSyuglqtrIYGPR/T0ch7ZDM8wpWvkyzmS3cUB1HzHkVOzR/eWliQhAEpu9dQCGvlTqZYNzgOXrcNi3cfSyrVcT/vlsrukEXmrFGBHxCMQRwdpFQpj0m/w= Received: by 10.141.74.17 with SMTP id b17mr876306rvl.234.1209655529864; Thu, 01 May 2008 08:25:29 -0700 (PDT) Received: by 10.140.208.15 with HTTP; Thu, 1 May 2008 08:25:29 -0700 (PDT) Message-ID: <1d3e8bf0805010825o7a6a0765ofeb63b730fef3c4e@mail.gmail.com> Date: Thu, 1 May 2008 16:25:29 +0100 From: "Dovydas Sankauskas" X-ASG-Orig-Subj: Re: disk I/O error Subject: Re: disk I/O error Cc: xfs@oss.sgi.com In-Reply-To: <480E17C7.7070606@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Content-Disposition: inline References: <1d3e8bf0804220842r26411f51vc714da371255aa90@mail.gmail.com> <480E17C7.7070606@sandeen.net> X-Barracuda-Connect: py-out-1112.google.com[64.233.166.181] X-Barracuda-Start-Time: 1209655530 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.83 X-Barracuda-Spam-Status: No, SCORE=-1.83 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=MISSING_HEADERS X-Barracuda-Spam-Report: Code version 3.1, rules version 3.1.49370 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.19 MISSING_HEADERS Missing To: header X-Virus-Scanned: ClamAV 0.91.2/6021/Wed Feb 27 15:55:48 2008 on oss.sgi.com X-Virus-Status: Clean X-archive-position: 15731 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: laisve@gmail.com Precedence: bulk X-list: xfs 2008/4/22 Eric Sandeen : > > In any case to recover as best you can from the dying disk, try > dd_rescue to image every readable sector, then run xfs_repair on that > image and mount it loopback to get to what's left. I did exactly as you said. It took a while, but I managed to recover all data I have lost. ddrescue is a great tool! Thank you for your help. -- Dovydas Sankauskas From owner-xfs@oss.sgi.com Thu May 1 13:49:53 2008 Received: with ECARTIS (v1.0.0; list xfs); Thu, 01 May 2008 13:50:11 -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.2 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-r574664 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.168.29]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id m41KndaK029718 for ; Thu, 1 May 2008 13:49:53 -0700 X-ASG-Debug-ID: 1209675018-32d000510000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from verein.lst.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id DAB27113384 for ; Thu, 1 May 2008 13:50:18 -0700 (PDT) Received: from verein.lst.de (verein.lst.de [213.95.11.210]) by cuda.sgi.com with ESMTP id 8XDYp89x324pJ0Zj for ; Thu, 01 May 2008 13:50:18 -0700 (PDT) Received: from verein.lst.de (localhost [127.0.0.1]) by verein.lst.de (8.12.3/8.12.3/Debian-7.1) with ESMTP id m41Ko7F3031639 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO) for ; Thu, 1 May 2008 22:50:07 +0200 Received: (from hch@localhost) by verein.lst.de (8.12.3/8.12.3/Debian-6.6) id m41Ko4S3031637 for xfs@oss.sgi.com; Thu, 1 May 2008 22:50:04 +0200 Date: Thu, 1 May 2008 22:50:04 +0200 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: xfsqa 166 failure Subject: xfsqa 166 failure Message-ID: <20080501205004.GA30384@lst.de> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.3.28i X-Scanned-By: MIMEDefang 2.39 X-Barracuda-Connect: verein.lst.de[213.95.11.210] X-Barracuda-Start-Time: 1209675023 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: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.1, rules version 3.1.49392 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV 0.91.2/6021/Wed Feb 27 15:55:48 2008 on oss.sgi.com X-Virus-Status: Clean X-archive-position: 15732 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: hch@lst.de Precedence: bulk X-list: xfs Looks like the awk on my system (mawk-1.3.3-11 from Debian unstable) doesn't like the regex used in there. I guess it's some kind of GNU awk extension: 166 [ 2583.856446] XFS mounting filesystem hdd [ 2583.871549] Ending clean XFS mount for filesystem: hdd - output mismatch (see 166.out.bad) 2,6c2,3 < 0: [AA..BB] XX..YY AG (AA..BB) RIGHT GOOD < 1: [AA..BB] XX..YY AG (AA..BB) RIGHT GOOD < 2: [AA..BB] XX..YY AG (AA..BB) RIGHT GOOD < 3: [AA..BB] XX..YY AG (AA..BB) RIGHT GOOD < 4: [AA..BB] XX..YY AG (AA..BB) RIGHT GOOD --- > awk: line 9: regular expression compile failed (missing operand) * is the extent unwritten? * From owner-xfs@oss.sgi.com Thu May 1 14:19:46 2008 Received: with ECARTIS (v1.0.0; list xfs); Thu, 01 May 2008 14:20:04 -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.2 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-r574664 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id m41LJgcQ031745 for ; Thu, 1 May 2008 14:19:46 -0700 X-ASG-Debug-ID: 1209676824-4d8600c50000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from verein.lst.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 585F41B909B1 for ; Thu, 1 May 2008 14:20:25 -0700 (PDT) Received: from verein.lst.de (verein.lst.de [213.95.11.210]) by cuda.sgi.com with ESMTP id daGWTbSASZdDklYW for ; Thu, 01 May 2008 14:20:24 -0700 (PDT) Received: from verein.lst.de (localhost [127.0.0.1]) by verein.lst.de (8.12.3/8.12.3/Debian-7.1) with ESMTP id m41LKIF3000405 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO) for ; Thu, 1 May 2008 23:20:18 +0200 Received: (from hch@localhost) by verein.lst.de (8.12.3/8.12.3/Debian-6.6) id m41LKID2000403 for xfs@oss.sgi.com; Thu, 1 May 2008 23:20:18 +0200 Date: Thu, 1 May 2008 23:20:18 +0200 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: xfsqa 173 failure Subject: xfsqa 173 failure Message-ID: <20080501212018.GA32213@lst.de> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.3.28i X-Scanned-By: MIMEDefang 2.39 X-Barracuda-Connect: verein.lst.de[213.95.11.210] X-Barracuda-Start-Time: 1209676826 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: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.1, rules version 3.1.49394 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV 0.91.2/6021/Wed Feb 27 15:55:48 2008 on oss.sgi.com X-Virus-Status: Clean X-archive-position: 15733 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: hch@lst.de Precedence: bulk X-list: xfs With current cvs on a 32bit kvm virtual machine: 173 [ 101.464812] XFS mounting filesystem hdd [ 101.481588] Ending clean XFS mount for filesystem: hdd [ 187.511174] XFS mounting filesystem hdd [ 188.022185] Ending clean XFS mount for filesystem: hdd [ 294.381897] XFS mounting filesystem hdd [ 294.449374] Ending clean XFS mount for filesystem: hdd [ 377.352911] Assertion failed: vn_count(vp) == 0, file: fs/xfs/xfs_inode.c, line: 3552 [ 377.354531] ------------[ cut here ]------------ [ 377.355178] kernel BUG at fs/xfs/support/debug.c:81! [ 377.355178] invalid opcode: 0000 [#1] SMP [ 377.355178] Modules linked in: xfs binfmt_misc nfsd auth_rpcgss exportfs af_packet nfs lockd nfs_acl sunrpc loop psmouse pcspkr serio_raw evdev [ 377.355178] [ 377.355178] Pid: 15732, comm: umount Not tainted (2.6.25-rc3 #29) [ 377.355178] EIP: 0060:[] EFLAGS: 00010282 CPU: 0 [ 377.355178] EIP is at assfail+0x1e/0x30 [xfs] [ 377.355178] EAX: 0000005c EBX: eca66348 ECX: c011b400 EDX: edf1a000 [ 377.355178] ESI: ec62ca08 EDI: ec62cb7c EBP: dc417e54 ESP: dc417e44 [ 377.355178] DS: 007b ES: 007b FS: 00d8 GS: 0033 SS: 0068 [ 377.355178] Process umount (pid: 15732, ti=dc416000 task=edf1a000 task.ti=dc416000) [ 377.355178] Stack: f0a17740 f0a08601 f0a0851a 00000de0 dc417e68 f09cc64a ec62ca08 00000000 [ 377.355178] ef709040 dc417e88 f09e54d3 00000003 ef751928 ec62ca08 dc417e88 00000000 [ 377.355178] ec62ca08 dc417ed8 f09ef15a f0a0253f f09ee077 00000002 00000046 c0411820 [ 377.355178] Call Trace: [ 377.355178] [] ? xfs_iflush_all+0x4a/0x80 [xfs] [ 377.355178] [] ? xfs_unmountfs+0x23/0x150 [xfs] [ 377.355178] [] ? xfs_unmount+0x14a/0x200 [xfs] [ 377.355179] [] ? xfs_fs_put_super+0x2f/0x50 [xfs] [ 377.355179] [] ? xfs_syncsub+0xe7/0x2b0 [xfs] [ 377.355179] [] ? xfs_fs_put_super+0x2f/0x50 [xfs] [ 377.355179] [] ? lock_kernel+0x2b/0x50 [ 377.355179] [] ? generic_shutdown_super+0x54/0xd0 [ 377.355179] [] ? kill_block_super+0xf/0x20 [ 377.355179] [] ? deactivate_super+0x72/0x90 [ 377.355179] [] ? mntput_no_expire+0x44/0x70 [ 377.355179] [] ? sys_umount+0x44/0x230 [ 377.355179] [] ? sys_stat64+0x14/0x30 [ 377.355179] [] ? do_munmap+0x18c/0x1f0 [ 377.355179] [] ? sys_oldumount+0x19/0x20 [ 377.355179] [] ? syscall_call+0x7/0xb [ 377.355179] ======================= [ 377.355179] Code: 00 e8 57 b0 80 cf c9 c3 90 8d 74 26 00 55 89 e5 83 ec 10 89 4c 24 0c 89 54 24 08 89 44 24 04 c7 04 24 40 77 a1 f0 e8 12 e0 71 cf <0f> 0b eb fe 8d b4 26 00 00 00 00 8d bc 27 00 00 00 00 55 89 e5 From owner-xfs@oss.sgi.com Thu May 1 15:00:55 2008 Received: with ECARTIS (v1.0.0; list xfs); Thu, 01 May 2008 15:01:06 -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.2 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-r574664 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id m41M0n0C001306 for ; Thu, 1 May 2008 15:00:55 -0700 X-ASG-Debug-ID: 1209679290-453801950000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from verein.lst.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 6EA7A1B2BCAC for ; Thu, 1 May 2008 15:01:30 -0700 (PDT) Received: from verein.lst.de (verein.lst.de [213.95.11.210]) by cuda.sgi.com with ESMTP id swAtAmJsO3kY8pMO for ; Thu, 01 May 2008 15:01:30 -0700 (PDT) Received: from verein.lst.de (localhost [127.0.0.1]) by verein.lst.de (8.12.3/8.12.3/Debian-7.1) with ESMTP id m41M1OF3002470 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO) for ; Fri, 2 May 2008 00:01:24 +0200 Received: (from hch@localhost) by verein.lst.de (8.12.3/8.12.3/Debian-6.6) id m41M1OwX002468 for xfs@oss.sgi.com; Fri, 2 May 2008 00:01:24 +0200 Date: Fri, 2 May 2008 00:01:24 +0200 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 8/10] kill calls to xfs_binval in the mount error path Subject: [PATCH 8/10] kill calls to xfs_binval in the mount error path Message-ID: <20080501220124.GH2315@lst.de> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.3.28i X-Scanned-By: MIMEDefang 2.39 X-Barracuda-Connect: verein.lst.de[213.95.11.210] X-Barracuda-Start-Time: 1209679291 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: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.1, rules version 3.1.49396 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV 0.91.2/6021/Wed Feb 27 15:55:48 2008 on oss.sgi.com X-Virus-Status: Clean X-archive-position: 15736 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: hch@lst.de Precedence: bulk X-list: xfs xfs_binval aka xfs_flush_buftarg is the first thing done in xfs_free_buftarg, so there is no need to have duplicated calls just before xfs_free_buftarg in the mount failure path. Signed-off-by: Christoph Hellwig Index: linux-2.6-xfs/fs/xfs/linux-2.6/xfs_super.c =================================================================== --- linux-2.6-xfs.orig/fs/xfs/linux-2.6/xfs_super.c 2008-05-01 20:33:11.000000000 +0200 +++ linux-2.6-xfs/fs/xfs/linux-2.6/xfs_super.c 2008-05-01 20:33:35.000000000 +0200 @@ -1790,10 +1790,10 @@ xfs_fs_fill_super( */ error = xfs_start_flags(args, mp); if (error) - goto error1; + goto out_destroy_counters; error = xfs_readsb(mp, flags); if (error) - goto error1; + goto out_destroy_counters; error = xfs_finish_flags(args, mp); if (error) goto error2; @@ -1854,12 +1854,6 @@ xfs_fs_fill_super( error2: if (mp->m_sb_bp) xfs_freesb(mp); - error1: - xfs_binval(mp->m_ddev_targp); - if (mp->m_logdev_targp && mp->m_logdev_targp != mp->m_ddev_targp) - xfs_binval(mp->m_logdev_targp); - if (mp->m_rtdev_targp) - xfs_binval(mp->m_rtdev_targp); out_destroy_counters: xfs_icsb_destroy_counters(mp); xfs_close_devices(mp); From owner-xfs@oss.sgi.com Thu May 1 15:01:04 2008 Received: with ECARTIS (v1.0.0; list xfs); Thu, 01 May 2008 15:01:28 -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.2 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-r574664 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id m41M0uRM001323 for ; Thu, 1 May 2008 15:01:04 -0700 X-ASG-Debug-ID: 1209679299-4d7001600000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from verein.lst.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id BCEA91B2BBD9 for ; Thu, 1 May 2008 15:01:40 -0700 (PDT) Received: from verein.lst.de (verein.lst.de [213.95.11.210]) by cuda.sgi.com with ESMTP id Yu8WrgKKzto30mn3 for ; Thu, 01 May 2008 15:01:40 -0700 (PDT) Received: from verein.lst.de (localhost [127.0.0.1]) by verein.lst.de (8.12.3/8.12.3/Debian-7.1) with ESMTP id m41M1XF3002489 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO) for ; Fri, 2 May 2008 00:01:33 +0200 Received: (from hch@localhost) by verein.lst.de (8.12.3/8.12.3/Debian-6.6) id m41M1XoI002486 for xfs@oss.sgi.com; Fri, 2 May 2008 00:01:33 +0200 Date: Fri, 2 May 2008 00:01:33 +0200 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 9/10] rename error2 goto label in xfs_fs_fill_super Subject: [PATCH 9/10] rename error2 goto label in xfs_fs_fill_super Message-ID: <20080501220133.GI2315@lst.de> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.3.28i X-Scanned-By: MIMEDefang 2.39 X-Barracuda-Connect: verein.lst.de[213.95.11.210] X-Barracuda-Start-Time: 1209679300 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: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.1, rules version 3.1.49396 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV 0.91.2/6021/Wed Feb 27 15:55:48 2008 on oss.sgi.com X-Virus-Status: Clean X-archive-position: 15743 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: hch@lst.de Precedence: bulk X-list: xfs Signed-off-by: Christoph Hellwig Index: linux-2.6-xfs/fs/xfs/linux-2.6/xfs_super.c =================================================================== --- linux-2.6-xfs.orig/fs/xfs/linux-2.6/xfs_super.c 2008-05-01 20:34:56.000000000 +0200 +++ linux-2.6-xfs/fs/xfs/linux-2.6/xfs_super.c 2008-05-01 20:35:30.000000000 +0200 @@ -1796,22 +1796,22 @@ xfs_fs_fill_super( goto out_destroy_counters; error = xfs_finish_flags(args, mp); if (error) - goto error2; + goto out_free_sb; error = xfs_setup_devices(mp); if (error) - goto error2; + goto out_free_sb; if (mp->m_flags & XFS_MOUNT_BARRIER) xfs_mountfs_check_barriers(mp); error = xfs_filestream_mount(mp); if (error) - goto error2; + goto out_free_sb; error = xfs_mountfs(mp, flags); if (error) - goto error2; + goto out_free_sb; XFS_SEND_MOUNT(mp, DM_RIGHT_NULL, args->mtpt, args->fsname); @@ -1851,9 +1851,8 @@ xfs_fs_fill_super( kfree(args); return 0; - error2: - if (mp->m_sb_bp) - xfs_freesb(mp); + out_free_sb: + xfs_freesb(mp); out_destroy_counters: xfs_icsb_destroy_counters(mp); xfs_close_devices(mp); From owner-xfs@oss.sgi.com Thu May 1 15:00:29 2008 Received: with ECARTIS (v1.0.0; list xfs); Thu, 01 May 2008 15:01:21 -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.2 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-r574664 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.168.29]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id m41M0NFt001250 for ; Thu, 1 May 2008 15:00:29 -0700 X-ASG-Debug-ID: 1209679266-2af201ba0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from verein.lst.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 1E3911176E1 for ; Thu, 1 May 2008 15:01:07 -0700 (PDT) Received: from verein.lst.de (verein.lst.de [213.95.11.210]) by cuda.sgi.com with ESMTP id A0F6EhAbzgY42E3j for ; Thu, 01 May 2008 15:01:07 -0700 (PDT) Received: from verein.lst.de (localhost [127.0.0.1]) by verein.lst.de (8.12.3/8.12.3/Debian-7.1) with ESMTP id m41M10F3002379 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO) for ; Fri, 2 May 2008 00:01:00 +0200 Received: (from hch@localhost) by verein.lst.de (8.12.3/8.12.3/Debian-6.6) id m41M1069002377 for xfs@oss.sgi.com; Fri, 2 May 2008 00:01:00 +0200 Date: Fri, 2 May 2008 00:01:00 +0200 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 3/10] don't call xfs_freesb from xfs_mountfs failure case Subject: [PATCH 3/10] don't call xfs_freesb from xfs_mountfs failure case Message-ID: <20080501220100.GC2315@lst.de> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.3.28i X-Scanned-By: MIMEDefang 2.39 X-Barracuda-Connect: verein.lst.de[213.95.11.210] X-Barracuda-Start-Time: 1209679268 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: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.1, rules version 3.1.49396 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV 0.91.2/6021/Wed Feb 27 15:55:48 2008 on oss.sgi.com X-Virus-Status: Clean X-archive-position: 15741 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: hch@lst.de Precedence: bulk X-list: xfs Freeing of the superblock is already handled in the caller, and that is more symmetric with the mount path, too. Signed-off-by: Christoph Hellwig Index: linux-2.6-xfs/fs/xfs/xfs_mount.c =================================================================== --- linux-2.6-xfs.orig/fs/xfs/xfs_mount.c 2008-05-01 21:20:47.000000000 +0200 +++ linux-2.6-xfs/fs/xfs/xfs_mount.c 2008-05-01 21:21:04.000000000 +0200 @@ -1272,7 +1272,6 @@ xfs_mountfs( error1: if (uuid_mounted) uuid_table_remove(&mp->m_sb.sb_uuid); - xfs_freesb(mp); return error; } From owner-xfs@oss.sgi.com Thu May 1 15:01:07 2008 Received: with ECARTIS (v1.0.0; list xfs); Thu, 01 May 2008 15:01:24 -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.2 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-r574664 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.168.29]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id m41M11QQ001340 for ; Thu, 1 May 2008 15:01:07 -0700 X-ASG-Debug-ID: 1209679305-2b8f01570000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from verein.lst.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 6BDCC1176F0 for ; Thu, 1 May 2008 15:01:45 -0700 (PDT) Received: from verein.lst.de (verein.lst.de [213.95.11.210]) by cuda.sgi.com with ESMTP id WcSgMN0bsUuXGywF for ; Thu, 01 May 2008 15:01:45 -0700 (PDT) Received: from verein.lst.de (localhost [127.0.0.1]) by verein.lst.de (8.12.3/8.12.3/Debian-7.1) with ESMTP id m41M1cF3002509 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO) for ; Fri, 2 May 2008 00:01:39 +0200 Received: (from hch@localhost) by verein.lst.de (8.12.3/8.12.3/Debian-6.6) id m41M1c8q002507 for xfs@oss.sgi.com; Fri, 2 May 2008 00:01:38 +0200 Date: Fri, 2 May 2008 00:01:38 +0200 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 10/10] add missing call to xfs_filestream_unmount on xfs_mountfs failure Subject: [PATCH 10/10] add missing call to xfs_filestream_unmount on xfs_mountfs failure Message-ID: <20080501220138.GJ2315@lst.de> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.3.28i X-Scanned-By: MIMEDefang 2.39 X-Barracuda-Connect: verein.lst.de[213.95.11.210] X-Barracuda-Start-Time: 1209679306 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: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.1, rules version 3.1.49396 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV 0.91.2/6021/Wed Feb 27 15:55:48 2008 on oss.sgi.com X-Virus-Status: Clean X-archive-position: 15742 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: hch@lst.de Precedence: bulk X-list: xfs Signed-off-by: Christoph Hellwig Index: linux-2.6-xfs/fs/xfs/linux-2.6/xfs_super.c =================================================================== --- linux-2.6-xfs.orig/fs/xfs/linux-2.6/xfs_super.c 2008-05-01 20:35:30.000000000 +0200 +++ linux-2.6-xfs/fs/xfs/linux-2.6/xfs_super.c 2008-05-01 20:36:38.000000000 +0200 @@ -1811,7 +1811,7 @@ xfs_fs_fill_super( error = xfs_mountfs(mp, flags); if (error) - goto out_free_sb; + goto out_filestream_unmount; XFS_SEND_MOUNT(mp, DM_RIGHT_NULL, args->mtpt, args->fsname); @@ -1851,6 +1851,8 @@ xfs_fs_fill_super( kfree(args); return 0; + out_filestream_unmount: + xfs_filestream_unmount(mp); out_free_sb: xfs_freesb(mp); out_destroy_counters: From owner-xfs@oss.sgi.com Thu May 1 15:00:25 2008 Received: with ECARTIS (v1.0.0; list xfs); Thu, 01 May 2008 15:00:47 -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.1 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_42 autolearn=no 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 m41M0Khe001241 for ; Thu, 1 May 2008 15:00:25 -0700 X-ASG-Debug-ID: 1209679261-08e601ad0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from verein.lst.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 2743F12ACED5 for ; Thu, 1 May 2008 15:01:01 -0700 (PDT) Received: from verein.lst.de (verein.lst.de [213.95.11.210]) by cuda.sgi.com with ESMTP id iKrLYgxTkmDx3Ru4 for ; Thu, 01 May 2008 15:01:01 -0700 (PDT) Received: from verein.lst.de (localhost [127.0.0.1]) by verein.lst.de (8.12.3/8.12.3/Debian-7.1) with ESMTP id m41M0sF3002363 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO) for ; Fri, 2 May 2008 00:00:54 +0200 Received: (from hch@localhost) by verein.lst.de (8.12.3/8.12.3/Debian-6.6) id m41M0sXZ002361 for xfs@oss.sgi.com; Fri, 2 May 2008 00:00:54 +0200 Date: Fri, 2 May 2008 00:00:54 +0200 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 2/10] merge xfs_mount into xfs_fs_fill_super Subject: [PATCH 2/10] merge xfs_mount into xfs_fs_fill_super Message-ID: <20080501220054.GB2315@lst.de> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.3.28i X-Scanned-By: MIMEDefang 2.39 X-Barracuda-Connect: verein.lst.de[213.95.11.210] X-Barracuda-Start-Time: 1209679263 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: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.1, rules version 3.1.49395 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV 0.91.2/6021/Wed Feb 27 15:55:48 2008 on oss.sgi.com X-Virus-Status: Clean X-archive-position: 15735 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: hch@lst.de Precedence: bulk X-list: xfs xfs_mount is already pretty linux-specific so merge it into xfs_fs_fill_super to allow for a more structured mount code in the next patches. xfs_start_flags and xfs_finish_flags also move to xfs_super.c. Signed-off-by: Christoph Hellwig Index: linux-2.6-xfs/fs/xfs/xfs_vfsops.h =================================================================== --- linux-2.6-xfs.orig/fs/xfs/xfs_vfsops.h 2008-05-01 19:06:18.000000000 +0200 +++ linux-2.6-xfs/fs/xfs/xfs_vfsops.h 2008-05-01 19:08:41.000000000 +0200 @@ -8,8 +8,6 @@ struct kstatfs; struct xfs_mount; struct xfs_mount_args; -int xfs_mount(struct xfs_mount *mp, struct xfs_mount_args *args, - struct cred *credp); int xfs_sync(struct xfs_mount *mp, int flags); void xfs_do_force_shutdown(struct xfs_mount *mp, int flags, char *fname, int lnnum); Index: linux-2.6-xfs/fs/xfs/linux-2.6/xfs_super.c =================================================================== --- linux-2.6-xfs.orig/fs/xfs/linux-2.6/xfs_super.c 2008-05-01 19:08:46.000000000 +0200 +++ linux-2.6-xfs/fs/xfs/linux-2.6/xfs_super.c 2008-05-01 19:28:51.000000000 +0200 @@ -1367,6 +1367,235 @@ xfs_fs_setxquota( Q_XSETPQLIM), id, (caddr_t)fdq); } +/* + * This function fills in xfs_mount_t fields based on mount args. + * Note: the superblock has _not_ yet been read in. + */ +STATIC int +xfs_start_flags( + struct xfs_mount_args *ap, + struct xfs_mount *mp) +{ + /* Values are in BBs */ + if ((ap->flags & XFSMNT_NOALIGN) != XFSMNT_NOALIGN) { + /* + * At this point the superblock has not been read + * in, therefore we do not know the block size. + * Before the mount call ends we will convert + * these to FSBs. + */ + mp->m_dalign = ap->sunit; + mp->m_swidth = ap->swidth; + } + + if (ap->logbufs != -1 && + ap->logbufs != 0 && + (ap->logbufs < XLOG_MIN_ICLOGS || + ap->logbufs > XLOG_MAX_ICLOGS)) { + cmn_err(CE_WARN, + "XFS: invalid logbufs value: %d [not %d-%d]", + ap->logbufs, XLOG_MIN_ICLOGS, XLOG_MAX_ICLOGS); + return XFS_ERROR(EINVAL); + } + mp->m_logbufs = ap->logbufs; + if (ap->logbufsize != -1 && + ap->logbufsize != 0 && + (ap->logbufsize < XLOG_MIN_RECORD_BSIZE || + ap->logbufsize > XLOG_MAX_RECORD_BSIZE || + !is_power_of_2(ap->logbufsize))) { + cmn_err(CE_WARN, + "XFS: invalid logbufsize: %d [not 16k,32k,64k,128k or 256k]", + ap->logbufsize); + return XFS_ERROR(EINVAL); + } + mp->m_logbsize = ap->logbufsize; + mp->m_fsname_len = strlen(ap->fsname) + 1; + mp->m_fsname = kmem_alloc(mp->m_fsname_len, KM_SLEEP); + strcpy(mp->m_fsname, ap->fsname); + if (ap->rtname[0]) { + mp->m_rtname = kmem_alloc(strlen(ap->rtname) + 1, KM_SLEEP); + strcpy(mp->m_rtname, ap->rtname); + } + if (ap->logname[0]) { + mp->m_logname = kmem_alloc(strlen(ap->logname) + 1, KM_SLEEP); + strcpy(mp->m_logname, ap->logname); + } + + if (ap->flags & XFSMNT_WSYNC) + mp->m_flags |= XFS_MOUNT_WSYNC; +#if XFS_BIG_INUMS + if (ap->flags & XFSMNT_INO64) { + mp->m_flags |= XFS_MOUNT_INO64; + mp->m_inoadd = XFS_INO64_OFFSET; + } +#endif + if (ap->flags & XFSMNT_RETERR) + mp->m_flags |= XFS_MOUNT_RETERR; + if (ap->flags & XFSMNT_NOALIGN) + mp->m_flags |= XFS_MOUNT_NOALIGN; + if (ap->flags & XFSMNT_SWALLOC) + mp->m_flags |= XFS_MOUNT_SWALLOC; + if (ap->flags & XFSMNT_OSYNCISOSYNC) + mp->m_flags |= XFS_MOUNT_OSYNCISOSYNC; + if (ap->flags & XFSMNT_32BITINODES) + mp->m_flags |= XFS_MOUNT_32BITINODES; + + if (ap->flags & XFSMNT_IOSIZE) { + if (ap->iosizelog > XFS_MAX_IO_LOG || + ap->iosizelog < XFS_MIN_IO_LOG) { + cmn_err(CE_WARN, + "XFS: invalid log iosize: %d [not %d-%d]", + ap->iosizelog, XFS_MIN_IO_LOG, + XFS_MAX_IO_LOG); + return XFS_ERROR(EINVAL); + } + + mp->m_flags |= XFS_MOUNT_DFLT_IOSIZE; + mp->m_readio_log = mp->m_writeio_log = ap->iosizelog; + } + + if (ap->flags & XFSMNT_IKEEP) + mp->m_flags |= XFS_MOUNT_IKEEP; + if (ap->flags & XFSMNT_DIRSYNC) + mp->m_flags |= XFS_MOUNT_DIRSYNC; + if (ap->flags & XFSMNT_ATTR2) + mp->m_flags |= XFS_MOUNT_ATTR2; + if (ap->flags & XFSMNT_NOATTR2) + mp->m_flags |= XFS_MOUNT_NOATTR2; + + if (ap->flags2 & XFSMNT2_COMPAT_IOSIZE) + mp->m_flags |= XFS_MOUNT_COMPAT_IOSIZE; + + /* + * no recovery flag requires a read-only mount + */ + if (ap->flags & XFSMNT_NORECOVERY) { + if (!(mp->m_flags & XFS_MOUNT_RDONLY)) { + cmn_err(CE_WARN, + "XFS: tried to mount a FS read-write without recovery!"); + return XFS_ERROR(EINVAL); + } + mp->m_flags |= XFS_MOUNT_NORECOVERY; + } + + if (ap->flags & XFSMNT_NOUUID) + mp->m_flags |= XFS_MOUNT_NOUUID; + if (ap->flags & XFSMNT_BARRIER) + mp->m_flags |= XFS_MOUNT_BARRIER; + else + mp->m_flags &= ~XFS_MOUNT_BARRIER; + + if (ap->flags2 & XFSMNT2_FILESTREAMS) + mp->m_flags |= XFS_MOUNT_FILESTREAMS; + + if (ap->flags & XFSMNT_DMAPI) + mp->m_flags |= XFS_MOUNT_DMAPI; + return 0; +} + +/* + * This function fills in xfs_mount_t fields based on mount args. + * Note: the superblock _has_ now been read in. + */ +STATIC int +xfs_finish_flags( + struct xfs_mount_args *ap, + struct xfs_mount *mp) +{ + int ronly = (mp->m_flags & XFS_MOUNT_RDONLY); + + /* Fail a mount where the logbuf is smaller then the log stripe */ + if (xfs_sb_version_haslogv2(&mp->m_sb)) { + if ((ap->logbufsize <= 0) && + (mp->m_sb.sb_logsunit > XLOG_BIG_RECORD_BSIZE)) { + mp->m_logbsize = mp->m_sb.sb_logsunit; + } else if (ap->logbufsize > 0 && + ap->logbufsize < mp->m_sb.sb_logsunit) { + cmn_err(CE_WARN, + "XFS: logbuf size must be greater than or equal to log stripe size"); + return XFS_ERROR(EINVAL); + } + } else { + /* Fail a mount if the logbuf is larger than 32K */ + if (ap->logbufsize > XLOG_BIG_RECORD_BSIZE) { + cmn_err(CE_WARN, + "XFS: logbuf size for version 1 logs must be 16K or 32K"); + return XFS_ERROR(EINVAL); + } + } + + /* + * mkfs'ed attr2 will turn on attr2 mount unless explicitly + * told by noattr2 to turn it off + */ + if (xfs_sb_version_hasattr2(&mp->m_sb) && + !(ap->flags & XFSMNT_NOATTR2)) + mp->m_flags |= XFS_MOUNT_ATTR2; + + /* + * prohibit r/w mounts of read-only filesystems + */ + if ((mp->m_sb.sb_flags & XFS_SBF_READONLY) && !ronly) { + cmn_err(CE_WARN, + "XFS: cannot mount a read-only filesystem as read-write"); + return XFS_ERROR(EROFS); + } + + /* + * check for shared mount. + */ + if (ap->flags & XFSMNT_SHARED) { + if (!xfs_sb_version_hasshared(&mp->m_sb)) + return XFS_ERROR(EINVAL); + + /* + * For IRIX 6.5, shared mounts must have the shared + * version bit set, have the persistent readonly + * field set, must be version 0 and can only be mounted + * read-only. + */ + if (!ronly || !(mp->m_sb.sb_flags & XFS_SBF_READONLY) || + (mp->m_sb.sb_shared_vn != 0)) + return XFS_ERROR(EINVAL); + + mp->m_flags |= XFS_MOUNT_SHARED; + + /* + * Shared XFS V0 can't deal with DMI. Return EINVAL. + */ + if (mp->m_sb.sb_shared_vn == 0 && (ap->flags & XFSMNT_DMAPI)) + return XFS_ERROR(EINVAL); + } + + if (ap->flags & XFSMNT_UQUOTA) { + mp->m_qflags |= (XFS_UQUOTA_ACCT | XFS_UQUOTA_ACTIVE); + if (ap->flags & XFSMNT_UQUOTAENF) + mp->m_qflags |= XFS_UQUOTA_ENFD; + } + + if (ap->flags & XFSMNT_GQUOTA) { + mp->m_qflags |= (XFS_GQUOTA_ACCT | XFS_GQUOTA_ACTIVE); + if (ap->flags & XFSMNT_GQUOTAENF) + mp->m_qflags |= XFS_OQUOTA_ENFD; + } else if (ap->flags & XFSMNT_PQUOTA) { + mp->m_qflags |= (XFS_PQUOTA_ACCT | XFS_PQUOTA_ACTIVE); + if (ap->flags & XFSMNT_PQUOTAENF) + mp->m_qflags |= XFS_OQUOTA_ENFD; + } + + return 0; +} + +/* + * The file system configurations are: + * (1) device (partition) with data and internal log + * (2) logical volume with data and log subvolumes. + * (3) logical volume with data, log, and realtime subvolumes. + * + * We only have to handle opening the log and realtime volumes here if + * they are present. The data subvolume has already been opened by + * get_sb_bdev() and is stored in vfsp->vfs_super->s_bdev. + */ STATIC int xfs_fs_fill_super( struct super_block *sb, @@ -1376,7 +1605,9 @@ xfs_fs_fill_super( struct inode *root; struct xfs_mount *mp = NULL; struct xfs_mount_args *args = xfs_args_allocate(sb, silent); - int error; + struct block_device *ddev = sb->s_bdev; + struct block_device *logdev = NULL, *rtdev = NULL; + int flags = 0, error; mp = xfs_mount_init(); @@ -1400,10 +1631,114 @@ xfs_fs_fill_super( sb->s_qcop = &xfs_quotactl_operations; sb->s_op = &xfs_super_operations; - error = xfs_mount(mp, args, NULL); + error = xfs_dmops_get(mp, args); + if (error) + goto fail_vfsop; + error = xfs_qmops_get(mp, args); if (error) goto fail_vfsop; + if (args->flags & XFSMNT_QUIET) + flags |= XFS_MFSI_QUIET; + + /* + * Open real time and log devices - order is important. + */ + if (args->logname[0]) { + error = xfs_blkdev_get(mp, args->logname, &logdev); + if (error) + goto fail_vfsop; + } + if (args->rtname[0]) { + error = xfs_blkdev_get(mp, args->rtname, &rtdev); + if (error) { + xfs_blkdev_put(logdev); + goto fail_vfsop; + } + + if (rtdev == ddev || rtdev == logdev) { + cmn_err(CE_WARN, + "XFS: Cannot mount filesystem with identical rtdev and ddev/logdev."); + xfs_blkdev_put(logdev); + xfs_blkdev_put(rtdev); + error = EINVAL; + goto fail_vfsop; + } + } + + /* + * Setup xfs_mount buffer target pointers + */ + error = ENOMEM; + mp->m_ddev_targp = xfs_alloc_buftarg(ddev, 0); + if (!mp->m_ddev_targp) { + xfs_blkdev_put(logdev); + xfs_blkdev_put(rtdev); + goto fail_vfsop; + } + if (rtdev) { + mp->m_rtdev_targp = xfs_alloc_buftarg(rtdev, 1); + if (!mp->m_rtdev_targp) { + xfs_blkdev_put(logdev); + xfs_blkdev_put(rtdev); + goto error0; + } + } + mp->m_logdev_targp = (logdev && logdev != ddev) ? + xfs_alloc_buftarg(logdev, 1) : mp->m_ddev_targp; + if (!mp->m_logdev_targp) { + xfs_blkdev_put(logdev); + xfs_blkdev_put(rtdev); + goto error0; + } + + /* + * Setup flags based on mount(2) options and then the superblock + */ + error = xfs_start_flags(args, mp); + if (error) + goto error1; + error = xfs_readsb(mp, flags); + if (error) + goto error1; + error = xfs_finish_flags(args, mp); + if (error) + goto error2; + + /* + * Setup xfs_mount buffer target pointers based on superblock + */ + error = xfs_setsize_buftarg(mp->m_ddev_targp, mp->m_sb.sb_blocksize, + mp->m_sb.sb_sectsize); + if (!error && logdev && logdev != ddev) { + unsigned int log_sector_size = BBSIZE; + + if (xfs_sb_version_hassector(&mp->m_sb)) + log_sector_size = mp->m_sb.sb_logsectsize; + error = xfs_setsize_buftarg(mp->m_logdev_targp, + mp->m_sb.sb_blocksize, + log_sector_size); + } + if (!error && rtdev) + error = xfs_setsize_buftarg(mp->m_rtdev_targp, + mp->m_sb.sb_blocksize, + mp->m_sb.sb_sectsize); + if (error) + goto error2; + + if (mp->m_flags & XFS_MOUNT_BARRIER) + xfs_mountfs_check_barriers(mp); + + error = xfs_filestream_mount(mp); + if (error) + goto error2; + + error = xfs_mountfs(mp, flags); + if (error) + goto error2; + + XFS_SEND_MOUNT(mp, DM_RIGHT_NULL, args->mtpt, args->fsname); + sb->s_dirt = 1; sb->s_magic = XFS_SB_MAGIC; sb->s_blocksize = mp->m_sb.sb_blocksize; @@ -1440,7 +1775,22 @@ xfs_fs_fill_super( kmem_free(args, sizeof(*args)); return 0; -fail_vnrele: + error2: + if (mp->m_sb_bp) + xfs_freesb(mp); + error1: + xfs_binval(mp->m_ddev_targp); + if (logdev && logdev != ddev) + xfs_binval(mp->m_logdev_targp); + if (rtdev) + xfs_binval(mp->m_rtdev_targp); + error0: + xfs_unmountfs_close(mp, NULL); + xfs_qmops_put(mp); + xfs_dmops_put(mp); + goto fail_vfsop; + + fail_vnrele: if (sb->s_root) { dput(sb->s_root); sb->s_root = NULL; @@ -1448,7 +1798,7 @@ fail_vnrele: iput(root); } -fail_unmount: + fail_unmount: /* * Blow away any referenced inode in the filestreams cache. * This can and will cause log traffic as inodes go inactive @@ -1467,7 +1817,7 @@ fail_unmount: xfs_dmops_put(mp); kmem_free(mp, sizeof(xfs_mount_t)); -fail_vfsop: + fail_vfsop: kmem_free(args, sizeof(*args)); return -error; } Index: linux-2.6-xfs/fs/xfs/xfs_vfsops.c =================================================================== --- linux-2.6-xfs.orig/fs/xfs/xfs_vfsops.c 2008-05-01 19:08:46.000000000 +0200 +++ linux-2.6-xfs/fs/xfs/xfs_vfsops.c 2008-05-01 19:20:09.000000000 +0200 @@ -189,375 +189,6 @@ xfs_cleanup(void) kmem_zone_destroy(xfs_log_ticket_zone); } -/* - * xfs_start_flags - * - * This function fills in xfs_mount_t fields based on mount args. - * Note: the superblock has _not_ yet been read in. - */ -STATIC int -xfs_start_flags( - struct xfs_mount_args *ap, - struct xfs_mount *mp) -{ - /* Values are in BBs */ - if ((ap->flags & XFSMNT_NOALIGN) != XFSMNT_NOALIGN) { - /* - * At this point the superblock has not been read - * in, therefore we do not know the block size. - * Before the mount call ends we will convert - * these to FSBs. - */ - mp->m_dalign = ap->sunit; - mp->m_swidth = ap->swidth; - } - - if (ap->logbufs != -1 && - ap->logbufs != 0 && - (ap->logbufs < XLOG_MIN_ICLOGS || - ap->logbufs > XLOG_MAX_ICLOGS)) { - cmn_err(CE_WARN, - "XFS: invalid logbufs value: %d [not %d-%d]", - ap->logbufs, XLOG_MIN_ICLOGS, XLOG_MAX_ICLOGS); - return XFS_ERROR(EINVAL); - } - mp->m_logbufs = ap->logbufs; - if (ap->logbufsize != -1 && - ap->logbufsize != 0 && - (ap->logbufsize < XLOG_MIN_RECORD_BSIZE || - ap->logbufsize > XLOG_MAX_RECORD_BSIZE || - !is_power_of_2(ap->logbufsize))) { - cmn_err(CE_WARN, - "XFS: invalid logbufsize: %d [not 16k,32k,64k,128k or 256k]", - ap->logbufsize); - return XFS_ERROR(EINVAL); - } - mp->m_logbsize = ap->logbufsize; - mp->m_fsname_len = strlen(ap->fsname) + 1; - mp->m_fsname = kmem_alloc(mp->m_fsname_len, KM_SLEEP); - strcpy(mp->m_fsname, ap->fsname); - if (ap->rtname[0]) { - mp->m_rtname = kmem_alloc(strlen(ap->rtname) + 1, KM_SLEEP); - strcpy(mp->m_rtname, ap->rtname); - } - if (ap->logname[0]) { - mp->m_logname = kmem_alloc(strlen(ap->logname) + 1, KM_SLEEP); - strcpy(mp->m_logname, ap->logname); - } - - if (ap->flags & XFSMNT_WSYNC) - mp->m_flags |= XFS_MOUNT_WSYNC; -#if XFS_BIG_INUMS - if (ap->flags & XFSMNT_INO64) { - mp->m_flags |= XFS_MOUNT_INO64; - mp->m_inoadd = XFS_INO64_OFFSET; - } -#endif - if (ap->flags & XFSMNT_RETERR) - mp->m_flags |= XFS_MOUNT_RETERR; - if (ap->flags & XFSMNT_NOALIGN) - mp->m_flags |= XFS_MOUNT_NOALIGN; - if (ap->flags & XFSMNT_SWALLOC) - mp->m_flags |= XFS_MOUNT_SWALLOC; - if (ap->flags & XFSMNT_OSYNCISOSYNC) - mp->m_flags |= XFS_MOUNT_OSYNCISOSYNC; - if (ap->flags & XFSMNT_32BITINODES) - mp->m_flags |= XFS_MOUNT_32BITINODES; - - if (ap->flags & XFSMNT_IOSIZE) { - if (ap->iosizelog > XFS_MAX_IO_LOG || - ap->iosizelog < XFS_MIN_IO_LOG) { - cmn_err(CE_WARN, - "XFS: invalid log iosize: %d [not %d-%d]", - ap->iosizelog, XFS_MIN_IO_LOG, - XFS_MAX_IO_LOG); - return XFS_ERROR(EINVAL); - } - - mp->m_flags |= XFS_MOUNT_DFLT_IOSIZE; - mp->m_readio_log = mp->m_writeio_log = ap->iosizelog; - } - - if (ap->flags & XFSMNT_IKEEP) - mp->m_flags |= XFS_MOUNT_IKEEP; - if (ap->flags & XFSMNT_DIRSYNC) - mp->m_flags |= XFS_MOUNT_DIRSYNC; - if (ap->flags & XFSMNT_ATTR2) - mp->m_flags |= XFS_MOUNT_ATTR2; - if (ap->flags & XFSMNT_NOATTR2) - mp->m_flags |= XFS_MOUNT_NOATTR2; - - if (ap->flags2 & XFSMNT2_COMPAT_IOSIZE) - mp->m_flags |= XFS_MOUNT_COMPAT_IOSIZE; - - /* - * no recovery flag requires a read-only mount - */ - if (ap->flags & XFSMNT_NORECOVERY) { - if (!(mp->m_flags & XFS_MOUNT_RDONLY)) { - cmn_err(CE_WARN, - "XFS: tried to mount a FS read-write without recovery!"); - return XFS_ERROR(EINVAL); - } - mp->m_flags |= XFS_MOUNT_NORECOVERY; - } - - if (ap->flags & XFSMNT_NOUUID) - mp->m_flags |= XFS_MOUNT_NOUUID; - if (ap->flags & XFSMNT_BARRIER) - mp->m_flags |= XFS_MOUNT_BARRIER; - else - mp->m_flags &= ~XFS_MOUNT_BARRIER; - - if (ap->flags2 & XFSMNT2_FILESTREAMS) - mp->m_flags |= XFS_MOUNT_FILESTREAMS; - - if (ap->flags & XFSMNT_DMAPI) - mp->m_flags |= XFS_MOUNT_DMAPI; - return 0; -} - -/* - * This function fills in xfs_mount_t fields based on mount args. - * Note: the superblock _has_ now been read in. - */ -STATIC int -xfs_finish_flags( - struct xfs_mount_args *ap, - struct xfs_mount *mp) -{ - int ronly = (mp->m_flags & XFS_MOUNT_RDONLY); - - /* Fail a mount where the logbuf is smaller then the log stripe */ - if (xfs_sb_version_haslogv2(&mp->m_sb)) { - if ((ap->logbufsize <= 0) && - (mp->m_sb.sb_logsunit > XLOG_BIG_RECORD_BSIZE)) { - mp->m_logbsize = mp->m_sb.sb_logsunit; - } else if (ap->logbufsize > 0 && - ap->logbufsize < mp->m_sb.sb_logsunit) { - cmn_err(CE_WARN, - "XFS: logbuf size must be greater than or equal to log stripe size"); - return XFS_ERROR(EINVAL); - } - } else { - /* Fail a mount if the logbuf is larger than 32K */ - if (ap->logbufsize > XLOG_BIG_RECORD_BSIZE) { - cmn_err(CE_WARN, - "XFS: logbuf size for version 1 logs must be 16K or 32K"); - return XFS_ERROR(EINVAL); - } - } - - /* - * mkfs'ed attr2 will turn on attr2 mount unless explicitly - * told by noattr2 to turn it off - */ - if (xfs_sb_version_hasattr2(&mp->m_sb) && - !(ap->flags & XFSMNT_NOATTR2)) - mp->m_flags |= XFS_MOUNT_ATTR2; - - /* - * prohibit r/w mounts of read-only filesystems - */ - if ((mp->m_sb.sb_flags & XFS_SBF_READONLY) && !ronly) { - cmn_err(CE_WARN, - "XFS: cannot mount a read-only filesystem as read-write"); - return XFS_ERROR(EROFS); - } - - /* - * check for shared mount. - */ - if (ap->flags & XFSMNT_SHARED) { - if (!xfs_sb_version_hasshared(&mp->m_sb)) - return XFS_ERROR(EINVAL); - - /* - * For IRIX 6.5, shared mounts must have the shared - * version bit set, have the persistent readonly - * field set, must be version 0 and can only be mounted - * read-only. - */ - if (!ronly || !(mp->m_sb.sb_flags & XFS_SBF_READONLY) || - (mp->m_sb.sb_shared_vn != 0)) - return XFS_ERROR(EINVAL); - - mp->m_flags |= XFS_MOUNT_SHARED; - - /* - * Shared XFS V0 can't deal with DMI. Return EINVAL. - */ - if (mp->m_sb.sb_shared_vn == 0 && (ap->flags & XFSMNT_DMAPI)) - return XFS_ERROR(EINVAL); - } - - if (ap->flags & XFSMNT_UQUOTA) { - mp->m_qflags |= (XFS_UQUOTA_ACCT | XFS_UQUOTA_ACTIVE); - if (ap->flags & XFSMNT_UQUOTAENF) - mp->m_qflags |= XFS_UQUOTA_ENFD; - } - - if (ap->flags & XFSMNT_GQUOTA) { - mp->m_qflags |= (XFS_GQUOTA_ACCT | XFS_GQUOTA_ACTIVE); - if (ap->flags & XFSMNT_GQUOTAENF) - mp->m_qflags |= XFS_OQUOTA_ENFD; - } else if (ap->flags & XFSMNT_PQUOTA) { - mp->m_qflags |= (XFS_PQUOTA_ACCT | XFS_PQUOTA_ACTIVE); - if (ap->flags & XFSMNT_PQUOTAENF) - mp->m_qflags |= XFS_OQUOTA_ENFD; - } - - return 0; -} - -/* - * xfs_mount - * - * The file system configurations are: - * (1) device (partition) with data and internal log - * (2) logical volume with data and log subvolumes. - * (3) logical volume with data, log, and realtime subvolumes. - * - * We only have to handle opening the log and realtime volumes here if - * they are present. The data subvolume has already been opened by - * get_sb_bdev() and is stored in vfsp->vfs_super->s_bdev. - */ -int -xfs_mount( - struct xfs_mount *mp, - struct xfs_mount_args *args, - cred_t *credp) -{ - struct block_device *ddev, *logdev, *rtdev; - int flags = 0, error; - - ddev = mp->m_super->s_bdev; - logdev = rtdev = NULL; - - error = xfs_dmops_get(mp, args); - if (error) - return error; - error = xfs_qmops_get(mp, args); - if (error) - return error; - - if (args->flags & XFSMNT_QUIET) - flags |= XFS_MFSI_QUIET; - - /* - * Open real time and log devices - order is important. - */ - if (args->logname[0]) { - error = xfs_blkdev_get(mp, args->logname, &logdev); - if (error) - return error; - } - if (args->rtname[0]) { - error = xfs_blkdev_get(mp, args->rtname, &rtdev); - if (error) { - xfs_blkdev_put(logdev); - return error; - } - - if (rtdev == ddev || rtdev == logdev) { - cmn_err(CE_WARN, - "XFS: Cannot mount filesystem with identical rtdev and ddev/logdev."); - xfs_blkdev_put(logdev); - xfs_blkdev_put(rtdev); - return EINVAL; - } - } - - /* - * Setup xfs_mount buffer target pointers - */ - error = ENOMEM; - mp->m_ddev_targp = xfs_alloc_buftarg(ddev, 0); - if (!mp->m_ddev_targp) { - xfs_blkdev_put(logdev); - xfs_blkdev_put(rtdev); - return error; - } - if (rtdev) { - mp->m_rtdev_targp = xfs_alloc_buftarg(rtdev, 1); - if (!mp->m_rtdev_targp) { - xfs_blkdev_put(logdev); - xfs_blkdev_put(rtdev); - goto error0; - } - } - mp->m_logdev_targp = (logdev && logdev != ddev) ? - xfs_alloc_buftarg(logdev, 1) : mp->m_ddev_targp; - if (!mp->m_logdev_targp) { - xfs_blkdev_put(logdev); - xfs_blkdev_put(rtdev); - goto error0; - } - - /* - * Setup flags based on mount(2) options and then the superblock - */ - error = xfs_start_flags(args, mp); - if (error) - goto error1; - error = xfs_readsb(mp, flags); - if (error) - goto error1; - error = xfs_finish_flags(args, mp); - if (error) - goto error2; - - /* - * Setup xfs_mount buffer target pointers based on superblock - */ - error = xfs_setsize_buftarg(mp->m_ddev_targp, mp->m_sb.sb_blocksize, - mp->m_sb.sb_sectsize); - if (!error && logdev && logdev != ddev) { - unsigned int log_sector_size = BBSIZE; - - if (xfs_sb_version_hassector(&mp->m_sb)) - log_sector_size = mp->m_sb.sb_logsectsize; - error = xfs_setsize_buftarg(mp->m_logdev_targp, - mp->m_sb.sb_blocksize, - log_sector_size); - } - if (!error && rtdev) - error = xfs_setsize_buftarg(mp->m_rtdev_targp, - mp->m_sb.sb_blocksize, - mp->m_sb.sb_sectsize); - if (error) - goto error2; - - if (mp->m_flags & XFS_MOUNT_BARRIER) - xfs_mountfs_check_barriers(mp); - - if ((error = xfs_filestream_mount(mp))) - goto error2; - - error = xfs_mountfs(mp, flags); - if (error) - goto error2; - - XFS_SEND_MOUNT(mp, DM_RIGHT_NULL, args->mtpt, args->fsname); - - return 0; - -error2: - if (mp->m_sb_bp) - xfs_freesb(mp); -error1: - xfs_binval(mp->m_ddev_targp); - if (logdev && logdev != ddev) - xfs_binval(mp->m_logdev_targp); - if (rtdev) - xfs_binval(mp->m_rtdev_targp); -error0: - xfs_unmountfs_close(mp, credp); - xfs_qmops_put(mp); - xfs_dmops_put(mp); - return error; -} - STATIC void xfs_quiesce_fs( xfs_mount_t *mp) From owner-xfs@oss.sgi.com Thu May 1 15:00:46 2008 Received: with ECARTIS (v1.0.0; list xfs); Thu, 01 May 2008 15:01:20 -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.2 required=5.0 tests=AWL,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 m41M0hmc001287 for ; Thu, 1 May 2008 15:00:46 -0700 X-ASG-Debug-ID: 1209679286-6d1b02b80000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from verein.lst.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id B08E812ACEE3 for ; Thu, 1 May 2008 15:01:26 -0700 (PDT) Received: from verein.lst.de (verein.lst.de [213.95.11.210]) by cuda.sgi.com with ESMTP id jOPpCDJCEtqdUoPJ for ; Thu, 01 May 2008 15:01:26 -0700 (PDT) Received: from verein.lst.de (localhost [127.0.0.1]) by verein.lst.de (8.12.3/8.12.3/Debian-7.1) with ESMTP id m41M1JF3002449 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO) for ; Fri, 2 May 2008 00:01:20 +0200 Received: (from hch@localhost) by verein.lst.de (8.12.3/8.12.3/Debian-6.6) id m41M1J7x002447 for xfs@oss.sgi.com; Fri, 2 May 2008 00:01:19 +0200 Date: Fri, 2 May 2008 00:01:19 +0200 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 7/10] kill xfs_mount_init Subject: [PATCH 7/10] kill xfs_mount_init Message-ID: <20080501220119.GG2315@lst.de> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.3.28i X-Scanned-By: MIMEDefang 2.39 X-Barracuda-Connect: verein.lst.de[213.95.11.210] X-Barracuda-Start-Time: 1209679287 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: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.1, rules version 3.1.49395 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV 0.91.2/6021/Wed Feb 27 15:55:48 2008 on oss.sgi.com X-Virus-Status: Clean X-archive-position: 15739 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: hch@lst.de Precedence: bulk X-list: xfs xfs_mount_init is inlined into xfs_fs_fill_super and allocation switched to kzalloc. Plug a leak of the mount structure for most early mount failures. Move xfs_icsb_init_counters to as late as possible in the mount path and make sure to undo it so that no stale hotplug cpu notifiers are left around on mount failures. Signed-off-by: Christoph Hellwig Index: linux-2.6-xfs/fs/xfs/linux-2.6/xfs_super.c =================================================================== --- linux-2.6-xfs.orig/fs/xfs/linux-2.6/xfs_super.c 2008-05-01 20:15:00.000000000 +0200 +++ linux-2.6-xfs/fs/xfs/linux-2.6/xfs_super.c 2008-05-01 20:28:36.000000000 +0200 @@ -1273,10 +1273,11 @@ xfs_fs_put_super( } xfs_unmountfs(mp); + xfs_icsb_destroy_counters(mp); xfs_close_devices(mp); xfs_qmops_put(mp); xfs_dmops_put(mp); - kmem_free(mp, sizeof(xfs_mount_t)); + kfree(mp); } STATIC void @@ -1733,14 +1734,20 @@ xfs_fs_fill_super( struct inode *root; struct xfs_mount *mp = NULL; struct xfs_mount_args *args; - int flags = 0, error; + int flags = 0, error = ENOMEM; args = xfs_args_allocate(sb, silent); if (!args) return -ENOMEM; - mp = xfs_mount_init(); + mp = kzalloc(sizeof(xfs_mount_t), GFP_KERNEL); + if (!mp) + goto out_free_args; + spin_lock_init(&mp->m_sb_lock); + mutex_init(&mp->m_ilock); + mutex_init(&mp->m_growlock); + atomic_set(&mp->m_active_trans, 0); INIT_LIST_HEAD(&mp->m_sync_list); spin_lock_init(&mp->m_sync_lock); init_waitqueue_head(&mp->m_wait_single_sync_task); @@ -1753,7 +1760,7 @@ xfs_fs_fill_super( error = xfs_parseargs(mp, (char *)data, args, 0); if (error) - goto fail_vfsop; + goto out_free_mp; sb_min_blocksize(sb, BBSIZE); sb->s_xattr = xfs_xattr_handlers; @@ -1763,7 +1770,7 @@ xfs_fs_fill_super( error = xfs_dmops_get(mp, args); if (error) - goto fail_vfsop; + goto out_free_mp; error = xfs_qmops_get(mp, args); if (error) goto out_put_dmops; @@ -1775,6 +1782,9 @@ xfs_fs_fill_super( if (error) goto out_put_qmops; + if (xfs_icsb_init_counters(mp)) + mp->m_flags |= XFS_MOUNT_NO_PERCPU_SB; + /* * Setup flags based on mount(2) options and then the superblock */ @@ -1850,12 +1860,18 @@ xfs_fs_fill_super( xfs_binval(mp->m_logdev_targp); if (mp->m_rtdev_targp) xfs_binval(mp->m_rtdev_targp); + out_destroy_counters: + xfs_icsb_destroy_counters(mp); xfs_close_devices(mp); out_put_qmops: xfs_qmops_put(mp); out_put_dmops: xfs_dmops_put(mp); - goto fail_vfsop; + out_free_mp: + kfree(mp); + out_free_args: + kfree(args); + return -error; fail_vnrele: if (sb->s_root) { @@ -1880,14 +1896,7 @@ xfs_fs_fill_super( IRELE(mp->m_rootip); xfs_unmountfs(mp); - xfs_close_devices(mp); - xfs_qmops_put(mp); - xfs_dmops_put(mp); - kmem_free(mp, sizeof(xfs_mount_t)); - - fail_vfsop: - kfree(args); - return -error; + goto out_destroy_counters; } STATIC int Index: linux-2.6-xfs/fs/xfs/xfs_mount.c =================================================================== --- linux-2.6-xfs.orig/fs/xfs/xfs_mount.c 2008-05-01 20:14:45.000000000 +0200 +++ linux-2.6-xfs/fs/xfs/xfs_mount.c 2008-05-01 20:23:30.000000000 +0200 @@ -125,33 +125,11 @@ static const struct { }; /* - * Return a pointer to an initialized xfs_mount structure. - */ -xfs_mount_t * -xfs_mount_init(void) -{ - xfs_mount_t *mp; - - mp = kmem_zalloc(sizeof(xfs_mount_t), KM_SLEEP); - - if (xfs_icsb_init_counters(mp)) { - mp->m_flags |= XFS_MOUNT_NO_PERCPU_SB; - } - - spin_lock_init(&mp->m_sb_lock); - mutex_init(&mp->m_ilock); - mutex_init(&mp->m_growlock); - atomic_set(&mp->m_active_trans, 0); - - return mp; -} - -/* * Free up the resources associated with a mount structure. Assume that * the structure was initially zeroed, so we can tell which fields got * initialized. */ -void +STATIC void xfs_mount_free( xfs_mount_t *mp) { @@ -180,8 +158,6 @@ xfs_mount_free( kmem_free(mp->m_rtname, strlen(mp->m_rtname) + 1); if (mp->m_logname != NULL) kmem_free(mp->m_logname, strlen(mp->m_logname) + 1); - - xfs_icsb_destroy_counters(mp); } /* @@ -2097,7 +2073,7 @@ xfs_icsb_reinit_counters( xfs_icsb_unlock(mp); } -STATIC void +void xfs_icsb_destroy_counters( xfs_mount_t *mp) { Index: linux-2.6-xfs/fs/xfs/xfs_mount.h =================================================================== --- linux-2.6-xfs.orig/fs/xfs/xfs_mount.h 2008-05-01 20:14:45.000000000 +0200 +++ linux-2.6-xfs/fs/xfs/xfs_mount.h 2008-05-01 20:23:01.000000000 +0200 @@ -210,6 +210,7 @@ typedef struct xfs_icsb_cnts { extern int xfs_icsb_init_counters(struct xfs_mount *); extern void xfs_icsb_reinit_counters(struct xfs_mount *); +extern void xfs_icsb_destroy_counters(struct xfs_mount *); extern void xfs_icsb_sync_counters(struct xfs_mount *, int); extern void xfs_icsb_sync_counters_locked(struct xfs_mount *, int); @@ -511,10 +512,8 @@ typedef struct xfs_mod_sb { #define XFS_MOUNT_ILOCK(mp) mutex_lock(&((mp)->m_ilock)) #define XFS_MOUNT_IUNLOCK(mp) mutex_unlock(&((mp)->m_ilock)) -extern xfs_mount_t *xfs_mount_init(void); extern void xfs_mod_sb(xfs_trans_t *, __int64_t); extern int xfs_log_sbcount(xfs_mount_t *, uint); -extern void xfs_mount_free(xfs_mount_t *mp); extern int xfs_mountfs(xfs_mount_t *mp, int); extern void xfs_mountfs_check_barriers(xfs_mount_t *mp); Index: linux-2.6-xfs/fs/xfs/linux-2.6/xfs_ksyms.c =================================================================== --- linux-2.6-xfs.orig/fs/xfs/linux-2.6/xfs_ksyms.c 2008-05-01 20:17:16.000000000 +0200 +++ linux-2.6-xfs/fs/xfs/linux-2.6/xfs_ksyms.c 2008-05-01 20:22:51.000000000 +0200 @@ -256,8 +256,6 @@ EXPORT_SYMBOL(xfs_log_force_umount); EXPORT_SYMBOL(xfs_log_unmount_dealloc); EXPORT_SYMBOL(xfs_log_unmount_write); EXPORT_SYMBOL(xfs_mod_sb); -EXPORT_SYMBOL(xfs_mount_free); -EXPORT_SYMBOL(xfs_mount_init); EXPORT_SYMBOL(xfs_mount_reset_sbqflags); EXPORT_SYMBOL(xfs_mountfs); EXPORT_SYMBOL(xfs_qm_dqcheck); From owner-xfs@oss.sgi.com Thu May 1 15:00:37 2008 Received: with ECARTIS (v1.0.0; list xfs); Thu, 01 May 2008 15:01:17 -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.2 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-r574664 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id m41M0TgG001260 for ; Thu, 1 May 2008 15:00:36 -0700 X-ASG-Debug-ID: 1209679272-4888017e0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from verein.lst.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 557601B2BB71 for ; Thu, 1 May 2008 15:01:12 -0700 (PDT) Received: from verein.lst.de (verein.lst.de [213.95.11.210]) by cuda.sgi.com with ESMTP id PxLeWXUK8xUXqJDD for ; Thu, 01 May 2008 15:01:12 -0700 (PDT) Received: from verein.lst.de (localhost [127.0.0.1]) by verein.lst.de (8.12.3/8.12.3/Debian-7.1) with ESMTP id m41M15F3002402 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO) for ; Fri, 2 May 2008 00:01:06 +0200 Received: (from hch@localhost) by verein.lst.de (8.12.3/8.12.3/Debian-6.6) id m41M15HY002398 for xfs@oss.sgi.com; Fri, 2 May 2008 00:01:05 +0200 Date: Fri, 2 May 2008 00:01:05 +0200 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 4/10] sort out opening and closing of the block devices Subject: [PATCH 4/10] sort out opening and closing of the block devices Message-ID: <20080501220105.GD2315@lst.de> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.3.28i X-Scanned-By: MIMEDefang 2.39 X-Barracuda-Connect: verein.lst.de[213.95.11.210] X-Barracuda-Start-Time: 1209679273 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: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.1, rules version 3.1.49396 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV 0.91.2/6021/Wed Feb 27 15:55:48 2008 on oss.sgi.com X-Virus-Status: Clean X-archive-position: 15738 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: hch@lst.de Precedence: bulk X-list: xfs Currently closing the rt/log block device is done in the wrong spot, and far too early. So revampt it: - xfs_blkdev_put moved out of xfs_free_buftarg into the caller so that it is done after tearing down the buftarg completely. - call to xfs_unmountfs_close moved from xfs_mountfs into caller so that it's done after tearing down the filesystem completely. - xfs_unmountfs_close is renamed to xfs_close_devices and made static in xfs_super.c - opening of the block devices is split into a helper xfs_open_devices that is symetric in use to xfs_close_devices - xfs_unountfs can now lose struct cred - error handling around device opening sanitized in xfs_fs_fill_super Signed-off-by: Christoph Hellwig Index: linux-2.6-xfs/fs/xfs/linux-2.6/xfs_super.c =================================================================== --- linux-2.6-xfs.orig/fs/xfs/linux-2.6/xfs_super.c 2008-05-01 19:54:48.000000000 +0200 +++ linux-2.6-xfs/fs/xfs/linux-2.6/xfs_super.c 2008-05-01 19:54:49.000000000 +0200 @@ -766,6 +766,102 @@ xfs_blkdev_issue_flush( blkdev_issue_flush(buftarg->bt_bdev, NULL); } +STATIC void +xfs_close_devices( + struct xfs_mount *mp) +{ + if (mp->m_logdev_targp && mp->m_logdev_targp != mp->m_ddev_targp) { + xfs_free_buftarg(mp->m_logdev_targp); + xfs_blkdev_put(mp->m_logdev_targp->bt_bdev); + } + if (mp->m_rtdev_targp) { + xfs_free_buftarg(mp->m_rtdev_targp); + xfs_blkdev_put(mp->m_rtdev_targp->bt_bdev); + } + xfs_free_buftarg(mp->m_ddev_targp); +} + +/* + * The file system configurations are: + * (1) device (partition) with data and internal log + * (2) logical volume with data and log subvolumes. + * (3) logical volume with data, log, and realtime subvolumes. + * + * We only have to handle opening the log and realtime volumes here if + * they are present. The data subvolume has already been opened by + * get_sb_bdev() and is stored in sb->s_bdev. + */ +STATIC int +xfs_open_devices( + struct xfs_mount *mp, + struct xfs_mount_args *args) +{ + struct block_device *ddev = mp->m_super->s_bdev; + struct block_device *logdev = NULL, *rtdev = NULL; + int error; + + /* + * Open real time and log devices - order is important. + */ + if (args->logname[0]) { + error = xfs_blkdev_get(mp, args->logname, &logdev); + if (error) + goto out; + } + + if (args->rtname[0]) { + error = xfs_blkdev_get(mp, args->rtname, &rtdev); + if (error) + goto out_close_logdev; + + if (rtdev == ddev || rtdev == logdev) { + cmn_err(CE_WARN, + "XFS: Cannot mount filesystem with identical rtdev and ddev/logdev."); + goto out_close_rtdev; + } + } + + /* + * Setup xfs_mount buffer target pointers + */ + error = ENOMEM; + mp->m_ddev_targp = xfs_alloc_buftarg(ddev, 0); + if (!mp->m_ddev_targp) + goto out_close_rtdev; + + if (rtdev) { + mp->m_rtdev_targp = xfs_alloc_buftarg(rtdev, 1); + if (!mp->m_rtdev_targp) + goto out_free_ddev_targ; + } + + if (logdev && logdev != ddev) { + mp->m_logdev_targp = xfs_alloc_buftarg(logdev, 1); + if (!mp->m_logdev_targp) + goto out_free_rtdev_targ; + } else { + mp->m_logdev_targp = mp->m_ddev_targp; + } + + return 0; + + out_free_rtdev_targ: + if (mp->m_rtdev_targp) + xfs_free_buftarg(mp->m_rtdev_targp); + out_free_ddev_targ: + xfs_free_buftarg(mp->m_ddev_targp); + out_close_rtdev: + if (mp->m_rtdev_targp) + xfs_blkdev_put(mp->m_rtdev_targp->bt_bdev); + out_close_logdev: + if (mp->m_logdev_targp && mp->m_logdev_targp != mp->m_ddev_targp) + xfs_blkdev_put(mp->m_logdev_targp->bt_bdev); + out: + return error; +} + + + /* * XFS AIL push thread support */ @@ -1139,7 +1235,8 @@ xfs_fs_put_super( unmount_event_flags); } - xfs_unmountfs(mp, NULL); + xfs_unmountfs(mp); + xfs_close_devices(mp); xfs_qmops_put(mp); xfs_dmops_put(mp); kmem_free(mp, sizeof(xfs_mount_t)); @@ -1586,16 +1683,6 @@ xfs_finish_flags( return 0; } -/* - * The file system configurations are: - * (1) device (partition) with data and internal log - * (2) logical volume with data and log subvolumes. - * (3) logical volume with data, log, and realtime subvolumes. - * - * We only have to handle opening the log and realtime volumes here if - * they are present. The data subvolume has already been opened by - * get_sb_bdev() and is stored in vfsp->vfs_super->s_bdev. - */ STATIC int xfs_fs_fill_super( struct super_block *sb, @@ -1605,8 +1692,6 @@ xfs_fs_fill_super( struct inode *root; struct xfs_mount *mp = NULL; struct xfs_mount_args *args = xfs_args_allocate(sb, silent); - struct block_device *ddev = sb->s_bdev; - struct block_device *logdev = NULL, *rtdev = NULL; int flags = 0, error; mp = xfs_mount_init(); @@ -1636,61 +1721,14 @@ xfs_fs_fill_super( goto fail_vfsop; error = xfs_qmops_get(mp, args); if (error) - goto fail_vfsop; + goto out_put_dmops; if (args->flags & XFSMNT_QUIET) flags |= XFS_MFSI_QUIET; - /* - * Open real time and log devices - order is important. - */ - if (args->logname[0]) { - error = xfs_blkdev_get(mp, args->logname, &logdev); - if (error) - goto fail_vfsop; - } - if (args->rtname[0]) { - error = xfs_blkdev_get(mp, args->rtname, &rtdev); - if (error) { - xfs_blkdev_put(logdev); - goto fail_vfsop; - } - - if (rtdev == ddev || rtdev == logdev) { - cmn_err(CE_WARN, - "XFS: Cannot mount filesystem with identical rtdev and ddev/logdev."); - xfs_blkdev_put(logdev); - xfs_blkdev_put(rtdev); - error = EINVAL; - goto fail_vfsop; - } - } - - /* - * Setup xfs_mount buffer target pointers - */ - error = ENOMEM; - mp->m_ddev_targp = xfs_alloc_buftarg(ddev, 0); - if (!mp->m_ddev_targp) { - xfs_blkdev_put(logdev); - xfs_blkdev_put(rtdev); - goto fail_vfsop; - } - if (rtdev) { - mp->m_rtdev_targp = xfs_alloc_buftarg(rtdev, 1); - if (!mp->m_rtdev_targp) { - xfs_blkdev_put(logdev); - xfs_blkdev_put(rtdev); - goto error0; - } - } - mp->m_logdev_targp = (logdev && logdev != ddev) ? - xfs_alloc_buftarg(logdev, 1) : mp->m_ddev_targp; - if (!mp->m_logdev_targp) { - xfs_blkdev_put(logdev); - xfs_blkdev_put(rtdev); - goto error0; - } + error = xfs_open_devices(mp, args); + if (error) + goto out_put_qmops; /* * Setup flags based on mount(2) options and then the superblock @@ -1710,7 +1748,9 @@ xfs_fs_fill_super( */ error = xfs_setsize_buftarg(mp->m_ddev_targp, mp->m_sb.sb_blocksize, mp->m_sb.sb_sectsize); - if (!error && logdev && logdev != ddev) { + if (error) + goto error2; + if (mp->m_logdev_targp && mp->m_logdev_targp != mp->m_ddev_targp) { unsigned int log_sector_size = BBSIZE; if (xfs_sb_version_hassector(&mp->m_sb)) @@ -1718,13 +1758,16 @@ xfs_fs_fill_super( error = xfs_setsize_buftarg(mp->m_logdev_targp, mp->m_sb.sb_blocksize, log_sector_size); + if (error) + goto error2; } - if (!error && rtdev) + if (mp->m_rtdev_targp) { error = xfs_setsize_buftarg(mp->m_rtdev_targp, mp->m_sb.sb_blocksize, mp->m_sb.sb_sectsize); - if (error) - goto error2; + if (error) + goto error2; + } if (mp->m_flags & XFS_MOUNT_BARRIER) xfs_mountfs_check_barriers(mp); @@ -1780,13 +1823,14 @@ xfs_fs_fill_super( xfs_freesb(mp); error1: xfs_binval(mp->m_ddev_targp); - if (logdev && logdev != ddev) + if (mp->m_logdev_targp && mp->m_logdev_targp != mp->m_ddev_targp) xfs_binval(mp->m_logdev_targp); - if (rtdev) + if (mp->m_rtdev_targp) xfs_binval(mp->m_rtdev_targp); - error0: - xfs_unmountfs_close(mp, NULL); + xfs_close_devices(mp); + out_put_qmops: xfs_qmops_put(mp); + out_put_dmops: xfs_dmops_put(mp); goto fail_vfsop; @@ -1812,7 +1856,8 @@ xfs_fs_fill_super( IRELE(mp->m_rootip); - xfs_unmountfs(mp, NULL); + xfs_unmountfs(mp); + xfs_close_devices(mp); xfs_qmops_put(mp); xfs_dmops_put(mp); kmem_free(mp, sizeof(xfs_mount_t)); Index: linux-2.6-xfs/fs/xfs/xfs_mount.c =================================================================== --- linux-2.6-xfs.orig/fs/xfs/xfs_mount.c 2008-05-01 19:54:46.000000000 +0200 +++ linux-2.6-xfs/fs/xfs/xfs_mount.c 2008-05-01 19:54:49.000000000 +0200 @@ -1283,7 +1283,7 @@ xfs_mountfs( * log and makes sure that incore structures are freed. */ int -xfs_unmountfs(xfs_mount_t *mp, struct cred *cr) +xfs_unmountfs(xfs_mount_t *mp) { __uint64_t resblks; int error = 0; @@ -1350,7 +1350,6 @@ xfs_unmountfs(xfs_mount_t *mp, struct cr */ ASSERT(mp->m_inodes == NULL); - xfs_unmountfs_close(mp, cr); if ((mp->m_flags & XFS_MOUNT_NOUUID) == 0) uuid_table_remove(&mp->m_sb.sb_uuid); @@ -1361,16 +1360,6 @@ xfs_unmountfs(xfs_mount_t *mp, struct cr return 0; } -void -xfs_unmountfs_close(xfs_mount_t *mp, struct cred *cr) -{ - if (mp->m_logdev_targp && mp->m_logdev_targp != mp->m_ddev_targp) - xfs_free_buftarg(mp->m_logdev_targp, 1); - if (mp->m_rtdev_targp) - xfs_free_buftarg(mp->m_rtdev_targp, 1); - xfs_free_buftarg(mp->m_ddev_targp, 0); -} - STATIC void xfs_unmountfs_wait(xfs_mount_t *mp) { Index: linux-2.6-xfs/fs/xfs/xfs_mount.h =================================================================== --- linux-2.6-xfs.orig/fs/xfs/xfs_mount.h 2008-05-01 19:54:37.000000000 +0200 +++ linux-2.6-xfs/fs/xfs/xfs_mount.h 2008-05-01 19:54:49.000000000 +0200 @@ -518,8 +518,7 @@ extern void xfs_mount_free(xfs_mount_t * extern int xfs_mountfs(xfs_mount_t *mp, int); extern void xfs_mountfs_check_barriers(xfs_mount_t *mp); -extern int xfs_unmountfs(xfs_mount_t *, struct cred *); -extern void xfs_unmountfs_close(xfs_mount_t *, struct cred *); +extern int xfs_unmountfs(xfs_mount_t *); extern int xfs_unmountfs_writesb(xfs_mount_t *); extern int xfs_unmount_flush(xfs_mount_t *, int); extern int xfs_mod_incore_sb(xfs_mount_t *, xfs_sb_field_t, int64_t, int); Index: linux-2.6-xfs/fs/xfs/linux-2.6/xfs_super.h =================================================================== --- linux-2.6-xfs.orig/fs/xfs/linux-2.6/xfs_super.h 2008-05-01 19:54:47.000000000 +0200 +++ linux-2.6-xfs/fs/xfs/linux-2.6/xfs_super.h 2008-05-01 19:54:49.000000000 +0200 @@ -78,9 +78,6 @@ extern void xfs_initialize_vnode(struct extern void xfs_flush_inode(struct xfs_inode *); extern void xfs_flush_device(struct xfs_inode *); -extern int xfs_blkdev_get(struct xfs_mount *, const char *, - struct block_device **); -extern void xfs_blkdev_put(struct block_device *); extern void xfs_blkdev_issue_flush(struct xfs_buftarg *); extern const struct export_operations xfs_export_operations; Index: linux-2.6-xfs/fs/xfs/linux-2.6/xfs_buf.c =================================================================== --- linux-2.6-xfs.orig/fs/xfs/linux-2.6/xfs_buf.c 2008-05-01 19:54:51.000000000 +0200 +++ linux-2.6-xfs/fs/xfs/linux-2.6/xfs_buf.c 2008-05-01 19:54:55.000000000 +0200 @@ -1413,13 +1413,10 @@ xfs_unregister_buftarg( void xfs_free_buftarg( - xfs_buftarg_t *btp, - int external) + xfs_buftarg_t *btp) { xfs_flush_buftarg(btp, 1); xfs_blkdev_issue_flush(btp); - if (external) - xfs_blkdev_put(btp->bt_bdev); xfs_free_bufhash(btp); iput(btp->bt_mapping->host); Index: linux-2.6-xfs/fs/xfs/linux-2.6/xfs_buf.h =================================================================== --- linux-2.6-xfs.orig/fs/xfs/linux-2.6/xfs_buf.h 2008-05-01 19:54:51.000000000 +0200 +++ linux-2.6-xfs/fs/xfs/linux-2.6/xfs_buf.h 2008-05-01 19:54:55.000000000 +0200 @@ -410,7 +410,7 @@ static inline void xfs_bdwrite(void *mp, * Handling of buftargs. */ extern xfs_buftarg_t *xfs_alloc_buftarg(struct block_device *, int); -extern void xfs_free_buftarg(xfs_buftarg_t *, int); +extern void xfs_free_buftarg(xfs_buftarg_t *); extern void xfs_wait_buftarg(xfs_buftarg_t *); extern int xfs_setsize_buftarg(xfs_buftarg_t *, unsigned int, unsigned int); extern int xfs_flush_buftarg(xfs_buftarg_t *, int); From owner-xfs@oss.sgi.com Thu May 1 15:01:01 2008 Received: with ECARTIS (v1.0.0; list xfs); Thu, 01 May 2008 15:01:10 -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.2 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-r574664 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id m41M0tt0001313 for ; Thu, 1 May 2008 15:01:01 -0700 X-ASG-Debug-ID: 1209679281-4d7e01410000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from verein.lst.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 78A921B2BBD9 for ; Thu, 1 May 2008 15:01:21 -0700 (PDT) Received: from verein.lst.de (verein.lst.de [213.95.11.210]) by cuda.sgi.com with ESMTP id eH2DIOjQCqFH8a6t for ; Thu, 01 May 2008 15:01:21 -0700 (PDT) Received: from verein.lst.de (localhost [127.0.0.1]) by verein.lst.de (8.12.3/8.12.3/Debian-7.1) with ESMTP id m41M1FF3002435 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO) for ; Fri, 2 May 2008 00:01:15 +0200 Received: (from hch@localhost) by verein.lst.de (8.12.3/8.12.3/Debian-6.6) id m41M1FHK002433 for xfs@oss.sgi.com; Fri, 2 May 2008 00:01:15 +0200 Date: Fri, 2 May 2008 00:01:15 +0200 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 6/10] allow xfs_args_allocate to fail Subject: [PATCH 6/10] allow xfs_args_allocate to fail Message-ID: <20080501220115.GF2315@lst.de> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.3.28i X-Scanned-By: MIMEDefang 2.39 X-Barracuda-Connect: verein.lst.de[213.95.11.210] X-Barracuda-Start-Time: 1209679282 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: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.1, rules version 3.1.49396 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV 0.91.2/6021/Wed Feb 27 15:55:48 2008 on oss.sgi.com X-Virus-Status: Clean X-archive-position: 15737 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: hch@lst.de Precedence: bulk X-list: xfs Switch xfs_args_allocate to kzalloc and handle failures. Signed-off-by: Christoph Hellwig Index: linux-2.6-xfs/fs/xfs/linux-2.6/xfs_super.c =================================================================== --- linux-2.6-xfs.orig/fs/xfs/linux-2.6/xfs_super.c 2008-05-01 20:06:01.000000000 +0200 +++ linux-2.6-xfs/fs/xfs/linux-2.6/xfs_super.c 2008-05-01 20:15:00.000000000 +0200 @@ -75,7 +75,10 @@ xfs_args_allocate( { struct xfs_mount_args *args; - args = kmem_zalloc(sizeof(struct xfs_mount_args), KM_SLEEP); + args = kzalloc(sizeof(struct xfs_mount_args), GFP_KERNEL); + if (!args) + return NULL; + args->logbufs = args->logbufsize = -1; strncpy(args->fsname, sb->s_id, MAXNAMELEN); @@ -1396,9 +1399,13 @@ xfs_fs_remount( char *options) { struct xfs_mount *mp = XFS_M(sb); - struct xfs_mount_args *args = xfs_args_allocate(sb, 0); + struct xfs_mount_args *args; int error; + args = xfs_args_allocate(sb, 0); + if (!args) + return -ENOMEM; + error = xfs_parseargs(mp, options, args, 1); if (error) goto out_free_args; @@ -1420,7 +1427,7 @@ xfs_fs_remount( } out_free_args: - kmem_free(args, sizeof(*args)); + kfree(args); return -error; } @@ -1725,9 +1732,13 @@ xfs_fs_fill_super( { struct inode *root; struct xfs_mount *mp = NULL; - struct xfs_mount_args *args = xfs_args_allocate(sb, silent); + struct xfs_mount_args *args; int flags = 0, error; + args = xfs_args_allocate(sb, silent); + if (!args) + return -ENOMEM; + mp = xfs_mount_init(); INIT_LIST_HEAD(&mp->m_sync_list); @@ -1827,7 +1838,7 @@ xfs_fs_fill_super( xfs_itrace_exit(XFS_I(sb->s_root->d_inode)); - kmem_free(args, sizeof(*args)); + kfree(args); return 0; error2: @@ -1875,7 +1886,7 @@ xfs_fs_fill_super( kmem_free(mp, sizeof(xfs_mount_t)); fail_vfsop: - kmem_free(args, sizeof(*args)); + kfree(args); return -error; } From owner-xfs@oss.sgi.com Thu May 1 15:00:21 2008 Received: with ECARTIS (v1.0.0; list xfs); Thu, 01 May 2008 15:00:40 -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.1 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_65 autolearn=no 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 m41M0DFp001235 for ; Thu, 1 May 2008 15:00:21 -0700 X-ASG-Debug-ID: 1209679255-6d1802a00000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from verein.lst.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 7051012ACED5 for ; Thu, 1 May 2008 15:00:55 -0700 (PDT) Received: from verein.lst.de (verein.lst.de [213.95.11.210]) by cuda.sgi.com with ESMTP id 71ht3YnBFUUz08CE for ; Thu, 01 May 2008 15:00:55 -0700 (PDT) Received: from verein.lst.de (localhost [127.0.0.1]) by verein.lst.de (8.12.3/8.12.3/Debian-7.1) with ESMTP id m41M0mF3002349 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO) for ; Fri, 2 May 2008 00:00:49 +0200 Received: (from hch@localhost) by verein.lst.de (8.12.3/8.12.3/Debian-6.6) id m41M0mV3002347 for xfs@oss.sgi.com; Fri, 2 May 2008 00:00:48 +0200 Date: Fri, 2 May 2008 00:00:48 +0200 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 1/10] merge xfs_unmount into xfs_fs_put_super / xfs_fs_fill_super Subject: [PATCH 1/10] merge xfs_unmount into xfs_fs_put_super / xfs_fs_fill_super Message-ID: <20080501220048.GA2315@lst.de> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.3.28i X-Scanned-By: MIMEDefang 2.39 X-Barracuda-Connect: verein.lst.de[213.95.11.210] X-Barracuda-Start-Time: 1209679257 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.82 X-Barracuda-Spam-Status: No, SCORE=-1.82 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC0_MJ615 X-Barracuda-Spam-Report: Code version 3.1, rules version 3.1.49395 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.20 BSF_SC0_MJ615 Custom Rule MJ615 X-Virus-Scanned: ClamAV 0.91.2/6021/Wed Feb 27 15:55:48 2008 on oss.sgi.com X-Virus-Status: Clean X-archive-position: 15734 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: hch@lst.de Precedence: bulk X-list: xfs xfs_unmount is small and already pretty Linux specific, so merge it into the callers. The real unmount path is simplified a little by doing a WARN_ON on the xfs_unmount_flush retval directly instead of propagating the error back to the caller, and the mout failure case in simplified significantly by removing the forced shudown case and all the dmapi events that shouldn't be sent because the dmapi mount event hasn't been sent by that time either. Signed-off-by: Christoph Hellwig Index: linux-2.6-xfs/fs/xfs/linux-2.6/xfs_super.c =================================================================== --- linux-2.6-xfs.orig/fs/xfs/linux-2.6/xfs_super.c 2008-04-25 20:48:31.000000000 +0200 +++ linux-2.6-xfs/fs/xfs/linux-2.6/xfs_super.c 2008-04-25 20:50:16.000000000 +0200 @@ -1087,14 +1087,61 @@ xfs_fs_put_super( struct super_block *sb) { struct xfs_mount *mp = XFS_M(sb); + struct xfs_inode *rip = mp->m_rootip; + int unmount_event_flags = 0; int error; kthread_stop(mp->m_sync_task); xfs_sync(mp, SYNC_ATTR | SYNC_DELWRI); - error = xfs_unmount(mp, 0, NULL); - if (error) - printk("XFS: unmount got error=%d\n", error); + +#ifdef HAVE_DMAPI + if (mp->m_flags & XFS_MOUNT_DMAPI) { + unmount_event_flags = + (mp->m_dmevmask & (1 << DM_EVENT_UNMOUNT)) ? + 0 : DM_FLAGS_UNWANTED; + /* + * Ignore error from dmapi here, first unmount is not allowed + * to fail anyway, and second we wouldn't want to fail a + * unmount because of dmapi. + */ + XFS_SEND_PREUNMOUNT(mp, rip, DM_RIGHT_NULL, rip, DM_RIGHT_NULL, + NULL, NULL, 0, 0, unmount_event_flags); + } +#endif + + /* + * Blow away any referenced inode in the filestreams cache. + * This can and will cause log traffic as inodes go inactive + * here. + */ + xfs_filestream_unmount(mp); + + XFS_bflush(mp->m_ddev_targp); + error = xfs_unmount_flush(mp, 0); + WARN_ON(error); + + IRELE(rip); + + /* + * If we're forcing a shutdown, typically because of a media error, + * we want to make sure we invalidate dirty pages that belong to + * referenced vnodes as well. + */ + if (XFS_FORCED_SHUTDOWN(mp)) { + error = xfs_sync(mp, SYNC_WAIT | SYNC_CLOSE); + ASSERT(error != EFSCORRUPTED); + } + + if (mp->m_flags & XFS_MOUNT_DMAPI) { + XFS_SEND_UNMOUNT(mp, rip, DM_RIGHT_NULL, 0, 0, + unmount_event_flags); + } + + xfs_unmountfs(mp, NULL); + xfs_qmops_put(mp); + xfs_dmops_put(mp); + kmem_free(mp, sizeof(xfs_mount_t)); } STATIC void @@ -1400,7 +1447,23 @@ fail_vnrele: } fail_unmount: - xfs_unmount(mp, 0, NULL); + /* + * Blow away any referenced inode in the filestreams cache. + * This can and will cause log traffic as inodes go inactive + * here. + */ + xfs_filestream_unmount(mp); + + XFS_bflush(mp->m_ddev_targp); + error = xfs_unmount_flush(mp, 0); + WARN_ON(error); + + IRELE(mp->m_rootip); + + xfs_unmountfs(mp, NULL); + xfs_qmops_put(mp); + xfs_dmops_put(mp); + kmem_free(mp, sizeof(xfs_mount_t)); fail_vfsop: kmem_free(args, sizeof(*args)); Index: linux-2.6-xfs/fs/xfs/xfs_vfsops.c =================================================================== --- linux-2.6-xfs.orig/fs/xfs/xfs_vfsops.c 2008-04-25 20:48:31.000000000 +0200 +++ linux-2.6-xfs/fs/xfs/xfs_vfsops.c 2008-04-25 20:48:32.000000000 +0200 @@ -550,93 +550,6 @@ error0: return error; } -int -xfs_unmount( - xfs_mount_t *mp, - int flags, - cred_t *credp) -{ - xfs_inode_t *rip; - bhv_vnode_t *rvp; - int unmount_event_wanted = 0; - int unmount_event_flags = 0; - int xfs_unmountfs_needed = 0; - int error; - - rip = mp->m_rootip; - rvp = XFS_ITOV(rip); - -#ifdef HAVE_DMAPI - if (mp->m_flags & XFS_MOUNT_DMAPI) { - error = XFS_SEND_PREUNMOUNT(mp, - rip, DM_RIGHT_NULL, rip, DM_RIGHT_NULL, - NULL, NULL, 0, 0, - (mp->m_dmevmask & (1<m_dmevmask & (1<m_ddev_targp); - error = xfs_unmount_flush(mp, 0); - if (error) - goto out; - - ASSERT(vn_count(rvp) == 1); - - /* - * Drop the reference count - */ - IRELE(rip); - - /* - * If we're forcing a shutdown, typically because of a media error, - * we want to make sure we invalidate dirty pages that belong to - * referenced vnodes as well. - */ - if (XFS_FORCED_SHUTDOWN(mp)) { - error = xfs_sync(mp, SYNC_WAIT | SYNC_CLOSE); - ASSERT(error != EFSCORRUPTED); - } - xfs_unmountfs_needed = 1; - -out: - /* Send DMAPI event, if required. - * Then do xfs_unmountfs() if needed. - * Then return error (or zero). - */ - if (unmount_event_wanted) { - /* Note: mp structure must still exist for - * XFS_SEND_UNMOUNT() call. - */ - XFS_SEND_UNMOUNT(mp, error == 0 ? rip : NULL, - DM_RIGHT_NULL, 0, error, unmount_event_flags); - } - if (xfs_unmountfs_needed) { - /* - * Call common unmount function to flush to disk - * and free the super block buffer & mount structures. - */ - xfs_unmountfs(mp, credp); - xfs_qmops_put(mp); - xfs_dmops_put(mp); - kmem_free(mp, sizeof(xfs_mount_t)); - } - - return XFS_ERROR(error); -} - STATIC void xfs_quiesce_fs( xfs_mount_t *mp) Index: linux-2.6-xfs/fs/xfs/xfs_vfsops.h =================================================================== --- linux-2.6-xfs.orig/fs/xfs/xfs_vfsops.h 2008-04-25 20:48:31.000000000 +0200 +++ linux-2.6-xfs/fs/xfs/xfs_vfsops.h 2008-04-25 20:48:32.000000000 +0200 @@ -10,7 +10,6 @@ struct xfs_mount_args; int xfs_mount(struct xfs_mount *mp, struct xfs_mount_args *args, struct cred *credp); -int xfs_unmount(struct xfs_mount *mp, int flags, struct cred *credp); int xfs_sync(struct xfs_mount *mp, int flags); void xfs_do_force_shutdown(struct xfs_mount *mp, int flags, char *fname, int lnnum); From owner-xfs@oss.sgi.com Thu May 1 15:01:02 2008 Received: with ECARTIS (v1.0.0; list xfs); Thu, 01 May 2008 15:01:21 -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.2 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-r574664 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.168.29]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id m41M0uE0001322 for ; Thu, 1 May 2008 15:01:02 -0700 X-ASG-Debug-ID: 1209679276-32d401520000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from verein.lst.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 20C311176EE for ; Thu, 1 May 2008 15:01:17 -0700 (PDT) Received: from verein.lst.de (verein.lst.de [213.95.11.210]) by cuda.sgi.com with ESMTP id BVYeS24BrLnAwJ7f for ; Thu, 01 May 2008 15:01:17 -0700 (PDT) Received: from verein.lst.de (localhost [127.0.0.1]) by verein.lst.de (8.12.3/8.12.3/Debian-7.1) with ESMTP id m41M1AF3002420 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO) for ; Fri, 2 May 2008 00:01:10 +0200 Received: (from hch@localhost) by verein.lst.de (8.12.3/8.12.3/Debian-6.6) id m41M1Aht002418 for xfs@oss.sgi.com; Fri, 2 May 2008 00:01:10 +0200 Date: Fri, 2 May 2008 00:01:10 +0200 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 5/10] add xfs_setup_devices helper Subject: [PATCH 5/10] add xfs_setup_devices helper Message-ID: <20080501220110.GE2315@lst.de> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.3.28i X-Scanned-By: MIMEDefang 2.39 X-Barracuda-Connect: verein.lst.de[213.95.11.210] X-Barracuda-Start-Time: 1209679278 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: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.1, rules version 3.1.49396 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV 0.91.2/6021/Wed Feb 27 15:55:48 2008 on oss.sgi.com X-Virus-Status: Clean X-archive-position: 15740 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: hch@lst.de Precedence: bulk X-list: xfs Split setting the block and sector size out of xfs_fs_fill_super into a small helper to make xfs_fs_fill_super more readable. Signed-off-by: Christoph Hellwig Index: linux-2.6-xfs/fs/xfs/linux-2.6/xfs_super.c =================================================================== --- linux-2.6-xfs.orig/fs/xfs/linux-2.6/xfs_super.c 2008-05-01 19:58:12.000000000 +0200 +++ linux-2.6-xfs/fs/xfs/linux-2.6/xfs_super.c 2008-05-01 20:05:49.000000000 +0200 @@ -860,7 +860,41 @@ xfs_open_devices( return error; } +/* + * Setup xfs_mount buffer target pointers based on superblock + */ +STATIC int +xfs_setup_devices( + struct xfs_mount *mp) +{ + int error; + error = xfs_setsize_buftarg(mp->m_ddev_targp, mp->m_sb.sb_blocksize, + mp->m_sb.sb_sectsize); + if (error) + return error; + + if (mp->m_logdev_targp && mp->m_logdev_targp != mp->m_ddev_targp) { + unsigned int log_sector_size = BBSIZE; + + if (xfs_sb_version_hassector(&mp->m_sb)) + log_sector_size = mp->m_sb.sb_logsectsize; + error = xfs_setsize_buftarg(mp->m_logdev_targp, + mp->m_sb.sb_blocksize, + log_sector_size); + if (error) + return error; + } + if (mp->m_rtdev_targp) { + error = xfs_setsize_buftarg(mp->m_rtdev_targp, + mp->m_sb.sb_blocksize, + mp->m_sb.sb_sectsize); + if (error) + return error; + } + + return 0; +} /* * XFS AIL push thread support @@ -1743,31 +1777,9 @@ xfs_fs_fill_super( if (error) goto error2; - /* - * Setup xfs_mount buffer target pointers based on superblock - */ - error = xfs_setsize_buftarg(mp->m_ddev_targp, mp->m_sb.sb_blocksize, - mp->m_sb.sb_sectsize); + error = xfs_setup_devices(mp); if (error) goto error2; - if (mp->m_logdev_targp && mp->m_logdev_targp != mp->m_ddev_targp) { - unsigned int log_sector_size = BBSIZE; - - if (xfs_sb_version_hassector(&mp->m_sb)) - log_sector_size = mp->m_sb.sb_logsectsize; - error = xfs_setsize_buftarg(mp->m_logdev_targp, - mp->m_sb.sb_blocksize, - log_sector_size); - if (error) - goto error2; - } - if (mp->m_rtdev_targp) { - error = xfs_setsize_buftarg(mp->m_rtdev_targp, - mp->m_sb.sb_blocksize, - mp->m_sb.sb_sectsize); - if (error) - goto error2; - } if (mp->m_flags & XFS_MOUNT_BARRIER) xfs_mountfs_check_barriers(mp); From owner-xfs@oss.sgi.com Thu May 1 15:07:54 2008 Received: with ECARTIS (v1.0.0; list xfs); Thu, 01 May 2008 15:08:01 -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.1 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-r574664 Received: from larry.melbourne.sgi.com (larry.melbourne.sgi.com [134.14.52.130]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with SMTP id m41M7oMr002380 for ; Thu, 1 May 2008 15:07:53 -0700 Received: from snort.melbourne.sgi.com (snort.melbourne.sgi.com [134.14.54.149]) by larry.melbourne.sgi.com (950413.SGI.8.6.12/950213.SGI.AUTOCF) via ESMTP id IAA02144; Fri, 2 May 2008 08:08:31 +1000 Received: from snort.melbourne.sgi.com (localhost [127.0.0.1]) by snort.melbourne.sgi.com (SGI-8.12.5/8.12.5) with ESMTP id m41M8SsT151105874; Fri, 2 May 2008 08:08:28 +1000 (AEST) Received: (from dgc@localhost) by snort.melbourne.sgi.com (SGI-8.12.5/8.12.5/Submit) id m41M8PtB152307624; Fri, 2 May 2008 08:08:25 +1000 (AEST) X-Authentication-Warning: snort.melbourne.sgi.com: dgc set sender to dgc@sgi.com using -f Date: Fri, 2 May 2008 08:08:25 +1000 From: David Chinner To: Christoph Hellwig Cc: David Chinner , xfs-dev , xfs-oss Subject: Re: [PATCH] Don't allow memory reclaim to wait on the filesystem in inode writeback Message-ID: <20080501220825.GN108924158@sgi.com> References: <20080501122611.GK108924158@sgi.com> <20080501131521.GA7435@infradead.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20080501131521.GA7435@infradead.org> User-Agent: Mutt/1.4.2.1i X-Virus-Scanned: ClamAV 0.91.2/6021/Wed Feb 27 15:55:48 2008 on oss.sgi.com X-Virus-Status: Clean X-archive-position: 15744 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: dgc@sgi.com Precedence: bulk X-list: xfs On Thu, May 01, 2008 at 09:15:21AM -0400, Christoph Hellwig wrote: > On Thu, May 01, 2008 at 10:26:11PM +1000, David Chinner wrote: > > Index: 2.6.x-xfs-new/fs/xfs/xfs_inode.c > > =================================================================== > > --- 2.6.x-xfs-new.orig/fs/xfs/xfs_inode.c 2008-04-28 16:35:23.000000000 +1000 > > +++ 2.6.x-xfs-new/fs/xfs/xfs_inode.c 2008-05-01 20:04:55.151880341 +1000 > > @@ -2986,7 +2986,7 @@ xfs_iflush_cluster( > > ASSERT(pag->pag_ici_init); > > > > ilist_size = XFS_INODE_CLUSTER_SIZE(mp) * sizeof(xfs_inode_t *); > > - ilist = kmem_alloc(ilist_size, KM_MAYFAIL); > > + ilist = kmem_alloc(ilist_size, KM_NOFS); > > if (!ilist) > > return 0; > > This should be KM_MAYFAIL | KM_NOFS, because KM_NOFS doesn't imply that > the allocation may fail. Yes, right you are - I only looked at the effect of __GFP_FS, not what kmem_alloc does. i.e. kmem_flags_convert() doesn't do anything with KM_MAYFAIL, forgetting that it's kmem_alloc() that uses it... New patch below. Cheers, Dave. -- Dave Chinner Principal Engineer SGI Australian Software Group --- Don't allow memory reclaim to wait on the filesystem in inode writeback If we allow memory reclaim to wait on the pages under writeback in inode cluster writeback we could deadlock because we are currently holding the ILOCK on the initial writeback inode which is needed in data I/O completion to change the file size or do unwritten extent conversion before the pages are taken out of writeback state. Signed-off-by: Dave Chinner --- fs/xfs/xfs_inode.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) Index: 2.6.x-xfs-new/fs/xfs/xfs_inode.c =================================================================== --- 2.6.x-xfs-new.orig/fs/xfs/xfs_inode.c 2008-04-28 16:35:23.000000000 +1000 +++ 2.6.x-xfs-new/fs/xfs/xfs_inode.c 2008-05-02 08:03:30.071824780 +1000 @@ -2986,7 +2986,7 @@ xfs_iflush_cluster( ASSERT(pag->pag_ici_init); ilist_size = XFS_INODE_CLUSTER_SIZE(mp) * sizeof(xfs_inode_t *); - ilist = kmem_alloc(ilist_size, KM_MAYFAIL); + ilist = kmem_alloc(ilist_size, KM_MAYFAIL|KM_NOFS); if (!ilist) return 0; From owner-xfs@oss.sgi.com Thu May 1 15:09:51 2008 Received: with ECARTIS (v1.0.0; list xfs); Thu, 01 May 2008 15:09:58 -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.5 required=5.0 tests=AWL,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 m41M9lAY002716 for ; Thu, 1 May 2008 15:09:51 -0700 X-ASG-Debug-ID: 1209679831-08ef02060000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id E30FB12ACD2E; Thu, 1 May 2008 15:10:31 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id Iy9334tvS1Uiptn8; Thu, 01 May 2008 15:10:31 -0700 (PDT) Received: from hch by bombadil.infradead.org with local (Exim 4.68 #1 (Red Hat Linux)) id 1Jrgz0-0002Sc-UJ; Thu, 01 May 2008 22:10:30 +0000 Date: Thu, 1 May 2008 18:10:30 -0400 From: Christoph Hellwig To: David Chinner Cc: Christoph Hellwig , xfs-dev , xfs-oss X-ASG-Orig-Subj: Re: [PATCH] Don't allow memory reclaim to wait on the filesystem in inode writeback Subject: Re: [PATCH] Don't allow memory reclaim to wait on the filesystem in inode writeback Message-ID: <20080501221030.GA4857@infradead.org> References: <20080501122611.GK108924158@sgi.com> <20080501131521.GA7435@infradead.org> <20080501220825.GN108924158@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20080501220825.GN108924158@sgi.com> User-Agent: Mutt/1.5.17 (2007-11-01) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1209679831 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: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.1, rules version 3.1.49397 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV 0.91.2/6021/Wed Feb 27 15:55:48 2008 on oss.sgi.com X-Virus-Status: Clean X-archive-position: 15745 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: hch@infradead.org Precedence: bulk X-list: xfs On Fri, May 02, 2008 at 08:08:25AM +1000, David Chinner wrote: > Index: 2.6.x-xfs-new/fs/xfs/xfs_inode.c > =================================================================== > --- 2.6.x-xfs-new.orig/fs/xfs/xfs_inode.c 2008-04-28 16:35:23.000000000 +1000 > +++ 2.6.x-xfs-new/fs/xfs/xfs_inode.c 2008-05-02 08:03:30.071824780 +1000 > @@ -2986,7 +2986,7 @@ xfs_iflush_cluster( > ASSERT(pag->pag_ici_init); > > ilist_size = XFS_INODE_CLUSTER_SIZE(mp) * sizeof(xfs_inode_t *); > - ilist = kmem_alloc(ilist_size, KM_MAYFAIL); > + ilist = kmem_alloc(ilist_size, KM_MAYFAIL|KM_NOFS); > if (!ilist) > return 0; Looks good. From owner-xfs@oss.sgi.com Thu May 1 15:42:07 2008 Received: with ECARTIS (v1.0.0; list xfs); Thu, 01 May 2008 15:42:30 -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.1 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-r574664 Received: from larry.melbourne.sgi.com (larry.melbourne.sgi.com [134.14.52.130]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with SMTP id m41Mg4Y9007090 for ; Thu, 1 May 2008 15:42:06 -0700 Received: from snort.melbourne.sgi.com (snort.melbourne.sgi.com [134.14.54.149]) by larry.melbourne.sgi.com (950413.SGI.8.6.12/950213.SGI.AUTOCF) via ESMTP id IAA02888; Fri, 2 May 2008 08:42:41 +1000 Received: from snort.melbourne.sgi.com (localhost [127.0.0.1]) by snort.melbourne.sgi.com (SGI-8.12.5/8.12.5) with ESMTP id m41MgdsT151735294; Fri, 2 May 2008 08:42:40 +1000 (AEST) Received: (from dgc@localhost) by snort.melbourne.sgi.com (SGI-8.12.5/8.12.5/Submit) id m41MgbZj153156483; Fri, 2 May 2008 08:42:37 +1000 (AEST) X-Authentication-Warning: snort.melbourne.sgi.com: dgc set sender to dgc@sgi.com using -f Date: Fri, 2 May 2008 08:42:37 +1000 From: David Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: xfsqa 166 failure Message-ID: <20080501224237.GO108924158@sgi.com> References: <20080501205004.GA30384@lst.de> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20080501205004.GA30384@lst.de> User-Agent: Mutt/1.4.2.1i X-Virus-Scanned: ClamAV 0.91.2/6021/Wed Feb 27 15:55:48 2008 on oss.sgi.com X-Virus-Status: Clean X-archive-position: 15746 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: dgc@sgi.com Precedence: bulk X-list: xfs On Thu, May 01, 2008 at 10:50:04PM +0200, Christoph Hellwig wrote: > Looks like the awk on my system (mawk-1.3.3-11 from Debian unstable) doesn't > like the regex used in there. I guess it's some kind of GNU awk > extension: > > 166 [ 2583.856446] XFS mounting filesystem hdd > [ 2583.871549] Ending clean XFS mount for filesystem: hdd > - output mismatch (see 166.out.bad) > 2,6c2,3 > < 0: [AA..BB] XX..YY AG (AA..BB) RIGHT GOOD > < 1: [AA..BB] XX..YY AG (AA..BB) RIGHT GOOD > < 2: [AA..BB] XX..YY AG (AA..BB) RIGHT GOOD > < 3: [AA..BB] XX..YY AG (AA..BB) RIGHT GOOD > < 4: [AA..BB] XX..YY AG (AA..BB) RIGHT GOOD > --- > > awk: line 9: regular expression compile failed (missing operand) > * is the extent unwritten? * gawk supports C comment syntax inside procedure blocks and doesn't interpret them as regexes. I think the standard comment syntax is supposed to be like bash - use "#". Of course, the gawk man page doesn't define comment syntax at all, but mawk does. Does the patch below fix it? Cheers, Dave. -- Dave Chinner Principal Engineer SGI Australian Software Group --- xfstests/166 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) Index: xfs-cmds/xfstests/166 =================================================================== --- xfs-cmds.orig/xfstests/166 2008-04-28 13:54:14.000000000 +1000 +++ xfs-cmds/xfstests/166 2008-05-02 08:39:46.746511614 +1000 @@ -40,7 +40,7 @@ _filter_blocks() unwritten2 = ((1048576/512) / 2) - 2 * written_size } - /* is the extent unwritten? */ + # is the extent unwritten? unwritten_ext = 0; if ($7 >= 10000) unwritten_ext = 1; From owner-xfs@oss.sgi.com Thu May 1 17:09:13 2008 Received: with ECARTIS (v1.0.0; list xfs); Thu, 01 May 2008 17:09:32 -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.1 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_43 autolearn=no version=3.3.0-r574664 Received: from larry.melbourne.sgi.com (larry.melbourne.sgi.com [134.14.52.130]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with SMTP id m42099F6014328 for ; Thu, 1 May 2008 17:09:12 -0700 Received: from pc-bnaujok.melbourne.sgi.com (pc-bnaujok.melbourne.sgi.com [134.14.55.58]) by larry.melbourne.sgi.com (950413.SGI.8.6.12/950213.SGI.AUTOCF) via ESMTP id KAA04820; Fri, 2 May 2008 10:09:46 +1000 Date: Fri, 02 May 2008 10:13:38 +1000 To: "Christoph Hellwig" Subject: Re: REVIEW: ASCII CI support in xfsprogs From: "Barry Naujok" Organization: SGI Cc: "xfs@oss.sgi.com" , xfs-dev Content-Type: text/plain; format=flowed; delsp=yes; charset=utf-8 MIME-Version: 1.0 References: <20080501131725.GB7435@infradead.org> Message-ID: In-Reply-To: <20080501131725.GB7435@infradead.org> User-Agent: Opera Mail/9.24 (Win32) X-Virus-Scanned: ClamAV 0.91.2/6021/Wed Feb 27 15:55:48 2008 on oss.sgi.com X-Virus-Status: Clean Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from Quoted-Printable to 8bit by oss.sgi.com id m4209DF6014339 X-archive-position: 15747 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: bnaujok@sgi.com Precedence: bulk X-list: xfs On Thu, 01 May 2008 23:17:25 +1000, Christoph Hellwig wrote: > On Thu, May 01, 2008 at 02:37:11PM +1000, Barry Naujok wrote: >> I've reworked xfsprogs userspace tools from scratch with ASCII CI >> support >> only. Much simpler than previous patches with Unicode CI. >> >> One issue that sort of bugs me a bit is I've maintained the same output >> as >> the original IRIX mkfs.xfs with CI mode: >> naming =version 2 bsize=4096 mixed-case=Y|N >> >> where "N" = CI enabled and "Y" = normal case-senstive filesystem. >> >> Should this be changed to something clearer? > > I'd prefer something cleaner. Like case-insensitive=Y|N. Yes, I was going to do "ascii-ci=Y|N", got to keep it clear in only does CI for A-Z. > Otherwise > the patch looks fine, but I wonder if you shouldn't better backport the > xfs_dir* files from the kernel completely instead of applying the > changes selectively, otherwise we'll get totoally out of sync codebases. I was thinking of that, but libxfs is pretty out of date anyway from all the cleanup changes that have occured and would like to sync them back at some stage in the near future. The sync would bring those other changes in at that time (Nathan can correct me if I misunderstand the sync process!) Barry. From owner-xfs@oss.sgi.com Thu May 1 19:08:19 2008 Received: with ECARTIS (v1.0.0; list xfs); Thu, 01 May 2008 19:08:39 -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.3 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-r574664 Received: from relay.sgi.com (netops-testserver-3.corp.sgi.com [192.26.57.72]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id m4228JgW020381 for ; Thu, 1 May 2008 19:08:19 -0700 Received: from outhouse.melbourne.sgi.com (outhouse.melbourne.sgi.com [134.14.52.145]) by netops-testserver-3.corp.sgi.com (Postfix) with ESMTP id 39995908A7; Thu, 1 May 2008 19:09:02 -0700 (PDT) Received: from blub.melbourne.sgi.com (mail@blub.melbourne.sgi.com [134.14.54.217]) by outhouse.melbourne.sgi.com (SGI-8.12.5/8.12.5) with SMTP id m4228vjm875203; Fri, 2 May 2008 12:08:57 +1000 (AEST) Received: (nullmailer pid 4892 invoked by uid 1000); Fri, 02 May 2008 01:55:39 -0000 From: xaiki@sgi.com To: xfs-dev@sgi.com Cc: xfs@oss.sgi.com, Niv Sardi , Niv Sardi Subject: [PATCH] Use xfs_d_alloc_anon for DM rdwr using handle code. Date: Fri, 2 May 2008 11:55:39 +1000 Message-Id: <1209693339-4861-3-git-send-email-xaiki@sgi.com> X-Mailer: git-send-email 1.5.5.1 In-Reply-To: <1209693339-4861-2-git-send-email-xaiki@sgi.com> References: <20080501070244.GH108924158@sgi.com> <1209693339-4861-1-git-send-email-xaiki@sgi.com> <1209693339-4861-2-git-send-email-xaiki@sgi.com> X-Virus-Scanned: ClamAV 0.91.2/6021/Wed Feb 27 15:55:48 2008 on oss.sgi.com X-Virus-Status: Clean X-archive-position: 15749 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: xaiki@sgi.com Precedence: bulk X-list: xfs From: Niv Sardi When doing invisible IO through the DMAPI we only require a handle, but that doesn't give us a file descriptor that we require, before we used to call d_alloc_annon() that created an annonymous disconnected but hashed dentry, from which we extracted the file descriptor, if no one else uses the dentry, the dput on fclose should unhash the dentry and (if not used) tear appart the dentry, and call into xfs_inactive where we will send the DESTROY EVENT. The issue was, that in some cases (as the dentry was hashed) another thread could use the same dentry inibiting the unhash on the first dput, and hence leaving that dentry on the unused list for ever (or untill caches are dropped). This uses the cuted down d_alloc_annon xfs implementation so that the dentry is never hashed. Signed-off-by: Niv Sardi --- fs/xfs/dmapi/xfs_dm.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/fs/xfs/dmapi/xfs_dm.c b/fs/xfs/dmapi/xfs_dm.c index c4f57a9..5aa00a9 100644 --- a/fs/xfs/dmapi/xfs_dm.c +++ b/fs/xfs/dmapi/xfs_dm.c @@ -1126,7 +1126,7 @@ xfs_dm_rdwr( igrab(inode); - dentry = d_alloc_anon(inode); + dentry = xfs_d_alloc_anon(inode); if (dentry == NULL) { iput(inode); return ENOMEM; -- 1.5.5.1 From owner-xfs@oss.sgi.com Thu May 1 19:08:19 2008 Received: with ECARTIS (v1.0.0; list xfs); Thu, 01 May 2008 19:08:38 -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.3 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-r574664 Received: from relay.sgi.com (netops-testserver-3.corp.sgi.com [192.26.57.72]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id m4228I6c020380 for ; Thu, 1 May 2008 19:08:19 -0700 Received: from outhouse.melbourne.sgi.com (outhouse.melbourne.sgi.com [134.14.52.145]) by netops-testserver-3.corp.sgi.com (Postfix) with ESMTP id DBC0F908A6; Thu, 1 May 2008 19:08:59 -0700 (PDT) Received: from blub.melbourne.sgi.com (mail@blub.melbourne.sgi.com [134.14.54.217]) by outhouse.melbourne.sgi.com (SGI-8.12.5/8.12.5) with SMTP id m4228tjm857889; Fri, 2 May 2008 12:08:55 +1000 (AEST) Received: (nullmailer pid 4887 invoked by uid 1000); Fri, 02 May 2008 01:55:39 -0000 From: xaiki@sgi.com To: xfs-dev@sgi.com Cc: xfs@oss.sgi.com Subject: Don't use d_alloc_anon for open_by_handle Date: Fri, 2 May 2008 11:55:37 +1000 Message-Id: <1209693339-4861-1-git-send-email-xaiki@sgi.com> X-Mailer: git-send-email 1.5.5.1 In-Reply-To: <20080501070244.GH108924158@sgi.com> References: <20080501070244.GH108924158@sgi.com> X-Virus-Scanned: ClamAV 0.91.2/6021/Wed Feb 27 15:55:48 2008 on oss.sgi.com X-Virus-Status: Clean X-archive-position: 15748 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: xaiki@sgi.com Precedence: bulk X-list: xfs One of our DMAPI user found that in some cases inodes weren't getting through xfs_inactive() in any reasonable amount of time. Investigation tracked it down to the use of d_alloc_anon() combined with another thread accessing the same inode via an open(). So we introduce a stripped down version of d_alloc_anon, that won't try to find an existing dentry, nor will hash it. From owner-xfs@oss.sgi.com Thu May 1 19:08:21 2008 Received: with ECARTIS (v1.0.0; list xfs); Thu, 01 May 2008 19:08:43 -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.3 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-r574664 Received: from relay.sgi.com (netops-testserver-3.corp.sgi.com [192.26.57.72]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id m4228LpH020401 for ; Thu, 1 May 2008 19:08:21 -0700 Received: from outhouse.melbourne.sgi.com (outhouse.melbourne.sgi.com [134.14.52.145]) by netops-testserver-3.corp.sgi.com (Postfix) with ESMTP id 33B56908A6; Thu, 1 May 2008 19:09:04 -0700 (PDT) Received: from blub.melbourne.sgi.com (mail@blub.melbourne.sgi.com [134.14.54.217]) by outhouse.melbourne.sgi.com (SGI-8.12.5/8.12.5) with SMTP id m42290jm880403; Fri, 2 May 2008 12:09:01 +1000 (AEST) Received: (nullmailer pid 4890 invoked by uid 1000); Fri, 02 May 2008 01:55:39 -0000 From: xaiki@sgi.com To: xfs-dev@sgi.com Cc: xfs@oss.sgi.com, Niv Sardi , Niv Sardi Subject: [PATCH] Don't use hashed dentries when doing open_by_handle Date: Fri, 2 May 2008 11:55:38 +1000 Message-Id: <1209693339-4861-2-git-send-email-xaiki@sgi.com> X-Mailer: git-send-email 1.5.5.1 In-Reply-To: <1209693339-4861-1-git-send-email-xaiki@sgi.com> References: <20080501070244.GH108924158@sgi.com> <1209693339-4861-1-git-send-email-xaiki@sgi.com> X-Virus-Scanned: ClamAV 0.91.2/6021/Wed Feb 27 15:55:48 2008 on oss.sgi.com X-Virus-Status: Clean X-archive-position: 15750 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: xaiki@sgi.com Precedence: bulk X-list: xfs From: Niv Sardi Open by handle only require a handle, but that doesn't give us a file descriptor that we require for any IO, before we used to call d_alloc_annon() that created an annonymous disconnected but hashed dentry, from which we extracted the file descriptor, if no one else uses the dentry, the dput on fclose should unhash the dentry and (if not used) tear it appart, A repported issue is the DMAPI code was, that in some cases (as the dentry was hashed) another thread could use the same dentry inibiting the unhash on the first dput, and hence leaving that dentry on the unused list for ever (or untill caches are dropped). This cuts down d_alloc_annon to a subset that will only give us an anon dentry, and NOT hash it. Signed-off-by: Niv Sardi --- fs/xfs/linux-2.6/xfs_ioctl.c | 2 +- fs/xfs/linux-2.6/xfs_iops.c | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_ioctl.c b/fs/xfs/linux-2.6/xfs_ioctl.c index 4c82a05..66ed268 100644 --- a/fs/xfs/linux-2.6/xfs_ioctl.c +++ b/fs/xfs/linux-2.6/xfs_ioctl.c @@ -311,7 +311,7 @@ xfs_open_by_handle( return new_fd; } - dentry = d_alloc_anon(inode); + dentry = xfs_d_alloc_anon(inode); if (dentry == NULL) { iput(inode); put_unused_fd(new_fd); diff --git a/fs/xfs/linux-2.6/xfs_iops.c b/fs/xfs/linux-2.6/xfs_iops.c index cc4abd3..cf5e83f 100644 --- a/fs/xfs/linux-2.6/xfs_iops.c +++ b/fs/xfs/linux-2.6/xfs_iops.c @@ -190,6 +190,23 @@ xfs_ichgtime_fast( mark_inode_dirty_sync(inode); } +struct dentry * +xfs_d_alloc_anon(struct inode *inode) +{ + static const struct qstr anonstring = { .name = ""}; + struct dentry *res; + + res = d_alloc(NULL, &anonstring); + if (!res) + return NULL; + + /* attach a disconnected dentry */ + res->d_sb = inode->i_sb; + res->d_parent = res; + res->d_inode = inode; + + return res; +} /* * Pull the link count and size up from the xfs inode to the linux inode -- 1.5.5.1 From owner-xfs@oss.sgi.com Thu May 1 19:28:49 2008 Received: with ECARTIS (v1.0.0; list xfs); Thu, 01 May 2008 19:29:07 -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.1 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-r574664 Received: from larry.melbourne.sgi.com (larry.melbourne.sgi.com [134.14.52.130]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with SMTP id m422Sic5022606 for ; Thu, 1 May 2008 19:28:48 -0700 Received: from chook.melbourne.sgi.com (chook.melbourne.sgi.com [134.14.54.237]) by larry.melbourne.sgi.com (950413.SGI.8.6.12/950213.SGI.AUTOCF) via ESMTP id MAA07588; Fri, 2 May 2008 12:29:24 +1000 Received: by chook.melbourne.sgi.com (Postfix, from userid 16346) id 0CA8C58C4C15; Fri, 2 May 2008 12:29:23 +1000 (EST) To: sgi.bugs.xfs@engr.sgi.com Cc: xfs@oss.sgi.com Subject: TAKE 981091 - Don't allow memory reclaim to wait on the filesystem in inode writeback Message-Id: <20080502022924.0CA8C58C4C15@chook.melbourne.sgi.com> Date: Fri, 2 May 2008 12:29:23 +1000 (EST) From: dgc@sgi.com (David Chinner) X-Virus-Scanned: ClamAV 0.91.2/6021/Wed Feb 27 15:55:48 2008 on oss.sgi.com X-Virus-Status: Clean X-archive-position: 15751 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: dgc@sgi.com Precedence: bulk X-list: xfs Don't allow memory reclaim to wait on the filesystem in inode writeback If we allow memory reclaim to wait on the pages under writeback in inode cluster writeback we could deadlock because we are currently holding the ILOCK on the initial writeback inode which is needed in data I/O completion to change the file size or do unwritten extent conversion before the pages are taken out of writeback state. Date: Fri May 2 12:29:03 AEST 2008 Workarea: chook.melbourne.sgi.com:/build/dgc/isms/2.6.x-xfs Inspected by: hch@infradead.org The following file(s) were checked into: longdrop.melbourne.sgi.com:/isms/linux/2.6.x-xfs-melb Modid: xfs-linux-melb:xfs-kern:31015a fs/xfs/xfs_inode.c - 1.501 - changed http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-linux/xfs_inode.c.diff?r1=text&tr1=1.501&r2=text&tr2=1.500&f=h - Allocate the inode cluster list with KM_NOFS to prevent reclaim from recursing into the filesystem. From owner-xfs@oss.sgi.com Thu May 1 23:06:16 2008 Received: with ECARTIS (v1.0.0; list xfs); Thu, 01 May 2008 23:06:23 -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.5 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-r574664 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.168.29]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id m4266Cnw007535 for ; Thu, 1 May 2008 23:06:16 -0700 X-ASG-Debug-ID: 1209708415-5e1d010e0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 4ABAE11900A; Thu, 1 May 2008 23:06:55 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id gUqr0BdDcDJoTnt4; Thu, 01 May 2008 23:06:55 -0700 (PDT) Received: from hch by bombadil.infradead.org with local (Exim 4.68 #1 (Red Hat Linux)) id 1JroQ2-0003Ng-JM; Fri, 02 May 2008 06:06:54 +0000 Date: Fri, 2 May 2008 02:06:54 -0400 From: Christoph Hellwig To: xaiki@sgi.com Cc: xfs-dev@sgi.com, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Don't use d_alloc_anon for open_by_handle Subject: Re: Don't use d_alloc_anon for open_by_handle Message-ID: <20080502060654.GA23912@infradead.org> References: <20080501070244.GH108924158@sgi.com> <1209693339-4861-1-git-send-email-xaiki@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1209693339-4861-1-git-send-email-xaiki@sgi.com> User-Agent: Mutt/1.5.17 (2007-11-01) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1209708417 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: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.1, rules version 3.1.49428 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV 0.91.2/6021/Wed Feb 27 15:55:48 2008 on oss.sgi.com X-Virus-Status: Clean X-archive-position: 15753 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: hch@infradead.org Precedence: bulk X-list: xfs On Fri, May 02, 2008 at 11:55:37AM +1000, xaiki@sgi.com wrote: > One of our DMAPI user found that in some cases inodes weren't getting through > xfs_inactive() in any reasonable amount of time. Investigation tracked it down > to the use of d_alloc_anon() combined with another thread accessing the same > inode via an open(). > > So we introduce a stripped down version of d_alloc_anon, that won't try to find > an existing dentry, nor will hash it. No, this is even more buggy than using d_alloc_anon. What really needs to be done in the handle code is to do the full reconnect logic nfsd would be doing. Aka you should be using exportfs_decode_fh and update xfs's fh_to_dentry method to accept the file handle type used by the handle interface. From owner-xfs@oss.sgi.com Thu May 1 23:04:21 2008 Received: with ECARTIS (v1.0.0; list xfs); Thu, 01 May 2008 23:04:39 -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.2 required=5.0 tests=AWL,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 m4264EqO007351 for ; Thu, 1 May 2008 23:04:21 -0700 X-ASG-Debug-ID: 1209708296-44d800430000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from verein.lst.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 1E07712ADFD8; Thu, 1 May 2008 23:04:57 -0700 (PDT) Received: from verein.lst.de (verein.lst.de [213.95.11.210]) by cuda.sgi.com with ESMTP id EK07mUhccVyHHqAB; Thu, 01 May 2008 23:04:57 -0700 (PDT) Received: from verein.lst.de (localhost [127.0.0.1]) by verein.lst.de (8.12.3/8.12.3/Debian-7.1) with ESMTP id m4264oF3022171 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Fri, 2 May 2008 08:04:50 +0200 Received: (from hch@localhost) by verein.lst.de (8.12.3/8.12.3/Debian-6.6) id m4264ov2022168; Fri, 2 May 2008 08:04:50 +0200 Date: Fri, 2 May 2008 08:04:50 +0200 From: Christoph Hellwig To: David Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfsqa 166 failure Subject: Re: xfsqa 166 failure Message-ID: <20080502060450.GA21443@lst.de> References: <20080501205004.GA30384@lst.de> <20080501224237.GO108924158@sgi.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20080501224237.GO108924158@sgi.com> User-Agent: Mutt/1.3.28i X-Scanned-By: MIMEDefang 2.39 X-Barracuda-Connect: verein.lst.de[213.95.11.210] X-Barracuda-Start-Time: 1209708299 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: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.1, rules version 3.1.49427 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV 0.91.2/6021/Wed Feb 27 15:55:48 2008 on oss.sgi.com X-Virus-Status: Clean X-archive-position: 15752 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: hch@lst.de Precedence: bulk X-list: xfs On Fri, May 02, 2008 at 08:42:37AM +1000, David Chinner wrote: > gawk supports C comment syntax inside procedure blocks and doesn't > interpret them as regexes. I think the standard comment syntax > is supposed to be like bash - use "#". Of course, the gawk man > page doesn't define comment syntax at all, but mawk does. > > Does the patch below fix it? Yes, this fixes it. From owner-xfs@oss.sgi.com Fri May 2 03:11:28 2008 Received: with ECARTIS (v1.0.0; list xfs); Fri, 02 May 2008 03:11:47 -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=3.0 required=5.0 tests=BAYES_50,HTML_MESSAGE autolearn=no 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 m42ABNfg028723 for ; Fri, 2 May 2008 03:11:28 -0700 X-ASG-Debug-ID: 1209723126-5c9f03b80000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from outbound4-dub-R.bigfish.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 1255BADE1CF for ; Fri, 2 May 2008 03:12:07 -0700 (PDT) Received: from outbound4-dub-R.bigfish.com (outbound-dub.frontbridge.com [213.199.154.16]) by cuda.sgi.com with ESMTP id kI7PUUc9eLqd6eK0 for ; Fri, 02 May 2008 03:12:07 -0700 (PDT) Received: from outbound4-dub.bigfish.com (localhost.localdomain [127.0.0.1]) by outbound4-dub-R.bigfish.com (Postfix) with ESMTP id 5DE3417C047D for ; Fri, 2 May 2008 10:08:25 +0000 (UTC) Received: from mail72-dub-R.bigfish.com (unknown [10.5.252.3]) by outbound4-dub.bigfish.com (Postfix) with ESMTP id 36940136805C for ; Fri, 2 May 2008 10:08:25 +0000 (UTC) Received: from mail72-dub (localhost.localdomain [127.0.0.1]) by mail72-dub-R.bigfish.com (Postfix) with ESMTP id 2702410082E2 for ; Fri, 2 May 2008 10:08:24 +0000 (UTC) X-BigFish: V X-MS-Exchange-Organization-Antispam-Report: OrigIP: 72.20.130.72;Service: EHS Received: by mail72-dub (MessageSwitch) id 120972290332857_6392; Fri, 2 May 2008 10:08:23 +0000 (UCT) Received: from mailus1.cgg.com (72-20-130-72.cgg.com [72.20.130.72]) by mail72-dub.bigfish.com (Postfix) with ESMTP id 7CACCA78073 for ; Fri, 2 May 2008 10:08:22 +0000 (UTC) Received: from in02ex01.int.cgg.com (in02ex01.int.cgg.com [192.168.53.201]) by mailus1.cgg.com (MailerCGG) with ESMTP id 5862A1D4001 for ; Fri, 2 May 2008 05:08:17 -0500 (CDT) MIME-Version: 1.0 X-ASG-Orig-Subj: query Subject: query X-MimeOLE: Produced By Microsoft Exchange V6.0.6603.0 Date: Fri, 2 May 2008 15:38:13 +0530 Message-ID: <87604E51C77C4F4988CF1C7F088D562D9BE614@in02ex01.int.cgg.com> X-MS-Has-Attach: X-MS-TNEF-Correlator: Thread-Topic: query Thread-Index: AcisPG6oYAb3wn1+Sta+tXbvpEJUPA== From: "Nandedkar, Rishiraj" To: X-Barracuda-Connect: outbound-dub.frontbridge.com[213.199.154.16] X-Barracuda-Start-Time: 1209723128 X-Barracuda-Bayes: INNOCENT GLOBAL 0.4596 1.0000 0.0000 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.1, rules version 3.1.49445 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message X-Virus-Scanned: ClamAV 0.91.2/6021/Wed Feb 27 15:55:48 2008 on oss.sgi.com X-Virus-Status: Clean Content-Type: text/plain Content-Disposition: inline Content-Transfer-Encoding: 7bit Content-length: 361 X-archive-position: 15754 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: Rishiraj.Nandedkar@cggveritas.com Precedence: bulk X-list: xfs Hi, I would like to know which Linux version support XFS file system. I am working on linux3.5 and 4.3 and 7.3 but all these versions not support XFS. Please let me know which Linux version supports xfs and where can I get this versions Thanks in advance Thx & Regards Rishi Nandedkar It support CGGVERITAS [[HTML alternate version deleted]] From owner-xfs@oss.sgi.com Fri May 2 03:34:57 2008 Received: with ECARTIS (v1.0.0; list xfs); Fri, 02 May 2008 03:35:16 -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=AWL,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 m42AYtmb030501 for ; Fri, 2 May 2008 03:34:57 -0700 X-ASG-Debug-ID: 1209724538-0a2901b90000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp8-g19.free.fr (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id A8C04ADE326 for ; Fri, 2 May 2008 03:35:39 -0700 (PDT) Received: from smtp8-g19.free.fr (smtp8-g19.free.fr [212.27.42.65]) by cuda.sgi.com with ESMTP id l6jE6Y6Cp8wBRDIY for ; Fri, 02 May 2008 03:35:39 -0700 (PDT) Received: from smtp8-g19.free.fr (localhost [127.0.0.1]) by smtp8-g19.free.fr (Postfix) with ESMTP id 8B7A417F538; Fri, 2 May 2008 12:35:38 +0200 (CEST) Received: from harpe.intellique.com (labo.djinux.com [82.225.196.72]) by smtp8-g19.free.fr (Postfix) with ESMTP id 5509217F535; Fri, 2 May 2008 12:35:38 +0200 (CEST) Date: Fri, 2 May 2008 12:35:41 +0200 From: Emmanuel Florac To: "Nandedkar, Rishiraj" Cc: X-ASG-Orig-Subj: Re: query Subject: Re: query Message-ID: <20080502123541.2216848e@harpe.intellique.com> In-Reply-To: <87604E51C77C4F4988CF1C7F088D562D9BE614@in02ex01.int.cgg.com> References: <87604E51C77C4F4988CF1C7F088D562D9BE614@in02ex01.int.cgg.com> Organization: Intellique X-Mailer: Claws Mail 3.0.2 (GTK+ 2.12.9; i686-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 X-Barracuda-Connect: smtp8-g19.free.fr[212.27.42.65] X-Barracuda-Start-Time: 1209724539 X-Barracuda-Bayes: INNOCENT GLOBAL 0.4737 1.0000 0.0000 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.1, rules version 3.1.49447 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV 0.91.2/6021/Wed Feb 27 15:55:48 2008 on oss.sgi.com X-Virus-Status: Clean Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by oss.sgi.com id m42AYvmb030503 X-archive-position: 15755 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: eflorac@intellique.com Precedence: bulk X-list: xfs Le Fri, 2 May 2008 15:38:13 +0530 "Nandedkar, Rishiraj" écrivait: > I would like to know which Linux version support XFS file system. I am > working on linux3.5 and 4.3 and 7.3 but all these versions not support > XFS. You are misleaded. There is no such thing as "linux 3.5" or "linux 7.3". Current Linux kernel version is 2.6.25. However there exists hundreds of GNU/Linux distributions, with many different numbering schemes, that may come with or without XFS support. Some current common distributions : Debian GNU/Linux 4.0, SuSE Linux Enterprise Server 10.0, RedHat Enterprise Linux 5.0... See http://distrowatch.com/ to find about most of them. Most distributions (except RedHat Enterprise and SuSE Enterprise) may be downloaded (and used) for free. Don't stick with an outdated one! As far as I know, all distributions less than 5 years old should support XFS natively. So either you use some very old distribution (like RedHat Linux 7.3, which is antique), or you didn't looked for the right thing at the right place. -- ---------------------------------------- Emmanuel Florac | Intellique ---------------------------------------- From owner-xfs@oss.sgi.com Fri May 2 03:42:24 2008 Received: with ECARTIS (v1.0.0; list xfs); Fri, 02 May 2008 03:42:38 -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=0.2 required=5.0 tests=AWL,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 m42AgNLD031283 for ; Fri, 2 May 2008 03:42:24 -0700 X-ASG-Debug-ID: 1209724987-0e2301b10000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from outbound9-dub-R.bigfish.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 4DBCEADE4D1 for ; Fri, 2 May 2008 03:43:07 -0700 (PDT) Received: from outbound9-dub-R.bigfish.com (outbound-dub.frontbridge.com [213.199.154.16]) by cuda.sgi.com with ESMTP id U3Ehdi135iisQ6Wf for ; Fri, 02 May 2008 03:43:07 -0700 (PDT) Received: from outbound9-dub.bigfish.com (localhost.localdomain [127.0.0.1]) by outbound9-dub-R.bigfish.com (Postfix) with ESMTP id 1E7F1E1A5D0; Fri, 2 May 2008 10:43:07 +0000 (UTC) Received: from mail102-dub-R.bigfish.com (unknown [10.5.252.3]) by outbound9-dub.bigfish.com (Postfix) with ESMTP id 0F5B51390043; Fri, 2 May 2008 10:43:07 +0000 (UTC) Received: from mail102-dub (localhost.localdomain [127.0.0.1]) by mail102-dub-R.bigfish.com (Postfix) with ESMTP id 0B73E19381B1; Fri, 2 May 2008 10:43:05 +0000 (UTC) X-BigFish: V X-MS-Exchange-Organization-Antispam-Report: OrigIP: 72.20.130.72;Service: EHS Received: by mail102-dub (MessageSwitch) id 1209724983619862_23921; Fri, 2 May 2008 10:43:03 +0000 (UCT) Received: from mailus1.cgg.com (72-20-130-72.cgg.com [72.20.130.72]) by mail102-dub.bigfish.com (Postfix) with ESMTP id B6C8FB20083; Fri, 2 May 2008 10:43:02 +0000 (UTC) Received: from in02ex01.int.cgg.com (in02ex01.int.cgg.com [192.168.53.201]) by mailus1.cgg.com (MailerCGG) with ESMTP id 02AB31D4001; Fri, 2 May 2008 05:42:56 -0500 (CDT) MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" X-ASG-Orig-Subj: RE: query Subject: RE: query content-class: urn:content-classes:message X-MimeOLE: Produced By Microsoft Exchange V6.0.6603.0 Date: Fri, 2 May 2008 16:12:58 +0530 Message-ID: <87604E51C77C4F4988CF1C7F088D562D38BE0A@in02ex01.int.cgg.com> X-MS-Has-Attach: X-MS-TNEF-Correlator: Thread-Topic: query Thread-Index: AcisQEf/rhC83n/yRdSSvp0kNcDTUgAAErtQ From: "Nandedkar, Rishiraj" To: "Emmanuel Florac" Cc: X-Barracuda-Connect: outbound-dub.frontbridge.com[213.199.154.16] X-Barracuda-Start-Time: 1209724988 X-Barracuda-Bayes: INNOCENT GLOBAL 0.4842 1.0000 0.0000 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.1, rules version 3.1.49447 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV 0.91.2/6021/Wed Feb 27 15:55:48 2008 on oss.sgi.com X-Virus-Status: Clean Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by oss.sgi.com id m42AgPLD031285 X-archive-position: 15756 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: Rishiraj.Nandedkar@cggveritas.com Precedence: bulk X-list: xfs Hi, Thank you for update but Linux 7.3 means red hat 7 update 3 red hat 3 update 5.In our system we are unable to detect disk which is having file system in XFS format. Our system is not able to support it. 2.4.21-32.EL is kenal version on our systems. Please let me know which version should I use in redhat.I am trying this with fedora core 3 Thx rishi -----Original Message----- From: Emmanuel Florac [mailto:eflorac@intellique.com] Sent: Friday, May 02, 2008 4:06 PM To: Nandedkar, Rishiraj Cc: xfs@oss.sgi.com Subject: Re: query Le Fri, 2 May 2008 15:38:13 +0530 "Nandedkar, Rishiraj" écrivait: > I would like to know which Linux version support XFS file system. I am > working on linux3.5 and 4.3 and 7.3 but all these versions not support > XFS. You are misleaded. There is no such thing as "linux 3.5" or "linux 7.3". Current Linux kernel version is 2.6.25. However there exists hundreds of GNU/Linux distributions, with many different numbering schemes, that may come with or without XFS support. Some current common distributions : Debian GNU/Linux 4.0, SuSE Linux Enterprise Server 10.0, RedHat Enterprise Linux 5.0... See http://distrowatch.com/ to find about most of them. Most distributions (except RedHat Enterprise and SuSE Enterprise) may be downloaded (and used) for free. Don't stick with an outdated one! As far as I know, all distributions less than 5 years old should support XFS natively. So either you use some very old distribution (like RedHat Linux 7.3, which is antique), or you didn't looked for the right thing at the right place. -- ---------------------------------------- Emmanuel Florac | Intellique ---------------------------------------- From owner-xfs@oss.sgi.com Fri May 2 03:51:43 2008 Received: with ECARTIS (v1.0.0; list xfs); Fri, 02 May 2008 03:52:01 -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.2 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_62 autolearn=no version=3.3.0-r574664 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.168.29]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id m42ApfDc032085 for ; Fri, 2 May 2008 03:51:43 -0700 X-ASG-Debug-ID: 1209725541-377601530000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from verein.lst.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 35BC5119C4B for ; Fri, 2 May 2008 03:52:22 -0700 (PDT) Received: from verein.lst.de (verein.lst.de [213.95.11.210]) by cuda.sgi.com with ESMTP id xgD4Fcm3aK0F3gHN for ; Fri, 02 May 2008 03:52:22 -0700 (PDT) Received: from verein.lst.de (localhost [127.0.0.1]) by verein.lst.de (8.12.3/8.12.3/Debian-7.1) with ESMTP id m42AqFF3018072 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO) for ; Fri, 2 May 2008 12:52:15 +0200 Received: (from hch@localhost) by verein.lst.de (8.12.3/8.12.3/Debian-6.6) id m42AqFFO018070 for xfs@oss.sgi.com; Fri, 2 May 2008 12:52:15 +0200 Date: Fri, 2 May 2008 12:52:15 +0200 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] sanitize xfs_initialize_vnode Subject: [PATCH] sanitize xfs_initialize_vnode Message-ID: <20080502105215.GA17870@lst.de> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.3.28i X-Scanned-By: MIMEDefang 2.39 X-Barracuda-Connect: verein.lst.de[213.95.11.210] X-Barracuda-Start-Time: 1209725545 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: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.1, rules version 3.1.49448 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV 0.91.2/6021/Wed Feb 27 15:55:48 2008 on oss.sgi.com X-Virus-Status: Clean X-archive-position: 15757 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: hch@lst.de Precedence: bulk X-list: xfs Sanitize setting up the Linux indode. Setting up the xfs_inode <-> inode link is opencoded in xfs_iget_core now because that's the only place it needs to be done, xfs_initialize_vnode is renamed to xfs_setup_inode and loses all superflous paramaters. The check for I_NEW is removed because it always is true and the di_mode check moves into xfs_iget_core because it's only needed there. xfs_set_inodeops and xfs_revalidate_inode are merged into xfs_setup_inode and the whole things is moved into xfs_iops.c where it belongs. Signed-off-by: Christoph Hellwig Index: linux-2.6-xfs/fs/xfs/linux-2.6/xfs_iops.c =================================================================== --- linux-2.6-xfs.orig/fs/xfs/linux-2.6/xfs_iops.c 2008-05-02 08:41:27.000000000 +0200 +++ linux-2.6-xfs/fs/xfs/linux-2.6/xfs_iops.c 2008-05-02 08:51:46.000000000 +0200 @@ -777,7 +777,7 @@ out_error: return error; } -const struct inode_operations xfs_inode_operations = { +static const struct inode_operations xfs_inode_operations = { .permission = xfs_vn_permission, .truncate = xfs_vn_truncate, .getattr = xfs_vn_getattr, @@ -789,7 +789,7 @@ const struct inode_operations xfs_inode_ .fallocate = xfs_vn_fallocate, }; -const struct inode_operations xfs_dir_inode_operations = { +static const struct inode_operations xfs_dir_inode_operations = { .create = xfs_vn_create, .lookup = xfs_vn_lookup, .link = xfs_vn_link, @@ -808,7 +808,7 @@ const struct inode_operations xfs_dir_in .listxattr = xfs_vn_listxattr, }; -const struct inode_operations xfs_symlink_inode_operations = { +static const struct inode_operations xfs_symlink_inode_operations = { .readlink = generic_readlink, .follow_link = xfs_vn_follow_link, .put_link = xfs_vn_put_link, @@ -820,3 +820,95 @@ const struct inode_operations xfs_symlin .removexattr = generic_removexattr, .listxattr = xfs_vn_listxattr, }; + +STATIC void +xfs_diflags_to_iflags( + struct inode *inode, + struct xfs_inode *ip) +{ + if (ip->i_d.di_flags & XFS_DIFLAG_IMMUTABLE) + inode->i_flags |= S_IMMUTABLE; + else + inode->i_flags &= ~S_IMMUTABLE; + if (ip->i_d.di_flags & XFS_DIFLAG_APPEND) + inode->i_flags |= S_APPEND; + else + inode->i_flags &= ~S_APPEND; + if (ip->i_d.di_flags & XFS_DIFLAG_SYNC) + inode->i_flags |= S_SYNC; + else + inode->i_flags &= ~S_SYNC; + if (ip->i_d.di_flags & XFS_DIFLAG_NOATIME) + inode->i_flags |= S_NOATIME; + else + inode->i_flags &= ~S_NOATIME; +} + +/* + * Initialize the Linux inode, set up the operation vectors and + * unlock the inode. + * + * When reading existing inodes from disk this is called directly + * from xfs_iget, when creating a new inode it is called from + * xfs_ialloc after setting up the inode. + */ +void +xfs_setup_inode( + struct xfs_inode *ip) +{ + struct inode *inode = ip->i_vnode; + + inode->i_mode = ip->i_d.di_mode; + inode->i_nlink = ip->i_d.di_nlink; + inode->i_uid = ip->i_d.di_uid; + inode->i_gid = ip->i_d.di_gid; + + switch (inode->i_mode & S_IFMT) { + case S_IFBLK: + case S_IFCHR: + inode->i_rdev = + MKDEV(sysv_major(ip->i_df.if_u2.if_rdev) & 0x1ff, + sysv_minor(ip->i_df.if_u2.if_rdev)); + break; + default: + inode->i_rdev = 0; + break; + } + + inode->i_generation = ip->i_d.di_gen; + i_size_write(inode, ip->i_d.di_size); + inode->i_atime.tv_sec = ip->i_d.di_atime.t_sec; + inode->i_atime.tv_nsec = ip->i_d.di_atime.t_nsec; + inode->i_mtime.tv_sec = ip->i_d.di_mtime.t_sec; + inode->i_mtime.tv_nsec = ip->i_d.di_mtime.t_nsec; + inode->i_ctime.tv_sec = ip->i_d.di_ctime.t_sec; + inode->i_ctime.tv_nsec = ip->i_d.di_ctime.t_nsec; + xfs_diflags_to_iflags(inode, ip); + xfs_iflags_clear(ip, XFS_IMODIFIED); + + switch (inode->i_mode & S_IFMT) { + case S_IFREG: + inode->i_op = &xfs_inode_operations; + inode->i_fop = &xfs_file_operations; + inode->i_mapping->a_ops = &xfs_address_space_operations; + break; + case S_IFDIR: + inode->i_op = &xfs_dir_inode_operations; + inode->i_fop = &xfs_dir_file_operations; + break; + case S_IFLNK: + inode->i_op = &xfs_symlink_inode_operations; + if (!(ip->i_df.if_flags & XFS_IFINLINE)) + inode->i_mapping->a_ops = &xfs_address_space_operations; + break; + default: + inode->i_op = &xfs_inode_operations; + init_special_inode(inode, inode->i_mode, inode->i_rdev); + break; + } + + xfs_iflags_clear(ip, XFS_INEW); + barrier(); + + unlock_new_inode(inode); +} Index: linux-2.6-xfs/fs/xfs/linux-2.6/xfs_iops.h =================================================================== --- linux-2.6-xfs.orig/fs/xfs/linux-2.6/xfs_iops.h 2008-05-02 08:41:27.000000000 +0200 +++ linux-2.6-xfs/fs/xfs/linux-2.6/xfs_iops.h 2008-05-02 08:41:35.000000000 +0200 @@ -18,9 +18,7 @@ #ifndef __XFS_IOPS_H__ #define __XFS_IOPS_H__ -extern const struct inode_operations xfs_inode_operations; -extern const struct inode_operations xfs_dir_inode_operations; -extern const struct inode_operations xfs_symlink_inode_operations; +struct xfs_inode; extern const struct file_operations xfs_file_operations; extern const struct file_operations xfs_dir_file_operations; @@ -28,10 +26,11 @@ extern const struct file_operations xfs_ extern ssize_t xfs_vn_listxattr(struct dentry *, char *data, size_t size); -struct xfs_inode; extern void xfs_ichgtime(struct xfs_inode *, int); extern void xfs_ichgtime_fast(struct xfs_inode *, struct inode *, int); +extern void xfs_setup_inode(struct xfs_inode *); + #define xfs_vtoi(vp) \ ((struct xfs_inode *)vn_to_inode(vp)->i_private) Index: linux-2.6-xfs/fs/xfs/linux-2.6/xfs_ksyms.c =================================================================== --- linux-2.6-xfs.orig/fs/xfs/linux-2.6/xfs_ksyms.c 2008-05-02 08:41:27.000000000 +0200 +++ linux-2.6-xfs/fs/xfs/linux-2.6/xfs_ksyms.c 2008-05-02 08:41:35.000000000 +0200 @@ -155,12 +155,9 @@ EXPORT_SYMBOL(kmem_zone_free); EXPORT_SYMBOL(kmem_zone_init); EXPORT_SYMBOL(kmem_zone_zalloc); EXPORT_SYMBOL(xfs_address_space_operations); -EXPORT_SYMBOL(xfs_dir_inode_operations); EXPORT_SYMBOL(xfs_dir_file_operations); -EXPORT_SYMBOL(xfs_inode_operations); EXPORT_SYMBOL(xfs_file_operations); EXPORT_SYMBOL(xfs_invis_file_operations); -EXPORT_SYMBOL(xfs_symlink_inode_operations); EXPORT_SYMBOL(xfs_buf_delwri_dequeue); EXPORT_SYMBOL(_xfs_buf_find); EXPORT_SYMBOL(xfs_buf_iostart); Index: linux-2.6-xfs/fs/xfs/linux-2.6/xfs_super.c =================================================================== --- linux-2.6-xfs.orig/fs/xfs/linux-2.6/xfs_super.c 2008-05-02 08:41:34.000000000 +0200 +++ linux-2.6-xfs/fs/xfs/linux-2.6/xfs_super.c 2008-05-02 08:51:43.000000000 +0200 @@ -558,115 +558,6 @@ xfs_max_file_offset( return (((__uint64_t)pagefactor) << bitshift) - 1; } -STATIC_INLINE void -xfs_set_inodeops( - struct inode *inode) -{ - switch (inode->i_mode & S_IFMT) { - case S_IFREG: - inode->i_op = &xfs_inode_operations; - inode->i_fop = &xfs_file_operations; - inode->i_mapping->a_ops = &xfs_address_space_operations; - break; - case S_IFDIR: - inode->i_op = &xfs_dir_inode_operations; - inode->i_fop = &xfs_dir_file_operations; - break; - case S_IFLNK: - inode->i_op = &xfs_symlink_inode_operations; - if (!(XFS_I(inode)->i_df.if_flags & XFS_IFINLINE)) - inode->i_mapping->a_ops = &xfs_address_space_operations; - break; - default: - inode->i_op = &xfs_inode_operations; - init_special_inode(inode, inode->i_mode, inode->i_rdev); - break; - } -} - -STATIC_INLINE void -xfs_revalidate_inode( - xfs_mount_t *mp, - bhv_vnode_t *vp, - xfs_inode_t *ip) -{ - struct inode *inode = vn_to_inode(vp); - - inode->i_mode = ip->i_d.di_mode; - inode->i_nlink = ip->i_d.di_nlink; - inode->i_uid = ip->i_d.di_uid; - inode->i_gid = ip->i_d.di_gid; - - switch (inode->i_mode & S_IFMT) { - case S_IFBLK: - case S_IFCHR: - inode->i_rdev = - MKDEV(sysv_major(ip->i_df.if_u2.if_rdev) & 0x1ff, - sysv_minor(ip->i_df.if_u2.if_rdev)); - break; - default: - inode->i_rdev = 0; - break; - } - - inode->i_generation = ip->i_d.di_gen; - i_size_write(inode, ip->i_d.di_size); - inode->i_atime.tv_sec = ip->i_d.di_atime.t_sec; - inode->i_atime.tv_nsec = ip->i_d.di_atime.t_nsec; - inode->i_mtime.tv_sec = ip->i_d.di_mtime.t_sec; - inode->i_mtime.tv_nsec = ip->i_d.di_mtime.t_nsec; - inode->i_ctime.tv_sec = ip->i_d.di_ctime.t_sec; - inode->i_ctime.tv_nsec = ip->i_d.di_ctime.t_nsec; - if (ip->i_d.di_flags & XFS_DIFLAG_IMMUTABLE) - inode->i_flags |= S_IMMUTABLE; - else - inode->i_flags &= ~S_IMMUTABLE; - if (ip->i_d.di_flags & XFS_DIFLAG_APPEND) - inode->i_flags |= S_APPEND; - else - inode->i_flags &= ~S_APPEND; - if (ip->i_d.di_flags & XFS_DIFLAG_SYNC) - inode->i_flags |= S_SYNC; - else - inode->i_flags &= ~S_SYNC; - if (ip->i_d.di_flags & XFS_DIFLAG_NOATIME) - inode->i_flags |= S_NOATIME; - else - inode->i_flags &= ~S_NOATIME; - xfs_iflags_clear(ip, XFS_IMODIFIED); -} - -void -xfs_initialize_vnode( - struct xfs_mount *mp, - bhv_vnode_t *vp, - struct xfs_inode *ip) -{ - struct inode *inode = vn_to_inode(vp); - - if (!ip->i_vnode) { - ip->i_vnode = vp; - inode->i_private = ip; - } - - /* - * We need to set the ops vectors, and unlock the inode, but if - * we have been called during the new inode create process, it is - * too early to fill in the Linux inode. We will get called a - * second time once the inode is properly set up, and then we can - * finish our work. - */ - if (ip->i_d.di_mode != 0 && (inode->i_state & I_NEW)) { - xfs_revalidate_inode(mp, vp, ip); - xfs_set_inodeops(inode); - - xfs_iflags_clear(ip, XFS_INEW); - barrier(); - - unlock_new_inode(inode); - } -} - int xfs_blkdev_get( xfs_mount_t *mp, Index: linux-2.6-xfs/fs/xfs/linux-2.6/xfs_super.h =================================================================== --- linux-2.6-xfs.orig/fs/xfs/linux-2.6/xfs_super.h 2008-05-02 08:41:27.000000000 +0200 +++ linux-2.6-xfs/fs/xfs/linux-2.6/xfs_super.h 2008-05-02 08:41:35.000000000 +0200 @@ -72,9 +72,6 @@ struct block_device; extern __uint64_t xfs_max_file_offset(unsigned int); -extern void xfs_initialize_vnode(struct xfs_mount *mp, bhv_vnode_t *vp, - struct xfs_inode *ip); - extern void xfs_flush_inode(struct xfs_inode *); extern void xfs_flush_device(struct xfs_inode *); Index: linux-2.6-xfs/fs/xfs/xfs_iget.c =================================================================== --- linux-2.6-xfs.orig/fs/xfs/xfs_iget.c 2008-05-02 08:41:27.000000000 +0200 +++ linux-2.6-xfs/fs/xfs/xfs_iget.c 2008-05-02 08:53:18.000000000 +0200 @@ -288,10 +288,17 @@ finish_inode: *ipp = ip; /* + * Set up the Linux with the Linux inode. + */ + ip->i_vnode = inode; + inode->i_private = ip; + + /* * If we have a real type for an on-disk inode, we can set ops(&unlock) * now. If it's a new inode being created, xfs_ialloc will handle it. */ - xfs_initialize_vnode(mp, inode, ip); + if (ip->i_d.di_mode != 0) + xfs_setup_inode(ip); return 0; } Index: linux-2.6-xfs/fs/xfs/xfs_inode.c =================================================================== --- linux-2.6-xfs.orig/fs/xfs/xfs_inode.c 2008-05-02 08:41:27.000000000 +0200 +++ linux-2.6-xfs/fs/xfs/xfs_inode.c 2008-05-02 08:41:35.000000000 +0200 @@ -1046,7 +1046,6 @@ xfs_ialloc( { xfs_ino_t ino; xfs_inode_t *ip; - bhv_vnode_t *vp; uint flags; int error; @@ -1077,7 +1076,6 @@ xfs_ialloc( } ASSERT(ip != NULL); - vp = XFS_ITOV(ip); ip->i_d.di_mode = (__uint16_t)mode; ip->i_d.di_onlink = 0; ip->i_d.di_nlink = nlink; @@ -1220,7 +1218,7 @@ xfs_ialloc( xfs_trans_log_inode(tp, ip, flags); /* now that we have an i_mode we can setup inode ops and unlock */ - xfs_initialize_vnode(tp->t_mountp, vp, ip); + xfs_setup_inode(ip); *ipp = ip; return 0; From owner-xfs@oss.sgi.com Fri May 2 03:57:24 2008 Received: with ECARTIS (v1.0.0; list xfs); Fri, 02 May 2008 03:57:31 -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.2 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_65 autolearn=no version=3.3.0-r574664 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id m42AvNJ5032723 for ; Fri, 2 May 2008 03:57:23 -0700 X-ASG-Debug-ID: 1209725883-097201380000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from verein.lst.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 122FF161FEE2 for ; Fri, 2 May 2008 03:58:04 -0700 (PDT) Received: from verein.lst.de (verein.lst.de [213.95.11.210]) by cuda.sgi.com with ESMTP id dGknxi49RdhJcn36 for ; Fri, 02 May 2008 03:58:04 -0700 (PDT) Received: from verein.lst.de (localhost [127.0.0.1]) by verein.lst.de (8.12.3/8.12.3/Debian-7.1) with ESMTP id m42AvvF3018340 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO) for ; Fri, 2 May 2008 12:57:57 +0200 Received: (from hch@localhost) by verein.lst.de (8.12.3/8.12.3/Debian-6.6) id m42AvvHY018338 for xfs@oss.sgi.com; Fri, 2 May 2008 12:57:57 +0200 Date: Fri, 2 May 2008 12:57:57 +0200 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 1/2] merge xfs_rmdir into xfs_remove Subject: [PATCH 1/2] merge xfs_rmdir into xfs_remove Message-ID: <20080502105757.GB17870@lst.de> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.3.28i X-Scanned-By: MIMEDefang 2.39 X-Barracuda-Connect: verein.lst.de[213.95.11.210] X-Barracuda-Start-Time: 1209725887 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: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.1, rules version 3.1.49448 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV 0.91.2/6021/Wed Feb 27 15:55:48 2008 on oss.sgi.com X-Virus-Status: Clean X-archive-position: 15758 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: hch@lst.de Precedence: bulk X-list: xfs xfs_remove and xfs_rmdir are almost the same with a little more work performed in xfs_rmdir due to the . and .. entries. This patch merges xfs_rmdir into xfs_remove and performs these actions conditionally. Also clean up the error handling which was a nightmare in both versions before. Signed-off-by: Christoph Hellwig Index: linux-2.6-xfs/fs/xfs/xfs_vnodeops.c =================================================================== --- linux-2.6-xfs.orig/fs/xfs/xfs_vnodeops.c 2008-05-01 22:56:57.000000000 +0200 +++ linux-2.6-xfs/fs/xfs/xfs_vnodeops.c 2008-05-02 08:30:24.000000000 +0200 @@ -2135,13 +2135,6 @@ again: #endif } -#ifdef DEBUG -#define REMOVE_DEBUG_TRACE(x) {remove_which_error_return = (x);} -int remove_which_error_return = 0; -#else /* ! DEBUG */ -#define REMOVE_DEBUG_TRACE(x) -#endif /* ! DEBUG */ - int xfs_remove( xfs_inode_t *dp, @@ -2150,6 +2143,7 @@ xfs_remove( { xfs_mount_t *mp = dp->i_mount; xfs_trans_t *tp = NULL; + int is_dir = S_ISDIR(ip->i_d.di_mode); int error = 0; xfs_bmap_free_t free_list; xfs_fsblock_t first_block; @@ -2157,8 +2151,11 @@ xfs_remove( int committed; int link_zero; uint resblks; + uint trans; + uint log_count; xfs_itrace_entry(dp); + xfs_itrace_entry(ip); if (XFS_FORCED_SHUTDOWN(mp)) return XFS_ERROR(EIO); @@ -2171,19 +2168,25 @@ xfs_remove( return error; } - xfs_itrace_entry(ip); - xfs_itrace_ref(ip); - error = XFS_QM_DQATTACH(mp, dp, 0); - if (!error) - error = XFS_QM_DQATTACH(mp, ip, 0); - if (error) { - REMOVE_DEBUG_TRACE(__LINE__); + if (error) + goto std_return; + + error = XFS_QM_DQATTACH(mp, ip, 0); + if (error) goto std_return; + + if (is_dir) { + trans = XFS_TRANS_RMDIR; + log_count = XFS_DEFAULT_LOG_COUNT; + } else { + trans = XFS_TRANS_REMOVE; + log_count = XFS_REMOVE_LOG_COUNT; } - tp = xfs_trans_alloc(mp, XFS_TRANS_REMOVE); + tp = xfs_trans_alloc(mp, trans); cancel_flags = XFS_TRANS_RELEASE_LOG_RES; + /* * We try to get the real space reservation first, * allowing for directory btree deletion(s) implying @@ -2195,25 +2198,21 @@ xfs_remove( */ resblks = XFS_REMOVE_SPACE_RES(mp); error = xfs_trans_reserve(tp, resblks, XFS_REMOVE_LOG_RES(mp), 0, - XFS_TRANS_PERM_LOG_RES, XFS_REMOVE_LOG_COUNT); + XFS_TRANS_PERM_LOG_RES, log_count); if (error == ENOSPC) { resblks = 0; error = xfs_trans_reserve(tp, 0, XFS_REMOVE_LOG_RES(mp), 0, - XFS_TRANS_PERM_LOG_RES, XFS_REMOVE_LOG_COUNT); + XFS_TRANS_PERM_LOG_RES, log_count); } if (error) { ASSERT(error != ENOSPC); - REMOVE_DEBUG_TRACE(__LINE__); - xfs_trans_cancel(tp, 0); - return error; + cancel_flags = 0; + goto out_trans_cancel; } error = xfs_lock_dir_and_entry(dp, ip); - if (error) { - REMOVE_DEBUG_TRACE(__LINE__); - xfs_trans_cancel(tp, cancel_flags); - goto std_return; - } + if (error) + goto out_trans_cancel; /* * At this point, we've gotten both the directory and the entry @@ -2226,6 +2225,21 @@ xfs_remove( xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); /* + * If we're removing a directory perform some additional validation. + */ + if (is_dir) { + ASSERT(ip->i_d.di_nlink >= 2); + if (ip->i_d.di_nlink != 2) { + error = XFS_ERROR(ENOTEMPTY); + goto out_trans_cancel; + } + if (!xfs_dir_isempty(ip)) { + error = XFS_ERROR(ENOTEMPTY); + goto out_trans_cancel; + } + } + + /* * Entry must exist since we did a lookup in xfs_lock_dir_and_entry. */ XFS_BMAP_INIT(&free_list, &first_block); @@ -2233,39 +2247,64 @@ xfs_remove( &first_block, &free_list, resblks); if (error) { ASSERT(error != ENOENT); - REMOVE_DEBUG_TRACE(__LINE__); - goto error1; + goto out_bmap_cancel; } xfs_ichgtime(dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); + /* + * Bump the in memory generation count on the parent + * directory so that other can know that it has changed. + */ dp->i_gen++; xfs_trans_log_inode(tp, dp, XFS_ILOG_CORE); - error = xfs_droplink(tp, ip); - if (error) { - REMOVE_DEBUG_TRACE(__LINE__); - goto error1; + if (is_dir) { + /* + * Drop the link from ip's "..". + */ + error = xfs_droplink(tp, dp); + if (error) + goto out_bmap_cancel; + + /* + * Drop the link from dp to ip. + */ + error = xfs_droplink(tp, ip); + if (error) + goto out_bmap_cancel; + } else { + /* + * When removing a non-directory we need to log the parent + * inode here for the i_gen update. For a directory this is + * done implicitly by the xfs_droplink call for the ".." entry. + */ + xfs_trans_log_inode(tp, dp, XFS_ILOG_CORE); } - /* Determine if this is the last link while + /* + * Drop the "." link from ip to self. + */ + error = xfs_droplink(tp, ip); + if (error) + goto out_bmap_cancel; + + /* + * Determine if this is the last link while * we are in the transaction. */ - link_zero = (ip)->i_d.di_nlink==0; + link_zero = (ip->i_d.di_nlink == 0); /* * If this is a synchronous mount, make sure that the * remove transaction goes to disk before returning to * the user. */ - if (mp->m_flags & (XFS_MOUNT_WSYNC|XFS_MOUNT_DIRSYNC)) { + if (mp->m_flags & (XFS_MOUNT_WSYNC|XFS_MOUNT_DIRSYNC)) xfs_trans_set_sync(tp); - } error = xfs_bmap_finish(&tp, &free_list, &committed); - if (error) { - REMOVE_DEBUG_TRACE(__LINE__); - goto error_rele; - } + if (error) + goto out_bmap_cancel; error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); if (error) @@ -2277,39 +2316,27 @@ xfs_remove( * will get killed on last close in xfs_close() so we don't * have to worry about that. */ - if (link_zero && xfs_inode_is_filestream(ip)) + if (!is_dir && link_zero && xfs_inode_is_filestream(ip)) xfs_filestream_deassociate(ip); xfs_itrace_exit(ip); + xfs_itrace_exit(dp); -/* Fall through to std_return with error = 0 */ std_return: if (DM_EVENT_ENABLED(dp, DM_EVENT_POSTREMOVE)) { - (void) XFS_SEND_NAMESP(mp, DM_EVENT_POSTREMOVE, - dp, DM_RIGHT_NULL, - NULL, DM_RIGHT_NULL, - name->name, NULL, ip->i_d.di_mode, error, 0); + XFS_SEND_NAMESP(mp, DM_EVENT_POSTREMOVE, dp, DM_RIGHT_NULL, + NULL, DM_RIGHT_NULL, name->name, NULL, + ip->i_d.di_mode, error, 0); } + return error; - error1: + out_bmap_cancel: xfs_bmap_cancel(&free_list); cancel_flags |= XFS_TRANS_ABORT; + out_trans_cancel: xfs_trans_cancel(tp, cancel_flags); goto std_return; - - error_rele: - /* - * In this case make sure to not release the inode until after - * the current transaction is aborted. Releasing it beforehand - * can cause us to go to xfs_inactive and start a recursive - * transaction which can easily deadlock with the current one. - */ - xfs_bmap_cancel(&free_list); - cancel_flags |= XFS_TRANS_ABORT; - xfs_trans_cancel(tp, cancel_flags); - - goto std_return; } int @@ -2675,186 +2702,6 @@ std_return: } int -xfs_rmdir( - xfs_inode_t *dp, - struct xfs_name *name, - xfs_inode_t *cdp) -{ - xfs_mount_t *mp = dp->i_mount; - xfs_trans_t *tp; - int error; - xfs_bmap_free_t free_list; - xfs_fsblock_t first_block; - int cancel_flags; - int committed; - int last_cdp_link; - uint resblks; - - xfs_itrace_entry(dp); - - if (XFS_FORCED_SHUTDOWN(mp)) - return XFS_ERROR(EIO); - - if (DM_EVENT_ENABLED(dp, DM_EVENT_REMOVE)) { - error = XFS_SEND_NAMESP(mp, DM_EVENT_REMOVE, - dp, DM_RIGHT_NULL, - NULL, DM_RIGHT_NULL, name->name, - NULL, cdp->i_d.di_mode, 0, 0); - if (error) - return XFS_ERROR(error); - } - - /* - * Get the dquots for the inodes. - */ - error = XFS_QM_DQATTACH(mp, dp, 0); - if (!error) - error = XFS_QM_DQATTACH(mp, cdp, 0); - if (error) { - REMOVE_DEBUG_TRACE(__LINE__); - goto std_return; - } - - tp = xfs_trans_alloc(mp, XFS_TRANS_RMDIR); - cancel_flags = XFS_TRANS_RELEASE_LOG_RES; - /* - * We try to get the real space reservation first, - * allowing for directory btree deletion(s) implying - * possible bmap insert(s). If we can't get the space - * reservation then we use 0 instead, and avoid the bmap - * btree insert(s) in the directory code by, if the bmap - * insert tries to happen, instead trimming the LAST - * block from the directory. - */ - resblks = XFS_REMOVE_SPACE_RES(mp); - error = xfs_trans_reserve(tp, resblks, XFS_REMOVE_LOG_RES(mp), 0, - XFS_TRANS_PERM_LOG_RES, XFS_DEFAULT_LOG_COUNT); - if (error == ENOSPC) { - resblks = 0; - error = xfs_trans_reserve(tp, 0, XFS_REMOVE_LOG_RES(mp), 0, - XFS_TRANS_PERM_LOG_RES, XFS_DEFAULT_LOG_COUNT); - } - if (error) { - ASSERT(error != ENOSPC); - cancel_flags = 0; - goto error_return; - } - XFS_BMAP_INIT(&free_list, &first_block); - - /* - * Now lock the child directory inode and the parent directory - * inode in the proper order. This will take care of validating - * that the directory entry for the child directory inode has - * not changed while we were obtaining a log reservation. - */ - error = xfs_lock_dir_and_entry(dp, cdp); - if (error) { - xfs_trans_cancel(tp, cancel_flags); - goto std_return; - } - - IHOLD(dp); - xfs_trans_ijoin(tp, dp, XFS_ILOCK_EXCL); - - IHOLD(cdp); - xfs_trans_ijoin(tp, cdp, XFS_ILOCK_EXCL); - - ASSERT(cdp->i_d.di_nlink >= 2); - if (cdp->i_d.di_nlink != 2) { - error = XFS_ERROR(ENOTEMPTY); - goto error_return; - } - if (!xfs_dir_isempty(cdp)) { - error = XFS_ERROR(ENOTEMPTY); - goto error_return; - } - - error = xfs_dir_removename(tp, dp, name, cdp->i_ino, - &first_block, &free_list, resblks); - if (error) - goto error1; - - xfs_ichgtime(dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); - - /* - * Bump the in memory generation count on the parent - * directory so that other can know that it has changed. - */ - dp->i_gen++; - - /* - * Drop the link from cdp's "..". - */ - error = xfs_droplink(tp, dp); - if (error) { - goto error1; - } - - /* - * Drop the link from dp to cdp. - */ - error = xfs_droplink(tp, cdp); - if (error) { - goto error1; - } - - /* - * Drop the "." link from cdp to self. - */ - error = xfs_droplink(tp, cdp); - if (error) { - goto error1; - } - - /* Determine these before committing transaction */ - last_cdp_link = (cdp)->i_d.di_nlink==0; - - /* - * If this is a synchronous mount, make sure that the - * rmdir transaction goes to disk before returning to - * the user. - */ - if (mp->m_flags & (XFS_MOUNT_WSYNC|XFS_MOUNT_DIRSYNC)) { - xfs_trans_set_sync(tp); - } - - error = xfs_bmap_finish (&tp, &free_list, &committed); - if (error) { - xfs_bmap_cancel(&free_list); - xfs_trans_cancel(tp, (XFS_TRANS_RELEASE_LOG_RES | - XFS_TRANS_ABORT)); - goto std_return; - } - - error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); - if (error) { - goto std_return; - } - - - /* Fall through to std_return with error = 0 or the errno - * from xfs_trans_commit. */ - std_return: - if (DM_EVENT_ENABLED(dp, DM_EVENT_POSTREMOVE)) { - (void) XFS_SEND_NAMESP(mp, DM_EVENT_POSTREMOVE, - dp, DM_RIGHT_NULL, - NULL, DM_RIGHT_NULL, - name->name, NULL, cdp->i_d.di_mode, - error, 0); - } - return error; - - error1: - xfs_bmap_cancel(&free_list); - cancel_flags |= XFS_TRANS_ABORT; - /* FALLTHROUGH */ - - error_return: - xfs_trans_cancel(tp, cancel_flags); - goto std_return; -} - -int xfs_symlink( xfs_inode_t *dp, struct xfs_name *link_name, Index: linux-2.6-xfs/fs/xfs/linux-2.6/xfs_iops.c =================================================================== --- linux-2.6-xfs.orig/fs/xfs/linux-2.6/xfs_iops.c 2008-05-02 00:09:32.000000000 +0200 +++ linux-2.6-xfs/fs/xfs/linux-2.6/xfs_iops.c 2008-05-02 08:30:24.000000000 +0200 @@ -252,8 +252,7 @@ STATIC void xfs_cleanup_inode( struct inode *dir, struct inode *inode, - struct dentry *dentry, - int mode) + struct dentry *dentry) { struct xfs_name teardown; @@ -264,10 +263,7 @@ xfs_cleanup_inode( */ xfs_dentry_to_name(&teardown, dentry); - if (S_ISDIR(mode)) - xfs_rmdir(XFS_I(dir), &teardown, XFS_I(inode)); - else - xfs_remove(XFS_I(dir), &teardown, XFS_I(inode)); + xfs_remove(XFS_I(dir), &teardown, XFS_I(inode)); iput(inode); } @@ -349,7 +345,7 @@ xfs_vn_mknod( return -error; out_cleanup_inode: - xfs_cleanup_inode(dir, inode, dentry, mode); + xfs_cleanup_inode(dir, inode, dentry); out_free_acl: if (default_acl) _ACL_FREE(default_acl); @@ -478,31 +474,12 @@ xfs_vn_symlink( return 0; out_cleanup_inode: - xfs_cleanup_inode(dir, inode, dentry, 0); + xfs_cleanup_inode(dir, inode, dentry); out: return -error; } STATIC int -xfs_vn_rmdir( - struct inode *dir, - struct dentry *dentry) -{ - struct inode *inode = dentry->d_inode; - struct xfs_name name; - int error; - - xfs_dentry_to_name(&name, dentry); - - error = xfs_rmdir(XFS_I(dir), &name, XFS_I(inode)); - if (likely(!error)) { - xfs_validate_fields(inode); - xfs_validate_fields(dir); - } - return -error; -} - -STATIC int xfs_vn_rename( struct inode *odir, struct dentry *odentry, @@ -796,7 +773,13 @@ static const struct inode_operations xfs .unlink = xfs_vn_unlink, .symlink = xfs_vn_symlink, .mkdir = xfs_vn_mkdir, - .rmdir = xfs_vn_rmdir, + /* + * Yes, XFS uses the same method for rmdir and unlink. + * + * There are some subtile differences deeper in the code, + * but we use S_ISDIR to check for those. + */ + .rmdir = xfs_vn_unlink, .mknod = xfs_vn_mknod, .rename = xfs_vn_rename, .permission = xfs_vn_permission, Index: linux-2.6-xfs/fs/xfs/xfs_vnodeops.h =================================================================== --- linux-2.6-xfs.orig/fs/xfs/xfs_vnodeops.h 2008-04-26 20:05:39.000000000 +0200 +++ linux-2.6-xfs/fs/xfs/xfs_vnodeops.h 2008-05-02 08:30:24.000000000 +0200 @@ -32,8 +32,6 @@ int xfs_link(struct xfs_inode *tdp, stru struct xfs_name *target_name); int xfs_mkdir(struct xfs_inode *dp, struct xfs_name *dir_name, mode_t mode, struct xfs_inode **ipp, struct cred *credp); -int xfs_rmdir(struct xfs_inode *dp, struct xfs_name *name, - struct xfs_inode *cdp); int xfs_readdir(struct xfs_inode *dp, void *dirent, size_t bufsize, xfs_off_t *offset, filldir_t filldir); int xfs_symlink(struct xfs_inode *dp, struct xfs_name *link_name, From owner-xfs@oss.sgi.com Fri May 2 03:57:28 2008 Received: with ECARTIS (v1.0.0; list xfs); Fri, 02 May 2008 03:57:47 -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.2 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-r574664 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id m42AvQe1032735 for ; Fri, 2 May 2008 03:57:28 -0700 X-ASG-Debug-ID: 1209725890-0949014e0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from verein.lst.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 2C85C161FEF1 for ; Fri, 2 May 2008 03:58:10 -0700 (PDT) Received: from verein.lst.de (verein.lst.de [213.95.11.210]) by cuda.sgi.com with ESMTP id a7ZjbjVZeklCLCjG for ; Fri, 02 May 2008 03:58:10 -0700 (PDT) Received: from verein.lst.de (localhost [127.0.0.1]) by verein.lst.de (8.12.3/8.12.3/Debian-7.1) with ESMTP id m42Aw3F3018359 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO) for ; Fri, 2 May 2008 12:58:03 +0200 Received: (from hch@localhost) by verein.lst.de (8.12.3/8.12.3/Debian-6.6) id m42Aw3BW018357 for xfs@oss.sgi.com; Fri, 2 May 2008 12:58:03 +0200 Date: Fri, 2 May 2008 12:58:03 +0200 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 2/2] kill xfs_lock_dir_and_entry Subject: [PATCH 2/2] kill xfs_lock_dir_and_entry Message-ID: <20080502105803.GC17870@lst.de> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.3.28i X-Scanned-By: MIMEDefang 2.39 X-Barracuda-Connect: verein.lst.de[213.95.11.210] X-Barracuda-Start-Time: 1209725891 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: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.1, rules version 3.1.49448 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV 0.91.2/6021/Wed Feb 27 15:55:48 2008 on oss.sgi.com X-Virus-Status: Clean X-archive-position: 15759 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: hch@lst.de Precedence: bulk X-list: xfs When multiple inodes are locked in XFS it happens in order of the inode number, with the everything but the first inode trylocked if any of the previous inodes is in the AIL. Except for the sorting of the inodes this logic is implemented in xfs_lock_inodes, but also partially duplicated in xfs_lock_dir_and_entry in a particularly stupid way adds a lock roundtrip if the inode ordering is not optimal. This patch adds a new helper xfs_lock_two_inodes that takes two inodes and locks them in the most optimal way according to the above locking protocol and uses it for all places that want to lock two inodes. The only caller of xfs_lock_inodes is xfs_rename which might lock up to four inodes. Signed-off-by: Christoph Hellwig Index: linux-2.6-xfs/fs/xfs/xfs_vnodeops.c =================================================================== --- linux-2.6-xfs.orig/fs/xfs/xfs_vnodeops.c 2008-05-02 08:30:24.000000000 +0200 +++ linux-2.6-xfs/fs/xfs/xfs_vnodeops.c 2008-05-02 08:30:30.000000000 +0200 @@ -1897,111 +1897,6 @@ std_return: } #ifdef DEBUG -/* - * Some counters to see if (and how often) we are hitting some deadlock - * prevention code paths. - */ - -int xfs_rm_locks; -int xfs_rm_lock_delays; -int xfs_rm_attempts; -#endif - -/* - * The following routine will lock the inodes associated with the - * directory and the named entry in the directory. The locks are - * acquired in increasing inode number. - * - * If the entry is "..", then only the directory is locked. The - * vnode ref count will still include that from the .. entry in - * this case. - * - * There is a deadlock we need to worry about. If the locked directory is - * in the AIL, it might be blocking up the log. The next inode we lock - * could be already locked by another thread waiting for log space (e.g - * a permanent log reservation with a long running transaction (see - * xfs_itruncate_finish)). To solve this, we must check if the directory - * is in the ail and use lock_nowait. If we can't lock, we need to - * drop the inode lock on the directory and try again. xfs_iunlock will - * potentially push the tail if we were holding up the log. - */ -STATIC int -xfs_lock_dir_and_entry( - xfs_inode_t *dp, - xfs_inode_t *ip) /* inode of entry 'name' */ -{ - int attempts; - xfs_ino_t e_inum; - xfs_inode_t *ips[2]; - xfs_log_item_t *lp; - -#ifdef DEBUG - xfs_rm_locks++; -#endif - attempts = 0; - -again: - xfs_ilock(dp, XFS_ILOCK_EXCL | XFS_ILOCK_PARENT); - - e_inum = ip->i_ino; - - xfs_itrace_ref(ip); - - /* - * We want to lock in increasing inum. Since we've already - * acquired the lock on the directory, we may need to release - * if if the inum of the entry turns out to be less. - */ - if (e_inum > dp->i_ino) { - /* - * We are already in the right order, so just - * lock on the inode of the entry. - * We need to use nowait if dp is in the AIL. - */ - - lp = (xfs_log_item_t *)dp->i_itemp; - if (lp && (lp->li_flags & XFS_LI_IN_AIL)) { - if (!xfs_ilock_nowait(ip, XFS_ILOCK_EXCL)) { - attempts++; -#ifdef DEBUG - xfs_rm_attempts++; -#endif - - /* - * Unlock dp and try again. - * xfs_iunlock will try to push the tail - * if the inode is in the AIL. - */ - - xfs_iunlock(dp, XFS_ILOCK_EXCL); - - if ((attempts % 5) == 0) { - delay(1); /* Don't just spin the CPU */ -#ifdef DEBUG - xfs_rm_lock_delays++; -#endif - } - goto again; - } - } else { - xfs_ilock(ip, XFS_ILOCK_EXCL); - } - } else if (e_inum < dp->i_ino) { - xfs_iunlock(dp, XFS_ILOCK_EXCL); - - ips[0] = ip; - ips[1] = dp; - xfs_lock_inodes(ips, 2, XFS_ILOCK_EXCL); - } - /* else e_inum == dp->i_ino */ - /* This can happen if we're asked to lock /x/.. - * the entry is "..", which is also the parent directory. - */ - - return 0; -} - -#ifdef DEBUG int xfs_locked_n; int xfs_small_retries; int xfs_middle_retries; @@ -2135,6 +2030,45 @@ again: #endif } +void +xfs_lock_two_inodes( + xfs_inode_t *ip0, + xfs_inode_t *ip1, + uint lock_mode) +{ + xfs_inode_t *temp; + int attempts = 0; + xfs_log_item_t *lp; + + ASSERT(ip0->i_ino != ip1->i_ino); + + if (ip0->i_ino > ip1->i_ino) { + temp = ip0; + ip0 = ip1; + ip1 = temp; + } + + again: + xfs_ilock(ip0, xfs_lock_inumorder(lock_mode, 0)); + + /* + * If the first lock we have locked is in the AIL, we must TRY to get + * the second lock. If we can't get it, we must release the first one + * and try again. + */ + lp = (xfs_log_item_t *)ip0->i_itemp; + if (lp && (lp->li_flags & XFS_LI_IN_AIL)) { + if (!xfs_ilock_nowait(ip1, xfs_lock_inumorder(lock_mode, 1))) { + xfs_iunlock(ip0, lock_mode); + if ((++attempts % 5) == 0) + delay(1); /* Don't just spin the CPU */ + goto again; + } + } else { + xfs_ilock(ip1, xfs_lock_inumorder(lock_mode, 1)); + } +} + int xfs_remove( xfs_inode_t *dp, @@ -2210,9 +2144,7 @@ xfs_remove( goto out_trans_cancel; } - error = xfs_lock_dir_and_entry(dp, ip); - if (error) - goto out_trans_cancel; + xfs_lock_two_inodes(dp, ip, XFS_ILOCK_EXCL); /* * At this point, we've gotten both the directory and the entry @@ -2239,9 +2171,6 @@ xfs_remove( } } - /* - * Entry must exist since we did a lookup in xfs_lock_dir_and_entry. - */ XFS_BMAP_INIT(&free_list, &first_block); error = xfs_dir_removename(tp, dp, name, ip->i_ino, &first_block, &free_list, resblks); @@ -2347,7 +2276,6 @@ xfs_link( { xfs_mount_t *mp = tdp->i_mount; xfs_trans_t *tp; - xfs_inode_t *ips[2]; int error; xfs_bmap_free_t free_list; xfs_fsblock_t first_block; @@ -2395,15 +2323,7 @@ xfs_link( goto error_return; } - if (sip->i_ino < tdp->i_ino) { - ips[0] = sip; - ips[1] = tdp; - } else { - ips[0] = tdp; - ips[1] = sip; - } - - xfs_lock_inodes(ips, 2, XFS_ILOCK_EXCL); + xfs_lock_two_inodes(sip, tdp, XFS_ILOCK_EXCL); /* * Increment vnode ref counts since xfs_trans_commit & Index: linux-2.6-xfs/fs/xfs/xfs_dfrag.c =================================================================== --- linux-2.6-xfs.orig/fs/xfs/xfs_dfrag.c 2008-04-26 17:43:14.000000000 +0200 +++ linux-2.6-xfs/fs/xfs/xfs_dfrag.c 2008-05-02 08:30:30.000000000 +0200 @@ -128,7 +128,6 @@ xfs_swap_extents( xfs_swapext_t *sxp) { xfs_mount_t *mp; - xfs_inode_t *ips[2]; xfs_trans_t *tp; xfs_bstat_t *sbp = &sxp->sx_stat; bhv_vnode_t *vp, *tvp; @@ -153,16 +152,7 @@ xfs_swap_extents( vp = XFS_ITOV(ip); tvp = XFS_ITOV(tip); - /* Lock in i_ino order */ - if (ip->i_ino < tip->i_ino) { - ips[0] = ip; - ips[1] = tip; - } else { - ips[0] = tip; - ips[1] = ip; - } - - xfs_lock_inodes(ips, 2, lock_flags); + xfs_lock_two_inodes(ip, tip, lock_flags); locked = 1; /* Verify that both files have the same format */ @@ -265,7 +255,7 @@ xfs_swap_extents( locked = 0; goto error0; } - xfs_lock_inodes(ips, 2, XFS_ILOCK_EXCL); + xfs_lock_two_inodes(ip, tip, XFS_ILOCK_EXCL); /* * Count the number of extended attribute blocks Index: linux-2.6-xfs/fs/xfs/xfs_inode.h =================================================================== --- linux-2.6-xfs.orig/fs/xfs/xfs_inode.h 2008-05-01 22:56:57.000000000 +0200 +++ linux-2.6-xfs/fs/xfs/xfs_inode.h 2008-05-02 08:30:30.000000000 +0200 @@ -522,6 +522,7 @@ void xfs_iflush_all(struct xfs_mount *) void xfs_ichgtime(xfs_inode_t *, int); xfs_fsize_t xfs_file_last_byte(xfs_inode_t *); void xfs_lock_inodes(xfs_inode_t **, int, uint); +void xfs_lock_two_inodes(xfs_inode_t *, xfs_inode_t *, uint); void xfs_synchronize_atime(xfs_inode_t *); void xfs_mark_inode_dirty_sync(xfs_inode_t *); From owner-xfs@oss.sgi.com Fri May 2 04:14:47 2008 Received: with ECARTIS (v1.0.0; list xfs); Fri, 02 May 2008 04:15:09 -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=AWL,BAYES_00 autolearn=ham version=3.3.0-r574664 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id m42BEgG5002210 for ; Fri, 2 May 2008 04:14:46 -0700 X-ASG-Debug-ID: 1209726926-038b01ed0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp-out04.alice-dsl.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 04FE61621A98 for ; Fri, 2 May 2008 04:15:26 -0700 (PDT) Received: from smtp-out04.alice-dsl.net (smtp-out04.alice-dsl.net [88.44.63.6]) by cuda.sgi.com with ESMTP id P273j1LDZLbEZJkt for ; Fri, 02 May 2008 04:15:26 -0700 (PDT) Received: from out.alice-dsl.de ([192.168.125.60]) by smtp-out04.alice-dsl.net with Microsoft SMTPSVC(6.0.3790.1830); Fri, 2 May 2008 13:08:30 +0200 Received: from basil.firstfloor.org ([78.53.156.253]) by out.alice-dsl.de with Microsoft SMTPSVC(6.0.3790.1830); Fri, 2 May 2008 13:07:08 +0200 Received: by basil.firstfloor.org (Postfix, from userid 1000) id E18BA1B415B; Fri, 2 May 2008 13:14:02 +0200 (CEST) To: Emmanuel Florac Cc: "Nandedkar, Rishiraj" , X-ASG-Orig-Subj: Re: query Subject: Re: query From: Andi Kleen References: <87604E51C77C4F4988CF1C7F088D562D9BE614@in02ex01.int.cgg.com> <20080502123541.2216848e@harpe.intellique.com> Date: Fri, 02 May 2008 13:14:02 +0200 In-Reply-To: <20080502123541.2216848e@harpe.intellique.com> (Emmanuel Florac's message of "Fri, 2 May 2008 12:35:41 +0200") Message-ID: <87fxt1ez5x.fsf@basil.nowhere.org> User-Agent: Gnus/5.1008 (Gnus v5.10.8) Emacs/21.3 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-OriginalArrivalTime: 02 May 2008 11:07:08.0657 (UTC) FILETIME=[A9CC9610:01C8AC44] X-Barracuda-Connect: smtp-out04.alice-dsl.net[88.44.63.6] X-Barracuda-Start-Time: 1209726927 X-Barracuda-Bayes: INNOCENT GLOBAL 0.2408 1.0000 -0.6200 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -0.62 X-Barracuda-Spam-Status: No, SCORE=-0.62 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.1, rules version 3.1.49448 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV 0.91.2/6021/Wed Feb 27 15:55:48 2008 on oss.sgi.com X-Virus-Status: Clean X-archive-position: 15760 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: andi@firstfloor.org Precedence: bulk X-list: xfs Emmanuel Florac writes: > > Most distributions (except RedHat Enterprise and SuSE Enterprise) may OT, but actually that's not correct. You can download SLES for free. -Andi From owner-xfs@oss.sgi.com Fri May 2 05:04:30 2008 Received: with ECARTIS (v1.0.0; list xfs); Fri, 02 May 2008 05:04:48 -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=AWL,BAYES_00 autolearn=ham version=3.3.0-r574664 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id m42C4Rxn009837 for ; Fri, 2 May 2008 05:04:30 -0700 X-ASG-Debug-ID: 1209729911-095202780000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp8-g19.free.fr (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id C93D71622700 for ; Fri, 2 May 2008 05:05:11 -0700 (PDT) Received: from smtp8-g19.free.fr (smtp8-g19.free.fr [212.27.42.65]) by cuda.sgi.com with ESMTP id vQXS9zAK1HJWPqBG for ; Fri, 02 May 2008 05:05:11 -0700 (PDT) Received: from smtp8-g19.free.fr (localhost [127.0.0.1]) by smtp8-g19.free.fr (Postfix) with ESMTP id C3D8A17F507; Fri, 2 May 2008 14:05:10 +0200 (CEST) Received: from harpe.intellique.com (labo.djinux.com [82.225.196.72]) by smtp8-g19.free.fr (Postfix) with ESMTP id 9B34917F53A; Fri, 2 May 2008 14:05:10 +0200 (CEST) Date: Fri, 2 May 2008 14:05:09 +0200 From: Emmanuel Florac To: "Nandedkar, Rishiraj" Cc: X-ASG-Orig-Subj: Re: query Subject: Re: query Message-ID: <20080502140509.62dadf26@harpe.intellique.com> In-Reply-To: <87604E51C77C4F4988CF1C7F088D562D38BE0A@in02ex01.int.cgg.com> References: <87604E51C77C4F4988CF1C7F088D562D38BE0A@in02ex01.int.cgg.com> Organization: Intellique X-Mailer: Claws Mail 3.0.2 (GTK+ 2.12.9; i686-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 X-Barracuda-Connect: smtp8-g19.free.fr[212.27.42.65] X-Barracuda-Start-Time: 1209729911 X-Barracuda-Bayes: INNOCENT GLOBAL 0.1203 1.0000 -1.2725 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.27 X-Barracuda-Spam-Status: No, SCORE=-1.27 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.1, rules version 3.1.49452 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV 0.91.2/6021/Wed Feb 27 15:55:48 2008 on oss.sgi.com X-Virus-Status: Clean Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by oss.sgi.com id m42C4Uxn009842 X-archive-position: 15761 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: eflorac@intellique.com Precedence: bulk X-list: xfs Le Fri, 2 May 2008 16:12:58 +0530 "Nandedkar, Rishiraj" écrivait: > Thank you for update but Linux 7.3 means red hat 7 update 3 red hat 3 > update 5.In our system we are unable to detect disk which is having > file system in XFS format. Our system is not able to support it. > 2.4.21-32.EL is kenal version on our systems. Please let me know > which version should I use in redhat.I am trying this with fedora > core 3 RedHat 7.3 ( or even 8.0 and 9.0 for that matter) are really very old and outdated. You'd be much better for pretty much everything with something more up-to-date. Back then RedHat 7.x needed a special additional CD provided by SGI for XFS support IIRC. I'm pretty surprised that RHEL 3 doesn't support XFS though. Anyway, RHEL 4 and 5 do without any doubt (I use XFS on them). -- ---------------------------------------- Emmanuel Florac | Intellique ---------------------------------------- From owner-xfs@oss.sgi.com Fri May 2 05:24:14 2008 Received: with ECARTIS (v1.0.0; list xfs); Fri, 02 May 2008 05:24:34 -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=AWL,BAYES_00 autolearn=ham version=3.3.0-r574664 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id m42CODNB011222 for ; Fri, 2 May 2008 05:24:14 -0700 X-ASG-Debug-ID: 1209731096-096d02b20000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp8-g19.free.fr (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 908CE162202F for ; Fri, 2 May 2008 05:24:56 -0700 (PDT) Received: from smtp8-g19.free.fr (smtp8-g19.free.fr [212.27.42.65]) by cuda.sgi.com with ESMTP id dAK8EQh9ApFalQ62 for ; Fri, 02 May 2008 05:24:56 -0700 (PDT) Received: from smtp8-g19.free.fr (localhost [127.0.0.1]) by smtp8-g19.free.fr (Postfix) with ESMTP id 8433417F570; Fri, 2 May 2008 14:24:56 +0200 (CEST) Received: from harpe.intellique.com (labo.djinux.com [82.225.196.72]) by smtp8-g19.free.fr (Postfix) with ESMTP id 479C017F55F; Fri, 2 May 2008 14:24:56 +0200 (CEST) Date: Fri, 2 May 2008 14:25:00 +0200 From: Emmanuel Florac To: "Nandedkar, Rishiraj" Cc: X-ASG-Orig-Subj: Re: query Subject: Re: query Message-ID: <20080502142500.049e14b0@harpe.intellique.com> In-Reply-To: <87604E51C77C4F4988CF1C7F088D562D38BE0A@in02ex01.int.cgg.com> References: <87604E51C77C4F4988CF1C7F088D562D38BE0A@in02ex01.int.cgg.com> Organization: Intellique X-Mailer: Claws Mail 3.0.2 (GTK+ 2.12.9; i686-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 X-Barracuda-Connect: smtp8-g19.free.fr[212.27.42.65] X-Barracuda-Start-Time: 1209731097 X-Barracuda-Bayes: INNOCENT GLOBAL 0.4539 1.0000 0.0000 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.1, rules version 3.1.49454 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV 0.91.2/6021/Wed Feb 27 15:55:48 2008 on oss.sgi.com X-Virus-Status: Clean Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by oss.sgi.com id m42COENB011232 X-archive-position: 15762 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: eflorac@intellique.com Precedence: bulk X-list: xfs Le Fri, 2 May 2008 16:12:58 +0530 "Nandedkar, Rishiraj" écrivait: > In our system we are unable to detect disk which is having file > system in XFS format. Our system is not able to support it. Just to get sure, how did you try to mount the XFS disks? Is there a software RAID, LVM or other additional layer that may prevent an older system to mount a volume made on a newer one? -- ---------------------------------------- Emmanuel Florac | Intellique ---------------------------------------- From owner-xfs@oss.sgi.com Fri May 2 05:37:35 2008 Received: with ECARTIS (v1.0.0; list xfs); Fri, 02 May 2008 05:37:54 -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=-1.2 required=5.0 tests=AWL,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 m42CbXLD012210 for ; Fri, 2 May 2008 05:37:35 -0700 X-ASG-Debug-ID: 1209731896-1259039f0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from outbound4-sin-R.bigfish.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 2E78EADE85B for ; Fri, 2 May 2008 05:38:17 -0700 (PDT) Received: from outbound4-sin-R.bigfish.com (outbound-sin.frontbridge.com [207.46.51.80]) by cuda.sgi.com with ESMTP id fkAT4FM3OtlYo01z for ; Fri, 02 May 2008 05:38:17 -0700 (PDT) Received: from outbound4-sin.bigfish.com (localhost.localdomain [127.0.0.1]) by outbound4-sin-R.bigfish.com (Postfix) with ESMTP id A5158157886D; Fri, 2 May 2008 12:28:03 +0000 (UTC) Received: from mail13-sin-R.bigfish.com (unknown [10.3.40.3]) by outbound4-sin.bigfish.com (Postfix) with ESMTP id 7CBFD460053; Fri, 2 May 2008 12:28:03 +0000 (UTC) Received: from mail13-sin (localhost.localdomain [127.0.0.1]) by mail13-sin-R.bigfish.com (Postfix) with ESMTP id 3021818B82E1; Fri, 2 May 2008 12:28:03 +0000 (UTC) X-BigFish: V X-MS-Exchange-Organization-Antispam-Report: OrigIP: 72.20.130.72;Service: EHS Received: by mail13-sin (MessageSwitch) id 1209731283185351_9923; Fri, 2 May 2008 12:28:03 +0000 (UCT) Received: from mailus1.cgg.com (72-20-130-72.cgg.com [72.20.130.72]) by mail13-sin.bigfish.com (Postfix) with ESMTP id 9E6521B30053; Fri, 2 May 2008 12:28:02 +0000 (UTC) Received: from in02ex01.int.cgg.com (in02ex01.int.cgg.com [192.168.53.201]) by mailus1.cgg.com (MailerCGG) with ESMTP id BA4AE1D4001; Fri, 2 May 2008 07:27:55 -0500 (CDT) MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" X-ASG-Orig-Subj: RE: query Subject: RE: query content-class: urn:content-classes:message X-MimeOLE: Produced By Microsoft Exchange V6.0.6603.0 Date: Fri, 2 May 2008 17:57:58 +0530 Message-ID: <87604E51C77C4F4988CF1C7F088D562D9BE618@in02ex01.int.cgg.com> X-MS-Has-Attach: X-MS-TNEF-Correlator: Thread-Topic: query Thread-Index: AcisTWczgDKUogmnTeC7IXg9CbZBXgAAoRtw From: "Nandedkar, Rishiraj" To: "Emmanuel Florac" Cc: X-Barracuda-Connect: outbound-sin.frontbridge.com[207.46.51.80] X-Barracuda-Start-Time: 1209731898 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0017 1.0000 -2.0097 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.01 X-Barracuda-Spam-Status: No, SCORE=-2.01 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.1, rules version 3.1.49455 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV 0.91.2/6021/Wed Feb 27 15:55:48 2008 on oss.sgi.com X-Virus-Status: Clean Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by oss.sgi.com id m42CbZLD012214 X-archive-position: 15763 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: Rishiraj.Nandedkar@cggveritas.com Precedence: bulk X-list: xfs Thank you very much -----Original Message----- From: Emmanuel Florac [mailto:eflorac@intellique.com] Sent: Friday, May 02, 2008 5:35 PM To: Nandedkar, Rishiraj Cc: xfs@oss.sgi.com Subject: Re: query Le Fri, 2 May 2008 16:12:58 +0530 "Nandedkar, Rishiraj" écrivait: > Thank you for update but Linux 7.3 means red hat 7 update 3 red hat 3 > update 5.In our system we are unable to detect disk which is having > file system in XFS format. Our system is not able to support it. > 2.4.21-32.EL is kenal version on our systems. Please let me know > which version should I use in redhat.I am trying this with fedora > core 3 RedHat 7.3 ( or even 8.0 and 9.0 for that matter) are really very old and outdated. You'd be much better for pretty much everything with something more up-to-date. Back then RedHat 7.x needed a special additional CD provided by SGI for XFS support IIRC. I'm pretty surprised that RHEL 3 doesn't support XFS though. Anyway, RHEL 4 and 5 do without any doubt (I use XFS on them). -- ---------------------------------------- Emmanuel Florac | Intellique ---------------------------------------- From owner-xfs@oss.sgi.com Fri May 2 05:51:06 2008 Received: with ECARTIS (v1.0.0; list xfs); Fri, 02 May 2008 05:51: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 (cuda2.sgi.com [192.48.168.29]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id m42Cp51v013295 for ; Fri, 2 May 2008 05:51:06 -0700 X-ASG-Debug-ID: 1209732707-3780039f0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from proxy2.bredband.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 714E4119CF0 for ; Fri, 2 May 2008 05:51:48 -0700 (PDT) Received: from proxy2.bredband.net (proxy2.bredband.net [195.54.101.72]) by cuda.sgi.com with ESMTP id jbHx7kdeep6mXwed for ; Fri, 02 May 2008 05:51:48 -0700 (PDT) Received: from ironport2.bredband.com (195.54.101.122) by proxy2.bredband.net (7.3.127) id 4811833300270805 for xfs@oss.sgi.com; Fri, 2 May 2008 14:51:47 +0200 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Ar86ABKrGkjVctjQPGdsb2JhbACBU5AGAQEBAS0BmX4 Received: from c-d0d872d5.06-15-73746f44.cust.bredbandsbolaget.se (HELO DeepSpaceNine.stesmi.com) ([213.114.216.208]) by ironport2.bredband.com with ESMTP; 02 May 2008 14:51:47 +0200 Received: from [127.0.0.1] (voyager.stesmi.com [192.168.1.11]) by DeepSpaceNine.stesmi.com (8.12.11/8.12.11) with ESMTP id m42Cpas6023704; Fri, 2 May 2008 14:51:46 +0200 Message-ID: <481B0E57.5030100@stesmi.com> Date: Fri, 02 May 2008 14:51:35 +0200 From: Stefan Smietanowski User-Agent: Thunderbird 2.0.0.12 (Windows/20080213) MIME-Version: 1.0 To: "Nandedkar, Rishiraj" CC: Emmanuel Florac , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: query Subject: Re: query References: <87604E51C77C4F4988CF1C7F088D562D9BE618@in02ex01.int.cgg.com> In-Reply-To: <87604E51C77C4F4988CF1C7F088D562D9BE618@in02ex01.int.cgg.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 8bit X-AntiVirus: checked by Vexira Milter 1.0.7; VAE 6.29.0.5; VDF 6.29.0.100 X-Barracuda-Connect: proxy2.bredband.net[195.54.101.72] X-Barracuda-Start-Time: 1209732708 X-Barracuda-Bayes: INNOCENT GLOBAL 0.2759 1.0000 -0.4542 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -0.45 X-Barracuda-Spam-Status: No, SCORE=-0.45 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.1, rules version 3.1.49456 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV 0.91.2/6021/Wed Feb 27 15:55:48 2008 on oss.sgi.com X-Virus-Status: Clean X-archive-position: 15764 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: stesmi@stesmi.com Precedence: bulk X-list: xfs Nandedkar, Rishiraj wrote: > Thank you very much > > > > -----Original Message----- > From: Emmanuel Florac [mailto:eflorac@intellique.com] > Sent: Friday, May 02, 2008 5:35 PM > To: Nandedkar, Rishiraj > Cc: xfs@oss.sgi.com > Subject: Re: query > > Le Fri, 2 May 2008 16:12:58 +0530 > "Nandedkar, Rishiraj" écrivait: > >> Thank you for update but Linux 7.3 means red hat 7 update 3 red hat 3 >> update 5.In our system we are unable to detect disk which is having >> file system in XFS format. Our system is not able to support it. >> 2.4.21-32.EL is kenal version on our systems. Please let me know >> which version should I use in redhat.I am trying this with fedora >> core 3 > > RedHat 7.3 ( or even 8.0 and 9.0 for that matter) are really very old > and outdated. You'd be much better for pretty much everything with > something more up-to-date. Back then RedHat 7.x needed a special > additional CD provided by SGI for XFS support IIRC. > I'm pretty surprised that RHEL 3 doesn't support XFS though. Anyway, > RHEL 4 and 5 do without any doubt (I use XFS on them). > Another point could be that if you're used to and like RedHat Linux 7.3 and/or RedHat Enterprise Linux then I think looking at either the newer RedHat Enterprise Linue (RHEL) 4 or 5 or Fedora is the way to go. To use XFS in Fedora (http://www.fedoraproject.org) you need to add the word "xfs" to the installer commandline and also make sure you use a seperate, small (100MB is enough) partition that's called /boot that's using ext3 (others work but I recommend using ext3 simply for that partition). // Stefan From owner-xfs@oss.sgi.com Fri May 2 06:02:37 2008 Received: with ECARTIS (v1.0.0; list xfs); Fri, 02 May 2008 06:02:56 -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.1 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-r574664 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.168.29]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id m42D2Y9Z014456 for ; Fri, 2 May 2008 06:02:37 -0700 X-ASG-Debug-ID: 1209733397-147800160000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from sandeen.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 6B63C11A8C3 for ; Fri, 2 May 2008 06:03:17 -0700 (PDT) Received: from sandeen.net (sandeen.net [209.173.210.139]) by cuda.sgi.com with ESMTP id KRw9nQZVPIGipaHn for ; Fri, 02 May 2008 06:03:17 -0700 (PDT) Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTP id 6752A18004491; Fri, 2 May 2008 08:03:15 -0500 (CDT) Message-ID: <481B1113.7040509@sandeen.net> Date: Fri, 02 May 2008 08:03:15 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.14 (Macintosh/20080421) MIME-Version: 1.0 To: Stefan Smietanowski CC: "Nandedkar, Rishiraj" , Emmanuel Florac , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: query Subject: Re: query References: <87604E51C77C4F4988CF1C7F088D562D9BE618@in02ex01.int.cgg.com> <481B0E57.5030100@stesmi.com> In-Reply-To: <481B0E57.5030100@stesmi.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[209.173.210.139] X-Barracuda-Start-Time: 1209733399 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0013 1.0000 -2.0123 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.01 X-Barracuda-Spam-Status: No, SCORE=-2.01 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.1, rules version 3.1.49456 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV 0.91.2/6021/Wed Feb 27 15:55:48 2008 on oss.sgi.com X-Virus-Status: Clean X-archive-position: 15765 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: sandeen@sandeen.net Precedence: bulk X-list: xfs Stefan Smietanowski wrote: > To use XFS in Fedora (http://www.fedoraproject.org) you need to add the > word "xfs" to the installer commandline Only for F7 and earlier. F8 and beyond give you an xfs option on the partitioning screen by default. -Eric > > From owner-xfs@oss.sgi.com Fri May 2 13:55:03 2008 Received: with ECARTIS (v1.0.0; list xfs); Fri, 02 May 2008 13:55:22 -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.7 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-r574664 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.168.29]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id m42Kt2pH021009 for ; Fri, 2 May 2008 13:55:03 -0700 X-ASG-Debug-ID: 1209761747-146800470000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx1.redhat.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 00FB411C703 for ; Fri, 2 May 2008 13:55:47 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by cuda.sgi.com with ESMTP id AWKHM2OElKxPeOsQ for ; Fri, 02 May 2008 13:55:47 -0700 (PDT) X-ASG-Whitelist: Barracuda Reputation Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id m42KtkLd003927 for ; Fri, 2 May 2008 16:55:46 -0400 Received: from file.rdu.redhat.com (file.rdu.redhat.com [10.11.255.147]) by int-mx1.corp.redhat.com (8.13.1/8.13.1) with ESMTP id m42Ktkse028851 for ; Fri, 2 May 2008 16:55:46 -0400 Received: from neon.msp.redhat.com (neon.msp.redhat.com [10.15.80.10]) by file.rdu.redhat.com (8.13.1/8.13.1) with ESMTP id m42KtjSp022225 for ; Fri, 2 May 2008 16:55:45 -0400 Message-ID: <481B7FD1.3030107@sandeen.net> Date: Fri, 02 May 2008 15:55:45 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.12 (X11/20080226) MIME-Version: 1.0 To: xfs-oss X-ASG-Orig-Subj: Re: [PATCH] fix dir2 shortform structures on ARM old ABI Subject: Re: [PATCH] fix dir2 shortform structures on ARM old ABI References: <47DB4181.7040603@sandeen.net> <480E89B5.8070006@sandeen.net> In-Reply-To: <480E89B5.8070006@sandeen.net> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.58 on 172.16.52.254 X-Barracuda-Connect: mx1.redhat.com[66.187.233.31] X-Barracuda-Start-Time: 1209761748 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV 0.91.2/6021/Wed Feb 27 15:55:48 2008 on oss.sgi.com X-Virus-Status: Clean X-archive-position: 15766 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: sandeen@sandeen.net Precedence: bulk X-list: xfs Eric Sandeen wrote: > Eric Sandeen wrote: >> This should fix the longstanding issues with xfs and old ABI >> arm boxes, which lead to various asserts and xfs shutdowns, >> and for which an (incorrect) patch has been floating around >> for years. (Said patch made ARM internally consistent, but >> altered the normal xfs on-disk format such that it looked >> corrupted on other architectures): >> http://lists.arm.linux.org.uk/lurker/message/20040311.002034.5ecf21a2.html > > ping again... ping #3... > There is still the cache flushing issue, I guess, but I think the > on-disk alignment is still worth fixing. > > Oh, I'm sorry Jeff - I meant "fixing." :) > > Thanks, > -Eric > >> Old ABI ARM has interesting packing & padding; for example >> on ARM old abi: >> >> struct xfs_dir2_sf_entry { >> __uint8_t namelen; /* 0 1 */ >> >> /* XXX 3 bytes hole, try to pack */ >> >> xfs_dir2_sf_off_t offset; /* 4 4 */ >> __uint8_t name[1]; /* 8 1 */ >> >> /* XXX 3 bytes hole, try to pack */ >> >> xfs_dir2_inou_t inumber; /* 12 8 */ >> >> /* size: 20, cachelines: 1 */ >> /* sum members: 14, holes: 2, sum holes: 6 */ >> /* last cacheline: 20 bytes */ >> }; >> >> but on x86: >> >> struct xfs_dir2_sf_entry { >> __uint8_t namelen; /* 0 1 */ >> xfs_dir2_sf_off_t offset; /* 1 2 */ >> __uint8_t name[1]; /* 3 1 */ >> xfs_dir2_inou_t inumber; /* 4 8 */ >> >> /* size: 12, cachelines: 1 */ >> /* last cacheline: 12 bytes */ >> }; >> >> ... this sort of discrepancy leads to problems. >> >> I've verified this patch by comparing the on-disk structure >> layouts using pahole from the dwarves package, as well as >> running through a bit of xfsqa under qemu-arm, modified so >> that the check/repair phase after each test actually executes >> check/repair from the x86 host, on the filesystem populated >> by the arm emulator. Thus far it all looks good. >> >> There are 2 other structures with extra padding at the end, >> but they don't seem to cause trouble. I suppose they could >> be packed as well: xfs_dir2_data_unused_t and xfs_dir2_sf_t. >> >> Note that userspace needs a similar treatment, and any >> filesystems which were running with the previous rogue >> "fix" will now see corruption (either in the kernel, or >> during xfs_repair) with this fix properly in place; it >> may be worth teaching xfs_repair to identify and fix that >> specific issue. >> >> Signed-off-by: Eric Sandeen >> >> --- >> >> Index: linux-2.6.24/fs/xfs/linux-2.6/xfs_linux.h >> =================================================================== >> --- linux-2.6.24.orig/fs/xfs/linux-2.6/xfs_linux.h >> +++ linux-2.6.24/fs/xfs/linux-2.6/xfs_linux.h >> @@ -300,4 +300,11 @@ static inline __uint64_t howmany_64(__ui >> return x; >> } >> >> +/* ARM old ABI has some weird alignment/padding */ >> +#if defined(__arm__) && !defined(__ARM_EABI__) >> +#define __arch_pack __attribute__((packed)) >> +#else >> +#define __arch_pack >> +#endif >> + >> #endif /* __XFS_LINUX__ */ >> Index: linux-2.6.24/fs/xfs/xfs_dir2_sf.h >> =================================================================== >> --- linux-2.6.24.orig/fs/xfs/xfs_dir2_sf.h >> +++ linux-2.6.24/fs/xfs/xfs_dir2_sf.h >> @@ -62,7 +62,7 @@ typedef union { >> * Normalized offset (in a data block) of the entry, really xfs_dir2_data_off_t. >> * Only need 16 bits, this is the byte offset into the single block form. >> */ >> -typedef struct { __uint8_t i[2]; } xfs_dir2_sf_off_t; >> +typedef struct { __uint8_t i[2]; } __arch_pack xfs_dir2_sf_off_t; >> >> /* >> * The parent directory has a dedicated field, and the self-pointer must >> @@ -76,14 +76,14 @@ typedef struct xfs_dir2_sf_hdr { >> __uint8_t count; /* count of entries */ >> __uint8_t i8count; /* count of 8-byte inode #s */ >> xfs_dir2_inou_t parent; /* parent dir inode number */ >> -} xfs_dir2_sf_hdr_t; >> +} __arch_pack xfs_dir2_sf_hdr_t; >> >> typedef struct xfs_dir2_sf_entry { >> __uint8_t namelen; /* actual name length */ >> xfs_dir2_sf_off_t offset; /* saved offset */ >> __uint8_t name[1]; /* name, variable size */ >> xfs_dir2_inou_t inumber; /* inode number, var. offset */ >> -} xfs_dir2_sf_entry_t; >> +} __arch_pack xfs_dir2_sf_entry_t; >> >> typedef struct xfs_dir2_sf { >> xfs_dir2_sf_hdr_t hdr; /* shortform header */ >> >> >> > > From owner-xfs@oss.sgi.com Fri May 2 14:01:07 2008 Received: with ECARTIS (v1.0.0; list xfs); Fri, 02 May 2008 14:01:14 -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=0.9 required=5.0 tests=AWL,BAYES_20,HTML_MESSAGE autolearn=no 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 m42L14NI021673 for ; Fri, 2 May 2008 14:01:07 -0700 X-ASG-Debug-ID: 1209762108-2b7200e10000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ext.agami.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id C8F29AEA96E for ; Fri, 2 May 2008 14:01:48 -0700 (PDT) Received: from ext.agami.com (64.221.212.177.ptr.us.xo.net [64.221.212.177]) by cuda.sgi.com with ESMTP id 9bgRNDMkLEOhzSG6 for ; Fri, 02 May 2008 14:01:48 -0700 (PDT) Received: from agami.com (mail [192.168.168.5]) by ext.agami.com (8.12.5/8.12.5) with ESMTP id m42L1PO8023171 for ; Fri, 2 May 2008 14:01:25 -0700 Received: from mx1.agami.com (mx1.agami.com [10.123.10.30]) by agami.com (8.12.11/8.12.11) with ESMTP id m42L1P1u016883 for ; Fri, 2 May 2008 14:01:25 -0700 X-MimeOLE: Produced By Microsoft Exchange V6.5 MIME-Version: 1.0 X-ASG-Orig-Subj: question about xfs_alloc_fix_freelist() Subject: question about xfs_alloc_fix_freelist() Date: Fri, 2 May 2008 14:01:47 -0700 Message-ID: <038C959C13632143B902BE360CA5B58E3C552E@mx1.ddns.agami.com> X-MS-Has-Attach: X-MS-TNEF-Correlator: Thread-Topic: question about xfs_alloc_fix_freelist() Thread-Index: Acisl7xQx+kT//56QqOpiR9uhl4Lcg== From: "Michael Nishimoto" To: X-Barracuda-Connect: 64.221.212.177.ptr.us.xo.net[64.221.212.177] X-Barracuda-Start-Time: 1209762108 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.92 X-Barracuda-Spam-Status: No, SCORE=-1.92 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=HTML_MESSAGE, RDNS_GENERIC_NO_PTR X-Barracuda-Spam-Report: Code version 3.1, rules version 3.1.49487 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_GENERIC_NO_PTR Delivered to trusted network by host with generic-looking RDNS - indicates no PTR record 0.00 HTML_MESSAGE BODY: HTML included in message X-Virus-Scanned: ClamAV 0.91.2/6021/Wed Feb 27 15:55:48 2008 on oss.sgi.com X-Virus-Status: Clean Content-Type: text/plain Content-Disposition: inline Content-Transfer-Encoding: 7bit Content-length: 496 X-archive-position: 15767 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: miken@agami.com Precedence: bulk X-list: xfs The following code can be found near the end of xfs_alloc_fix_freelist: if (targs.agbno == NULLAGBLOCK) { if (flags & XFS_ALLOC_FLAG_FREEING) break; xfs_trans_brelse(tp, agflbp); args->agbp = NULL; return 0; } Don't we need to release agbp too by calling xfs_trans_brelse(tp, agbp)? Michael [[HTML alternate version deleted]] From owner-xfs@oss.sgi.com Sat May 3 17:38:58 2008 Received: with ECARTIS (v1.0.0; list xfs); Sat, 03 May 2008 17:39:16 -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.3 required=5.0 tests=BAYES_50,MIME_8BIT_HEADER, RCVD_IN_PSBL autolearn=no version=3.3.0-r574664 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id m440csjM014000 for ; Sat, 3 May 2008 17:38:57 -0700 X-ASG-Debug-ID: 1209861552-3e1302060000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp.sohu.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 3F70E162C607 for ; Sat, 3 May 2008 17:39:16 -0700 (PDT) Received: from smtp.sohu.com (smtp.sohu.com [220.181.26.195]) by cuda.sgi.com with ESMTP id k54jdnD0mK4M4nJq for ; Sat, 03 May 2008 17:39:16 -0700 (PDT) Received: from iTFGUY&t*???_ (unknown [116.25.130.9]) by smtp.sohu.com (Postfix) with ESMTP id 1604911E35F; Sun, 4 May 2008 08:37:53 +0800 (CST) From: =?GB2312?B?zfJzb2h1LmNvbQ==?= X-ASG-Orig-Subj: =?GB2312?B?enJoc2l0ZnJAc29odS5jb22zz9H7us/X96Oh?= Subject: =?GB2312?B?enJoc2l0ZnJAc29odS5jb22zz9H7us/X96Oh?= To: linux-raid@vger.kernel.org Content-Type: multipart/mixed; charset="GB2312"; boundary="vKf8w1WMqEhEEVwZ0qpGuqyKvZ28v=_IW1" MIME-Version: 1.0 Date: Sun, 4 May 2008 08:38:02 +0800 Message-Id: <20080504003753.1604911E35F@smtp.sohu.com> X-SOHU-Antispam-Bayes: 999 X-SOHU-Antispam-Language: 0 X-CMAE-Analysis: cmae content reject X-Barracuda-Connect: smtp.sohu.com[220.181.26.195] X-Barracuda-Start-Time: 1209861579 X-Barracuda-Bayes: INNOCENT GLOBAL 0.5002 1.0000 0.7500 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 0.95 X-Barracuda-Spam-Status: No, SCORE=0.95 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=PR0N_SUBJECT X-Barracuda-Spam-Report: Code version 3.1, rules version 3.1.49593 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.20 PR0N_SUBJECT Subject has letters around special characters (pr0n) X-Virus-Scanned: ClamAV 0.91.2/6021/Wed Feb 27 15:55:48 2008 on oss.sgi.com X-Virus-Status: Clean X-archive-position: 15768 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: zrhsitfr@sohu.com Precedence: bulk X-list: xfs This is a multi-part message in MIME format --vKf8w1WMqEhEEVwZ0qpGuqyKvZ28v=_IW1 Content-Type: text/plain Content-Transfer-Encoding: 8bit 703½ß³ÏΪÄú·þÎñ! ÏêΟ½¼þ --vKf8w1WMqEhEEVwZ0qpGuqyKvZ28v=_IW1 Content-Type: application/octet-stream; name="%#^).jpg" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="%#^).jpg" /9j/4AAQSkZJRgABAQEAYABgAAD/4QAWRXhpZgAASUkqAAgAAAAAAAAAAAD/ 2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIs IxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIy MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy MjL/wAARCAK8AdEDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAEC AwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1Fh ByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RF RkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZ mqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo 6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL /8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKR obHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RV VldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaan qKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3 +Pn6/9oADAMBAAIRAxEAPwD2CdZZdXeETeWoUfwg9vpTjZzjj7WR9UH+FNm5 1uXjB8sHP4U6e7uPOWOCRugXA65olJoxjCMhv2WYf8vR/wC+B/hSfZpv+fpv ++B/hUb3l6jENNKuDg5UU1r3UB1lkHttFT7Uv2USfybn/n7P/fA/wpDFc/8A P43/AH7H+FQ/adW55m/74FBuNXIGBcfggp89xeyiS+Vcj/l8P4xj/Cgx3H/P 7/5DH+FQmfWOmLn/AL9ikM2s/wDT1/37H+FF2g9lEdO1zDCzi7B9iq/4VTXU LlgD56/go/wpt5f61HII1a4zjn5B/hUP27WQcGS4B7ZRf8KwnUaD2cC4Lq6O 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 V9dPwKHja0iWO31NHmOpxq9tYwxlfnklG3oRzgHP4VQgttP0650XSbu1lTVN MjLWWHCw3TMPnw3+9yQcH655686ZBJqaahOBLPEpWAsOIgeu33Pc0zVNFstY a1a7jLNazCaJlOCGH9Pb2pypNtyX9f1+go1Ukov+v6/UqaToj2H2u/vZxc6p djM0wGFVR0RB2Ufmep9sz4af8iPaf9dJP/QzWzrehrrFs6x3l3ZXO0rHPbzO u36qCAw+v4EU/QdGg0DR4dNt3eRIsne+MsSST0+tNQaqKy0Sf42E5pwd3q2i LUNIbVNXsprlx9ism81IMZ8yXGAzeygnA9TWF8O40fTNV3orbdWmYZGcHanN dpXM6f4QFlY3FmdTufIuLp7mVYP3Rfdj5dwyQuAOhBPPOOKJQfOpJdwjNcji 32MUQQav4sv7uzhRNN0i1lhRo0Co1w4O8jHB4Jz74PfNa/haWz0/wdpd7Mka O8McJl2jc2Wwq56nk9Peugt9PtLSwFjb26RWoUqIkGBg9fzya5g/DrTmgW1f VNYaxVtws2uv3WM5xt29P196n2c4PmirvUr2kZKzdkdcY0MgkKKXAwGxyB9a 4rxEtw3xI8OC1liimMM+15Yy6j5GzlQyk8e4rtgMAAZ49Tmsm70JLvxNp+st OytZRyIsQXhiwxkn6E8VpVi5JJd1+ZnTkott9mP+z69/0EtN/wDBfJ/8erD8 ABxFrwlZWkGrzbmVdoJ+XJAycD2ya6PVNOGqWTW/2q6tW6rLbTNGyn14PP0P FUfC/h4eG9OltmvJLuaaZp5ZnGCzHA6ZPoOpPOaTg/aJrZeZSkuRp7k/ib/k VNY/68Zv/QDXGWXh7Wde8GaRYRanDHpU0StcK8f71cHICkDBGcdcHjqeld7q dn/aOlXlj5nl/aYHh34zt3KRnHfrUejaaNI0a008S+b9njCeZt27vfHalOlz z12sEKnLDTe5xdnDZJq3ja1u7pLW2KW8XnSOF2fu2AOT3zipPCz2N/fCLxE5 m8RWrGNEvAANoOVaFMAHhQd2N3fpiuig8J6XD4juNdKPLeTEEeYQVjOMZUY6 8d8+2Kn1rw3pXiCNF1G0WVo/uOCVZfbI5x7dKhUZrXTS+nzuW6sXp6fkatY2 v6nPawrY6cqyardZWBCeEHeRvRV/U4HetKzs4LCzitLZNkEShEXJOAOByaxN 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 qPaMxyCP8/hUiQFcZxU9FK7HzMijiKF2JG49KY1uxHykA+tWKKmUU9xPUoPY s4IO3nryagfSN7o2I8pnacnOO3ataio9lEVkY7aTOxY74jkYxk4/lWRN4bvI 0aUvAVQFiFZsnHpxXX1Fc/8AHrN/uH+VT7GK1DlRycTn7N8nOeOewqJtWkgD RQAMd3LHpnviqX2hTa+TztcEO2eQPao4oC4iRIxtUYQA889zWc56aCbshmo6 hc3l4jM2zaFBx9a3bq4z4qmtDnON59OlY91aMsxBXoFz+YrQuj/xXNwfSP8A oK0o6u4n8JrbfeilzRXYYWG6rGZNQnx2Vf5Vl25H2uIjs4rcuBu1e5X1VR+g rIaNoNSjULlTIMVz1o63NoGqxyuPeuV+IVr44uLDW5tGutlkthGtrb2UpF00 6zI7yAhAR+7Ei7Q5zgYGWwOpOTtIHOTmtuppbsqJ5Bqdjc2+mR6L4Nm8VpBe 6us9zbpZPZi0tjveVbeSWKNYgTtwpfGcD+Js9TewapF8Oxp/iuw/4SXVLndb yW9lH8lw7OTHlgqiJVG3MhC7duck4z21Fa3KPOPDHhzxL4GlS5Z38SNqCL/a bB0FzHMqnY0ckrL5kQXCbXYEfeXG5lrS+E1jdab8M9ItL61ntbiPzt8M8ZR1 zNIRlTyOCD+NdrRQ3cDF8Q2GsalYxw6Jrf8AY1yswdrj7IlxuTBBTaxwOSDn 2962qKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA Corn/j1m/wBw/wAqlqK5/wCPWbv8jd/aplswOPs9OjEXmyEsc/cFWYbSOF3k 24ZvmI7gVpCAR5IGGPWmeUxQnjPQkjnFcKRmYGoLGl+wzIoZQRz7irdyq/8A CXXPrjP6CqHiCVW1FIlBOAuSPrVu8ct44lUdkP8AIV00Bv4Ta+0Giq+w0V2G JbnH/E6nPsv8qz7pH/tK3dckeYAQK0Zv+QxcfRf5Cs66DHUbfaRxIMjNZVdj aBfB5JIOd2Oa2awyQ7hkAADYPNblYUt2UgooorcYUUUUAFFFYHifxH/wjf8A Yv8Aon2n+09Vg07/AFmzy/M3fP0OcbenGfWmBv0VWlvrS3u7e0mu4I7m53eR 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 H9bv/Evh3WtDOnNPpKXg8u9kdFZpowin5FYkA5JHGcYyM5Gfe/Dea8k/tF9a jOuPq0GqT3ZsyYn8hWWKJYhINqKrAZ3FjzknIwJ6Abvhvw9bW/gPSNC1PTLU pHZwpdWkkSPGZQAz5HKsd+Wzzk8+9eQ3Fm1r8Qri90yR7DwtYONBOpSXd262 jqqttfbOkioJCEzkRDIPXk+p2vhbX4fDc2lSeK7gyTXLObxIW86G2Y5aGN3k Zg3ULI5cqD0yARQHgm81XTotA1CGx0vwxbxIo0rTJzMblhIHzJK8asq/KOFw zFmJekmBQ+GdnLrUs/iO/SC6ghllg0a9NzdSu8W4pJKEnlk8rdtUDGG4YHgj MPji0h1HXp7yxj1sXMthLpF4Es7mONoC5JCt9imDZJPzKRwBgnNdTo3hzV/D 9x9msNfSTQ0dBb2F7ZmaS2iByY0mEikjnClw20BRzg5TWvBi+JdTa41e5S6s 4EDafp8kLfZ4ph1lmUODOc8BSVUKWGMsTRfUDyiKyn1SOaPTdQ1FGisv7Bmn W2uLsQWqsN8LRrpyZcKT1dWyRlq9k0E2kfheGz09b4W1jbraIb21kgkIRAAS ropPGOQMZz6Vzuh/DsjSLs+IJkGs3OpXOopd6VLJC1nJMoRhFJkNjAzg8HgE NtyezitvsWipa+fPceRbiLzrh98km1cbnbuxxknuamb0YFZuCGHTHNRMAHY9 B3zUh6Fe3r6UxssASOe3oa4rXIMTWVjaQ5BLtswccdaW6B/4TW4/3P6Cob+W dtQyX5G1duOMZ9KuXY/4q6dh124/SuqnDZjfwmhRTsUV0WMRmotKNTnWGMux 2jj6Cq8TbtRijRQGEgLEt3qxqO3+1JWIcFdo3KcdhWfbQhb+ACKZn80HJPym uerKzN6R0jxSEFTNuPPCrnFW6zSweVoobVuT8zlvkB+taVRR6lMKKKK3EFFF FABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUU AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQA VFc/8es3+4f5VLUVz/x6zf7h/lUy2YGaWAbOc57Go9+47c//AFqSaUKPlXcR 19qqtckN95QCOlc0YskzbyI/2y4PIDr1q3OM+KLn6GoGIuNUDE9WFTyHd4jv G9zXXDsEvhL2aKSitbGAaksf9pzSNG0rKV2oOP4RVBIZZ9Qi89pU3SBvJV+Q o759K15+NXuDgHGw8/QVlXtpFc3KQkyLvnQMY2wwGex9K560bs6KZvyEJEIo 1EcOOq/dA9AO9c/deItXHxIHhyzjsWtl0ZtRImDh5JPMMYTeCQi52knYx4PH PG7cWqOd04AghO0JnIb3PpXnniLV59G+Nkc1po99qt1N4eEEVvaKPvm5JUyM eEjyAC5zjI4qKK3KZY8RfEC9n+F2v63pUU2larpd0lnOkojl8qcSRCQKfmV1 +cgNgZ64FemV5B8SdVmudI0nw/qTJqN9DcDUNftdJYpHHZwrvkVwZNygh027 iNxUEbTtFem2Wt6bqGiJrVrfQPpjxGYXJbagQZyWJxtxg5zjGCDjFbMRxr+J vESeO7rw2+seHljtdLOo3N41hIBDhwCjr9p+X5SHyT0I4xzWr4B8T3fiLw7Z XOsSWUOq3kTXaWMKmJ1t95RX2M7MVOMh+AdwHufOrmEx2d98WJykU19OyRaT eyLDFf6eUEYikVzzK0aGUYLq21SFOcDqPhPpthdRap4shtNMs59VlVI7TTmj dLKBVXbGdo+WRuGcd/lJVTkCmtAI/HvxMtvDXiXRls9Wtbi1jS+GoWcMiOzS pGPJjcgM0ZMnGeO+eAa43Ufi9q9vb3kgvpIotUe2k09o5LO6k05MBrgMicsc sFRZApI5JVga6vxlJbeLvHGm6fpcV1qqaTBf2+rpYFFa3FxCIlAeUrGXyW43 EjY2RwRXAW/9j3+h6d4mN9Y21zpUfm21tJrdpFfDyMLGrKLHMjYiXaHLZGPU 0JAe2eE/FsOrfDq28TX4e2gW3lknaRhIwWJmVnOxFBJCFsKo64AriIPG/ie3 8Gaj4gv9S0aJNTiubjSYp9SiV7dFDbUjRYCJpFJGQz8napCndXSeHfB+kap8 NPDenB75NNXydS+zvMj+buJm8qb5Aske5+RtGdo9K8u0u4ls/Dvwsnh1CCwk T+1sXU9yluiZcjmR45FXOccoc5xwTkCSA9T8EeL77xFZaXDLcaDcXDWaS3TW 2q+Zcg7BlmgEQCncQCN2FJ74AOX4n8eXcHjqw0C28RaFp2lXDulxfRzpLc2r RDc4cP8Au4ix/dgMG5yevyiP4X3Et1438bTzahDqEj/YM3UFylwj4jccSJHG rYxjhBjGOSMnN8Xadr2tfGTw5m6u9EhZbqDTZo5lkffFEZDP5YyoRyyKVJyy oQ23IAVtQLGteO9T8vVP+Ef1qTUdMe8RDq0GmySHSVVgZ84h8meJUGQdwbD/ AMXDV3p12IeCf7csUvdWVbXzLcfZnWa7bGF+QRgjecchAuDuxtrxyf8Atrwh f3/gDTr3Tr3T9WvYrbUb5tPMLWk96hUIkayBcCNN42jaOnHSvaPDzafp3gzT lg1W1utPsbJIjfpIvlMsS7WfcCQB8pzzxg88UNWA8/0b4ly6l4p0KO/8S6LZ 6cdG+334j2Iklw7FRblndijICrYBydrZGCAvS+GPEnm63caNceJ9L11ZMyaf LYjfP5YyX+0+UPKTG5FU/KGx0ycVwOqxXj6pefFS7n1BNDWdbVLCG5lt5Z9P O2NJo3VlZQ0hEoiIUHru5BPb/CuC7n8PTa9danfXK6tK00FpcXxuksoQ7hI1 ckktg/MTg8AEAqcjAyvGPiDWtI1zVNO0/UdZkkh0abVkaL7D5cADMoVkkhDG NcDJDs+OME81g2XjPxR/aFr9vv8AxD9i/wCEaTWLjyIdN8zORukTK48nGcKf 3me1bnxFSP7fZS6vY6JDJLI1rZN5i3FxdDOVXy3sJmGM9FOAXxkkiuM/szS7 0zwapYaVZ20GqS6dI1zPb2scksGHZfPh09TGrDpl0ZgGApoD3Hw7ci98Pafe rdXV0l1bpcJLdrGspVxuAYRgKCAQOB279a1qxNPvZrfwy16+m2oht7cyWtto 8xuVlhVAUEXyICSOFUDHTB54k8M+IrXxXoFrrVjFPHbXO/Yk6gONrshyASOq nvSA165XWtS1HSLjde+KvDWmwzO5t0vrJlYqD03G5UMQCMkAdegzXVVwfjCK /j+IngrUrPSbzUYbT7f5wtlX5N8KquWdlRcnP3mGcHGTxSQGbrPjnVrPwZq3 iXR9d0PVYtNuBbSLHpk8atJvRSA5uCCAJAcgEHsa7pLi80vTJbjWLhLt0fOd O0+UHacADyg0jMc5yR27DBNeT+J9K1HTPhF48fUrGSzbUNba+hikeN28qSeA rnYzAHgjGe1etavb6pdae8Ok6hDYXLZH2iW18/YCCMqu9RuBwQTkccg5psDy rRviV4ll+Hmg3y2clxqd5q6ac91dWyCO48xpcGFVkjBKhUXLbVzkZ4JHXeDf EviHWPFWvaVrUVrbppSW42LbeXKzSqWBbbPKgAAPAJzkHIwRXj3ha00q5tfB Ok3WqalLNqjzym1ubyP7FagSyxoywywSI7viQAdd/puBrtPhPE2pWmnalDBq NvdSI32u6s9KsLa0KiV8Rb/KWRwRGu7yy2CwyVPRtAdb4w8Q3S+J9F8M6ZqT 2NxMJL++niiSWVbaNW+SON1bzHdgcBAzLsztIri5/iLrMsEsaajqUDP4uNgJ Y9KJZLEj/VjdER5o67CDJ6g1p67oP9hfFfwxeaUv27U9RutRuZGv5tmf3CAR +YsbMI0XO1cNjOOM5HNWv9pT6PPqso0y20yPxu2prevdTGGVg20BXWBl8otw JmIXIwQKEgPVJ/G9rD4Sl1uTT9QtZ95gt9NvrZ4Lie4P+riVcEsXOMFdwwTn 7rY5e48b6pYaNZ+Ek1Fbz4h3PlQyBrP5LZ5cOXfYNhWONvvLu+6CVI3Y1vEe k6n4j+Hm67tdL1/Vh5d3YJZHyrYSlQFcGR2WVV3u3zYVxgFRmuH0LTbTw3qe jeGovDmnR+ItQgAupbTxLcRTRNHF5jCYxoTGHyTsUlWIHXapAgPS/CXiV7+S 48PaxJHH4l0pVS+iDKRMNoxPHgAFHBU4wCpbBA4zn/EXxJqunaYNL8Lo9x4j uEM6RQIJHgt05eUqVIIONgBwWL/LkjFVPCcVhc+I9T0O58K6XBLocsd012bp r2Rri4Ak3q8sQcsQvLls5VQMgDFj4ga/4m0htMttKhsoItR1S2sY7v7STN8/ JGxoWROVI3fvMDnbk8LqBR0Lxxr2veJtK0nS4tLu9PW1W51DU4bhrrahBCq2 EhEczFTlSpxuztAUivQLy9jsbR7qVZ2jQjIggeZzkgcIgLHr2Hv0rxrUk1/w Br/h3TdNf7BJrt/Glwzag2ox3Dh1WSWVJIY2Ej+auSjqCFxgHBHdXsXxLk0W CO0uvDMepv5ouJPLnCQg4EZizu3MPmJLDHIGDgkjQHC+J/iPq/h0R2E/iCdv 9PhkST+ynt757I+Z5u9Z4li3A7FUqBnaSQORXaeBfF134j2Xcy31ympb5kWC zMdnp0afKIzM6qZpCeGK7huBwFUZPn/iWDV9F8U6Dp9h4fTU7+2ca1fxLfz3 lxeeSuyOWWZokKlcSBVUldzY2chW63StGu9Z8X6J420Kx0KztJElF89hqEp+ 3Ryd2XyEBdW3MQwyWADEFRhtKwHbeJPEel+E9Em1bVJxHBHwoXl5XPREHdjj 9CTgAkcR4J8W68uplfF9/ayR6q6JY/ZkURWdz8zPZSnAaOYBkwj5J2kBi3BX xtpt3p3iTw7rl3fJe3Fz4gtLK3iktUMVpbMSWVFbd+9ZkUmUYbgBdoGKoeEt HudaufGdi2m6PLpV14mu49Qmui7TSRKciNEUDBDEFXL/AClmIUnqraAem6vr NloVot1qdx9ntmlSEzMjFEZjgF2AIRc4G5sKMjJ5ri/E/ifWNN8W63Y2t55d tbeEp9ShTy0O25WRgr5IyeAODx7V1Vh4U0bS/Dk/h60tHTS50kR7driRxtcY cKWYlQcngEcknqSa8bj0zXtE1TW9K1+4sri4tPAdzDbyWm7HkK5CBsqvzDkc DoBnJyaEB6r4f8X2M2n+F7HUdQRtb1fTYrlYQnzSHyg7sQowgOGxnAOCB0rJ 8YeLZtM+IfhfRLe/uoop0nuNQhtbI3EkkYXMQAEbtgsjg7OQMk44NVvhVod7 /Y9j4j1tUGoS6bDY2KRN8sVgqqUyB1d2y5JJ6gDbytcP8YIJvBXivSvE2kXk 661fS3UklzKEfaojijVFXbt2qjMBkFuckk4wJagamkfEfWNa8O+GLCC+1L+3 Li4e41S6ttKMuyyWSRCVVYmBJ+RVKoQGUhiOc9n4j8fwRfDPUPFnhxku0gdE ie5t5UjcmVEbAbaWA3EZHGQR2Irwi80qHw5LrF3Za1Brlno8S6bFIkyqkiXl tOCY/nb7jsxKLnOWPy4Y17j428NXa/Bifw9ZSJcTWllbQ+ZI6QKywtGWcl22 qNqFuTx602kBxPiv4i+JbTWNdttJ8TWMy6VYAziDSzEEnF2kLqBKzncA4+bL KRwFz8w9P0XxDd+IteupdOjhfw1BH5Md6VIa5ug/zGI5w0Sj5S2Bls7SQDXz pcWk+oaV4n8Q3Pn2F1d6fHeXVrKgjF0Z79WDwqwLGAKqHdnO/AyVOD698LdW g1yX7NeeJZbzVtG862NjamKGyaPdsWWJIkXzY9oUDdkKTnaMqaGgO8vdXvrW 7eGHw3qd5GuMTwSWoR8gHgPMrcdOQOnpzXmmv+JPH8vjLVdH0KC+hln0qO7s rKeOyBtiJo0dy+9gykLIOTnL/dwA1afjPTtPi+I0WsalL4UnhOki1Ww1u+WB g3nM3mqrRuCMZUHHdvTnyu5bT9IOk+HYPEtjNcXdgdGv7yykYwWccl4J/N80 7RIpR2VlBAGGye1CQH0DNqN9b+CRqHiGV9Gu0t1kvZNNT7QbcggsVBRwRjr8 rBRn5iBurzOD4geOh4abVryCCKx0uWK4m1B7SSCPUbfIVUjLoxZpiwO5Y0CA AkjfhfSdNtPDmreFtQ8N6KfK0y28/Sp0gQoYn24kALjlvnzu5yTnJ5ryjTBf WWr2yQyWWrXNp4ifQtMi1S3kuZLS3hWPM8aLKiDYqRlmWMHPJfmhWA9K8H+I /EPie4TUp9L0+08Py2aSW8kN59ollmY5IyAAoQbkZSoIccEjOOuuf+PWb/cP 8q81+GOn30viLxdrF1qjuRq9zZGygj8m2LqULTeWCRvICjPXhssxbI9Kuf8A j1m/3D/KonswOZlDSnLMdp6AUkcRzkKMe9W5cMp2cZqWK2wqD8ahW6CaMpVC 6nFkfxVMwxrd39TRIhOrxADgEUp51i9PoTWkNxS+Et4opM0VsYFi4/5C1x9F /kKrptbUkU95AOe+asXH/IWufov8hVZGKaijZI/er24rKe5tTRduIo4bljNM 7szDy4o/lwPcd6brGkz6rb+RFrOo6ahR0c2RiVnDDH3nRipHOCpUjP0wl5NM Hf7OkSzO2xWfrz6Vr1z0neTsayMnSfD+laAkw0yySB53LzzEl5ZmLFsySMSz nLNyxOM1Df8AhTRtQ0MaIbKO3sEYPHBbKI41cEsCYwNjgMd211ZScEqa3KK6 CTBsPCtrbasNWvLy91XU03CG5v5Q32dWVVYRRoFjTIUZKqGOTknNJF4P0a21 q41e1tpbW9uZVmuGtbuaFJnXkF40cI3JJOQc5Oc5Od+igArjtN+G2g6ZoS6M Z9Xnsgjo0cmp3CK6uSWBSN1TB3EYCjPfJJJ7GigClBp0Nno8Wm2DPaQQ24t4 GjIZoVC7VI3hgSAB94HpzmuQ0/4WWel/2P8AYvEWtxf2N5/2D/j2byfOz5nW E7s5P3s47YrvKKVwORsvAkdp4gn1t9d1qe5uZYprlWmiiS4aJCkYcRRoSoB+ 7kK2BuBq54j8J23iS/06+fUdRsLrT0nSCaxkRGAmQI/LK2DtHBGCM5HOCOio ouBzsngfw5LpsWntYyCGK9/tBXW6lWU3PP71pQ29n+Y8lienoMJH4I8Oppsm mfYXktJ7z7fPFNdSyCefj5pNzEyAlQSrZUkZIzXR0UwOcg8IWx1eHVdVurrW byBAts2oLEVtcNuLRoiKquSFy+C3ygAgVJF4P0a21q41e1tpbW9uZVmuGtbu aFJnXkF40cI3JJOQc5Oc5Od+igDJbQNMbU73UjA/268txbSXAncOsQ/hjO7M Yyc/JtyeevNVtB8J6Z4f0W50uLzryK8lkmu5L5/Oe5eThjJkYOQADxzjnJJJ 36KAM680XT77RJNGlt9unPEITBC7QgRjA2AoQQuBjA4xx04q1bQQ2ttFb28S QwRIEjjjUKqKBgAAcAAdqnopAFFFFAHN6t4E8Na3qf8AaOpaUk9wXjd8yOqS tHkIZIwwVyAxGWB4OOnFa2qaeuq6fPYvc3VsJk2+daTNFLGezKw5BB/A9CCC RV6igDlPDvw98N+GdDn0e3sEu7e5cPctfIsrXBByu/jBC9hgAdepJLNP+H+l 6Rf2MumahrdlZWnKabFqUv2VmyWyyEknk5IBCnHIOTnrqKLgcx4q8D6b4vu9 NuNQuL6M2PmqqW03liVJAokRzjdtZV2nBHDH1re+w2n9m/2f9lg+xeV5H2by x5fl427NvTbjjHTFWaKYGB/whfh//hEv+EV/s/8A4kv/AD7edJ/z08z727d9 7nr+lU734faBPe6ZdW9vJpw055nii0t/siu0qqjFjHtbOFXkMOmDkcV1dFAH PaH4RsvD+s6pqNlcXkkup+T5wurlp9vlqVXDPlzwT95j2xgDFSeIfDNp4qtr CG9muoks72O9jNrL5bF0BAG4cgfMeVIPTBFbtFAHI3Pw80W71vS9VuJtTml0 yUzQR3GozToX4IJ8xmIwVU/KRnHzZHFb99Zz3tusVvqV1YOHDGW2WJmIwflP mI4xznpngc9av0UAY+h+HLDw/FN9jE8tzcbDdXl1M009wyqFBd2OTwOAMKMn AGagi8H6Nba1cava20tre3MqzXDWt3NCkzryC8aOEbkknIOcnOcnO/RQBzur +ENI127S41GK9lkjlSeMLqNxGkUijCuiLIFVh6gA8k9SaitfAehWXni0Gq2/ nytPMYtXvE8yRvvO2JeWOBknk109FK4GZJoVnNpkVg02oiCJ96supXCyk8/e lD72HzHgsR09BjIn+Hfh26uJbi4hv5J5bc2skj6rdszwk5MZJlyUJ/h6V1VF MDA03wboek3lpdW1tO0tlE0Nobi8muBboQARGsjsE4UD5QOOOlV/FXgPRfGd 3p02srPNHYebsgSUoknmBQdxHzcbQRgj3yOK6eigDk9N8BaHY391f3Mb6neX LyvJJeqhUeaqpJiJFWMFwgDME3Nk5JBqUeBtHi8Of8I5ZPfWWktLvlt4Lpz5 qE5aIs5Zljb+IIVzk8/Mc9PRSuBzfiPwRofinQF0i9tEhgiRUt5LeNFktlBU 4iJUhAQgBAHTirM/hHQLnUdM1KXSLU3WloEsnCbRCo+6Ao4IXqoIO08jBrbo pgZSeH9Lt7i6u7GwtbHULpHWS9traNZiWOSxYqdx3Yb5gQSBkGqem+C9B07S 5dPGnwXUc+DeSXkazSXjhi2+ZmHztuJbnoTxgcV0NFAGFovhbS/DWjz6ZoMU mnQTu0haOQyMsjKF3jzNwyAq8EEcdOtV7Twbpcd/c6hqPmazf3CeU1zqSRyM kW0r5aKqKqIQz5CqN29s5rpaKAMDS/CWm6Hrc9/pXn2cM8WyTT4H2Wm/5f3o iAwJMIq5GOO2STW1c/8AHrN/uH+VS1Fc/wDHrN/uH+VRLZgZborTLtAA9qtK oOQOOKWOIKCx61IopRQGPLHs1aIA8kqKh66tffU1anGdYj/3hUAX/iZXh9zV w3Jn8JLmiiitzmJ7k41W4+i/yFVDj7aNxKpv5Iq3dD/iaXH/AAH+QrOu4p5r +3hhU4eYb2HYVjU10OmkbVtGXnMuA20YjVe31rQqEiOwtMZyRxkDGTXGeOfE 2o+HIby4tPEHhuGeK3+0W+m38TLNKoHIDCYFiSrbcJycL6msqcOXYts7mivA /DmvxeGNTtrTw74k8Ntba6zane/bYmt4tMRtuI1QXBTfyV8tTu+UbjtAI9Dg 1LQ/E3w4MN3q114gs7tGtLi8t9OZ5TLyS3kxxkxlTgrlePkOSSCdWhHc0V5l HsvoPDd/p97rfiDQbv8A0BrqG7u4LqNg7BZpBGyI0YIKszIrDAYs/SuR+F1z /wAJVrGj3OqXUklxpyybLm/v7k3FzcFnZktx52wosXleYNpOOCCGyFYD3uiv KPiDqkPiDx/4b8FW9ta3zxXH9oXUM8oRCyRu0cTMFfAKhiylDkMmCMkgkOuT fG6KaXRtHfUIfD26KNtQcoi+eV3rJ5GQ/wAzLgL0J+bnFFgPV6Ky9BOuHTFH iBNOXUA5BOnu7RMvY4cAqexHPTOecDUoAKKK8+8a+LX0Dxz4T006tJa2d28z XsNvCs8sgAUQrtCM+GfK/KATzg5GQwPQaK8LsPGWseGvDfjXV9H0ZJraPxDd TPd3zGNULyQosfk8SF8MSQ2wLjqT8tevvp8mqaPaQavI6XSqjznT7qa3Xzdu G2sjKxTJOAT6Z5FJqwGrRXkCeIdJurDQdRstI8V/2drGpR2EV1c+IJ41BZmU kKtw7kgoeCoBweRxnX8M2Bm+JHiyxlv9YltdKewezhk1a5ZULxF2yDJ84LAc NkdulFgPSKK8p+Il/qFh8SfBkwn0jToYnvBDe387GMK0SCQyLhApAJCgOdxI yVrlNSufEWp6T4lv9J1XXrid9Vn/ALMFlHqEqyW4mABimjk8gIBvGChPynB5 XDsB9A0Vz+r6/ZeG/CiagFnl/dJHZW0xk8+6lZf3cWGBkMjHAOQWHJPQ147B FI/hLwZrVnaWtxd6t4mgu7y9nkMMtxeebMNjKqMFiHOGB9T5YJNJID6CoryT 4cJ4iXW/EVxaWGirbv4ju01N5J5DOcbcLEwjAKoWYjd97cRhOp6H4jaDrvi7 Tx4e0tVtbSZDNdX07KUYpzHAFGXyXCsWwAoXjcSVosB3VFeOeBZ9R8YeJrSe 01y9h0HQYliuNONxAu+5wQEX7IEV4F2qVZhhtpABBbHrN895HbFrCGGa5GNk c8xiQ8jOWCsRxn+E/h1oaAtUV82+JZJ5HgstB0q1vdPbXLQxRQ6mbvS1uisp FtErxxgB95ZwrFRkA7cgDvvAOqXlt4iXStXitbDXLxJbjUxemWS9vpFJRTG2 xIliXDlQjSAIMAD5mp2A9UorgvEHjbVtH8fpoNrpsF3bNpgvT+7uDIH80p1h ilO3AHVByfvdAfMtJ13XYNM13UILLV2t7jVrq/v9Psrh7U2m395Iks5tflIW MAhJlYhlAUEmiwH0VVaW+tLe7t7Sa7gjubnd5ELyAPLtGW2qeWwOTjpWJ4dv td1vwTp1/PLp1tqt7bpcBkgeSBFc7lGwurE7CAfm4bPUdfMG1u58XfENJ2v7 C8tfDLsba6stCu7uOeWVQCTGjtgKyEq+8ZKgruHIVgPc6K868L3eoeMtcn1S XW9Ugg0W5Nqtvb2i2UE8gz5gkjeSWR+Cg+YIVzwA2cN8Wxaq/jPw94fTxNrE Fhrj3bTC38iKSERIJEWKRYgyjPBySSOCeuSwHo9FfP8Ac69Jpms387XeqT6f Y/a9OSxm1/UPPvJ7Xa8lzuiQhcowypKqOTwBmvZfBxsf+EO0V9OsUsLOWyim itUbcIg6hsburHLHLHknJPJosBt0V4J8H45b3wZKsmmeJb9Yb144n0/VzbxR LtRtmz7THzuZmJC/xdfTt/AVzeP438ZWE51WK1tTY+RZ6leG5eDdGxb5jJIP mPPDHt0xgNqwHolFeJ+JPiDptr4xu/EF2kkreH3m03StPdZENxc7lW5m85UK KAjABCWJGDhCRmK01W/OtnxeLyCTxfeXK2UPhiO5Wciz4zDIPvQSLsaVnOFU r8ygsVBYD3Gisa0vT4h0YzWjarpcj7QTNaeTPC3DEbZkKnrtJAZeuDkZrwfx DqXirVtA8Ox+Jk1F531aHfb3Ni0alsuFAT7FtJK9g8ucn923RUlcD6Rory/w BfarrXjXxCdYvtRlbS0tUt4pZZIlQSJIW3xeVAHJzwXiBGBjOATpeKPEfmaX 4x8N3tp9lvINFubu2KyeYlzalGUSA4G1g3ylCOOxYc0WA76ivGPD2ox6P4n0 jU5leSGz+HsM8ixgFiqOGIGSBnA9a9O8MaxP4g8N6fq91YfYZLyITC380S7U Jyh3ADOV2t04zg8iiwGzRXzyPE2sX8Fl4pS8+w3viPbo91FZ6PdrHGpeRVuE lD4mnULhQpLYO0Dg13XwqmWwuNb8K28MAtNH+zGO4FjNaTXDyozO8qSsW3fK AOnAGPlwA2gPTKK8k+ImqWmtfELw54Scfa4rTztSvLQKHWWSOJ3hjbCu/IVt yhCSsgwGJGGfbNT0hr/x9p0mg22g3tll4U1K6ltzdPIqi5aNYAd+QqMoVWyD kg5pWA9eoqrYpdx2wW/lhmuRnfJBCYkPJxhSzEcY/iP4dK8n+NF5b6f4v8A3 13J5dvbXzzTPgnaiyQFjgcngHpQgPYqiuf8Aj1m/3D/Kpaiuf+PWb/cP8qmW zAQ8kccGm4JYgD6U8j0ph9KEBn3K7tTjA6hgTVIc398QOpNW251aMk9WANV8 AXt6R71UVqTP4R2KKftWitrHMS3POqXI9Av8hUMYzqSYYj94vTvU0/8AyFbr 6L/IVFFzqcQ9JAaiW50QNO4Tz79Yj91RkiuM0z/icfGPVtXtPms9L0tNJmkP KvcGXzWVCMg7BgMCQQxAx3rtIhnVpiey8VZqOpYUUUUAeKfCLSE1/wAPaeNU 8M6VPpNnayQpd39mrzzTm4kfEZOcxKrYOQPnJAzg46P4L6ZYQ/DvSdTisLVN QmSdJbpYVErr578M+MkfKvBPYelekVWsrG0020S0sLWC1to87IYIwiLkknCj gckn8aLgcB4p0vT4/if4Jt0sLVYbx9Ve6jWFQs7PbqHLjGGLDqT171w+hwaB P8IZdSvYtdl1waRdWq3Ua6g0QjUybI96/uvKGFyudgwc969yutK0/UWje+0+ 1unjR0Rp4VcqrrtcDI4DLwR3HBqe2ghtbaK3t4khgiQJHHGoVUUDAAA4AA7U 0wOT0rVF0T4PaZqLXNvbG30OB0lut3lK/krs3bfmILYGF5OcDkitXwjfazqf hexvfEFollqkyM81uilQg3HbwSSDt2kgnIJIOOg3qKACvNvF0GnaP8UPBmu3 EVrZQM96l7qEirEpY2+IhJIcDOAwUE9jivSaKSdgPGJdK0LUtI1vSrv4h6Na WWqa/PqM0VrdQSedbuyMqEvgpICgOVJA5yG7eg/D3xBd+KvBGna3fpBHc3Pm 70gUhBtldBgEk9FHeumopt3A8ltfBOo+HvBGiQ+IdZsotN8O366o4stPmnc7 JXbBcPkrhzkiMbepyASdfwJe22q/EHxzq2nyfaNPnls4YrpAfLkeOJlcK3Rs HHTsQehBPodFK4HifxF/4RnSfiVoV3JbR6xeFLwXenTTvdtJIYs28Pltv8sN JJ8oCgDdkDArmprB9L1Pwvba5o2k2Wsq1+Lz+1bKC10+TMKmE+ZDHskRcg45 YPkZXKmvoWTStPm1OLUpdPtXvoU2RXTQqZUXnhXxkD5m4B7n1qW5ghuraW3u IkmglQpJHIoZXUjBBB4II7U7gc/4b07QLvRIVs/7Av47e688yaXbRpAlwOjq oZ9sgUrzuz9AcV4/4NsLjxF4W8H6PpWr3z3Fjf8A9pXkapB5GnRpNLtbcYy3 nP1RGLA5JIC4Ne/WVjaabaJaWFrBa20edkMEYRFySThRwOST+NRadpWn6Pbt b6ZYWtlAzl2jtoVjUtgDJCgDOAOfYUXA860HTrTQPiDJoupT+IYrm/urjUbN zeD7JfOdju7GFIz5mEOYnBRQDjO8Zk+K8EiW+jvda9cR6Xd63awXNtIIBbxx 4Ysx3R/MAU3YkLJnqOBj0+ql1Z2l95P2u1guPIlWeHzYw/lyL911z0YZOCOR SuB4Z4yTRZvGHgey0zxHBrEL38UEjW5tVkto0kjEaJJbRo8a4d8DOMjIwRmv R774dW99okGlTeJ/FBiTzRLJ/aRZ7kSYBWXcpBUBcBQAOTwSST10tjaXF3b3 c1pBJc227yJnjBeLcMNtY8rkcHHWotR0rT9Yt1t9TsLW9gVw6x3MKyKGwRkB gRnBPPuabdwPIdQ0PVfFPirT18G+JHltPD1uxh1RhALeKZlG23iEESKw2qm7 76hWwRn5W2tLudI1rxNpVxrfinVLPxNpEpjGmai1pEySSja0alYVEyuAMMhJ 2spG0sK9LtoIbW2it7eJIYIkCRxxqFVFAwAAOAAO1T0XA8U8V+N49G+JmseI NNutOlfRtOg02ezuJB5l4z3AeRYdrcFFzuYg7SpBU9R59od1Y3d5p80h0qfU bnR5xNNqMtt5a3T3koE07ThizKjK+ADIwVRypNfVlFHMByOipoPjHwLZWkF/ /aWnRxC1le0aSyEjImxlaOMqUUg58s/LgjjGDXGwae0fxJ8b/Y7WGOysorDd /wATq40uOCNbbj/UKQVAB+9gKBx1NewVUtbO0sTN9ktYLfz5Wnm8qMJ5kjfe dsdWOBknk0kwOC+DzrJpXiV0dHRvEF0VaO4a4Vhtj5ErcyD/AGzy3U9ava34 V8QeIvF+m6s2pWujwaO8gtGtE+0zTLJ8shbzFCRkoFAG18EscnArr7WztLHz vslrBb+fK083lRhPMkb7ztjqxwMk8mpLmCG6tpbe4iSaCVCkkcihldSMEEHg gjtRcDw7WfDE8+vau2hifWILO61S41GSCIL5T3kSRGCEFv30sS5cqCucBcqx Ar1nwVcWFx4K0b+yr431lDapbR3PlNF5vlDyy21uRyh4/nWtZWNpptolpYWs FrbR52QwRhEXJJOFHA5JP41ZouB4B8Gbk2/hC6Uav4hsQdQc+Xpml/aoz+7j 5LfZpcN7bhwBxzk9p8PJTN8QvHUn2q9uM/2f++vbbyJm/cv95NiYx0HyjIAP Ocn0KysbTTbRLSwtYLW2jzshgjCIuSScKOBySfxqzTbuB5ZqyIvxO1LUrTXN bn1KC1gsP7O0jSld4EkKOoaeVWi2k7ny23HI3fLg81/wn+o/8Kk/4SD/AIT3 /ipf+gbiy/5+Nn+q8rf/AKv5uvv0r3iqH9h6T/ZH9kf2VY/2Z/z5/Z08n727 7mNv3uenXmhMCLUNIk1LSP7Ok1O6UFAk0yxQO1wu0qwdXjZMNnJAUe2BxXhf i/Q9Ns9Q8P6culXtvez6pbZt5bfR0kkiYsvyrCMnJGB5n7sn73avoiq0tjaX F3b3c1pBJc227yJnjBeLcMNtY8rkcHHWknYDzXwT4Gv9K8Ya1qpivtItZPsw tVaKwDzIF/eo4hRlRdyr9zZnIJyRkJ8VF8Ja7pVzPN4ot7fVtHtbxYLa21GJ HeRk2tE6nLHO3aVGCckd69UoouB872n/AAj2ueLvCKalr9lbabaeGLP7WjXM Yjmkjkz9mk3Hb97azIQTheg6j3BNXn1TRLXU/D9vBeR3OHj+2yS2oaM5+YZi ZueMZUAg5BxjOxRQ2B4R4h8H3vhnSPCemralYV163jhP/CQ3Mm52Z2xtEKJF yT+8Rdw9CSTXovhzw/qmk67PefYdOs4bxAb+U6ndahcXLIMRANKFCBQWyfmy MDA6jp7qztL7yftdrBceRKs8Pmxh/LkX7rrnowycEcirdFwPM/Fn9k6B8S/B N3L9h023abU57mZtkKNI8KAu7cAsTgZPJ4rjlOhjUtF8IXWuaBc+G7XVrrVV 8u8Rkt7YZNvC8j/K5Z3kDJ87YI5A5r3SWxtLi7t7ua0gkubbd5EzxgvFuGG2 seVyODjrVmi4GXF4j0ObTZdTi1rTn0+J9kl0t0hiRuOGfOAfmXgnuPWuGtfD Np8Rtb1bxJqtkRpNzYDTdIMkQErQnLNc7XB2sWb923B28leQT6FdWdpfGH7X awXHkSrPD5sYfy5F+6656MMnBHIq3TA8+8G+Lbm2voPBXitHt/EcCCOGT55I 9QiVSRMrnPO1Du3YyffKr3lz/wAes3+4f5VLUVz/AMes3+4f5VMtmAHqaaMF uKdIVA+Y4qHz1B+TmiO4FED/AImSZAzvFV8f6Vfn1zirSfNfoT/eFV8fv736 GqW5M/hDmilorU5ief8A5Ct19F/kKgiONThx/wA9Rmp7g41W59SF/kKgj41O MY48xQah/EdENjWi+TVZgejDirFV7wNFcJcAZCnDAelWKhlhRWXpmv6brNxf w6fM8z2Fw1tckwOipKpIZQzKAxGOdpOMj1GdSgAornrLxp4ev9GTWk1WCHTJ JTDHc3gNskjjOQplC7uh6f3SOxxNp/i7QNX1ZtK0zV7W9vFgNyy2zeYoj3Bc l1yuckcZzyDjFMDborLuNf0qz12x0Oa9RdTvUd4LYAlmVQSScDCjCtgnGcHG cGmReJ9GlutMtodSgnk1XzfsRgJlSbyhmTDrlRj3I9OtAGvRVayvrTUrRLuw uoLq2kzsmgkDo2CQcMODyCPwqppmv6brNxfw6fM8z2Fw1tckwOipKpIZQzKA xGOdpOMj1GQDUooqhrWtaf4d0ifVdVuPs9lBt8yXYz7dzBRwoJPJA6UgL9FZ smtadbmyFzfQW0l/gWsV03kySk4+UI+G3fMo24yCQCM1pUAFFYfiPxdofhK3 gm1u/S0SZykQKM7OQMnCqCcDjJxgZHqK3KACiqmo3tvp2n3N9dSeXb20TTTP tJ2ooJY4HJ4B6VTsvE+j6lqFtYWl55lzc2C6lCnlON1sxAV8kYHJHB59qYGv RRXOad458Paq+mpY37yHU3mSz3WsqCYxKGk2llAwAevQkEDJBFAHR0VlaXr+ m6zcX8GnzPM9hcNbXJMDoqSqSGUMygMRjnaTjI9RmvqnjDw3oj3EWo69p9tP bpvkge5XzQNu7/V53EkYIAGTkY60AbtFc7pPjbw7rkV7LpmqwTxWcUc11KQU SJHUsCzMABwDnn5cEHBGK2ft1p/Zv9ofaoPsXlef9p8weX5eN2/d0245z0xQ BZoqtZX1pqVol3YXUF1bSZ2TQSB0bBIOGHB5BH4VBaa1YXuq3+lW9xvvdO8v 7VFsYeX5i7k5IwcgZ4Jx3pAaFFUNT1zSNGMQ1TVLGw83Pl/arhIt+MZxuIzj I/MVTg8Y+GLm4jt7fxFpM08jhI4476JmdicAABskk9qYG3RVHUdV0/R7dbjU 7+1soGcIslzMsalsE4BYgZwDx7Gr1IAornNG8c+HtentYbG+keS8SR7bzbWW FbgRnD+WzqA5XuFJIwfQ1tRX1pcXdxaQ3cElzbbfPhSQF4twyu5RyuRyM9aY Fmis+71qwstVsNKuLjZe6j5n2WLYx8zy13PyBgYBzyRntWhSAKKw/Efi7Q/C VvBNrd+lokzlIgUZ2cgZOFUE4HGTjAyPUVuUAFFVNRvbfTtPub66k8u3tomm mfaTtRQSxwOTwD0qnZeJ9H1LULawtLzzLm5sF1KFPKcbrZiAr5IwOSODz7Uw NeioLmeG1tpbi4lSGCJC8kkjBVRQMkkngADvWAvxA8JG/NmniCykkEXnPJG+ +GNM7cvKMonOB8zDllHVhkA6aisSw8XaJqupfYNM1BL+fYHZrNGnijB3Y3yo CiE7GwGYE49xUmt+J9I8PG0XVLzyZLyXybaJInlkmf0VEBY9QOnUgdSKANei uVh+JPgubTDqCeJtOEARn2vKElwuc/ujh88cDbk8YzkVuwapZ3Gjxaulyg0+ S3FytxJ8iiIru3HdjaNvPOMd6ALtFc3/AMJz4c+zz3a6qklnb3EdtLdxRu9u kkmCoMyqUxyMnOFLAMQSKv23iDTbzXb7RLeZ5L+xRHuYxA+2MMAVy+3bkg5A zng+hwAatFFFIAooooAKiuf+PWb/AHD/ACqWorn/AI9Zv9w/yqZbMCsxHQnm mhSalnjwQVHNPCZAParihlIDF+PqKgI/f3n+6atAH7eufUVVbPm3Z/2TTW5E /hGUUuKK1OYmuXWO+vXY427MZ+gqpbzb76B8jaZASaNXQyahKmcLjJ/BRVax +W5hRRn96OK5qk+WR009Try6MCcgisO91e+tbt4YfDmpXka4xPBJahHyAeA8 ytx05A6enNaXlNI52nYcHtmqeoz63HcKum6fp9xBsBL3N88DBsngKsLgjGOc 9zxxyoS5imjz/wCHer31v/wlfleHtVud/iO8kbypLUeUx2ZRt0y/MO+3K88E 11Oo6vPb+FxqHiPUF8LOHDn7PdRTsRsLeWTJCQz/AHvlRWJ2DBOSKzPDGjeL vDf9tf8AEv0S5/tLVZ9R/wCQnKnl+Zt+T/j3OcbevGfSuumubu30/wC0NYS3 F0EUva2kiMSxxkK0hQEDJ5O3IHTPFagfPOmasdL+FXhXULldUay07xHBKVkj hETBGnkf7PjDtxjJc43cKeDjv/DWoXmrfGW+1Ce2up0fSkSGSM2/lWUDv5iI 5ilkDlwAwbeGO4nZsIK5svhHW7T4ZeCNEudF+1Xtrrscl1ZtiSMRmSY/vGQO BGQy7jggA8jtXR+CvDGv+DNRFlLaWN9Z6jiS5vYJWR7ApHtSD94WeWIAIsZy CvzZHSi+gHJ+JNVEfxNla51bRFmvv9BtbqLWpYv7LghO6VbgQmIlpCSQrOMO MbsCsKDQLbxZ4h8RaxBq01nJ/al9apPpugz3qTwOgT78X7vlGbkDed5Yk5Uj 1TxjoniHUPGvhHU9Cjtcae90Li4uvmjhWREXJQMrOcBsAHrjJA5qloXhC60+ PxRe6hZ6u01zrdzc2tvp+rPAZoXZdr4WZEB6k7iGwMegoTA1fhZfJqPw30e4 SytbJCkiLBaqyxqFldeNxJJOMkkkkkk9a5fw9Y2djqHif+2LXxRbyz69dzwf Yo9RSOSFiNrjyPkOSDz1Ix2xXQeA/ClzZfDfSdD1yO6tLm2eV5I7a+eJgTLI Rl4XGRtYHGSOncVr3HhTTooJJUfXp3RCyxR65dhnIH3RumAyenJA9SKAMXRd U0NvGkGj6fD4oe9W1a7L3t1drCkeSmWjuJAW5IAwjDJBzwSH/ELRNK1i3tR4 l1N4NEV/Lis7aAmae7cFI2Vl3M5UMxWNV5OS24DFZngSx1DUvHGoeI59O1XT dNtrBNMsodVWT7TMC/muztI7MdrZAPQhgBjaRUvxO8NW95NoWoWnhxNRuzrl q16YLRHllgUMGV2OBswFHzkL0yQKXUDlvC1vpvh3xLa+IPGmm/2FcrFHa6XJ Hpv2S3mEgcebN5RZEnKlgyMVCDnB6r6je+MtBtNFfVYdRgv4PNFvGthIs7zz nG2GMKTukORhffJwMmvNvEnhmW98eeCpdD8DTaPFbX/nXciW9siFFeJss0Ls BgK+NxGc4XJyK9XEMWh6V5Wl6Ruih/1dlYpFF1bnaGZUHJLHkd+ppsDxnVpr 7XLtNa1qLS9UmudZTw6mizCTyNODjdKPM2g+fkKDKgYDkjcNoXvtF1DxFY6i uirAviPSbe4Nu2tRX8Xn24H/ACzuIyQWlQ43MCCVION2QeOn8LeJLq2ktrjw ndTQy+LzrUkck9oyvakYMZBmwXI/h+7716Zoly9uIdNtvCV9pNku7af9EWGL q33YpmPJ9FPJ57mkwOO8b+Ibrw+df0XWrtJNN1fSbuXTLmYJG0cwjIa1+UYY YZWVmAPO3LnFc1Z66vh7XNGvlZDd/wDCBW0VlCys5uLlpB5UaqvzMWbHA5xk 8AEju/GttJ4h0nUtPbwVdXt0LeeCxu5vsbLG7KVEiFptyAkKc4B4HGRiuX0r wzqsXirw7quqeDr65i0fQYLGNRcWjFbuNv8AWKDOAVALYJ5BwcAgEMDrLi88 V6P8MofNWfU/FlxEsK+VAo2TyngttBjCxg8s2FOzkjdXgNp4rt9G0XwjPZa5 etqGmRajugjt4iLOSTcItpePDK5ILZLkDONpwK+p9LlvrnT7efUrRbK8kTdL bJP5wiP93fgAnGM4GM5wSOT816D4N8W2vg7U9Ml0m6t4ddntIzE1hJJOyRys WZcMFiKkqcTbAykkMMciA7H4W3+o3mpaHp9nq19bW1zp82saisqwTNdy/aWh I3mIONzIWLMzNtIUEYDVkfETWdR0vxD47tNKn2XWoS2MM0KIrvJaiymMxCkE hQNpLD7vqK7zwvofiLw34svdVl0GB4PEsq3F7HaXYJ0xw0hw3mH99nzAWKEY IfauAoOdr/w8j8ceOtT1CKK90e3itWtW1EB45Lu6KhDhGOGgWP5SVCbyWALD kF9QOK8KahZ3fiG40a+1G5ttO1DTdMW5tLayuHur0RWagxLsQlYjlizDllA2 naxNex65Olz8J9Yli06bTYjo1wI7OeNY3hQRMFUopIXgD5c8dCAcgecQ+BPF 2p+NtZu4V0/QL2xSyltby2t5DE0sdv5YigYqoEJBO9cNjCLhgDn022t9a8S+ Bbyx8QWMOlajfWstrIkMonCbkKb8DgckkKGbjGWznAwOf0vQ7HUdD8AXcWrp pesxWVoUZH2y31skaPJb4DKXTIVjkMF545NWPAsjX/j/AMe6tFE62b3lvYo7 lctLbxlJOAScZKkE9Qw75Ax/DulXmhwC18KafqOp6x9nhgfWfEcMtvb20IDH yY0cCTZleEQEAupZjtArb8M+CNV8H6xavp+sfbNLuYnbV0vS5lmujuIuI+SA zEhSMj5VGS7YIALfxQ1Gaw+HmqR2qpLeXyrY28BBZpmmYIVRQcs+1mIAz0zg gGvPZNU1C38OeE/E9lbW0reHrI6RFps8rJdnU3At3RogrbwFUOIwUcgkkjpX Y63Nd3fjW0utS0jU5LPSZd2mWFramf7bM52faJH/ANRGqclAzq45YlchTial 4J8SSeJbf4g/2RpF5re+NpNEZmxGoOFYTNJsMyoFGdoQEFgCQCRaIDtPFl7Z WXw/un8Wx6dOWsyJ7UzeXFcziMt5cTN8wJZTtP3hgEcivI/DeoXmi3Gp2HiL V8iwsbFore+1y50swKbYOY44YQxkZRtUjG7Kg4yxr1Hxvpuq+M/hzrGm2umT 2N/Ls8q3vZYgZNjpJwY3dRnaQMkc9cDmuI13wBrD6e/iK4Lv4gv7i9/0KG2N 2wW7iEKQPMGUKkSBv3h+RcnAIADCsBS+E2p6Y9zoelabp39qavYfbBcXs97K kNpAZF/fQRuCPnDhcKqNkHdgEmtr4wxFb22l0G4urTxKtlNPPd21zJH5Wnwq 8jK4RuA0hUKSuCwxkYqr4Z8JeKvhXqFlFYW8GrW2tXVpFqFxHG5+xBS4f5Qc lcPkSnAG07lGRXWJ4d1C5+L2qard6UBok2jfYRLNcLMlwxZGI8oklFxuUrja dpPVqOoHALq1rca18N7m58dO8osp2urh7m0LWDtbJ8pJj4LNlf3u4nHXOTXZ +BfFf9nfCDSNZ1u8uru4leWJNzNNcXUpnkVI0BOXc4AA9B2AJF/XtKnX4ieA nsbBxYWSXyO0EJ8q3UwKqA4GEBxgDjpgV195cSwWjzxWc95IuMQQFA75IHBd lXjryR09eKTYHiWrTX2uXaa1rUWl6pNc6ynh1NFmEnkacHG6UeZtB8/IUGVA wHJG4bQvfaLqHiKx1FdFWBfEek29wbdtaiv4vPtwP+WdxGSC0qHG5gQSpBxu yDx0/hbxJdW0ltceE7qaGXxedakjkntGV7UjBjIM2C5H8P3fevTNEuXtxDpt t4SvtJsl3bT/AKIsMXVvuxTMeT6KeTz3NDA47xv4huvD51/Rdau0k03V9Ju5 dMuZgkbRzCMhrX5RhhhlZWYA87cucVzVnrq+Htc0a+VkN3/wgVtFZQsrObi5 aQeVGqr8zFmxwOcZPABI7vxrbSeIdJ1LT28FXV7dC3ngsbub7GyxuylRIhab cgJCnOAeBxkYrl9K8M6rF4q8O6rqng6+uYtH0GCxjUXFoxW7jb/WKDOAVALY J5BwcAgEMDrdQj1iH4N6omv3X2jVjoty90/lomHaJzswny/Lnbkddue9eOat r93J4El8OwapptzpMXhm0ujb2ECIIbg3cIYSEMxMvzHdyoJbO0Hk+zeKIvEm veBotOg05LHUNVdLa+CTpMLG3cnzWywUSEJ8pVcHLHaTgE1Dor67r+kafFZT 2XhvwvKrRrcKym7uY02xeXnD+XEOd5OHJxhgN1JOwE/h3XdVv/Ft94eGl6Zp llocUS3KQyvN5nmRgwrD8kYRVAOcqegAA6jk/HD21x8QdN0a11q9uNXuNzzT pKfN0m1X986Wywx5E0iKVBO5yqqpyHzXW+G7G6t/ib44u5bWeO3uf7P8iZ4y El2wkNtY8Ng8HHSs/wAUeFLS++IPhDZoEE+mtLqE+oYsw0JkeJcPLxt3MyjB bkkD0oW4HBRWknh74dz6PqEV3Ei28sL3sl3rFvboZWYKTD9lEeMuBtPDHr1r 0WKO4h+DVh9us4LdbHS43vLTU7AXW5IYskeV5iDcSgYbm46EA9OT8bfDuLSf Ct9pOiaD/acuo3Ua6dNDYRGawzIrMks5beYyAwViPlHys2MV6ZN4Q8P3GmDT Do9rFp/2hblrW3TyYpJFxguiYDjgcMCDgZHAptgeBeH/ABte2ng/wx4b/ta2 sLK6uzBeJPYYc2kkrB5BLLvheL5pASVUqUxhgCa9B8Eix0r4kzaB4c8RrfaH Jp8mqzxwtbSI100gjK7o4xtULsIRcYwO3Bp+F7fxBffCi08FW2k6hp13MkkN /f3tt5UVtDJNKzhVkw0rlOMKMDzAS6kVpeEdJ8T+DLufStO8OZ0efXZ5WZ54 iEs3CpG6t5u/coXJUoxYdwaHYCx8aNMGs6D4f0ozeT9t162tvN27tm9JF3Yy M4znGRXpdYviGw1jUrGOHRNb/sa5WYO1x9kS43JggptY4HJBz7e9bVIAooop AFRXP/HrN/uH+VS1Fc/8es3+4f5VMtmA6ReCTRGD5YBpzDJAp4AGBVxGUGX/ AE1fqKpMMG6P+ya0WH+mL9RVCUYS5/3TTW5E/hIuKKSitTmJLlBJqdwjdGGP x2iqVmo+2pxyZRk1enUtqVxg9GU/koqnbgLqzxgEL5owK5qyOmm/dOkDAO2T 34paQFVQFvXHIpamCsWwooorQQUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR QAUUUUAFFFFABRRRQAUUUUAFFFFABUVz/wAes3+4f5VLUVz/AMes3+4f5VMt mBMoyTT+4pgypp3Ug1ohlU/8fo+oqlN/qrn/AHTV0/8AH6P96qUvMNz/ALpp x3IlsVc0UlFamRZlH/EyusdcL/IVBsP9pxuuclwCB3NTyf8AISuvov8AIUyL /kIx8f8ALQVjNamlP4TWbLMu7PGRg0+lZQWJ75zSVLVjR7IKKKKBBRRRQAVg eJ/Ef/CN/wBi/wCifaf7T1WDTv8AWbPL8zd8/Q5xt6cZ9a1r2xtNStHtL+1g uraTG+GeMOjYIIyp4PIB/CvnnxNomk+ML/RtW0qwh0vw1cazBo1uttZpBJd7 yxkuAdgwvARQd3KsSFOVLSuB9DS31pb3dvaTXcEdzc7vIheQB5doy21Ty2By cdKpeIdes/Dmg3er37OtraoGfYu5mJIVVA9SxA5wOeSBzXF/Dq/0G3nn0W4g 0Gz8XWTvZ3ZsIYYvtQBLboymNwKqCyjBVlOVXAFaGvQte6m2seKimmeGdAuB dWsbyKXup14WdypJVAWwkY+ZifmHRaVgNWx8W/bvF1vof9nT2/n6Muqb7htk ke6QJ5Tx44YZ5+bg8Y71vTyNFBJIkLzuiFlijKhnIH3RuIGT05IHqRXntzaa r400Cwlubu20Hxlbu+paZbrjzrWEkoqSgksyOMByFUZIBT5Sp7Gys9Sv/DqW viJoVv3z550ueaFBhyV2OCHHAXPPqOlUBB/wkGp/9Cdrf/f6y/8Akio9P8WR 3nih/D1xpOo2F+LI3wFz5LKYt4TgxyPzuPT2PtXi9x4iS6+Gj65ca9p017Kh STQpNSv2kdTL5ZBBvckFfnxs6e3Neh6VYQ6b8abezggtYEj8KYKWkAhi3G7y xVATtBYk4yevU9aVgOk1nxrpWiX/ANguE1GXUHR2t7W30+eRrkqu4rEwTa5A IzhsDuRzWFe/FSy0/U7u3m0nUXgt3itQ0EfnPNevgm2TZmMugPzZkByCAG61 wPxF1nxJp/jvxNf2/wDxK3ttCSG1lADSy2zXcaF1KudjF2fDdQoHyqx3DBsj a6b48tNP+0wQ2Wnaxqtvbx3GuT2i28IVdq7hkwqSWwwyZGLK3TNNID6drgtN +JcOof2eItGvrj+1rq7i0r7LJE32qG3xmU+Y0fl5+b5Tz8p9RnK+H+j3Gv8A wN0rS4b/AOxRXXnxXUiwiR2gM8gdEycKzDjcQ2MnjOCOKtNWksfhV4c8SXK6 1b32jRXcGmahHLaPE8kjNGqFJXMjKAoXATIVWI4AISQHrdh4uuLzxs3hu50O 8sXGnf2gJLiaJmI80R4Cxs4xz13Z4PHQ0ut+NP7M8Qp4csdF1HU9XlszeRR2 /lpFtyyjfI7DYNy4zg9RjJIFcZ8O9RvfFGs2niuCHUdRu1sv7M1C91Ge3t4Y iGjkZYY4YyznLMRu2jHBbJ4j8d6fPq3xNv7G0sr28ubjwlJFClpdCDa7TMFa QmRA0eSMqd2cj5TjgsrgdPb+PtQmvr7RU8KajNr1jbpLc20E8Jt4mdAyIZ3Z RkhgDhTyG2hguT1Qu9Qg0f7TdacZb0fetLGdZM/Nj5Xl8sHjk5x3Azxnwm2l 1zw54c8W+ItL1Cexk02HS9NYIkMiPcwxRQzowdWPyFiAVIBzkFhXuVvZXOja HFZ6az6hPCgVG1K8fdIc/Mzy7XOeSeFx0AAHQYGNa+OJL7VtQ0q38L63Je6d 5X2uLfaDy/MXcnJnwcgZ4Jx3qfwz4wXxXaWt9YaJqkenXO/ZeTm3CDaWByol L/eUj7v6c1ynhm58RR/Ezxy0OlaY1y39n+fG2pSKkeIW27WEBLZHXKrj3603 4Q/8JFJ4B0Bbf+yrfSU88ySSeZNPN/pDfKFGxY/4/m3P/D8vUUNKwHXeNfFq eDLDT7yW1NzHdX8dmw89YvLDBiX3P8vG3+IqOeWArBuPixp7ahpNla2HnSX9 /DaE/wBp2cnliQ437YZZGOOOoA/2gcZzPiv4j0iSDQILbWbV7uz1+2eaO1uo DNBsDhjhztUqe74UHG7iuf8AEniu0v8AUPDBk168uIoNetJ5Ptl5pbxxqpbL n7Md4wD1b5QM55xTS0A93rA1rWtU0vWNMt4tDnvtNvJRBNd2sm57VznBePb/ AKvpl93HOR0DaFte6T4gsZvsl1ZalZPugm8qRJo2yPmRsZB4IyD2NcD4l8P+ HdQupvCfh7w1on9qSxf6beixjCaXC4++SoBMpGdiAg/xHCjlAehWt5aX3nfZ LqC48iVoJvKkD+XIv3kbHRhkZB5Fcd4n+IE/hq/vLO6t9FWWG1e9hil1WWKS eEEhdubfZ5jFSAgcnPqOa6Pw34c0vwnosOk6ZAI4I+WLcvK56u57scfoAMAA DhfHFnDqOvT3ljHrYuZbCXSLwJZ3McbQFySFb7FMGySfmUjgDBOaSALL4vfb b+1tTb+H4PPsEvvOn1/bHHuIHku3kcTDOSnYd69G0u6mvNMt7qdbYNMm8fZL gzxFTypWQqu4FcHOB179a8Kisp9Ujmj03UNRRorL+wZp1tri7EFqrDfC0a6c mXCk9XVskZavSLyXSYPBGn2Vv4X1HxDDatFY2tpeacVbzFjISSQTIoRMcGXb gbj7im0BnaR8XIdaHh6Ky0n7Vfat9p86ytb6JprTyslch9gO4At8xXgHG6uo 0/xYl54obw9caTqNjqAsvtwW58llMW8JkGOR+dx6ex9q+e9Bk0ew/wCECe+g 0KcSpePNDeWxhVleR4ozcT7ZA43K207Bs284B3DtvgwbeHTdKSwn8L2l7cec boyTGfUbkCTPliPKeUuxCerjhW28mm0gPXdR8R6HpFwtvqWs6dZTsgcR3N0k bFckZAYg4yDz7Gua0n4peG76HVp77U9PsEsLua3QNerI1zFGARKijBIbJwFD ZxwTVf4k29y2j3OpXFpbQW+lIZ7bUoNYe0vIyVAZUPkMAX+5t3ENlehxjzHw jNf+KvEt9p2oaXZCzbWrrVE0nUJpLfz7vADRl/Jff5SnmPCk78sCoICSA+iL eZbi3inUOEkUOokjZGAIzyrAFT7EAjvXDS/Frw/Pq2lWelX2nXNtdq8t1dXV 59kW0jVgoyHXLOx3YTg8AnCndXaaYNRXTLcau9q9/szObRGWLd6KGJOB0yeu M4GcDy3wjrn9l3viyD/hKfDukbvEd6/kanFukblRuB8+P5eMdDyDz2AlcD0P SfF2g63qV1puk6va3l1aorypC+4bT3VujgZAJUnBIBwTU+oa7a6ZcLBcQ6gz sgcG20+4uFxkjlo0YA8dM56eoriPh5efb/iH47uf7SsdR3/2f/pdiu2GTELj 5RvfpjB+Y8g9Og2fEuralbePfB2k2l89tZ6g9210iRoxlEUauq5ZSQM5Bxg4 J5BwQW1AsJ4/0S4t7uWwh1e+e1d4pIrbSLpmEqjmM5jAV+gwxGMjOK37O4ln tEnls57ORs5gnKF0wSOSjMvPXgnr68V534Bl1uKfxgumafp9xB/wkt6We5vn hYNleAqwuCMY5z3PHHPd6jazajoDQXOmafezyIhksrqUm3ZsgkFjGxIBGQdn JA4HZgcdpnxXsLnw7pGo3lhsvdXuhBZ6ZZ3Uc07Au0auwfy9ql0Zc8jpzyQN ew8fWd/q+kaf/Zt7F/a3nfY7nzbaaGTylLP80Uz9MY+v448Q8JwyXmheFb20 sNFNvpOswPqV1BExvoQJZH8ydtoCQBMckkfIPmGCq9J8KrfUddg8FXltZf6F 4futTt7qfzV/5axq6NtODyZNuBn7uTjNDQHr0mt31v4oi0qfRLprS5Xdb6jb nzIlKqS6zDAMRyAF+8G3DkEEDEtfiNYXfjWbQxaTxWMUjWa6nKrLDJfKebZT txuxnBLDJGADlScrxpcazYeKNI0yHxRfW9hq8WoPPva3gECxQ71CzCEtGozg udzADPUZrzjT7u0v7trV9AurLwymh/b30e51bUPJUfaB+/8AljYsDkN8qlMf MWBBASQH0Jq2p2Wi6XcalqNyttaW6b5JX6KP5kk4AA5JIA5Nc/p/ijxFe+bL deB9VtrZsNast1bGR0OTmSN5EMbY2/LlsEkHpzXit7PRfBdg8Og/2tIsscmn WVtdSahGsuMQtHPKP3UYUA78KqAnGSfm8+8HaTr+v+H21i+jvr+z1+Uyao1j NH9pu1ieRBC7SSRLDF0G2MOxAYbkUqoEgPUfCXiuXxZ9vuINJns9MglENrdS zI/2phkSFQhK7VYYDKzK3Y8EDpq8s8HW0+q6xZa/4SF9onhUxSeZZXsolhun aZt4it1kIgwQ3zAjnaAmN270eTVdPh1OLTZdQtUvpk3xWrTKJXXnlUzkj5W5 A7H0pMC5UVz/AMes3+4f5VLUVz/x6zf7h/lUy2YFgjI5pF6GnEZFMI5x61oh lYn/AEz6Nmqcv+puf901cxi8b61UmH7m5/3TTjuRLYp0UYorUyLMv/ISuvov 8hRF/wAf8f8Avih+dUuR/u/yFM8wRXaN/tisZ7mlP4TbYheT0ptMuX3ARoeS efpT6llhRRRQAUUUUAZ2r6NZa7aLa6nb/aLZZUmMLOwR2U5AdQQHXODtbKnA yOK5PxR8NNI1P+xv7I0TRLT7LqkFzd/6KkfnW67t8fyod2cj5Twcc13tFMDH s/Cnh7T7lLmw0HSrW5jzsmgtI0dcgg4YDI4JH41Q8W+F7vxOdPij1KCGyt5T NcWVzameG7YY2CQLIhKqQW252k4yDiunooA898QeB9f1HTLO6tPFN1N4h090 ls7m4ht4YlkOBJ/q4d4Rl3fJkg8Bs4r0KiigCh/Yek/2R/ZH9lWP9mf8+f2d PJ+9u+5jb97np15rA0/w3q//AAsm/wDE+o3Vk1t9gGn2UVvG6uYzJ5mZNxID A/Lxw3XC9D11FAHE+Mfh9ZeJLm61XyftWovYCxjtbm7kgtWAk8wNJ5Q3thuc ZwcDocMGWXw5i0uHRbmz1J21rS3uJheXMIkW6muABNJMoKs5xwvzgjC5LY57 milcDA8GeG/+ER8J2Oh/a/tf2XzP3/l+Xu3SM/3cnGN2OvauPh+FE0fhR9Eu 9WTUo7SyuItLge3MEMVxL5h8+QbnLuDJhT0QZIG45r0+ii4HI6F4Lj0mHR7p Luay1K3sLezvzZMvlXvlKoHmK6HONpAcBXCsRkcYjHhnWNNfXr7SdQtX1jWr 1We+uYiotLZV2oqxjKyPGucZ2hicseMHsqKYHC6/4BV/hXN4M8PskICRrC93 IxBImWRmYgE5JDHgYyeAB06rV21dNPf+xobGW9OQpvZnjjTg4Y7VYtg4+XjI z8wrQooAw/DfhyPQIZ3e4e91K8cS32oTACS5kxgcDhUUcKg4UcDuTV+Hvh+7 8K+CNO0S/eCS5tvN3vAxKHdK7jBIB6MO1dNRQBxuveFdQ8X3rWuvXC23h2Fw 62VjcMXvWD5BnYou1AoHyLnkk7/lWr+r+E7XUo4bizurrTtYtbcQWupwzO0q KGDBZMn98m5RlZM5y3QkmujooAwLrQr/AFPw1DpWoeIL6K7Xb5+oaYq2sk20 8dd+zPBO0jJHGAStZml+CpvC0jw+EtTTT7CZ2klsLy1N1EJCqLvRt6SA4TkF 2HzcAYrsqKVwMSC28TrcRm41fSJIA4MiR6XKjMueQGNwQDjvg49DWfrXgxfE uptcavcpdWcCBtP0+SFvs8Uw6yzKHBnOeApKqFLDGWJrq6KYHn+h/DrGkXZ1 +ZBrNzqVzqKXelSyQtZyTKEYRSZDYwM4PB4BDbcnrZrTUbPw6LPSLtJdQht1 jgn1PdKJGUAZlKkElscsO5zg9Dp0UAeM6b8F9R0rTdHkg1W1uNYs9Stboy3M bGK1hj3u0UQHzMDJIWIygbA+6eT2ll4Y1xPiG3iTUr6wuIv7I+wAWsLwMG84 ScozOCMZ53dwNvGT2VFK7A5uTw3NqPiOLU9Zv0vbeyfzNPsY4DHFBJk4lfLN 5koUgBuAvJCgnIytN8BK2meILPV2RhqGtz6rZzWkjLLaltvlurEApKpB6ZHb kEiu5oouBn6Rp8ulWC2kup32o7MBZrwo0gUAAAsqru6Zy2WJJyTXJ+F/C/i/ QrTUGfWdEiudR1CbULiNdPlmRJJCMhG85Dtwo6rkZPJ613lFFwOR8MeG9X0v xZ4m1jVbuxuP7V+y+WbWN4seVGUOUYtt6j+Js8njpRrvhXVtW8WaTrttrFlb HSfO+ywSae8ufNjCPvYTLu6ZGAuM85rrqKLgcTofhLxDoB1P7J4g0t/7Rv5d Qm83SZDtkkxuC4uBheBjOT71YvdH8WyeD30hPEUE2qzyhH1b7P8AZnhgJBYq i7g0gGVGCnUHIIyeuoouB59d/DiC41i2t7S0tdN0OGy+wytaXMv2i7t9wfyG GAsaM5Yu4LO44yNzUaV8PdR0LVBLpXiBLLT/AO1pNSNpBZMoMcmA1uQJfLKb VABKZUjK46V6DRRcDhfEHwz0/wAR3N3eX+pajcXzuJLJ7p1lhsWBBwkGAjId qhlYHcF65JNSv4N1WXWLrWJtQ0aa9urY2czTabcSI0BwTH5bXZQKSMkAc5Pq c9rRRcCho2nf2TpEFjssU8rd8tja/ZoRliflj3Nt688nJye+K5Twh4Y8TeGf CWn6LFqmkxPapIJd1lLcBmaV3yrebHxtZRgr1B5Nd1RTA4rwn4N1jwzp+n6W PEm/TLDeRFb2CRvOWk34kd2k+XlhhAh+brxWjJ4VhuvG0Xii9mSWWzt/IsYo 4RGYdwIdnfJMhO4gA4VQTwSd1dJRSuAVFc/8es3+4f5VLUVz/wAes3+4f5VM tmBYDA5o4qM/K31p4rRDK5/4+D/vVUnH7i5P+yatn/j4P1qtcf8AHvcf7hpx 3IlsUKKKK1Miw3/IVuf+A/yFRSx7plHcuMVK5xqdz9V/kKc6fOp9HFYVNzSn 8JfUH7U0mOMYAqWkT5irVx2u+L9Q0WHWLk22gTQaUnmTJ/bLLMqkExhk8ghX cY2qTyTgE9aRodlRXlfiT4nwN8LpdX0zWdLs9fljhljtILyK5ki3SJlSrAZY ITuG3g59M13+naxDr2kNe6PLJ5ciHyJrmzlRSSoKuEcIXTkHIIB5APoWEatF cF4n1nxd4b/sX/iYaJc/2lqsGnf8gyVPL8zd8/8Ax8HONvTjPrXQ6RYeIbbU 7qfVtdt761mRRFaw6f5AgYd1bzGJB5yGzzjBA4LA3KK5HVvF9zYavqtlDb6W V021F7N9qvJ4ZDBty0gQW7B1BBGUZuQAcE4rk9I+Jfim90DVJJ9A0221Cz0v +1AZr10W4gZGdJIogjF1AChvnHzHBKk4CsB61RXOaRr+p3fg/SdYm0d7q7vb eOWS306RMKHXcGzMyADGMjJIJx8wG6ue8Q+L9etfEPhqx0/Q9Vt7m7un8yzu DaMl1bomZcMJSVkUYK/MoPOd3SiwHolFYkGt6hPPFE/hbV4EdwrSyS2hVAT9 47ZycDrwCfQGptd12x8PaZ9uvmkILiKGCFd8s8rcLHGvVnY9B+JwASGBq0V5 9oniPX9AdYfiLJa2h1FjPaXsbqttASuTaO2AEdQCQWLBxkBiV57q5nhtbaW4 uJUhgiQvJJIwVUUDJJJ4AA70mrAT0V4e/wARNcv/AAzd3ula1513d309zHbx 20Ms2maXCWLO6YCiThRiRiGBUKdxJr0HS/E+rajFor2nhvVJ9Nu4kaXUbq5t I3CMoKSeWjndnOWAC47Kfu0WA6+iuQ8Z6/dW2i6nZ6L/AGrDrUcW+2lg0ie5 RnGGCBvLMZ3D5c5+Xd6jFc5pfjvUfEOr6ewOq6fZadEq6uLXR5p/tN4VUvbq PKcxLGchiSGO7AHR6LAepUVSgvftunG6soX3sjGKO7jktiWGQAwZNyAkddp4 5ANeYf8ACx9Vudf+wW3iLwZDFH+8uriaRzDCrP8AIkUhlX7RJs5bCIoIwSCe CwHrlFcb4KuLzWbKPU5dc125gRzHi9sbe2ivBsBE0aiIP5Tbty/NnjBzg5oe K/Gzadr8sVvcvBpWgItzrsqRK0jGQf6Pbx7gcl2OWOAAMfOpzRYD0GivI7v4 ja7Nrh1fTLWRtDiuIdKi0y5kW3mutQkGWRt0TGMx7trAsq5QEMeVPe3XiEJ4 Zi1q0uNFliO3zppdT8u1Tna22cRtuw+FGVGfY8UWA36K4I/ET7F41/4RvW49 F07Za/aZrr+19yx5OFjw8SfvDkNtJHynPPQ1/D3j631H4j+IdI/tT7fZD7Kd MWztzOgBQCVjJEpwodlBZzgZ6jmiwHotFcd4g8Q3Q8b+HvDGm3qWtxcOb69d ghJtkDfu1Vx8xkYEZQ7lCFsYrA0/xN4s1v4W3PiyPUdItH+xXU6wppsjMhi8 wcO05GTszypAzyD3LAeoUVzGnavrEnw80vV7ay/tfVprC2mNv5yW/nO6oXO4 javVm6dsCuX8W+NPEOlXml2ok0HTgNShjvpl1XzljVlZlhmBg3RCQA4kCnG0 k4HNFgPT6K8/8PeNNe8XanbT6Lp2kSaDEzJfXYvJiS/y/JGHijYOAwblCrA4 3Ka9ApgFFFFIAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACorn/ AI9Zv9w/yqWorn/j1m/3D/KplswJZeAPelX7gpkhzKB6U7PIFaIZCebnHq1V Lg5t7j/cNWs4vB/vmqUp3Q3P+6acdyJbFT8aKXFFamRZKg6rcfVf5CpXAa4C epFRHjVLg/7Sf+gipgM3wPowrKRpT+EuQfKpQ9QK8c+MqJq1wsOj6Yl/f6ZA bnWJVmaNYrNSJBBNgruDsN4XdvHlkqPmzXssqESb169DVRdK0+O3u4EsLZYL x3e6jWFQs7OMOXGMMWHUnr3pGjPI/HC6tcfDjxRrf9oeZ4c1aKxvNPs52eSe BneEvliSEXOfkBZeeNuCG9evLKO+tHtZWnWNyMmCd4XGCDw6EMOnY+3SsXxF 4N0nxLp9ppl0bq20+1dD9ls5jDFLGuMROg4KfKuOAVx8pHNdJQI8s+Inh2xs /wDhE/Kn1RvN8R2cLebql1LhTvyV3SHa3HDLhh2IruLTwvpNnqsOorHcz3lu jpBLeX09yYQ+N2zzXYKSAASMHHHQ1X1XwXpusa9p+q3lxqLPZXC3KW32x/Ia VQAjGMkgFcZG3bkk7t2TXR1NwPMviLZP401WHwto0UB1OCKWa61EswOno8ZC xsVx/rs7SuW+TLbDwRwvj2/e4svDFwkcvh65vNKaw1xI7ZlazshNEvMIJKRb 9+3oXUhcnOK96TTba3t7uKwRLF7l3lkltokVjKw5kOQQz9Dlgc4Gc1naX4U0 vSrK6t0he7e9RVvri+kNxLd4TZ+8Z87ht/h4UZOAM00wNax+yf2fbf2f5H2L yl+z/Z8eX5eBt2Y424xjHGK4OSzi8afE66ZmmfSfD1qbVJYZ3gIvpSDIY5Yi CdsYCOpYYJxt5zXQw+DbHTvD50LRL3UdJsy7Nm0uN7qGBDKrShygJOflwQeQ QSczS+FdOXw1FoVkbrTbOBNsB065eB4jgjduU5Y5Yk7twJ5IJpgcp8MbI/27 421EzOwfVzp6xySSSsFtgVVjJI7MxIcdTxt44wBN8QbTTbC+0fVX066vtTu9 Sj0+2b+2Lm1W3aZSpZShIQEIA21RnOTnv12haDY+HNLFjYhyC5lmmmbfLPK3 3pJG6s7HqfwGAAAutaBp+v29vDqMEkot7hbmExzyRNHKoIVwyMCCMnvU31A8 18U6Qmnz6HPrnhW11JrjUYrKzFz4mvblY5ZDkFllixs+Qbhg5wODXcS+DNK/ 4RWPw3atdWOkI/z29tOQZYyxZ4mdstsYsc4IOOMgZFPk8E6LNcWk1wNSuWtL hLmAXOq3UypKhyrhXkIyPp3NdFTbA8X8GaLp0HwD1HWUt86hcaNfwNO7s5Ea vMQigkhFzyQuATycnmug+HNwosNDCSeJb2STSIY2a4t2hsbNURThcrGrliwA YeYxC/eC5J6Gz8FWFh4Fbwlb3t9HYNHJCZt0ZmKSMzOMlNvO5h93oeOea2NJ 02PR9HsdNhd3hs4I7eNpCCxVFCgnAAzgelFwMvxBearpFvd6o+u6RYaVAgdj dafJKyDAHLLOu4lugC5OQBk9fOPBt94p0DUFstbm0zQ5vE91NqVqLmzebdO5 AeFgJkMbY8sqpBzuwTuG2vSX8LWlxra6rqN5falJDKJrS3upB5Fqw34KRoFU sN5AZwzDAwcitHV9G0vxBYPY6rYwXls2TslXO0kEblPVWwThhgjPBpXAbo9j e2GnpDqGrT6pc8F7iWKOPJwAQqooAXIJAOTz1NeMa1rOrIur+K/7Q/4SC20e WKWzlu9LeHTvM80x/wCj7bgCRlMjjzGRyPLGGHyk+rQ+DrL/AIR5tEvr/V9S t3dmllu9RmMsu4EFWZWXKbTjZ93uQTzTPEHgbR/EdnbWd095b2UHlqbSzuni gkiQ5EbRA7NuccgBhtGGGKEBzvhC/wBR/wCEuuIdR8TvFPcO8j6Bf6e0MgJ3 Dfbu8zlkzEzYRnQAnAXIxg+K/D9nL44N3rWh+FNO0yJJxEbvU0tG1R5RhpWY RFiUBHGAVdtwdq9Wu9FsL3VbDVbi333uneZ9ll3sPL8xdr8A4OQMcg47U220 PSrLUJtQtdKsre9n3edcxW6JJJuO5tzAZOSATnqaLgeHeDvBCatrVxqWjaVo V/o+la3qESx3dwxF1E0aLEu7ypAyIMMpJOSx4HU+ieD4dL8K/CO3h1nU9Mu9 NtopxcXMEnn20iNK+VBx8+d23bjk8YNbieCdEhuLue3XUbd7u4e4nFtqt1Cr yucsxVJAMn6dhU2l+FND0vTbfTrTTUNlbXH2m3iuHacQy9mTzCxQ5JPGMEk9 SabYHjvhXS9fW51/Q7S0l0DX72K11bSpJ7yRvJtY5PLWGYhm3KqNsCOnPO4c LjvvBomX4n+OxcOklyE00SPGhRWb7OckKSSBntk49TXcfYbT+0v7Q+ywfbfK 8j7T5Y8zy87tm7rtzzjpmsjw94R0/wAO3ep3drPfXFzqUqyTzXty0z7VBCIG bnaoJAzlueScDBcDjPE2ix2Pxa8I3GjiC11O/l1Cae5uke53sIFADAurbQuQ qhgq54HUHzSS9DfEO6ubHw/4euNJtbUxy3A0XNqbVZwkl4kKyN5m1tw3Kxyq ngYOPoLX/CujeJnt31a1kma2SVImS4kiKrIoWQfIwyGUYIPbI7mlg8LadbeJ 4tdtw8M8WnDTI7ePasKQh94woGQQeOuMdqLgUIdJux4Ii023ntdehurcQu08 qWULW7R7SIvs8RATH3RgkBvvcCvI5PDsDS+GvEYvdK1LSdaurXThaizufs8E 8SeVCwjeZWlVfLdCZCOGY7W3YHultoml2GnzWGn2UFhbTbi6WS/Z8kjBYFME NgD5hzwOeKw0+GvheG0tbRLS9W2tJRPbQrqd0EhkBJDovmYVsknI55NCYGb4 d02zufGswur66uPEvh9AmoX8VtFax6itwm6MSKmS4RVUAHGCoPNaPiT4gaT4 Y1k6dqMF8dlql5PcRIjRwwvMIQzZYMcORkKrHB6HmtjSPDelaJd3t3YRTi5v vL+0zT3Us7y7AQmWkZjwCR/+qprnQ9KvdQh1C60qyuL2Db5NzLbo8ke07l2s RkYJJGOhpgaNFFFSAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAB UVz/AMes3+4f5VLUVz/x6zf7h/lUy2YD1Gfm9aeB0qONv4W61MBxVR3GVcf6 X/wOqL/cuf8AcNXx/wAff/AzVCTiO4J7qauO5EtitRS5FFamRYbnVJh/tr/6 CKnTm++rcVAf+QvL/vr/AOgirBGy+Q+prKe5pS+E0CeTj1plPkcRDJ7mmVDL CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooqtLfWlvd29pNdwR3Nzu8 iF5AHl2jLbVPLYHJx0oAs0UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFF FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFRXP8Ax6zf7h/l UtRXP/HrN/uH+VTLZgOdQU3LwRT0O5FYd6RuUYd8cVAkpKKide9VHcYoP+l/ 8DrPlOYLg9gpq+oIvMH+8az3H+jXJ/2D/OrjuRLYi2+9FPyPWitTIkYgavJ/ vr/6CKvPGJJRj7wNZsxK6u2D/Gv/AKCKvmVlkz1APasZy1saUl7o+aVlTa45 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 RKV9C1uoqb7HF/tfnRVkWP/Z --vKf8w1WMqEhEEVwZ0qpGuqyKvZ28v=_IW1-- From owner-xfs@oss.sgi.com Sun May 4 16:50:16 2008 Received: with ECARTIS (v1.0.0; list xfs); Sun, 04 May 2008 16:50:37 -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.1 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-r574664 Received: from larry.melbourne.sgi.com (larry.melbourne.sgi.com [134.14.52.130]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with SMTP id m44NoDM9026273 for ; Sun, 4 May 2008 16:50:15 -0700 Received: from snort.melbourne.sgi.com (snort.melbourne.sgi.com [134.14.54.149]) by larry.melbourne.sgi.com (950413.SGI.8.6.12/950213.SGI.AUTOCF) via ESMTP id JAA12588; Mon, 5 May 2008 09:50:53 +1000 Received: from snort.melbourne.sgi.com (localhost [127.0.0.1]) by snort.melbourne.sgi.com (SGI-8.12.5/8.12.5) with ESMTP id m44NopsT131460200; Mon, 5 May 2008 09:50:52 +1000 (AEST) Received: (from dgc@localhost) by snort.melbourne.sgi.com (SGI-8.12.5/8.12.5/Submit) id m44NomK5156555114; Mon, 5 May 2008 09:50:48 +1000 (AEST) X-Authentication-Warning: snort.melbourne.sgi.com: dgc set sender to dgc@sgi.com using -f Date: Mon, 5 May 2008 09:50:48 +1000 From: David Chinner To: Michael Nishimoto Cc: xfs@oss.sgi.com Subject: Re: question about xfs_alloc_fix_freelist() Message-ID: <20080504235048.GC155679365@sgi.com> References: <038C959C13632143B902BE360CA5B58E3C552E@mx1.ddns.agami.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <038C959C13632143B902BE360CA5B58E3C552E@mx1.ddns.agami.com> User-Agent: Mutt/1.4.2.1i X-Virus-Scanned: ClamAV 0.91.2/6021/Wed Feb 27 15:55:48 2008 on oss.sgi.com X-Virus-Status: Clean X-archive-position: 15769 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: dgc@sgi.com Precedence: bulk X-list: xfs On Fri, May 02, 2008 at 02:01:47PM -0700, Michael Nishimoto wrote: > > The following code can be found near the end of xfs_alloc_fix_freelist: > > if (targs.agbno == NULLAGBLOCK) { > if (flags & XFS_ALLOC_FLAG_FREEING) > break; > xfs_trans_brelse(tp, agflbp); > args->agbp = NULL; > return 0; > } > > Don't we need to release agbp too by calling xfs_trans_brelse(tp, agbp)? I don't think so. AFAICT, The agbp (agf block) is linked into the transaction and by this point we may have modified the AGF (think multiple iterations of the loop to fill the free list). Given that it may be modified, we shouldn't release it here but instead allow the transaction commit/abort to do that for us at the appropriate time. Cheers, Dave. -- Dave Chinner Principal Engineer SGI Australian Software Group From owner-xfs@oss.sgi.com Sun May 4 17:53:46 2008 Received: with ECARTIS (v1.0.0; list xfs); Sun, 04 May 2008 17:54:30 -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.4 required=5.0 tests=BAYES_00,J_CHICKENPOX_26, J_CHICKENPOX_46 autolearn=no version=3.3.0-r574664 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.168.29]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id m450rgA4030701 for ; Sun, 4 May 2008 17:53:45 -0700 X-ASG-Debug-ID: 1209948863-32a200970000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ozlabs.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 375AB12364C for ; Sun, 4 May 2008 17:54:24 -0700 (PDT) Received: from ozlabs.org (ozlabs.org [203.10.76.45]) by cuda.sgi.com with ESMTP id Ai5CG3PQRVd5JEZZ for ; Sun, 04 May 2008 17:54:24 -0700 (PDT) Received: from vivaldi.local (unknown [203.213.241.221]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPSA id A5F70DDE19; Mon, 5 May 2008 10:54:19 +1000 (EST) To: linux-kernel@vger.kernel.org From: Rusty Russell Date: Mon, 5 May 2008 00:54:15 +0000 X-ASG-Orig-Subj: [PATCH] Replace down_trylock() with down_try(), reverse return values. Subject: [PATCH] Replace down_trylock() with down_try(), reverse return values. Cc: gregkh@suse.de, kaos@sgi.com, Stephen Rothwell , rolandd@cisco.com, "Brian S. Julin" , Martin Diehl , mokuno@sm.sony.co.jp, aacraid@adaptec.com, mfasheh@suse.com, wim@iguana.be, xfs@oss.sgi.com, reiserfs-devel@vger.kernel.org, Matthew Wilcox Cc: kaos@sgi.com Cc: Stephen Rothwell Cc: rolandd@cisco.com Cc: "Brian S. Julin" Cc: Martin Diehl Cc: mokuno@sm.sony.co.jp Cc: aacraid@adaptec.com Cc: mfasheh@suse.com Cc: wim@iguana.be Cc: xfs@oss.sgi.com Cc: reiserfs-devel@vger.kernel.org Cc: Matthew Wilcox MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline Message-Id: <200805051054.16575.rusty@rustcorp.com.au> X-Barracuda-Connect: ozlabs.org[203.10.76.45] X-Barracuda-Start-Time: 1209948866 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: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.1, rules version 3.1.49691 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV 0.91.2/6021/Wed Feb 27 15:55:48 2008 on oss.sgi.com X-Virus-Status: Clean X-archive-position: 15770 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: rusty@rustcorp.com.au Precedence: bulk X-list: xfs down_trylock() returns 1 on failure, 0 on success. This differs from spin_trylock(), mutex_trylock() and common sense. Or as ocfs2 put it "kernel 1, world 0". Rename it to down_try() (which makes more sense anyway), and reverse it. Fortunately there aren't a huge number of callers left. I took the liberty of reversing the sense of usb_trylock_device() without renaming it: it's only used in one place anyway. Signed-off-by: Rusty Russell Cc: gregkh@suse.de Cc: kaos@sgi.com Cc: Stephen Rothwell Cc: rolandd@cisco.com Cc: Brian S. Julin Cc: Martin Diehl Cc: mokuno@sm.sony.co.jp Cc: aacraid@adaptec.com Cc: mfasheh@suse.com Cc: wim@iguana.be Cc: xfs@oss.sgi.com Cc: reiserfs-devel@vger.kernel.org Cc: Matthew Wilcox diff -r c4dfb28595bc Documentation/DocBook/kernel-locking.tmpl --- a/Documentation/DocBook/kernel-locking.tmpl Mon May 05 10:27:58 2008 +1000 +++ b/Documentation/DocBook/kernel-locking.tmpl Mon May 05 10:32:35 2008 +1000 @@ -1906,7 +1906,7 @@ machines due to caching. down() - There is a down_trylock() which can be + There is a down_try() which can be used inside interrupt context, as it will not sleep. up() will also never sleep. diff -r c4dfb28595bc arch/ia64/kernel/salinfo.c --- a/arch/ia64/kernel/salinfo.c Mon May 05 10:27:58 2008 +1000 +++ b/arch/ia64/kernel/salinfo.c Mon May 05 10:32:35 2008 +1000 @@ -192,7 +192,7 @@ static void static void salinfo_work_to_do(struct salinfo_data *data) { - down_trylock(&data->mutex); + down_try(&data->mutex); up(&data->mutex); } @@ -309,7 +309,7 @@ salinfo_event_read(struct file *file, ch int i, n, cpu = -1; retry: - if (cpus_empty(data->cpu_event) && down_trylock(&data->mutex)) { + if (cpus_empty(data->cpu_event) && !down_try(&data->mutex)) { if (file->f_flags & O_NONBLOCK) return -EAGAIN; if (down_interruptible(&data->mutex)) diff -r c4dfb28595bc drivers/char/snsc.c --- a/drivers/char/snsc.c Mon May 05 10:27:58 2008 +1000 +++ b/drivers/char/snsc.c Mon May 05 10:32:35 2008 +1000 @@ -161,7 +161,7 @@ scdrv_read(struct file *file, char __use struct subch_data_s *sd = (struct subch_data_s *) file->private_data; /* try to get control of the read buffer */ - if (down_trylock(&sd->sd_rbs)) { + if (!down_try(&sd->sd_rbs)) { /* somebody else has it now; * if we're non-blocking, then exit... */ @@ -253,7 +253,7 @@ scdrv_write(struct file *file, const cha struct subch_data_s *sd = (struct subch_data_s *) file->private_data; /* try to get control of the write buffer */ - if (down_trylock(&sd->sd_wbs)) { + if (!down_try(&sd->sd_wbs)) { /* somebody else has it now; * if we're non-blocking, then exit... */ diff -r c4dfb28595bc drivers/char/viotape.c --- a/drivers/char/viotape.c Mon May 05 10:27:58 2008 +1000 +++ b/drivers/char/viotape.c Mon May 05 10:32:35 2008 +1000 @@ -361,7 +361,7 @@ static ssize_t viotap_write(struct file * semaphore */ if (noblock) { - if (down_trylock(&reqSem)) { + if (!down_try(&reqSem)) { ret = -EWOULDBLOCK; goto free_op; } @@ -451,7 +451,7 @@ static ssize_t viotap_read(struct file * * semaphore */ if (noblock) { - if (down_trylock(&reqSem)) { + if (!down_try(&reqSem)) { ret = -EWOULDBLOCK; goto free_op; } diff -r c4dfb28595bc drivers/infiniband/core/user_mad.c --- a/drivers/infiniband/core/user_mad.c Mon May 05 10:27:58 2008 +1000 +++ b/drivers/infiniband/core/user_mad.c Mon May 05 10:32:35 2008 +1000 @@ -890,7 +890,7 @@ static int ib_umad_sm_open(struct inode return -ENXIO; if (filp->f_flags & O_NONBLOCK) { - if (down_trylock(&port->sm_sem)) { + if (!down_try(&port->sm_sem)) { ret = -EAGAIN; goto fail; } diff -r c4dfb28595bc drivers/input/serio/hil_mlc.c --- a/drivers/input/serio/hil_mlc.c Mon May 05 10:27:58 2008 +1000 +++ b/drivers/input/serio/hil_mlc.c Mon May 05 10:32:35 2008 +1000 @@ -607,7 +607,7 @@ static inline void hilse_setup_input(hil do_gettimeofday(&(mlc->instart)); mlc->icount = 15; memset(mlc->ipacket, 0, 16 * sizeof(hil_packet)); - BUG_ON(down_trylock(&mlc->isem)); + BUG_ON(!down_try(&mlc->isem)); } #ifdef HIL_MLC_DEBUG @@ -694,7 +694,7 @@ static int hilse_donode(hil_mlc *mlc) out2: write_unlock_irqrestore(&mlc->lock, flags); - if (down_trylock(&mlc->osem)) { + if (!down_try(&mlc->osem)) { nextidx = HILSEN_DOZE; break; } diff -r c4dfb28595bc drivers/input/serio/hp_sdc_mlc.c --- a/drivers/input/serio/hp_sdc_mlc.c Mon May 05 10:27:58 2008 +1000 +++ b/drivers/input/serio/hp_sdc_mlc.c Mon May 05 10:32:35 2008 +1000 @@ -148,7 +148,7 @@ static int hp_sdc_mlc_in(hil_mlc *mlc, s priv = mlc->priv; /* Try to down the semaphore */ - if (down_trylock(&mlc->isem)) { + if (!down_try(&mlc->isem)) { struct timeval tv; if (priv->emtestmode) { mlc->ipacket[0] = @@ -186,13 +186,13 @@ static int hp_sdc_mlc_cts(hil_mlc *mlc) priv = mlc->priv; /* Try to down the semaphores -- they should be up. */ - BUG_ON(down_trylock(&mlc->isem)); - BUG_ON(down_trylock(&mlc->osem)); + BUG_ON(!down_try(&mlc->isem)); + BUG_ON(!down_try(&mlc->osem)); up(&mlc->isem); up(&mlc->osem); - if (down_trylock(&mlc->csem)) { + if (!down_try(&mlc->csem)) { if (priv->trans.act.semaphore != &mlc->csem) goto poll; else @@ -229,7 +229,7 @@ static void hp_sdc_mlc_out(hil_mlc *mlc) priv = mlc->priv; /* Try to down the semaphore -- it should be up. */ - BUG_ON(down_trylock(&mlc->osem)); + BUG_ON(!down_try(&mlc->osem)); if (mlc->opacket & HIL_DO_ALTER_CTRL) goto do_control; @@ -240,7 +240,7 @@ static void hp_sdc_mlc_out(hil_mlc *mlc) return; } /* Shouldn't be sending commands when loop may be busy */ - BUG_ON(down_trylock(&mlc->csem)); + BUG_ON(!down_try(&mlc->csem)); up(&mlc->csem); priv->trans.actidx = 0; @@ -296,7 +296,7 @@ static void hp_sdc_mlc_out(hil_mlc *mlc) priv->tseq[3] = 0; if (mlc->opacket & HIL_CTRL_APE) { priv->tseq[3] |= HP_SDC_LPC_APE_IPF; - down_trylock(&mlc->csem); + down_try(&mlc->csem); } enqueue: hp_sdc_enqueue_transaction(&priv->trans); diff -r c4dfb28595bc drivers/md/dm-raid1.c --- a/drivers/md/dm-raid1.c Mon May 05 10:27:58 2008 +1000 +++ b/drivers/md/dm-raid1.c Mon May 05 10:32:35 2008 +1000 @@ -587,7 +587,7 @@ static void rh_recovery_prepare(struct r /* Extra reference to avoid race with rh_stop_recovery */ atomic_inc(&rh->recovery_in_flight); - while (!down_trylock(&rh->recovery_count)) { + while (down_try(&rh->recovery_count)) { atomic_inc(&rh->recovery_in_flight); if (__rh_recovery_prepare(rh) <= 0) { atomic_dec(&rh->recovery_in_flight); diff -r c4dfb28595bc drivers/net/3c527.c --- a/drivers/net/3c527.c Mon May 05 10:27:58 2008 +1000 +++ b/drivers/net/3c527.c Mon May 05 10:32:35 2008 +1000 @@ -577,7 +577,7 @@ static int mc32_command_nowait(struct ne int ioaddr = dev->base_addr; int ret = -1; - if (down_trylock(&lp->cmd_mutex) == 0) + if (down_try(&lp->cmd_mutex)) { lp->cmd_nonblocking=1; lp->exec_box->mbox=0; diff -r c4dfb28595bc drivers/net/irda/sir_dev.c --- a/drivers/net/irda/sir_dev.c Mon May 05 10:27:58 2008 +1000 +++ b/drivers/net/irda/sir_dev.c Mon May 05 10:32:35 2008 +1000 @@ -286,7 +286,7 @@ int sirdev_schedule_request(struct sir_d IRDA_DEBUG(2, "%s - state=0x%04x / param=%u\n", __FUNCTION__, initial_state, param); - if (down_trylock(&fsm->sem)) { + if (!down_try(&fsm->sem)) { if (in_interrupt() || in_atomic() || irqs_disabled()) { IRDA_DEBUG(1, "%s(), state machine busy!\n", __FUNCTION__); return -EWOULDBLOCK; diff -r c4dfb28595bc drivers/net/ps3_gelic_wireless.c --- a/drivers/net/ps3_gelic_wireless.c Mon May 05 10:27:58 2008 +1000 +++ b/drivers/net/ps3_gelic_wireless.c Mon May 05 10:32:35 2008 +1000 @@ -2151,7 +2151,7 @@ static void gelic_wl_disconnect_event(st * As it waits with timeout, just leave assoc_done * uncompleted, then it terminates with timeout */ - if (down_trylock(&wl->assoc_stat_lock)) { + if (!down_try(&wl->assoc_stat_lock)) { pr_debug("%s: already locked\n", __func__); lock = 0; } else { diff -r c4dfb28595bc drivers/net/wireless/airo.c --- a/drivers/net/wireless/airo.c Mon May 05 10:27:58 2008 +1000 +++ b/drivers/net/wireless/airo.c Mon May 05 10:32:35 2008 +1000 @@ -2138,7 +2138,7 @@ static int airo_start_xmit(struct sk_buf fids[i] |= (len << 16); priv->xmit.skb = skb; priv->xmit.fid = i; - if (down_trylock(&priv->sem) != 0) { + if (!down_try(&priv->sem)) { set_bit(FLAG_PENDING_XMIT, &priv->flags); netif_stop_queue(dev); set_bit(JOB_XMIT, &priv->jobs); @@ -2209,7 +2209,7 @@ static int airo_start_xmit11(struct sk_b fids[i] |= (len << 16); priv->xmit11.skb = skb; priv->xmit11.fid = i; - if (down_trylock(&priv->sem) != 0) { + if (!down_try(&priv->sem)) { set_bit(FLAG_PENDING_XMIT11, &priv->flags); netif_stop_queue(dev); set_bit(JOB_XMIT11, &priv->jobs); @@ -2257,7 +2257,7 @@ static struct net_device_stats *airo_get if (!test_bit(JOB_STATS, &local->jobs)) { /* Get stats out of the card if available */ - if (down_trylock(&local->sem) != 0) { + if (!down_try(&local->sem)) { set_bit(JOB_STATS, &local->jobs); wake_up_interruptible(&local->thr_wait); } else @@ -2284,7 +2284,7 @@ static void airo_set_multicast_list(stru if ((dev->flags ^ ai->flags) & IFF_PROMISC) { change_bit(FLAG_PROMISC, &ai->flags); - if (down_trylock(&ai->sem) != 0) { + if (!down_try(&ai->sem)) { set_bit(JOB_PROMISC, &ai->jobs); wake_up_interruptible(&ai->thr_wait); } else @@ -3211,7 +3211,7 @@ static irqreturn_t airo_interrupt(int ir set_bit(FLAG_UPDATE_UNI, &apriv->flags); set_bit(FLAG_UPDATE_MULTI, &apriv->flags); - if (down_trylock(&apriv->sem) != 0) { + if (!down_try(&apriv->sem)) { set_bit(JOB_EVENT, &apriv->jobs); wake_up_interruptible(&apriv->thr_wait); } else @@ -7658,7 +7658,7 @@ static struct iw_statistics *airo_get_wi if (!test_bit(JOB_WSTATS, &local->jobs)) { /* Get stats out of the card if available */ - if (down_trylock(&local->sem) != 0) { + if (!down_try(&local->sem)) { set_bit(JOB_WSTATS, &local->jobs); wake_up_interruptible(&local->thr_wait); } else diff -r c4dfb28595bc drivers/scsi/aacraid/commsup.c --- a/drivers/scsi/aacraid/commsup.c Mon May 05 10:27:58 2008 +1000 +++ b/drivers/scsi/aacraid/commsup.c Mon May 05 10:32:35 2008 +1000 @@ -490,7 +490,7 @@ int aac_fib_send(u16 command, struct fib * hardware failure has occurred. */ unsigned long count = 36000000L; /* 3 minutes */ - while (down_trylock(&fibptr->event_wait)) { + while (!down_try(&fibptr->event_wait)) { int blink; if (--count == 0) { struct aac_queue * q = &dev->queues->queue[AdapNormCmdQueue]; diff -r c4dfb28595bc drivers/usb/core/usb.c --- a/drivers/usb/core/usb.c Mon May 05 10:27:58 2008 +1000 +++ b/drivers/usb/core/usb.c Mon May 05 10:32:35 2008 +1000 @@ -477,7 +477,7 @@ int usb_lock_device_for_reset(struct usb } } - while (usb_trylock_device(udev) != 0) { + while (!usb_trylock_device(udev)) { /* If we can't acquire the lock after waiting one second, * we're probably deadlocked */ diff -r c4dfb28595bc drivers/usb/gadget/inode.c --- a/drivers/usb/gadget/inode.c Mon May 05 10:27:58 2008 +1000 +++ b/drivers/usb/gadget/inode.c Mon May 05 10:32:35 2008 +1000 @@ -298,7 +298,7 @@ get_ready_ep (unsigned f_flags, struct e int val; if (f_flags & O_NONBLOCK) { - if (down_trylock (&epdata->lock) != 0) + if (!down_try (&epdata->lock)) goto nonblock; if (epdata->state != STATE_EP_ENABLED) { up (&epdata->lock); diff -r c4dfb28595bc drivers/watchdog/ar7_wdt.c --- a/drivers/watchdog/ar7_wdt.c Mon May 05 10:27:58 2008 +1000 +++ b/drivers/watchdog/ar7_wdt.c Mon May 05 10:32:35 2008 +1000 @@ -179,7 +179,7 @@ static int ar7_wdt_open(struct inode *in static int ar7_wdt_open(struct inode *inode, struct file *file) { /* only allow one at a time */ - if (down_trylock(&open_semaphore)) + if (!down_try(&open_semaphore)) return -EBUSY; ar7_wdt_enable_wdt(); expect_close = 0; diff -r c4dfb28595bc drivers/watchdog/it8712f_wdt.c --- a/drivers/watchdog/it8712f_wdt.c Mon May 05 10:27:58 2008 +1000 +++ b/drivers/watchdog/it8712f_wdt.c Mon May 05 10:32:35 2008 +1000 @@ -306,7 +306,7 @@ it8712f_wdt_open(struct inode *inode, st it8712f_wdt_open(struct inode *inode, struct file *file) { /* only allow one at a time */ - if (down_trylock(&it8712f_wdt_sem)) + if (!down_try(&it8712f_wdt_sem)) return -EBUSY; it8712f_wdt_enable(); diff -r c4dfb28595bc drivers/watchdog/s3c2410_wdt.c --- a/drivers/watchdog/s3c2410_wdt.c Mon May 05 10:27:58 2008 +1000 +++ b/drivers/watchdog/s3c2410_wdt.c Mon May 05 10:32:35 2008 +1000 @@ -211,7 +211,7 @@ static int s3c2410wdt_set_heartbeat(int static int s3c2410wdt_open(struct inode *inode, struct file *file) { - if(down_trylock(&open_lock)) + if(!down_try(&open_lock)) return -EBUSY; if (nowayout) diff -r c4dfb28595bc drivers/watchdog/sc1200wdt.c --- a/drivers/watchdog/sc1200wdt.c Mon May 05 10:27:58 2008 +1000 +++ b/drivers/watchdog/sc1200wdt.c Mon May 05 10:32:35 2008 +1000 @@ -151,7 +151,7 @@ static int sc1200wdt_open(struct inode * static int sc1200wdt_open(struct inode *inode, struct file *file) { /* allow one at a time */ - if (down_trylock(&open_sem)) + if (!down_try(&open_sem)) return -EBUSY; if (timeout > MAX_TIMEOUT) diff -r c4dfb28595bc drivers/watchdog/scx200_wdt.c --- a/drivers/watchdog/scx200_wdt.c Mon May 05 10:27:58 2008 +1000 +++ b/drivers/watchdog/scx200_wdt.c Mon May 05 10:32:35 2008 +1000 @@ -92,7 +92,7 @@ static int scx200_wdt_open(struct inode static int scx200_wdt_open(struct inode *inode, struct file *file) { /* only allow one at a time */ - if (down_trylock(&open_semaphore)) + if (!down_try(&open_semaphore)) return -EBUSY; scx200_wdt_enable(); diff -r c4dfb28595bc drivers/watchdog/wdt_pci.c --- a/drivers/watchdog/wdt_pci.c Mon May 05 10:27:58 2008 +1000 +++ b/drivers/watchdog/wdt_pci.c Mon May 05 10:32:35 2008 +1000 @@ -426,7 +426,7 @@ static int wdtpci_ioctl(struct inode *in static int wdtpci_open(struct inode *inode, struct file *file) { - if (down_trylock(&open_sem)) + if (!down_try(&open_sem)) return -EBUSY; if (nowayout) { diff -r c4dfb28595bc fs/ocfs2/inode.c --- a/fs/ocfs2/inode.c Mon May 05 10:27:58 2008 +1000 +++ b/fs/ocfs2/inode.c Mon May 05 10:32:35 2008 +1000 @@ -1062,10 +1062,6 @@ void ocfs2_clear_inode(struct inode *ino (unsigned long long)oi->ip_blkno); mutex_unlock(&oi->ip_io_mutex); - /* - * down_trylock() returns 0, down_write_trylock() returns 1 - * kernel 1, world 0 - */ mlog_bug_on_msg(!down_write_trylock(&oi->ip_alloc_sem), "Clear inode of %llu, alloc_sem is locked\n", (unsigned long long)oi->ip_blkno); diff -r c4dfb28595bc fs/reiserfs/journal.c --- a/fs/reiserfs/journal.c Mon May 05 10:27:58 2008 +1000 +++ b/fs/reiserfs/journal.c Mon May 05 10:32:35 2008 +1000 @@ -1412,7 +1412,7 @@ static int flush_journal_list(struct sup /* if flushall == 0, the lock is already held */ if (flushall) { down(&journal->j_flush_sem); - } else if (!down_trylock(&journal->j_flush_sem)) { + } else if (down_try(&journal->j_flush_sem)) { BUG(); } diff -r c4dfb28595bc fs/xfs/linux-2.6/sema.h --- a/fs/xfs/linux-2.6/sema.h Mon May 05 10:27:58 2008 +1000 +++ b/fs/xfs/linux-2.6/sema.h Mon May 05 10:32:36 2008 +1000 @@ -36,17 +36,15 @@ typedef struct semaphore sema_t; static inline int issemalocked(sema_t *sp) { - return down_trylock(sp) || (up(sp), 0); + return !down_try(sp) || (up(sp), 0); } /* - * Map cpsema (try to get the sema) to down_trylock. We need to switch - * the return values since cpsema returns 1 (acquired) 0 (failed) and - * down_trylock returns the reverse 0 (acquired) 1 (failed). + * Map cpsema (try to get the sema) to down_try. */ static inline int cpsema(sema_t *sp) { - return down_trylock(sp) ? 0 : 1; + return down_try(sp); } #endif /* __XFS_SUPPORT_SEMA_H__ */ diff -r c4dfb28595bc fs/xfs/linux-2.6/xfs_buf.c --- a/fs/xfs/linux-2.6/xfs_buf.c Mon May 05 10:27:58 2008 +1000 +++ b/fs/xfs/linux-2.6/xfs_buf.c Mon May 05 10:32:36 2008 +1000 @@ -530,7 +530,7 @@ found: * if this does not work then we need to drop the * spinlock and do a hard attempt on the semaphore. */ - if (down_trylock(&bp->b_sema)) { + if (!down_try(&bp->b_sema)) { if (!(flags & XBF_TRYLOCK)) { /* wait for buffer ownership */ XB_TRACE(bp, "get_lock", 0); @@ -873,7 +873,7 @@ xfs_buf_cond_lock( { int locked; - locked = down_trylock(&bp->b_sema) == 0; + locked = down_try(&bp->b_sema); if (locked) { XB_SET_OWNER(bp); } diff -r c4dfb28595bc include/linux/mutex.h --- a/include/linux/mutex.h Mon May 05 10:27:58 2008 +1000 +++ b/include/linux/mutex.h Mon May 05 10:32:36 2008 +1000 @@ -141,10 +141,6 @@ extern int __must_check mutex_lock_killa # define mutex_lock_killable_nested(lock, subclass) mutex_lock_killable(lock) #endif -/* - * NOTE: mutex_trylock() follows the spin_trylock() convention, - * not the down_trylock() convention! - */ extern int mutex_trylock(struct mutex *lock); extern void mutex_unlock(struct mutex *lock); diff -r c4dfb28595bc include/linux/semaphore.h --- a/include/linux/semaphore.h Mon May 05 10:27:58 2008 +1000 +++ b/include/linux/semaphore.h Mon May 05 10:32:36 2008 +1000 @@ -44,7 +44,7 @@ extern void down(struct semaphore *sem); extern void down(struct semaphore *sem); extern int __must_check down_interruptible(struct semaphore *sem); extern int __must_check down_killable(struct semaphore *sem); -extern int __must_check down_trylock(struct semaphore *sem); +extern int __must_check down_try(struct semaphore *sem); extern int __must_check down_timeout(struct semaphore *sem, long jiffies); extern void up(struct semaphore *sem); diff -r c4dfb28595bc include/linux/usb.h --- a/include/linux/usb.h Mon May 05 10:27:58 2008 +1000 +++ b/include/linux/usb.h Mon May 05 10:32:36 2008 +1000 @@ -491,7 +491,7 @@ extern void usb_put_dev(struct usb_devic /* USB device locking */ #define usb_lock_device(udev) down(&(udev)->dev.sem) #define usb_unlock_device(udev) up(&(udev)->dev.sem) -#define usb_trylock_device(udev) down_trylock(&(udev)->dev.sem) +#define usb_trylock_device(udev) down_try(&(udev)->dev.sem) extern int usb_lock_device_for_reset(struct usb_device *udev, const struct usb_interface *iface); diff -r c4dfb28595bc kernel/mutex.c --- a/kernel/mutex.c Mon May 05 10:27:58 2008 +1000 +++ b/kernel/mutex.c Mon May 05 10:32:36 2008 +1000 @@ -373,8 +373,8 @@ static inline int __mutex_trylock_slowpa * Try to acquire the mutex atomically. Returns 1 if the mutex * has been acquired successfully, and 0 on contention. * - * NOTE: this function follows the spin_trylock() convention, so - * it is negated to the down_trylock() return values! Be careful + * NOTE: this function follows the spin_trylock()/down_try() convention, + * so it is negated to the old down_trylock() return values! Be careful * about this when converting semaphore users to mutexes. * * This function must not be used in interrupt context. The diff -r c4dfb28595bc kernel/printk.c --- a/kernel/printk.c Mon May 05 10:27:58 2008 +1000 +++ b/kernel/printk.c Mon May 05 10:32:36 2008 +1000 @@ -986,7 +986,7 @@ EXPORT_SYMBOL(acquire_console_sem); int try_acquire_console_sem(void) { - if (down_trylock(&console_sem)) + if (!down_try(&console_sem)) return -1; console_locked = 1; console_may_schedule = 0; @@ -1083,7 +1083,7 @@ void console_unblank(void) * oops_in_progress is set to 1.. */ if (oops_in_progress) { - if (down_trylock(&console_sem) != 0) + if (!down_try(&console_sem)) return; } else acquire_console_sem(); diff -r c4dfb28595bc kernel/semaphore.c --- a/kernel/semaphore.c Mon May 05 10:27:58 2008 +1000 +++ b/kernel/semaphore.c Mon May 05 10:32:36 2008 +1000 @@ -14,7 +14,7 @@ * Some notes on the implementation: * * The spinlock controls access to the other members of the semaphore. - * down_trylock() and up() can be called from interrupt context, so we + * down_try() and up() can be called from interrupt context, so we * have to disable interrupts when taking the lock. It turns out various * parts of the kernel expect to be able to use down() on a semaphore in * interrupt context when they know it will succeed, so we have to use @@ -114,19 +114,18 @@ EXPORT_SYMBOL(down_killable); EXPORT_SYMBOL(down_killable); /** - * down_trylock - try to acquire the semaphore, without waiting + * down_try - try to acquire the semaphore, without waiting * @sem: the semaphore to be acquired * - * Try to acquire the semaphore atomically. Returns 0 if the mutex has - * been acquired successfully or 1 if it it cannot be acquired. + * Try to acquire the semaphore atomically. Returns true if the mutex has + * been acquired successfully or 0 if it it cannot be acquired. * - * NOTE: This return value is inverted from both spin_trylock and - * mutex_trylock! Be careful about this when converting code. + * NOTE: This replaces down_trylock() which returned the reverse. * * Unlike mutex_trylock, this function can be used from interrupt context, * and the semaphore can be released by any task or interrupt. */ -int down_trylock(struct semaphore *sem) +int down_try(struct semaphore *sem) { unsigned long flags; int count; @@ -137,9 +136,9 @@ int down_trylock(struct semaphore *sem) sem->count = count; spin_unlock_irqrestore(&sem->lock, flags); - return (count < 0); + return (count >= 0); } -EXPORT_SYMBOL(down_trylock); +EXPORT_SYMBOL(down_try); /** * down_timeout - acquire the semaphore within a specified time From owner-xfs@oss.sgi.com Sun May 4 18:46:29 2008 Received: with ECARTIS (v1.0.0; list xfs); Sun, 04 May 2008 18:47:00 -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.4 required=5.0 tests=BAYES_00,J_CHICKENPOX_26, J_CHICKENPOX_46 autolearn=no version=3.3.0-r574664 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.168.29]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id m451kRpV001679 for ; Sun, 4 May 2008 18:46:28 -0700 X-ASG-Debug-ID: 1209952007-5ba300f50000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ozlabs.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 980F5123B9E for ; Sun, 4 May 2008 18:46:47 -0700 (PDT) Received: from ozlabs.org (ozlabs.org [203.10.76.45]) by cuda.sgi.com with ESMTP id ccs2LUvdFgROePy4 for ; Sun, 04 May 2008 18:46:47 -0700 (PDT) Received: from vivaldi.local (unknown [203.213.241.221]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPSA id 84359DDE07; Mon, 5 May 2008 11:46:43 +1000 (EST) To: linux-kernel@vger.kernel.org From: Rusty Russell Date: Mon, 5 May 2008 01:46:36 +0000 X-ASG-Orig-Subj: [PATCH] Replace down_trylock() with down_try(), reverse return values. Subject: [PATCH] Replace down_trylock() with down_try(), reverse return values. Cc: gregkh@suse.de, kaos@sgi.com, Stephen Rothwell , rolandd@cisco.com, "Brian S. Julin" , Martin Diehl , mokuno@sm.sony.co.jp, aacraid@adaptec.com, mfasheh@suse.com, wim@iguana.be, xfs@oss.sgi.com, reiserfs-devel@vger.kernel.org, Matthew Wilcox , kaos@sgi.com, Stephen Rothwell , rolandd@cisco.com, "Brian S. Julin" , Martin Diehl , mokuno@sm.sony.co.jp, aacraid@adaptec.com, mfasheh@suse.com, wim@iguana.be, xfs@oss.sgi.com, reiserfs-devel@vger.kernel.org, Matthew Wilcox Cc: kaos@sgi.com Cc: Stephen Rothwell Cc: rolandd@cisco.com Cc: "Brian S. Julin" Cc: Martin Diehl Cc: mokuno@sm.sony.co.jp Cc: aacraid@adaptec.com Cc: mfasheh@suse.com Cc: wim@iguana.be Cc: xfs@oss.sgi.com Cc: reiserfs-devel@vger.kernel.org Cc: Matthew Wilcox MIME-Version: 1.0 Content-Disposition: inline Message-Id: <200805051146.38563.rusty@rustcorp.com.au> Content-Transfer-Encoding: 7bit X-Barracuda-Connect: ozlabs.org[203.10.76.45] X-Barracuda-Start-Time: 1209952008 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: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.1, rules version 3.1.49695 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV 0.91.2/6021/Wed Feb 27 15:55:48 2008 on oss.sgi.com X-Virus-Status: Clean X-archive-position: 15771 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: rusty@rustcorp.com.au Precedence: bulk X-list: xfs down_trylock() returns 1 on failure, 0 on success. This differs from spin_trylock(), mutex_trylock() and common sense. Or as ocfs2 put it "kernel 1, world 0". Rename it to down_try() (which makes more sense anyway), and reverse it. Fortunately there aren't a huge number of callers left. I took the liberty of reversing the sense of usb_trylock_device() without renaming it: it's only used in one place anyway. Signed-off-by: Rusty Russell Cc: gregkh@suse.de Cc: kaos@sgi.com Cc: Stephen Rothwell Cc: rolandd@cisco.com Cc: "Brian S. Julin" Cc: Martin Diehl Cc: mokuno@sm.sony.co.jp Cc: aacraid@adaptec.com Cc: mfasheh@suse.com Cc: wim@iguana.be Cc: xfs@oss.sgi.com Cc: reiserfs-devel@vger.kernel.org Cc: Matthew Wilcox diff -r c4dfb28595bc Documentation/DocBook/kernel-locking.tmpl --- a/Documentation/DocBook/kernel-locking.tmpl Mon May 05 10:27:58 2008 +1000 +++ b/Documentation/DocBook/kernel-locking.tmpl Mon May 05 10:32:35 2008 +1000 @@ -1906,7 +1906,7 @@ machines due to caching. down() - There is a down_trylock() which can be + There is a down_try() which can be used inside interrupt context, as it will not sleep. up() will also never sleep. diff -r c4dfb28595bc arch/ia64/kernel/salinfo.c --- a/arch/ia64/kernel/salinfo.c Mon May 05 10:27:58 2008 +1000 +++ b/arch/ia64/kernel/salinfo.c Mon May 05 10:32:35 2008 +1000 @@ -192,7 +192,7 @@ static void static void salinfo_work_to_do(struct salinfo_data *data) { - down_trylock(&data->mutex); + down_try(&data->mutex); up(&data->mutex); } @@ -309,7 +309,7 @@ salinfo_event_read(struct file *file, ch int i, n, cpu = -1; retry: - if (cpus_empty(data->cpu_event) && down_trylock(&data->mutex)) { + if (cpus_empty(data->cpu_event) && !down_try(&data->mutex)) { if (file->f_flags & O_NONBLOCK) return -EAGAIN; if (down_interruptible(&data->mutex)) diff -r c4dfb28595bc drivers/char/snsc.c --- a/drivers/char/snsc.c Mon May 05 10:27:58 2008 +1000 +++ b/drivers/char/snsc.c Mon May 05 10:32:35 2008 +1000 @@ -161,7 +161,7 @@ scdrv_read(struct file *file, char __use struct subch_data_s *sd = (struct subch_data_s *) file->private_data; /* try to get control of the read buffer */ - if (down_trylock(&sd->sd_rbs)) { + if (!down_try(&sd->sd_rbs)) { /* somebody else has it now; * if we're non-blocking, then exit... */ @@ -253,7 +253,7 @@ scdrv_write(struct file *file, const cha struct subch_data_s *sd = (struct subch_data_s *) file->private_data; /* try to get control of the write buffer */ - if (down_trylock(&sd->sd_wbs)) { + if (!down_try(&sd->sd_wbs)) { /* somebody else has it now; * if we're non-blocking, then exit... */ diff -r c4dfb28595bc drivers/char/viotape.c --- a/drivers/char/viotape.c Mon May 05 10:27:58 2008 +1000 +++ b/drivers/char/viotape.c Mon May 05 10:32:35 2008 +1000 @@ -361,7 +361,7 @@ static ssize_t viotap_write(struct file * semaphore */ if (noblock) { - if (down_trylock(&reqSem)) { + if (!down_try(&reqSem)) { ret = -EWOULDBLOCK; goto free_op; } @@ -451,7 +451,7 @@ static ssize_t viotap_read(struct file * * semaphore */ if (noblock) { - if (down_trylock(&reqSem)) { + if (!down_try(&reqSem)) { ret = -EWOULDBLOCK; goto free_op; } diff -r c4dfb28595bc drivers/infiniband/core/user_mad.c --- a/drivers/infiniband/core/user_mad.c Mon May 05 10:27:58 2008 +1000 +++ b/drivers/infiniband/core/user_mad.c Mon May 05 10:32:35 2008 +1000 @@ -890,7 +890,7 @@ static int ib_umad_sm_open(struct inode return -ENXIO; if (filp->f_flags & O_NONBLOCK) { - if (down_trylock(&port->sm_sem)) { + if (!down_try(&port->sm_sem)) { ret = -EAGAIN; goto fail; } diff -r c4dfb28595bc drivers/input/serio/hil_mlc.c --- a/drivers/input/serio/hil_mlc.c Mon May 05 10:27:58 2008 +1000 +++ b/drivers/input/serio/hil_mlc.c Mon May 05 10:32:35 2008 +1000 @@ -607,7 +607,7 @@ static inline void hilse_setup_input(hil do_gettimeofday(&(mlc->instart)); mlc->icount = 15; memset(mlc->ipacket, 0, 16 * sizeof(hil_packet)); - BUG_ON(down_trylock(&mlc->isem)); + BUG_ON(!down_try(&mlc->isem)); } #ifdef HIL_MLC_DEBUG @@ -694,7 +694,7 @@ static int hilse_donode(hil_mlc *mlc) out2: write_unlock_irqrestore(&mlc->lock, flags); - if (down_trylock(&mlc->osem)) { + if (!down_try(&mlc->osem)) { nextidx = HILSEN_DOZE; break; } diff -r c4dfb28595bc drivers/input/serio/hp_sdc_mlc.c --- a/drivers/input/serio/hp_sdc_mlc.c Mon May 05 10:27:58 2008 +1000 +++ b/drivers/input/serio/hp_sdc_mlc.c Mon May 05 10:32:35 2008 +1000 @@ -148,7 +148,7 @@ static int hp_sdc_mlc_in(hil_mlc *mlc, s priv = mlc->priv; /* Try to down the semaphore */ - if (down_trylock(&mlc->isem)) { + if (!down_try(&mlc->isem)) { struct timeval tv; if (priv->emtestmode) { mlc->ipacket[0] = @@ -186,13 +186,13 @@ static int hp_sdc_mlc_cts(hil_mlc *mlc) priv = mlc->priv; /* Try to down the semaphores -- they should be up. */ - BUG_ON(down_trylock(&mlc->isem)); - BUG_ON(down_trylock(&mlc->osem)); + BUG_ON(!down_try(&mlc->isem)); + BUG_ON(!down_try(&mlc->osem)); up(&mlc->isem); up(&mlc->osem); - if (down_trylock(&mlc->csem)) { + if (!down_try(&mlc->csem)) { if (priv->trans.act.semaphore != &mlc->csem) goto poll; else @@ -229,7 +229,7 @@ static void hp_sdc_mlc_out(hil_mlc *mlc) priv = mlc->priv; /* Try to down the semaphore -- it should be up. */ - BUG_ON(down_trylock(&mlc->osem)); + BUG_ON(!down_try(&mlc->osem)); if (mlc->opacket & HIL_DO_ALTER_CTRL) goto do_control; @@ -240,7 +240,7 @@ static void hp_sdc_mlc_out(hil_mlc *mlc) return; } /* Shouldn't be sending commands when loop may be busy */ - BUG_ON(down_trylock(&mlc->csem)); + BUG_ON(!down_try(&mlc->csem)); up(&mlc->csem); priv->trans.actidx = 0; @@ -296,7 +296,7 @@ static void hp_sdc_mlc_out(hil_mlc *mlc) priv->tseq[3] = 0; if (mlc->opacket & HIL_CTRL_APE) { priv->tseq[3] |= HP_SDC_LPC_APE_IPF; - down_trylock(&mlc->csem); + down_try(&mlc->csem); } enqueue: hp_sdc_enqueue_transaction(&priv->trans); diff -r c4dfb28595bc drivers/md/dm-raid1.c --- a/drivers/md/dm-raid1.c Mon May 05 10:27:58 2008 +1000 +++ b/drivers/md/dm-raid1.c Mon May 05 10:32:35 2008 +1000 @@ -587,7 +587,7 @@ static void rh_recovery_prepare(struct r /* Extra reference to avoid race with rh_stop_recovery */ atomic_inc(&rh->recovery_in_flight); - while (!down_trylock(&rh->recovery_count)) { + while (down_try(&rh->recovery_count)) { atomic_inc(&rh->recovery_in_flight); if (__rh_recovery_prepare(rh) <= 0) { atomic_dec(&rh->recovery_in_flight); diff -r c4dfb28595bc drivers/net/3c527.c --- a/drivers/net/3c527.c Mon May 05 10:27:58 2008 +1000 +++ b/drivers/net/3c527.c Mon May 05 10:32:35 2008 +1000 @@ -577,7 +577,7 @@ static int mc32_command_nowait(struct ne int ioaddr = dev->base_addr; int ret = -1; - if (down_trylock(&lp->cmd_mutex) == 0) + if (down_try(&lp->cmd_mutex)) { lp->cmd_nonblocking=1; lp->exec_box->mbox=0; diff -r c4dfb28595bc drivers/net/irda/sir_dev.c --- a/drivers/net/irda/sir_dev.c Mon May 05 10:27:58 2008 +1000 +++ b/drivers/net/irda/sir_dev.c Mon May 05 10:32:35 2008 +1000 @@ -286,7 +286,7 @@ int sirdev_schedule_request(struct sir_d IRDA_DEBUG(2, "%s - state=0x%04x / param=%u\n", __FUNCTION__, initial_state, param); - if (down_trylock(&fsm->sem)) { + if (!down_try(&fsm->sem)) { if (in_interrupt() || in_atomic() || irqs_disabled()) { IRDA_DEBUG(1, "%s(), state machine busy!\n", __FUNCTION__); return -EWOULDBLOCK; diff -r c4dfb28595bc drivers/net/ps3_gelic_wireless.c --- a/drivers/net/ps3_gelic_wireless.c Mon May 05 10:27:58 2008 +1000 +++ b/drivers/net/ps3_gelic_wireless.c Mon May 05 10:32:35 2008 +1000 @@ -2151,7 +2151,7 @@ static void gelic_wl_disconnect_event(st * As it waits with timeout, just leave assoc_done * uncompleted, then it terminates with timeout */ - if (down_trylock(&wl->assoc_stat_lock)) { + if (!down_try(&wl->assoc_stat_lock)) { pr_debug("%s: already locked\n", __func__); lock = 0; } else { diff -r c4dfb28595bc drivers/net/wireless/airo.c --- a/drivers/net/wireless/airo.c Mon May 05 10:27:58 2008 +1000 +++ b/drivers/net/wireless/airo.c Mon May 05 10:32:35 2008 +1000 @@ -2138,7 +2138,7 @@ static int airo_start_xmit(struct sk_buf fids[i] |= (len << 16); priv->xmit.skb = skb; priv->xmit.fid = i; - if (down_trylock(&priv->sem) != 0) { + if (!down_try(&priv->sem)) { set_bit(FLAG_PENDING_XMIT, &priv->flags); netif_stop_queue(dev); set_bit(JOB_XMIT, &priv->jobs); @@ -2209,7 +2209,7 @@ static int airo_start_xmit11(struct sk_b fids[i] |= (len << 16); priv->xmit11.skb = skb; priv->xmit11.fid = i; - if (down_trylock(&priv->sem) != 0) { + if (!down_try(&priv->sem)) { set_bit(FLAG_PENDING_XMIT11, &priv->flags); netif_stop_queue(dev); set_bit(JOB_XMIT11, &priv->jobs); @@ -2257,7 +2257,7 @@ static struct net_device_stats *airo_get if (!test_bit(JOB_STATS, &local->jobs)) { /* Get stats out of the card if available */ - if (down_trylock(&local->sem) != 0) { + if (!down_try(&local->sem)) { set_bit(JOB_STATS, &local->jobs); wake_up_interruptible(&local->thr_wait); } else @@ -2284,7 +2284,7 @@ static void airo_set_multicast_list(stru if ((dev->flags ^ ai->flags) & IFF_PROMISC) { change_bit(FLAG_PROMISC, &ai->flags); - if (down_trylock(&ai->sem) != 0) { + if (!down_try(&ai->sem)) { set_bit(JOB_PROMISC, &ai->jobs); wake_up_interruptible(&ai->thr_wait); } else @@ -3211,7 +3211,7 @@ static irqreturn_t airo_interrupt(int ir set_bit(FLAG_UPDATE_UNI, &apriv->flags); set_bit(FLAG_UPDATE_MULTI, &apriv->flags); - if (down_trylock(&apriv->sem) != 0) { + if (!down_try(&apriv->sem)) { set_bit(JOB_EVENT, &apriv->jobs); wake_up_interruptible(&apriv->thr_wait); } else @@ -7658,7 +7658,7 @@ static struct iw_statistics *airo_get_wi if (!test_bit(JOB_WSTATS, &local->jobs)) { /* Get stats out of the card if available */ - if (down_trylock(&local->sem) != 0) { + if (!down_try(&local->sem)) { set_bit(JOB_WSTATS, &local->jobs); wake_up_interruptible(&local->thr_wait); } else diff -r c4dfb28595bc drivers/scsi/aacraid/commsup.c --- a/drivers/scsi/aacraid/commsup.c Mon May 05 10:27:58 2008 +1000 +++ b/drivers/scsi/aacraid/commsup.c Mon May 05 10:32:35 2008 +1000 @@ -490,7 +490,7 @@ int aac_fib_send(u16 command, struct fib * hardware failure has occurred. */ unsigned long count = 36000000L; /* 3 minutes */ - while (down_trylock(&fibptr->event_wait)) { + while (!down_try(&fibptr->event_wait)) { int blink; if (--count == 0) { struct aac_queue * q = &dev->queues->queue[AdapNormCmdQueue]; diff -r c4dfb28595bc drivers/usb/core/usb.c --- a/drivers/usb/core/usb.c Mon May 05 10:27:58 2008 +1000 +++ b/drivers/usb/core/usb.c Mon May 05 10:32:35 2008 +1000 @@ -477,7 +477,7 @@ int usb_lock_device_for_reset(struct usb } } - while (usb_trylock_device(udev) != 0) { + while (!usb_trylock_device(udev)) { /* If we can't acquire the lock after waiting one second, * we're probably deadlocked */ diff -r c4dfb28595bc drivers/usb/gadget/inode.c --- a/drivers/usb/gadget/inode.c Mon May 05 10:27:58 2008 +1000 +++ b/drivers/usb/gadget/inode.c Mon May 05 10:32:35 2008 +1000 @@ -298,7 +298,7 @@ get_ready_ep (unsigned f_flags, struct e int val; if (f_flags & O_NONBLOCK) { - if (down_trylock (&epdata->lock) != 0) + if (!down_try (&epdata->lock)) goto nonblock; if (epdata->state != STATE_EP_ENABLED) { up (&epdata->lock); diff -r c4dfb28595bc drivers/watchdog/ar7_wdt.c --- a/drivers/watchdog/ar7_wdt.c Mon May 05 10:27:58 2008 +1000 +++ b/drivers/watchdog/ar7_wdt.c Mon May 05 10:32:35 2008 +1000 @@ -179,7 +179,7 @@ static int ar7_wdt_open(struct inode *in static int ar7_wdt_open(struct inode *inode, struct file *file) { /* only allow one at a time */ - if (down_trylock(&open_semaphore)) + if (!down_try(&open_semaphore)) return -EBUSY; ar7_wdt_enable_wdt(); expect_close = 0; diff -r c4dfb28595bc drivers/watchdog/it8712f_wdt.c --- a/drivers/watchdog/it8712f_wdt.c Mon May 05 10:27:58 2008 +1000 +++ b/drivers/watchdog/it8712f_wdt.c Mon May 05 10:32:35 2008 +1000 @@ -306,7 +306,7 @@ it8712f_wdt_open(struct inode *inode, st it8712f_wdt_open(struct inode *inode, struct file *file) { /* only allow one at a time */ - if (down_trylock(&it8712f_wdt_sem)) + if (!down_try(&it8712f_wdt_sem)) return -EBUSY; it8712f_wdt_enable(); diff -r c4dfb28595bc drivers/watchdog/s3c2410_wdt.c --- a/drivers/watchdog/s3c2410_wdt.c Mon May 05 10:27:58 2008 +1000 +++ b/drivers/watchdog/s3c2410_wdt.c Mon May 05 10:32:35 2008 +1000 @@ -211,7 +211,7 @@ static int s3c2410wdt_set_heartbeat(int static int s3c2410wdt_open(struct inode *inode, struct file *file) { - if(down_trylock(&open_lock)) + if(!down_try(&open_lock)) return -EBUSY; if (nowayout) diff -r c4dfb28595bc drivers/watchdog/sc1200wdt.c --- a/drivers/watchdog/sc1200wdt.c Mon May 05 10:27:58 2008 +1000 +++ b/drivers/watchdog/sc1200wdt.c Mon May 05 10:32:35 2008 +1000 @@ -151,7 +151,7 @@ static int sc1200wdt_open(struct inode * static int sc1200wdt_open(struct inode *inode, struct file *file) { /* allow one at a time */ - if (down_trylock(&open_sem)) + if (!down_try(&open_sem)) return -EBUSY; if (timeout > MAX_TIMEOUT) diff -r c4dfb28595bc drivers/watchdog/scx200_wdt.c --- a/drivers/watchdog/scx200_wdt.c Mon May 05 10:27:58 2008 +1000 +++ b/drivers/watchdog/scx200_wdt.c Mon May 05 10:32:35 2008 +1000 @@ -92,7 +92,7 @@ static int scx200_wdt_open(struct inode static int scx200_wdt_open(struct inode *inode, struct file *file) { /* only allow one at a time */ - if (down_trylock(&open_semaphore)) + if (!down_try(&open_semaphore)) return -EBUSY; scx200_wdt_enable(); diff -r c4dfb28595bc drivers/watchdog/wdt_pci.c --- a/drivers/watchdog/wdt_pci.c Mon May 05 10:27:58 2008 +1000 +++ b/drivers/watchdog/wdt_pci.c Mon May 05 10:32:35 2008 +1000 @@ -426,7 +426,7 @@ static int wdtpci_ioctl(struct inode *in static int wdtpci_open(struct inode *inode, struct file *file) { - if (down_trylock(&open_sem)) + if (!down_try(&open_sem)) return -EBUSY; if (nowayout) { diff -r c4dfb28595bc fs/ocfs2/inode.c --- a/fs/ocfs2/inode.c Mon May 05 10:27:58 2008 +1000 +++ b/fs/ocfs2/inode.c Mon May 05 10:32:35 2008 +1000 @@ -1062,10 +1062,6 @@ void ocfs2_clear_inode(struct inode *ino (unsigned long long)oi->ip_blkno); mutex_unlock(&oi->ip_io_mutex); - /* - * down_trylock() returns 0, down_write_trylock() returns 1 - * kernel 1, world 0 - */ mlog_bug_on_msg(!down_write_trylock(&oi->ip_alloc_sem), "Clear inode of %llu, alloc_sem is locked\n", (unsigned long long)oi->ip_blkno); diff -r c4dfb28595bc fs/reiserfs/journal.c --- a/fs/reiserfs/journal.c Mon May 05 10:27:58 2008 +1000 +++ b/fs/reiserfs/journal.c Mon May 05 10:32:35 2008 +1000 @@ -1412,7 +1412,7 @@ static int flush_journal_list(struct sup /* if flushall == 0, the lock is already held */ if (flushall) { down(&journal->j_flush_sem); - } else if (!down_trylock(&journal->j_flush_sem)) { + } else if (down_try(&journal->j_flush_sem)) { BUG(); } diff -r c4dfb28595bc fs/xfs/linux-2.6/sema.h --- a/fs/xfs/linux-2.6/sema.h Mon May 05 10:27:58 2008 +1000 +++ b/fs/xfs/linux-2.6/sema.h Mon May 05 10:32:36 2008 +1000 @@ -36,17 +36,15 @@ typedef struct semaphore sema_t; static inline int issemalocked(sema_t *sp) { - return down_trylock(sp) || (up(sp), 0); + return !down_try(sp) || (up(sp), 0); } /* - * Map cpsema (try to get the sema) to down_trylock. We need to switch - * the return values since cpsema returns 1 (acquired) 0 (failed) and - * down_trylock returns the reverse 0 (acquired) 1 (failed). + * Map cpsema (try to get the sema) to down_try. */ static inline int cpsema(sema_t *sp) { - return down_trylock(sp) ? 0 : 1; + return down_try(sp); } #endif /* __XFS_SUPPORT_SEMA_H__ */ diff -r c4dfb28595bc fs/xfs/linux-2.6/xfs_buf.c --- a/fs/xfs/linux-2.6/xfs_buf.c Mon May 05 10:27:58 2008 +1000 +++ b/fs/xfs/linux-2.6/xfs_buf.c Mon May 05 10:32:36 2008 +1000 @@ -530,7 +530,7 @@ found: * if this does not work then we need to drop the * spinlock and do a hard attempt on the semaphore. */ - if (down_trylock(&bp->b_sema)) { + if (!down_try(&bp->b_sema)) { if (!(flags & XBF_TRYLOCK)) { /* wait for buffer ownership */ XB_TRACE(bp, "get_lock", 0); @@ -873,7 +873,7 @@ xfs_buf_cond_lock( { int locked; - locked = down_trylock(&bp->b_sema) == 0; + locked = down_try(&bp->b_sema); if (locked) { XB_SET_OWNER(bp); } diff -r c4dfb28595bc include/linux/mutex.h --- a/include/linux/mutex.h Mon May 05 10:27:58 2008 +1000 +++ b/include/linux/mutex.h Mon May 05 10:32:36 2008 +1000 @@ -141,10 +141,6 @@ extern int __must_check mutex_lock_killa # define mutex_lock_killable_nested(lock, subclass) mutex_lock_killable(lock) #endif -/* - * NOTE: mutex_trylock() follows the spin_trylock() convention, - * not the down_trylock() convention! - */ extern int mutex_trylock(struct mutex *lock); extern void mutex_unlock(struct mutex *lock); diff -r c4dfb28595bc include/linux/semaphore.h --- a/include/linux/semaphore.h Mon May 05 10:27:58 2008 +1000 +++ b/include/linux/semaphore.h Mon May 05 10:32:36 2008 +1000 @@ -44,7 +44,7 @@ extern void down(struct semaphore *sem); extern void down(struct semaphore *sem); extern int __must_check down_interruptible(struct semaphore *sem); extern int __must_check down_killable(struct semaphore *sem); -extern int __must_check down_trylock(struct semaphore *sem); +extern int __must_check down_try(struct semaphore *sem); extern int __must_check down_timeout(struct semaphore *sem, long jiffies); extern void up(struct semaphore *sem); diff -r c4dfb28595bc include/linux/usb.h --- a/include/linux/usb.h Mon May 05 10:27:58 2008 +1000 +++ b/include/linux/usb.h Mon May 05 10:32:36 2008 +1000 @@ -491,7 +491,7 @@ extern void usb_put_dev(struct usb_devic /* USB device locking */ #define usb_lock_device(udev) down(&(udev)->dev.sem) #define usb_unlock_device(udev) up(&(udev)->dev.sem) -#define usb_trylock_device(udev) down_trylock(&(udev)->dev.sem) +#define usb_trylock_device(udev) down_try(&(udev)->dev.sem) extern int usb_lock_device_for_reset(struct usb_device *udev, const struct usb_interface *iface); diff -r c4dfb28595bc kernel/mutex.c --- a/kernel/mutex.c Mon May 05 10:27:58 2008 +1000 +++ b/kernel/mutex.c Mon May 05 10:32:36 2008 +1000 @@ -373,8 +373,8 @@ static inline int __mutex_trylock_slowpa * Try to acquire the mutex atomically. Returns 1 if the mutex * has been acquired successfully, and 0 on contention. * - * NOTE: this function follows the spin_trylock() convention, so - * it is negated to the down_trylock() return values! Be careful + * NOTE: this function follows the spin_trylock()/down_try() convention, + * so it is negated to the old down_trylock() return values! Be careful * about this when converting semaphore users to mutexes. * * This function must not be used in interrupt context. The diff -r c4dfb28595bc kernel/printk.c --- a/kernel/printk.c Mon May 05 10:27:58 2008 +1000 +++ b/kernel/printk.c Mon May 05 10:32:36 2008 +1000 @@ -986,7 +986,7 @@ EXPORT_SYMBOL(acquire_console_sem); int try_acquire_console_sem(void) { - if (down_trylock(&console_sem)) + if (!down_try(&console_sem)) return -1; console_locked = 1; console_may_schedule = 0; @@ -1083,7 +1083,7 @@ void console_unblank(void) * oops_in_progress is set to 1.. */ if (oops_in_progress) { - if (down_trylock(&console_sem) != 0) + if (!down_try(&console_sem)) return; } else acquire_console_sem(); diff -r c4dfb28595bc kernel/semaphore.c --- a/kernel/semaphore.c Mon May 05 10:27:58 2008 +1000 +++ b/kernel/semaphore.c Mon May 05 10:32:36 2008 +1000 @@ -14,7 +14,7 @@ * Some notes on the implementation: * * The spinlock controls access to the other members of the semaphore. - * down_trylock() and up() can be called from interrupt context, so we + * down_try() and up() can be called from interrupt context, so we * have to disable interrupts when taking the lock. It turns out various * parts of the kernel expect to be able to use down() on a semaphore in * interrupt context when they know it will succeed, so we have to use @@ -114,19 +114,18 @@ EXPORT_SYMBOL(down_killable); EXPORT_SYMBOL(down_killable); /** - * down_trylock - try to acquire the semaphore, without waiting + * down_try - try to acquire the semaphore, without waiting * @sem: the semaphore to be acquired * - * Try to acquire the semaphore atomically. Returns 0 if the mutex has - * been acquired successfully or 1 if it it cannot be acquired. + * Try to acquire the semaphore atomically. Returns true if the mutex has + * been acquired successfully or 0 if it it cannot be acquired. * - * NOTE: This return value is inverted from both spin_trylock and - * mutex_trylock! Be careful about this when converting code. + * NOTE: This replaces down_trylock() which returned the reverse. * * Unlike mutex_trylock, this function can be used from interrupt context, * and the semaphore can be released by any task or interrupt. */ -int down_trylock(struct semaphore *sem) +int down_try(struct semaphore *sem) { unsigned long flags; int count; @@ -137,9 +136,9 @@ int down_trylock(struct semaphore *sem) sem->count = count; spin_unlock_irqrestore(&sem->lock, flags); - return (count < 0); + return (count >= 0); } -EXPORT_SYMBOL(down_trylock); +EXPORT_SYMBOL(down_try); /** * down_timeout - acquire the semaphore within a specified time From owner-xfs@oss.sgi.com Sun May 4 18:56:07 2008 Received: with ECARTIS (v1.0.0; list xfs); Sun, 04 May 2008 18:56:22 -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.4 required=5.0 tests=BAYES_00,J_CHICKENPOX_26, J_CHICKENPOX_46 autolearn=no version=3.3.0-r574664 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id m451u6Vs002501 for ; Sun, 4 May 2008 18:56:07 -0700 X-ASG-Debug-ID: 1209952606-41d403200000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ozlabs.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 0E309163068B for ; Sun, 4 May 2008 18:56:47 -0700 (PDT) Received: from ozlabs.org (ozlabs.org [203.10.76.45]) by cuda.sgi.com with ESMTP id NkdzIdrVj00wVNkn for ; Sun, 04 May 2008 18:56:47 -0700 (PDT) Received: from vivaldi.local (unknown [203.213.241.221]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPSA id E3607DDE02; Mon, 5 May 2008 11:56:42 +1000 (EST) To: linux-kernel@vger.kernel.org From: Rusty Russell Date: Mon, 5 May 2008 01:56:35 +0000 X-ASG-Orig-Subj: [PATCH 1/1] Replace down_trylock() with down_try(), reverse return values. Subject: [PATCH 1/1] Replace down_trylock() with down_try(), reverse return values. Cc: gregkh@suse.de, kaos@sgi.com, Stephen Rothwell , rolandd@cisco.com, "Brian S. Julin" , Martin Diehl , mokuno@sm.sony.co.jp, aacraid@adaptec.com, mfasheh@suse.com, wim@iguana.be, xfs@oss.sgi.com, reiserfs-devel@vger.kernel.org, Matthew Wilcox Cc: kaos@sgi.com Cc: Stephen Rothwell Cc: rolandd@cisco.com Cc: "Brian S. Julin" Cc: Martin Diehl Cc: mokuno@sm.sony.co.jp Cc: aacraid@adaptec.com Cc: mfasheh@suse.com Cc: wim@iguana.be Cc: xfs@oss.sgi.com Cc: reiserfs-devel@vger.kernel.org Cc: Matthew Wilcox MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline Message-Id: <200805051156.36437.rusty@rustcorp.com.au> X-Barracuda-Connect: ozlabs.org[203.10.76.45] X-Barracuda-Start-Time: 1209952610 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: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.1, rules version 3.1.49693 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV 0.91.2/6021/Wed Feb 27 15:55:48 2008 on oss.sgi.com X-Virus-Status: Clean X-archive-position: 15772 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: rusty@rustcorp.com.au Precedence: bulk X-list: xfs down_trylock() returns 1 on failure, 0 on success. This differs from spin_trylock(), mutex_trylock() and common sense. Or as ocfs2 put it "kernel 1, world 0". Rename it to down_try() (which makes more sense anyway), and reverse it. Fortunately there aren't a huge number of callers left. I took the liberty of reversing the sense of usb_trylock_device() without renaming it: it's only used in one place anyway. Signed-off-by: Rusty Russell Cc: gregkh@suse.de Cc: kaos@sgi.com Cc: Stephen Rothwell Cc: rolandd@cisco.com Cc: "Brian S. Julin" Cc: Martin Diehl Cc: mokuno@sm.sony.co.jp Cc: aacraid@adaptec.com Cc: mfasheh@suse.com Cc: wim@iguana.be Cc: xfs@oss.sgi.com Cc: reiserfs-devel@vger.kernel.org Cc: Matthew Wilcox diff -r c4dfb28595bc Documentation/DocBook/kernel-locking.tmpl --- a/Documentation/DocBook/kernel-locking.tmpl Mon May 05 10:27:58 2008 +1000 +++ b/Documentation/DocBook/kernel-locking.tmpl Mon May 05 10:32:35 2008 +1000 @@ -1906,7 +1906,7 @@ machines due to caching. down() - There is a down_trylock() which can be + There is a down_try() which can be used inside interrupt context, as it will not sleep. up() will also never sleep. diff -r c4dfb28595bc arch/ia64/kernel/salinfo.c --- a/arch/ia64/kernel/salinfo.c Mon May 05 10:27:58 2008 +1000 +++ b/arch/ia64/kernel/salinfo.c Mon May 05 10:32:35 2008 +1000 @@ -192,7 +192,7 @@ static void static void salinfo_work_to_do(struct salinfo_data *data) { - down_trylock(&data->mutex); + down_try(&data->mutex); up(&data->mutex); } @@ -309,7 +309,7 @@ salinfo_event_read(struct file *file, ch int i, n, cpu = -1; retry: - if (cpus_empty(data->cpu_event) && down_trylock(&data->mutex)) { + if (cpus_empty(data->cpu_event) && !down_try(&data->mutex)) { if (file->f_flags & O_NONBLOCK) return -EAGAIN; if (down_interruptible(&data->mutex)) diff -r c4dfb28595bc drivers/char/snsc.c --- a/drivers/char/snsc.c Mon May 05 10:27:58 2008 +1000 +++ b/drivers/char/snsc.c Mon May 05 10:32:35 2008 +1000 @@ -161,7 +161,7 @@ scdrv_read(struct file *file, char __use struct subch_data_s *sd = (struct subch_data_s *) file->private_data; /* try to get control of the read buffer */ - if (down_trylock(&sd->sd_rbs)) { + if (!down_try(&sd->sd_rbs)) { /* somebody else has it now; * if we're non-blocking, then exit... */ @@ -253,7 +253,7 @@ scdrv_write(struct file *file, const cha struct subch_data_s *sd = (struct subch_data_s *) file->private_data; /* try to get control of the write buffer */ - if (down_trylock(&sd->sd_wbs)) { + if (!down_try(&sd->sd_wbs)) { /* somebody else has it now; * if we're non-blocking, then exit... */ diff -r c4dfb28595bc drivers/char/viotape.c --- a/drivers/char/viotape.c Mon May 05 10:27:58 2008 +1000 +++ b/drivers/char/viotape.c Mon May 05 10:32:35 2008 +1000 @@ -361,7 +361,7 @@ static ssize_t viotap_write(struct file * semaphore */ if (noblock) { - if (down_trylock(&reqSem)) { + if (!down_try(&reqSem)) { ret = -EWOULDBLOCK; goto free_op; } @@ -451,7 +451,7 @@ static ssize_t viotap_read(struct file * * semaphore */ if (noblock) { - if (down_trylock(&reqSem)) { + if (!down_try(&reqSem)) { ret = -EWOULDBLOCK; goto free_op; } diff -r c4dfb28595bc drivers/infiniband/core/user_mad.c --- a/drivers/infiniband/core/user_mad.c Mon May 05 10:27:58 2008 +1000 +++ b/drivers/infiniband/core/user_mad.c Mon May 05 10:32:35 2008 +1000 @@ -890,7 +890,7 @@ static int ib_umad_sm_open(struct inode return -ENXIO; if (filp->f_flags & O_NONBLOCK) { - if (down_trylock(&port->sm_sem)) { + if (!down_try(&port->sm_sem)) { ret = -EAGAIN; goto fail; } diff -r c4dfb28595bc drivers/input/serio/hil_mlc.c --- a/drivers/input/serio/hil_mlc.c Mon May 05 10:27:58 2008 +1000 +++ b/drivers/input/serio/hil_mlc.c Mon May 05 10:32:35 2008 +1000 @@ -607,7 +607,7 @@ static inline void hilse_setup_input(hil do_gettimeofday(&(mlc->instart)); mlc->icount = 15; memset(mlc->ipacket, 0, 16 * sizeof(hil_packet)); - BUG_ON(down_trylock(&mlc->isem)); + BUG_ON(!down_try(&mlc->isem)); } #ifdef HIL_MLC_DEBUG @@ -694,7 +694,7 @@ static int hilse_donode(hil_mlc *mlc) out2: write_unlock_irqrestore(&mlc->lock, flags); - if (down_trylock(&mlc->osem)) { + if (!down_try(&mlc->osem)) { nextidx = HILSEN_DOZE; break; } diff -r c4dfb28595bc drivers/input/serio/hp_sdc_mlc.c --- a/drivers/input/serio/hp_sdc_mlc.c Mon May 05 10:27:58 2008 +1000 +++ b/drivers/input/serio/hp_sdc_mlc.c Mon May 05 10:32:35 2008 +1000 @@ -148,7 +148,7 @@ static int hp_sdc_mlc_in(hil_mlc *mlc, s priv = mlc->priv; /* Try to down the semaphore */ - if (down_trylock(&mlc->isem)) { + if (!down_try(&mlc->isem)) { struct timeval tv; if (priv->emtestmode) { mlc->ipacket[0] = @@ -186,13 +186,13 @@ static int hp_sdc_mlc_cts(hil_mlc *mlc) priv = mlc->priv; /* Try to down the semaphores -- they should be up. */ - BUG_ON(down_trylock(&mlc->isem)); - BUG_ON(down_trylock(&mlc->osem)); + BUG_ON(!down_try(&mlc->isem)); + BUG_ON(!down_try(&mlc->osem)); up(&mlc->isem); up(&mlc->osem); - if (down_trylock(&mlc->csem)) { + if (!down_try(&mlc->csem)) { if (priv->trans.act.semaphore != &mlc->csem) goto poll; else @@ -229,7 +229,7 @@ static void hp_sdc_mlc_out(hil_mlc *mlc) priv = mlc->priv; /* Try to down the semaphore -- it should be up. */ - BUG_ON(down_trylock(&mlc->osem)); + BUG_ON(!down_try(&mlc->osem)); if (mlc->opacket & HIL_DO_ALTER_CTRL) goto do_control; @@ -240,7 +240,7 @@ static void hp_sdc_mlc_out(hil_mlc *mlc) return; } /* Shouldn't be sending commands when loop may be busy */ - BUG_ON(down_trylock(&mlc->csem)); + BUG_ON(!down_try(&mlc->csem)); up(&mlc->csem); priv->trans.actidx = 0; @@ -296,7 +296,7 @@ static void hp_sdc_mlc_out(hil_mlc *mlc) priv->tseq[3] = 0; if (mlc->opacket & HIL_CTRL_APE) { priv->tseq[3] |= HP_SDC_LPC_APE_IPF; - down_trylock(&mlc->csem); + down_try(&mlc->csem); } enqueue: hp_sdc_enqueue_transaction(&priv->trans); diff -r c4dfb28595bc drivers/md/dm-raid1.c --- a/drivers/md/dm-raid1.c Mon May 05 10:27:58 2008 +1000 +++ b/drivers/md/dm-raid1.c Mon May 05 10:32:35 2008 +1000 @@ -587,7 +587,7 @@ static void rh_recovery_prepare(struct r /* Extra reference to avoid race with rh_stop_recovery */ atomic_inc(&rh->recovery_in_flight); - while (!down_trylock(&rh->recovery_count)) { + while (down_try(&rh->recovery_count)) { atomic_inc(&rh->recovery_in_flight); if (__rh_recovery_prepare(rh) <= 0) { atomic_dec(&rh->recovery_in_flight); diff -r c4dfb28595bc drivers/net/3c527.c --- a/drivers/net/3c527.c Mon May 05 10:27:58 2008 +1000 +++ b/drivers/net/3c527.c Mon May 05 10:32:35 2008 +1000 @@ -577,7 +577,7 @@ static int mc32_command_nowait(struct ne int ioaddr = dev->base_addr; int ret = -1; - if (down_trylock(&lp->cmd_mutex) == 0) + if (down_try(&lp->cmd_mutex)) { lp->cmd_nonblocking=1; lp->exec_box->mbox=0; diff -r c4dfb28595bc drivers/net/irda/sir_dev.c --- a/drivers/net/irda/sir_dev.c Mon May 05 10:27:58 2008 +1000 +++ b/drivers/net/irda/sir_dev.c Mon May 05 10:32:35 2008 +1000 @@ -286,7 +286,7 @@ int sirdev_schedule_request(struct sir_d IRDA_DEBUG(2, "%s - state=0x%04x / param=%u\n", __FUNCTION__, initial_state, param); - if (down_trylock(&fsm->sem)) { + if (!down_try(&fsm->sem)) { if (in_interrupt() || in_atomic() || irqs_disabled()) { IRDA_DEBUG(1, "%s(), state machine busy!\n", __FUNCTION__); return -EWOULDBLOCK; diff -r c4dfb28595bc drivers/net/ps3_gelic_wireless.c --- a/drivers/net/ps3_gelic_wireless.c Mon May 05 10:27:58 2008 +1000 +++ b/drivers/net/ps3_gelic_wireless.c Mon May 05 10:32:35 2008 +1000 @@ -2151,7 +2151,7 @@ static void gelic_wl_disconnect_event(st * As it waits with timeout, just leave assoc_done * uncompleted, then it terminates with timeout */ - if (down_trylock(&wl->assoc_stat_lock)) { + if (!down_try(&wl->assoc_stat_lock)) { pr_debug("%s: already locked\n", __func__); lock = 0; } else { diff -r c4dfb28595bc drivers/net/wireless/airo.c --- a/drivers/net/wireless/airo.c Mon May 05 10:27:58 2008 +1000 +++ b/drivers/net/wireless/airo.c Mon May 05 10:32:35 2008 +1000 @@ -2138,7 +2138,7 @@ static int airo_start_xmit(struct sk_buf fids[i] |= (len << 16); priv->xmit.skb = skb; priv->xmit.fid = i; - if (down_trylock(&priv->sem) != 0) { + if (!down_try(&priv->sem)) { set_bit(FLAG_PENDING_XMIT, &priv->flags); netif_stop_queue(dev); set_bit(JOB_XMIT, &priv->jobs); @@ -2209,7 +2209,7 @@ static int airo_start_xmit11(struct sk_b fids[i] |= (len << 16); priv->xmit11.skb = skb; priv->xmit11.fid = i; - if (down_trylock(&priv->sem) != 0) { + if (!down_try(&priv->sem)) { set_bit(FLAG_PENDING_XMIT11, &priv->flags); netif_stop_queue(dev); set_bit(JOB_XMIT11, &priv->jobs); @@ -2257,7 +2257,7 @@ static struct net_device_stats *airo_get if (!test_bit(JOB_STATS, &local->jobs)) { /* Get stats out of the card if available */ - if (down_trylock(&local->sem) != 0) { + if (!down_try(&local->sem)) { set_bit(JOB_STATS, &local->jobs); wake_up_interruptible(&local->thr_wait); } else @@ -2284,7 +2284,7 @@ static void airo_set_multicast_list(stru if ((dev->flags ^ ai->flags) & IFF_PROMISC) { change_bit(FLAG_PROMISC, &ai->flags); - if (down_trylock(&ai->sem) != 0) { + if (!down_try(&ai->sem)) { set_bit(JOB_PROMISC, &ai->jobs); wake_up_interruptible(&ai->thr_wait); } else @@ -3211,7 +3211,7 @@ static irqreturn_t airo_interrupt(int ir set_bit(FLAG_UPDATE_UNI, &apriv->flags); set_bit(FLAG_UPDATE_MULTI, &apriv->flags); - if (down_trylock(&apriv->sem) != 0) { + if (!down_try(&apriv->sem)) { set_bit(JOB_EVENT, &apriv->jobs); wake_up_interruptible(&apriv->thr_wait); } else @@ -7658,7 +7658,7 @@ static struct iw_statistics *airo_get_wi if (!test_bit(JOB_WSTATS, &local->jobs)) { /* Get stats out of the card if available */ - if (down_trylock(&local->sem) != 0) { + if (!down_try(&local->sem)) { set_bit(JOB_WSTATS, &local->jobs); wake_up_interruptible(&local->thr_wait); } else diff -r c4dfb28595bc drivers/scsi/aacraid/commsup.c --- a/drivers/scsi/aacraid/commsup.c Mon May 05 10:27:58 2008 +1000 +++ b/drivers/scsi/aacraid/commsup.c Mon May 05 10:32:35 2008 +1000 @@ -490,7 +490,7 @@ int aac_fib_send(u16 command, struct fib * hardware failure has occurred. */ unsigned long count = 36000000L; /* 3 minutes */ - while (down_trylock(&fibptr->event_wait)) { + while (!down_try(&fibptr->event_wait)) { int blink; if (--count == 0) { struct aac_queue * q = &dev->queues->queue[AdapNormCmdQueue]; diff -r c4dfb28595bc drivers/usb/core/usb.c --- a/drivers/usb/core/usb.c Mon May 05 10:27:58 2008 +1000 +++ b/drivers/usb/core/usb.c Mon May 05 10:32:35 2008 +1000 @@ -477,7 +477,7 @@ int usb_lock_device_for_reset(struct usb } } - while (usb_trylock_device(udev) != 0) { + while (!usb_trylock_device(udev)) { /* If we can't acquire the lock after waiting one second, * we're probably deadlocked */ diff -r c4dfb28595bc drivers/usb/gadget/inode.c --- a/drivers/usb/gadget/inode.c Mon May 05 10:27:58 2008 +1000 +++ b/drivers/usb/gadget/inode.c Mon May 05 10:32:35 2008 +1000 @@ -298,7 +298,7 @@ get_ready_ep (unsigned f_flags, struct e int val; if (f_flags & O_NONBLOCK) { - if (down_trylock (&epdata->lock) != 0) + if (!down_try (&epdata->lock)) goto nonblock; if (epdata->state != STATE_EP_ENABLED) { up (&epdata->lock); diff -r c4dfb28595bc drivers/watchdog/ar7_wdt.c --- a/drivers/watchdog/ar7_wdt.c Mon May 05 10:27:58 2008 +1000 +++ b/drivers/watchdog/ar7_wdt.c Mon May 05 10:32:35 2008 +1000 @@ -179,7 +179,7 @@ static int ar7_wdt_open(struct inode *in static int ar7_wdt_open(struct inode *inode, struct file *file) { /* only allow one at a time */ - if (down_trylock(&open_semaphore)) + if (!down_try(&open_semaphore)) return -EBUSY; ar7_wdt_enable_wdt(); expect_close = 0; diff -r c4dfb28595bc drivers/watchdog/it8712f_wdt.c --- a/drivers/watchdog/it8712f_wdt.c Mon May 05 10:27:58 2008 +1000 +++ b/drivers/watchdog/it8712f_wdt.c Mon May 05 10:32:35 2008 +1000 @@ -306,7 +306,7 @@ it8712f_wdt_open(struct inode *inode, st it8712f_wdt_open(struct inode *inode, struct file *file) { /* only allow one at a time */ - if (down_trylock(&it8712f_wdt_sem)) + if (!down_try(&it8712f_wdt_sem)) return -EBUSY; it8712f_wdt_enable(); diff -r c4dfb28595bc drivers/watchdog/s3c2410_wdt.c --- a/drivers/watchdog/s3c2410_wdt.c Mon May 05 10:27:58 2008 +1000 +++ b/drivers/watchdog/s3c2410_wdt.c Mon May 05 10:32:35 2008 +1000 @@ -211,7 +211,7 @@ static int s3c2410wdt_set_heartbeat(int static int s3c2410wdt_open(struct inode *inode, struct file *file) { - if(down_trylock(&open_lock)) + if(!down_try(&open_lock)) return -EBUSY; if (nowayout) diff -r c4dfb28595bc drivers/watchdog/sc1200wdt.c --- a/drivers/watchdog/sc1200wdt.c Mon May 05 10:27:58 2008 +1000 +++ b/drivers/watchdog/sc1200wdt.c Mon May 05 10:32:35 2008 +1000 @@ -151,7 +151,7 @@ static int sc1200wdt_open(struct inode * static int sc1200wdt_open(struct inode *inode, struct file *file) { /* allow one at a time */ - if (down_trylock(&open_sem)) + if (!down_try(&open_sem)) return -EBUSY; if (timeout > MAX_TIMEOUT) diff -r c4dfb28595bc drivers/watchdog/scx200_wdt.c --- a/drivers/watchdog/scx200_wdt.c Mon May 05 10:27:58 2008 +1000 +++ b/drivers/watchdog/scx200_wdt.c Mon May 05 10:32:35 2008 +1000 @@ -92,7 +92,7 @@ static int scx200_wdt_open(struct inode static int scx200_wdt_open(struct inode *inode, struct file *file) { /* only allow one at a time */ - if (down_trylock(&open_semaphore)) + if (!down_try(&open_semaphore)) return -EBUSY; scx200_wdt_enable(); diff -r c4dfb28595bc drivers/watchdog/wdt_pci.c --- a/drivers/watchdog/wdt_pci.c Mon May 05 10:27:58 2008 +1000 +++ b/drivers/watchdog/wdt_pci.c Mon May 05 10:32:35 2008 +1000 @@ -426,7 +426,7 @@ static int wdtpci_ioctl(struct inode *in static int wdtpci_open(struct inode *inode, struct file *file) { - if (down_trylock(&open_sem)) + if (!down_try(&open_sem)) return -EBUSY; if (nowayout) { diff -r c4dfb28595bc fs/ocfs2/inode.c --- a/fs/ocfs2/inode.c Mon May 05 10:27:58 2008 +1000 +++ b/fs/ocfs2/inode.c Mon May 05 10:32:35 2008 +1000 @@ -1062,10 +1062,6 @@ void ocfs2_clear_inode(struct inode *ino (unsigned long long)oi->ip_blkno); mutex_unlock(&oi->ip_io_mutex); - /* - * down_trylock() returns 0, down_write_trylock() returns 1 - * kernel 1, world 0 - */ mlog_bug_on_msg(!down_write_trylock(&oi->ip_alloc_sem), "Clear inode of %llu, alloc_sem is locked\n", (unsigned long long)oi->ip_blkno); diff -r c4dfb28595bc fs/reiserfs/journal.c --- a/fs/reiserfs/journal.c Mon May 05 10:27:58 2008 +1000 +++ b/fs/reiserfs/journal.c Mon May 05 10:32:35 2008 +1000 @@ -1412,7 +1412,7 @@ static int flush_journal_list(struct sup /* if flushall == 0, the lock is already held */ if (flushall) { down(&journal->j_flush_sem); - } else if (!down_trylock(&journal->j_flush_sem)) { + } else if (down_try(&journal->j_flush_sem)) { BUG(); } diff -r c4dfb28595bc fs/xfs/linux-2.6/sema.h --- a/fs/xfs/linux-2.6/sema.h Mon May 05 10:27:58 2008 +1000 +++ b/fs/xfs/linux-2.6/sema.h Mon May 05 10:32:36 2008 +1000 @@ -36,17 +36,15 @@ typedef struct semaphore sema_t; static inline int issemalocked(sema_t *sp) { - return down_trylock(sp) || (up(sp), 0); + return !down_try(sp) || (up(sp), 0); } /* - * Map cpsema (try to get the sema) to down_trylock. We need to switch - * the return values since cpsema returns 1 (acquired) 0 (failed) and - * down_trylock returns the reverse 0 (acquired) 1 (failed). + * Map cpsema (try to get the sema) to down_try. */ static inline int cpsema(sema_t *sp) { - return down_trylock(sp) ? 0 : 1; + return down_try(sp); } #endif /* __XFS_SUPPORT_SEMA_H__ */ diff -r c4dfb28595bc fs/xfs/linux-2.6/xfs_buf.c --- a/fs/xfs/linux-2.6/xfs_buf.c Mon May 05 10:27:58 2008 +1000 +++ b/fs/xfs/linux-2.6/xfs_buf.c Mon May 05 10:32:36 2008 +1000 @@ -530,7 +530,7 @@ found: * if this does not work then we need to drop the * spinlock and do a hard attempt on the semaphore. */ - if (down_trylock(&bp->b_sema)) { + if (!down_try(&bp->b_sema)) { if (!(flags & XBF_TRYLOCK)) { /* wait for buffer ownership */ XB_TRACE(bp, "get_lock", 0); @@ -873,7 +873,7 @@ xfs_buf_cond_lock( { int locked; - locked = down_trylock(&bp->b_sema) == 0; + locked = down_try(&bp->b_sema); if (locked) { XB_SET_OWNER(bp); } diff -r c4dfb28595bc include/linux/mutex.h --- a/include/linux/mutex.h Mon May 05 10:27:58 2008 +1000 +++ b/include/linux/mutex.h Mon May 05 10:32:36 2008 +1000 @@ -141,10 +141,6 @@ extern int __must_check mutex_lock_killa # define mutex_lock_killable_nested(lock, subclass) mutex_lock_killable(lock) #endif -/* - * NOTE: mutex_trylock() follows the spin_trylock() convention, - * not the down_trylock() convention! - */ extern int mutex_trylock(struct mutex *lock); extern void mutex_unlock(struct mutex *lock); diff -r c4dfb28595bc include/linux/semaphore.h --- a/include/linux/semaphore.h Mon May 05 10:27:58 2008 +1000 +++ b/include/linux/semaphore.h Mon May 05 10:32:36 2008 +1000 @@ -44,7 +44,7 @@ extern void down(struct semaphore *sem); extern void down(struct semaphore *sem); extern int __must_check down_interruptible(struct semaphore *sem); extern int __must_check down_killable(struct semaphore *sem); -extern int __must_check down_trylock(struct semaphore *sem); +extern int __must_check down_try(struct semaphore *sem); extern int __must_check down_timeout(struct semaphore *sem, long jiffies); extern void up(struct semaphore *sem); diff -r c4dfb28595bc include/linux/usb.h --- a/include/linux/usb.h Mon May 05 10:27:58 2008 +1000 +++ b/include/linux/usb.h Mon May 05 10:32:36 2008 +1000 @@ -491,7 +491,7 @@ extern void usb_put_dev(struct usb_devic /* USB device locking */ #define usb_lock_device(udev) down(&(udev)->dev.sem) #define usb_unlock_device(udev) up(&(udev)->dev.sem) -#define usb_trylock_device(udev) down_trylock(&(udev)->dev.sem) +#define usb_trylock_device(udev) down_try(&(udev)->dev.sem) extern int usb_lock_device_for_reset(struct usb_device *udev, const struct usb_interface *iface); diff -r c4dfb28595bc kernel/mutex.c --- a/kernel/mutex.c Mon May 05 10:27:58 2008 +1000 +++ b/kernel/mutex.c Mon May 05 10:32:36 2008 +1000 @@ -373,8 +373,8 @@ static inline int __mutex_trylock_slowpa * Try to acquire the mutex atomically. Returns 1 if the mutex * has been acquired successfully, and 0 on contention. * - * NOTE: this function follows the spin_trylock() convention, so - * it is negated to the down_trylock() return values! Be careful + * NOTE: this function follows the spin_trylock()/down_try() convention, + * so it is negated to the old down_trylock() return values! Be careful * about this when converting semaphore users to mutexes. * * This function must not be used in interrupt context. The diff -r c4dfb28595bc kernel/printk.c --- a/kernel/printk.c Mon May 05 10:27:58 2008 +1000 +++ b/kernel/printk.c Mon May 05 10:32:36 2008 +1000 @@ -986,7 +986,7 @@ EXPORT_SYMBOL(acquire_console_sem); int try_acquire_console_sem(void) { - if (down_trylock(&console_sem)) + if (!down_try(&console_sem)) return -1; console_locked = 1; console_may_schedule = 0; @@ -1083,7 +1083,7 @@ void console_unblank(void) * oops_in_progress is set to 1.. */ if (oops_in_progress) { - if (down_trylock(&console_sem) != 0) + if (!down_try(&console_sem)) return; } else acquire_console_sem(); diff -r c4dfb28595bc kernel/semaphore.c --- a/kernel/semaphore.c Mon May 05 10:27:58 2008 +1000 +++ b/kernel/semaphore.c Mon May 05 10:32:36 2008 +1000 @@ -14,7 +14,7 @@ * Some notes on the implementation: * * The spinlock controls access to the other members of the semaphore. - * down_trylock() and up() can be called from interrupt context, so we + * down_try() and up() can be called from interrupt context, so we * have to disable interrupts when taking the lock. It turns out various * parts of the kernel expect to be able to use down() on a semaphore in * interrupt context when they know it will succeed, so we have to use @@ -114,19 +114,18 @@ EXPORT_SYMBOL(down_killable); EXPORT_SYMBOL(down_killable); /** - * down_trylock - try to acquire the semaphore, without waiting + * down_try - try to acquire the semaphore, without waiting * @sem: the semaphore to be acquired * - * Try to acquire the semaphore atomically. Returns 0 if the mutex has - * been acquired successfully or 1 if it it cannot be acquired. + * Try to acquire the semaphore atomically. Returns true if the mutex has + * been acquired successfully or 0 if it it cannot be acquired. * - * NOTE: This return value is inverted from both spin_trylock and - * mutex_trylock! Be careful about this when converting code. + * NOTE: This replaces down_trylock() which returned the reverse. * * Unlike mutex_trylock, this function can be used from interrupt context, * and the semaphore can be released by any task or interrupt. */ -int down_trylock(struct semaphore *sem) +int down_try(struct semaphore *sem) { unsigned long flags; int count; @@ -137,9 +136,9 @@ int down_trylock(struct semaphore *sem) sem->count = count; spin_unlock_irqrestore(&sem->lock, flags); - return (count < 0); + return (count >= 0); } -EXPORT_SYMBOL(down_trylock); +EXPORT_SYMBOL(down_try); /** * down_timeout - acquire the semaphore within a specified time From owner-xfs@oss.sgi.com Sun May 4 20:28:50 2008 Received: with ECARTIS (v1.0.0; list xfs); Sun, 04 May 2008 20:29:07 -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.0 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-r574664 Received: from larry.melbourne.sgi.com (larry.melbourne.sgi.com [134.14.52.130]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with SMTP id m453Sk71013218 for ; Sun, 4 May 2008 20:28:48 -0700 Received: from boing.melbourne.sgi.com (boing.melbourne.sgi.com [134.14.55.141]) by larry.melbourne.sgi.com (950413.SGI.8.6.12/950213.SGI.AUTOCF) via ESMTP id NAA15860; Mon, 5 May 2008 13:29:27 +1000 Message-ID: <481E7F17.5090601@sgi.com> Date: Mon, 05 May 2008 13:29:27 +1000 From: Timothy Shimmin User-Agent: Thunderbird 2.0.0.14 (Macintosh/20080421) MIME-Version: 1.0 To: xfs-dev , xfs-oss Subject: review: xfstests/016 change Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Virus-Scanned: ClamAV 0.91.2/6021/Wed Feb 27 15:55:48 2008 on oss.sgi.com X-Virus-Status: Clean X-archive-position: 15773 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: tes@sgi.com Precedence: bulk X-list: xfs Hi there, xfstests/016 has been failing for a while in many cases. It was relying on the log traffic for create/rm to be unaltered in XFS over the life of XFS. Its initial purpose was to test out the writing of the log around wrapping and checking that as we wrapped we didn't corrupt any data after the end of the log. The patch is to modify xfstest, 016, to take a sampling of the log traffic to guestimate how many ops are needed to get to the end of the log, instead of hard-coding in how many ops are expected to get there. --Tim =========================================================================== Index: xfstests/016 =========================================================================== --- a/xfstests/016 2008-05-05 11:26:50.000000000 +1000 +++ b/xfstests/016 2008-05-05 13:07:01.040000000 +1000 @@ -50,7 +50,7 @@ _init() echo "*** reset partition" $here/src/devzero -b 2048 -n 50 -v 198 $SCRATCH_DEV echo "*** mkfs" - force_opts="-dsize=50m -lsize=2097152" + force_opts="-dsize=50m -lsize=$log_size" echo mkfs_xfs $force_opts $SCRATCH_DEV >>$seq.full _scratch_mkfs_xfs $force_opts >$tmp.mkfs0 2>&1 [ $? -ne 0 ] && \ @@ -156,6 +156,10 @@ _supported_os Linux rm -f $seq.full +# mkfs sizes +log_size=2097152 +log_size_bb=`expr $log_size / 512` + _require_scratch _init @@ -163,27 +167,47 @@ block=`_after_log $SCRATCH_DEV` echo "fsblock after log = $block" >>$seq.full _check_corrupt $SCRATCH_DEV $block -size=`_log_size` -echo "log size = $size BB" >>$seq.full +actual_log_size=`_log_size` +echo "log size = $actual_log_size BB" >>$seq.full head=`_log_head` echo "log position = $head" >>$seq.full lsunit=`_log_sunit` echo "log sunit = $lsunit" >>$seq.full -[ $size -eq 4096 ] || \ +# sanity checks +[ $actual_log_size -eq $log_size_bb ] || \ _fail "!!! unexpected log size $size" [ $head -eq 2 -o $head -eq $((lsunit/512)) ] || \ _fail "!!! unexpected initial log position $head vs. $((lsunit/512))" -echo " lots of traffic" >>$seq.full -_log_traffic 850 +# find how how many blocks per op for 100 ops +# ignore the fact that it will also include an unmount record etc... +# this should be small overall +echo " lots of traffic for sampling" >>$seq.full +sample_size_ops=100 +_log_traffic $sample_size_ops +head1=`_log_head` +num_blocks=`expr $head1 - $head` +blocks_per_op=`echo "scale=3; $num_blocks / $sample_size_ops" | bc` +echo "blocks_per_op = $blocks_per_op" >>$seq.full +num_expected_ops=`echo "$log_size_bb / $blocks_per_op" | bc` +echo "num_expected_ops = $num_expected_ops" >>$seq.full +num_expected_to_go=`echo "$num_expected_ops - $sample_size_ops" | bc` +echo "num_expected_to_go = $num_expected_to_go" >>$seq.full + +echo " lots more traffic" >>$seq.full +_log_traffic $num_expected_to_go head=`_log_head` echo "log position = $head" >>$seq.full -[ $head -gt 3850 -a $head -lt 4050 ] || \ - _fail "!!! unexpected log position $head" +# e.g. 3891 +near_end_min=`echo "0.95 * $log_size_bb" | bc | sed 's/\..*//'` +echo "near_end_min = $near_end_min" >>$seq.full + +[ $head -gt $near_end_min -a $head -lt $log_size_bb ] || \ + _fail "!!! unexpected near end log position $head" -for c in 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 +for c in `seq 0 20` do echo " little traffic" >>$seq.full _log_traffic 2 @@ -193,7 +217,7 @@ do done [ $head -lt 1000 ] || \ - _fail "!!! unexpected log position $head" + _fail "!!! unexpected wrapped log position $head" # success, all done status=0 From owner-xfs@oss.sgi.com Sun May 4 22:42:31 2008 Received: with ECARTIS (v1.0.0; list xfs); Sun, 04 May 2008 22:42:48 -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.1 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-r574664 Received: from larry.melbourne.sgi.com (larry.melbourne.sgi.com [134.14.52.130]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with SMTP id m455gRLa019318 for ; Sun, 4 May 2008 22:42:29 -0700 Received: from chook.melbourne.sgi.com (chook.melbourne.sgi.com [134.14.54.237]) by larry.melbourne.sgi.com (950413.SGI.8.6.12/950213.SGI.AUTOCF) via ESMTP id PAA18728; Mon, 5 May 2008 15:43:07 +1000 Received: by chook.melbourne.sgi.com (Postfix, from userid 1161) id 562FB58C4C15; Mon, 5 May 2008 15:43:07 +1000 (EST) To: sgi.bugs.xfs@engr.sgi.com Cc: xfs@oss.sgi.com Subject: TAKE 981154 - Add support for sb_bad_features2 in QA 122 Message-Id: <20080505054307.562FB58C4C15@chook.melbourne.sgi.com> Date: Mon, 5 May 2008 15:43:07 +1000 (EST) From: bnaujok@sgi.com (Barry Naujok) X-Virus-Scanned: ClamAV 0.91.2/6021/Wed Feb 27 15:55:48 2008 on oss.sgi.com X-Virus-Status: Clean X-archive-position: 15774 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: bnaujok@sgi.com Precedence: bulk X-list: xfs Date: Mon May 5 15:42:52 AEST 2008 Workarea: chook.melbourne.sgi.com:/home/bnaujok/isms/repair Inspected by: tes@sgi.com The following file(s) were checked into: longdrop.melbourne.sgi.com:/isms/xfs-cmds/master-melb Modid: master-melb:xfs-cmds:31022a xfstests/122 - 1.8 - changed http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-cmds/xfstests/122.diff?r1=text&tr1=1.8&r2=text&tr2=1.7&f=h xfstests/122.out - 1.5 - changed http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-cmds/xfstests/122.out.diff?r1=text&tr1=1.5&r2=text&tr2=1.4&f=h - Add support for sb_bad_features2 in superblock structure From owner-xfs@oss.sgi.com Sun May 4 22:54:36 2008 Received: with ECARTIS (v1.0.0; list xfs); Sun, 04 May 2008 22:54:43 -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.5 required=5.0 tests=AWL,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 m455sZSm020622 for ; Sun, 4 May 2008 22:54:36 -0700 X-ASG-Debug-ID: 1209966917-39e601100000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 6952CB00A13; Sun, 4 May 2008 22:55:17 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id JGFWCFHbLc0HDpSq; Sun, 04 May 2008 22:55:17 -0700 (PDT) Received: from hch by bombadil.infradead.org with local (Exim 4.68 #1 (Red Hat Linux)) id 1JstfR-0005Qq-GY; Mon, 05 May 2008 05:55:17 +0000 Date: Mon, 5 May 2008 01:55:17 -0400 From: Christoph Hellwig To: Barry Naujok Cc: sgi.bugs.xfs@engr.sgi.com, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: TAKE 981154 - Add support for sb_bad_features2 in QA 122 Subject: Re: TAKE 981154 - Add support for sb_bad_features2 in QA 122 Message-ID: <20080505055517.GC15609@infradead.org> References: <20080505054307.562FB58C4C15@chook.melbourne.sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20080505054307.562FB58C4C15@chook.melbourne.sgi.com> User-Agent: Mutt/1.5.17 (2007-11-01) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1209966921 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: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.1, rules version 3.1.49697 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV 0.91.2/6021/Wed Feb 27 15:55:48 2008 on oss.sgi.com X-Virus-Status: Clean X-archive-position: 15776 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: hch@infradead.org Precedence: bulk X-list: xfs I guess this fixes the 122 failures that came up recently? From owner-xfs@oss.sgi.com Sun May 4 22:54:05 2008 Received: with ECARTIS (v1.0.0; list xfs); Sun, 04 May 2008 22:54:22 -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.5 required=5.0 tests=AWL,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 m455s4s6020570 for ; Sun, 4 May 2008 22:54:05 -0700 X-ASG-Debug-ID: 1209966886-397b01120000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 0AE8EB00B96; Sun, 4 May 2008 22:54:46 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 0d1QAWK2HRIwxC5j; Sun, 04 May 2008 22:54:46 -0700 (PDT) Received: from hch by bombadil.infradead.org with local (Exim 4.68 #1 (Red Hat Linux)) id 1Jstew-00054b-JX; Mon, 05 May 2008 05:54:46 +0000 Date: Mon, 5 May 2008 01:54:46 -0400 From: Christoph Hellwig To: Timothy Shimmin Cc: xfs-dev , xfs-oss X-ASG-Orig-Subj: Re: review: xfstests/016 change Subject: Re: review: xfstests/016 change Message-ID: <20080505055446.GB15609@infradead.org> References: <481E7F17.5090601@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <481E7F17.5090601@sgi.com> User-Agent: Mutt/1.5.17 (2007-11-01) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1209966890 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: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.1, rules version 3.1.49697 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV 0.91.2/6021/Wed Feb 27 15:55:48 2008 on oss.sgi.com X-Virus-Status: Clean X-archive-position: 15775 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: hch@infradead.org Precedence: bulk X-list: xfs On Mon, May 05, 2008 at 01:29:27PM +1000, Timothy Shimmin wrote: > Hi there, > > xfstests/016 has been failing for a while in many cases. > It was relying on the log traffic for create/rm to be unaltered > in XFS over the life of XFS. > Its initial purpose was to test out the writing of the log around > wrapping and checking that as we wrapped we didn't corrupt any data > after the end of the log. > > The patch is to modify xfstest, 016, to take a sampling of the log traffic > to guestimate how many ops are needed to get to the end of the log, > instead of hard-coding in how many ops are expected to get there. I get four rejects out of four hunk when trying to apply this patch, looks like whitespace-damage. From owner-xfs@oss.sgi.com Sun May 4 22:57:50 2008 Received: with ECARTIS (v1.0.0; list xfs); Sun, 04 May 2008 22:58:11 -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.5 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-r574664 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id m455vlZx021187 for ; Sun, 4 May 2008 22:57:50 -0700 X-ASG-Debug-ID: 1209967109-41c201080000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id A7BB6163450A for ; Sun, 4 May 2008 22:58:29 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id cqPxF49C5b44FYgd for ; Sun, 04 May 2008 22:58:29 -0700 (PDT) Received: from hch by bombadil.infradead.org with local (Exim 4.68 #1 (Red Hat Linux)) id 1JstiR-0005qI-Nm; Mon, 05 May 2008 05:58:23 +0000 Date: Mon, 5 May 2008 01:58:23 -0400 From: Christoph Hellwig To: Rusty Russell Cc: linux-kernel@vger.kernel.org, gregkh@suse.de, kaos@sgi.com, Stephen Rothwell , rolandd@cisco.com, "Brian S. Julin" , Martin Diehl , mokuno@sm.sony.co.jp, aacraid@adaptec.com, mfasheh@suse.com, wim@iguana.be, xfs@oss.sgi.com, reiserfs-devel@vger.kernel.org, Matthew Wilcox X-ASG-Orig-Subj: Re: [PATCH 1/1] Replace down_trylock() with down_try(), reverse return values. Subject: Re: [PATCH 1/1] Replace down_trylock() with down_try(), reverse return values. Message-ID: <20080505055823.GA20970@infradead.org> References: <200805051156.36437.rusty@rustcorp.com.au> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <200805051156.36437.rusty@rustcorp.com.au> User-Agent: Mutt/1.5.17 (2007-11-01) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1209967112 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: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.1, rules version 3.1.49697 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV 0.91.2/6021/Wed Feb 27 15:55:48 2008 on oss.sgi.com X-Virus-Status: Clean X-archive-position: 15777 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: hch@infradead.org Precedence: bulk X-list: xfs On Mon, May 05, 2008 at 01:56:35AM +0000, Rusty Russell wrote: > > down_trylock() returns 1 on failure, 0 on success. This differs from > spin_trylock(), mutex_trylock() and common sense. Or as ocfs2 put it > "kernel 1, world 0". > > Rename it to down_try() (which makes more sense anyway), and reverse > it. Fortunately there aren't a huge number of callers left. > > I took the liberty of reversing the sense of usb_trylock_device() > without renaming it: it's only used in one place anyway. Given that people are actively trying to kill struct semaphore I don't think doing a big search and rename is a good idea right now. (And I also really hate the name down_try, but when it goes away that's rather void and we can spare the discussion) From owner-xfs@oss.sgi.com Sun May 4 23:08:37 2008 Received: with ECARTIS (v1.0.0; list xfs); Sun, 04 May 2008 23:09:08 -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.5 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-r574664 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.168.29]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id m4568aml022817 for ; Sun, 4 May 2008 23:08:37 -0700 X-ASG-Debug-ID: 1209967758-42fd03bf0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ozlabs.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id F2618125080 for ; Sun, 4 May 2008 23:09:18 -0700 (PDT) Received: from ozlabs.org (ozlabs.org [203.10.76.45]) by cuda.sgi.com with ESMTP id 0HupDjmTcz5h9U3D for ; Sun, 04 May 2008 23:09:18 -0700 (PDT) Received: from vivaldi.local (unknown [203.213.241.221]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPSA id CD751DDEEA; Mon, 5 May 2008 16:09:15 +1000 (EST) From: Rusty Russell To: Christoph Hellwig X-ASG-Orig-Subj: Re: [PATCH 1/1] Replace down_trylock() with down_try(), reverse return values. Subject: Re: [PATCH 1/1] Replace down_trylock() with down_try(), reverse return values. Date: Mon, 5 May 2008 16:09:12 +1000 User-Agent: KMail/1.9.9 Cc: linux-kernel@vger.kernel.org, gregkh@suse.de, kaos@sgi.com, Stephen Rothwell , rolandd@cisco.com, "Brian S. Julin" , Martin Diehl , mokuno@sm.sony.co.jp, aacraid@adaptec.com, mfasheh@suse.com, wim@iguana.be, xfs@oss.sgi.com, reiserfs-devel@vger.kernel.org, Matthew Wilcox References: <200805051156.36437.rusty@rustcorp.com.au> <20080505055823.GA20970@infradead.org> In-Reply-To: <20080505055823.GA20970@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Content-Disposition: inline Message-Id: <200805051609.13731.rusty@rustcorp.com.au> X-Barracuda-Connect: ozlabs.org[203.10.76.45] X-Barracuda-Start-Time: 1209967761 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0209 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.1, rules version 3.1.49697 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV 0.91.2/6021/Wed Feb 27 15:55:48 2008 on oss.sgi.com X-Virus-Status: Clean X-archive-position: 15778 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: rusty@rustcorp.com.au Precedence: bulk X-list: xfs On Monday 05 May 2008 15:58:23 Christoph Hellwig wrote: > On Mon, May 05, 2008 at 01:56:35AM +0000, Rusty Russell wrote: > > down_trylock() returns 1 on failure, 0 on success. This differs from > > spin_trylock(), mutex_trylock() and common sense. Or as ocfs2 put it > > "kernel 1, world 0". > > > > Rename it to down_try() (which makes more sense anyway), and reverse > > it. Fortunately there aren't a huge number of callers left. > > Given that people are actively trying to kill struct semaphore I don't > think doing a big search and rename is a good idea right now. If it goes away before the 2.6.27 merge window, great. But I don't see that happening, so let's clean up this horror. I cc'd all the people effected in the hope that it will prod some of them towards mutexes anyway. > (And I also really hate the name down_try, but when it goes away that's > rather void and we can spare the discussion) Ideas? down() is pretty bad, down_try() matches it. Thanks, Rusty. From owner-xfs@oss.sgi.com Sun May 4 23:09:02 2008 Received: with ECARTIS (v1.0.0; list xfs); Sun, 04 May 2008 23:09:19 -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.1 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-r574664 Received: from larry.melbourne.sgi.com (larry.melbourne.sgi.com [134.14.52.130]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with SMTP id m4568waH022852 for ; Sun, 4 May 2008 23:09:01 -0700 Received: from pc-bnaujok.melbourne.sgi.com (pc-bnaujok.melbourne.sgi.com [134.14.55.58]) by larry.melbourne.sgi.com (950413.SGI.8.6.12/950213.SGI.AUTOCF) via ESMTP id QAA19348; Mon, 5 May 2008 16:09:32 +1000 To: "Christoph Hellwig" Subject: Re: TAKE 981154 - Add support for sb_bad_features2 in QA 122 From: "Barry Naujok" Organization: SGI Cc: sgi.bugs.xfs@engr.sgi.com, xfs@oss.sgi.com Content-Type: text/plain; format=flowed; delsp=yes; charset=utf-8 MIME-Version: 1.0 References: <20080505054307.562FB58C4C15@chook.melbourne.sgi.com> <20080505055517.GC15609@infradead.org> Content-Transfer-Encoding: 7bit Date: Mon, 05 May 2008 16:10:56 +1000 Message-ID: In-Reply-To: <20080505055517.GC15609@infradead.org> User-Agent: Opera Mail/9.24 (Win32) X-Virus-Scanned: ClamAV 0.91.2/6021/Wed Feb 27 15:55:48 2008 on oss.sgi.com X-Virus-Status: Clean X-archive-position: 15779 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: bnaujok@sgi.com Precedence: bulk X-list: xfs On Mon, 05 May 2008 15:55:17 +1000, Christoph Hellwig wrote: > I guess this fixes the 122 failures that came up recently? Yep. From owner-xfs@oss.sgi.com Sun May 4 23:11:38 2008 Received: with ECARTIS (v1.0.0; list xfs); Sun, 04 May 2008 23:11:47 -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.5 required=5.0 tests=AWL,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 m456Ban4023401 for ; Sun, 4 May 2008 23:11:38 -0700 X-ASG-Debug-ID: 1209967941-398401630000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id D8087B00E37 for ; Sun, 4 May 2008 23:12:21 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id fwDbuCQ9ZMHQ2odO for ; Sun, 04 May 2008 23:12:21 -0700 (PDT) Received: from hch by bombadil.infradead.org with local (Exim 4.68 #1 (Red Hat Linux)) id 1Jstvt-0004LS-Is; Mon, 05 May 2008 06:12:17 +0000 Date: Mon, 5 May 2008 02:12:17 -0400 From: Christoph Hellwig To: Rusty Russell Cc: Christoph Hellwig , linux-kernel@vger.kernel.org, gregkh@suse.de, kaos@sgi.com, Stephen Rothwell , rolandd@cisco.com, "Brian S. Julin" , Martin Diehl , mokuno@sm.sony.co.jp, aacraid@adaptec.com, mfasheh@suse.com, wim@iguana.be, xfs@oss.sgi.com, reiserfs-devel@vger.kernel.org, Matthew Wilcox X-ASG-Orig-Subj: Re: [PATCH 1/1] Replace down_trylock() with down_try(), reverse return values. Subject: Re: [PATCH 1/1] Replace down_trylock() with down_try(), reverse return values. Message-ID: <20080505061217.GA13398@infradead.org> References: <200805051156.36437.rusty@rustcorp.com.au> <20080505055823.GA20970@infradead.org> <200805051609.13731.rusty@rustcorp.com.au> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <200805051609.13731.rusty@rustcorp.com.au> User-Agent: Mutt/1.5.17 (2007-11-01) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1209967941 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: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.1, rules version 3.1.49697 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV 0.91.2/6021/Wed Feb 27 15:55:48 2008 on oss.sgi.com X-Virus-Status: Clean X-archive-position: 15780 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: hch@infradead.org Precedence: bulk X-list: xfs On Mon, May 05, 2008 at 04:09:12PM +1000, Rusty Russell wrote: > > Given that people are actively trying to kill struct semaphore I don't > > think doing a big search and rename is a good idea right now. > > If it goes away before the 2.6.27 merge window, great. But I don't see that > happening, so let's clean up this horror. I cc'd all the people effected in > the hope that it will prod some of them towards mutexes anyway. .27 might not be doable but .28 seems probable if willy and co are continuing to churn like they do currently. > > (And I also really hate the name down_try, but when it goes away that's > > rather void and we can spare the discussion) > > Ideas? down() is pretty bad, down_try() matches it. The trylock is a convention for real locking function, so having one stand out would be nasty. Then again a semaphore is not just a simple lock but a higher level locking primitive, so a down_nowait might make sense because we don't encode the lock anywhere else either From owner-xfs@oss.sgi.com Sun May 4 23:19:25 2008 Received: with ECARTIS (v1.0.0; list xfs); Sun, 04 May 2008 23:19:45 -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.0 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-r574664 Received: from larry.melbourne.sgi.com (larry.melbourne.sgi.com [134.14.52.130]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with SMTP id m456JKo1024762 for ; Sun, 4 May 2008 23:19:23 -0700 Received: from boing.melbourne.sgi.com (boing.melbourne.sgi.com [134.14.55.141]) by larry.melbourne.sgi.com (950413.SGI.8.6.12/950213.SGI.AUTOCF) via ESMTP id QAA19649; Mon, 5 May 2008 16:19:55 +1000 Message-ID: <481EA70A.2030500@sgi.com> Date: Mon, 05 May 2008 16:19:54 +1000 From: Timothy Shimmin User-Agent: Thunderbird 2.0.0.14 (Macintosh/20080421) MIME-Version: 1.0 To: Christoph Hellwig CC: xfs-dev , xfs-oss Subject: Re: review: xfstests/016 change References: <481E7F17.5090601@sgi.com> <20080505055446.GB15609@infradead.org> In-Reply-To: <20080505055446.GB15609@infradead.org> Content-Type: multipart/mixed; boundary="------------040506090206080500000808" X-Virus-Scanned: ClamAV 0.91.2/6021/Wed Feb 27 15:55:48 2008 on oss.sgi.com X-Virus-Status: Clean X-archive-position: 15781 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: tes@sgi.com Precedence: bulk X-list: xfs This is a multi-part message in MIME format. --------------040506090206080500000808 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Christoph Hellwig wrote: > On Mon, May 05, 2008 at 01:29:27PM +1000, Timothy Shimmin wrote: >> Hi there, >> >> xfstests/016 has been failing for a while in many cases. >> It was relying on the log traffic for create/rm to be unaltered >> in XFS over the life of XFS. >> Its initial purpose was to test out the writing of the log around >> wrapping and checking that as we wrapped we didn't corrupt any data >> after the end of the log. >> >> The patch is to modify xfstest, 016, to take a sampling of the log traffic >> to guestimate how many ops are needed to get to the end of the log, >> instead of hard-coding in how many ops are expected to get there. > > I get four rejects out of four hunk when trying to apply this patch, > looks like whitespace-damage. Groan. Sorry. I'll attach 016.patch for the moment. Need to see where things went wrong with the whitespace. --Tim --------------040506090206080500000808 Content-Type: text/x-patch; name="016.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="016.patch" =========================================================================== Index: xfstests/016 =========================================================================== --- a/xfstests/016 2008-05-05 11:26:50.000000000 +1000 +++ b/xfstests/016 2008-05-05 13:07:01.040000000 +1000 @@ -50,7 +50,7 @@ _init() echo "*** reset partition" $here/src/devzero -b 2048 -n 50 -v 198 $SCRATCH_DEV echo "*** mkfs" - force_opts="-dsize=50m -lsize=2097152" + force_opts="-dsize=50m -lsize=$log_size" echo mkfs_xfs $force_opts $SCRATCH_DEV >>$seq.full _scratch_mkfs_xfs $force_opts >$tmp.mkfs0 2>&1 [ $? -ne 0 ] && \ @@ -156,6 +156,10 @@ _supported_os Linux rm -f $seq.full +# mkfs sizes +log_size=2097152 +log_size_bb=`expr $log_size / 512` + _require_scratch _init @@ -163,27 +167,47 @@ block=`_after_log $SCRATCH_DEV` echo "fsblock after log = $block" >>$seq.full _check_corrupt $SCRATCH_DEV $block -size=`_log_size` -echo "log size = $size BB" >>$seq.full +actual_log_size=`_log_size` +echo "log size = $actual_log_size BB" >>$seq.full head=`_log_head` echo "log position = $head" >>$seq.full lsunit=`_log_sunit` echo "log sunit = $lsunit" >>$seq.full -[ $size -eq 4096 ] || \ +# sanity checks +[ $actual_log_size -eq $log_size_bb ] || \ _fail "!!! unexpected log size $size" [ $head -eq 2 -o $head -eq $((lsunit/512)) ] || \ _fail "!!! unexpected initial log position $head vs. $((lsunit/512))" -echo " lots of traffic" >>$seq.full -_log_traffic 850 +# find how how many blocks per op for 100 ops +# ignore the fact that it will also include an unmount record etc... +# this should be small overall +echo " lots of traffic for sampling" >>$seq.full +sample_size_ops=100 +_log_traffic $sample_size_ops +head1=`_log_head` +num_blocks=`expr $head1 - $head` +blocks_per_op=`echo "scale=3; $num_blocks / $sample_size_ops" | bc` +echo "blocks_per_op = $blocks_per_op" >>$seq.full +num_expected_ops=`echo "$log_size_bb / $blocks_per_op" | bc` +echo "num_expected_ops = $num_expected_ops" >>$seq.full +num_expected_to_go=`echo "$num_expected_ops - $sample_size_ops" | bc` +echo "num_expected_to_go = $num_expected_to_go" >>$seq.full + +echo " lots more traffic" >>$seq.full +_log_traffic $num_expected_to_go head=`_log_head` echo "log position = $head" >>$seq.full -[ $head -gt 3850 -a $head -lt 4050 ] || \ - _fail "!!! unexpected log position $head" +# e.g. 3891 +near_end_min=`echo "0.95 * $log_size_bb" | bc | sed 's/\..*//'` +echo "near_end_min = $near_end_min" >>$seq.full + +[ $head -gt $near_end_min -a $head -lt $log_size_bb ] || \ + _fail "!!! unexpected near end log position $head" -for c in 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 +for c in `seq 0 20` do echo " little traffic" >>$seq.full _log_traffic 2 @@ -193,7 +217,7 @@ do done [ $head -lt 1000 ] || \ - _fail "!!! unexpected log position $head" + _fail "!!! unexpected wrapped log position $head" # success, all done status=0 --------------040506090206080500000808-- From owner-xfs@oss.sgi.com Sun May 4 23:32:57 2008 Received: with ECARTIS (v1.0.0; list xfs); Sun, 04 May 2008 23:33:16 -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.3 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-r574664 Received: from relay.sgi.com (relay2.corp.sgi.com [192.26.58.22]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id m456WthT025920 for ; Sun, 4 May 2008 23:32:57 -0700 Received: from outhouse.melbourne.sgi.com (outhouse.melbourne.sgi.com [134.14.52.145]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9EE45304087; Sun, 4 May 2008 23:33:37 -0700 (PDT) Received: from itchy (xaiki@itchy.melbourne.sgi.com [134.14.55.96]) by outhouse.melbourne.sgi.com (SGI-8.12.5/8.12.5) with ESMTP id m456XWjm927482; Mon, 5 May 2008 16:33:33 +1000 (AEST) From: Niv Sardi To: Christoph Hellwig Cc: xfs-dev@sgi.com, xfs@oss.sgi.com Subject: Re: Don't use d_alloc_anon for open_by_handle References: <20080501070244.GH108924158@sgi.com> <1209693339-4861-1-git-send-email-xaiki@sgi.com> <20080502060654.GA23912@infradead.org> Date: Mon, 05 May 2008 16:33:34 +1000 In-Reply-To: <20080502060654.GA23912@infradead.org> (Christoph Hellwig's message of "Fri, 2 May 2008 02:06:54 -0400") Message-ID: User-Agent: Gnus/5.110009 (No Gnus v0.9) Emacs/23.0.60 (i486-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Virus-Scanned: ClamAV 0.91.2/6021/Wed Feb 27 15:55:48 2008 on oss.sgi.com X-Virus-Status: Clean X-archive-position: 15782 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: xaiki@sgi.com Precedence: bulk X-list: xfs Christoph Hellwig writes: > On Fri, May 02, 2008 at 11:55:37AM +1000, xaiki@sgi.com wrote: >> One of our DMAPI user found that in some cases inodes weren't getting through >> xfs_inactive() in any reasonable amount of time. Investigation tracked it down >> to the use of d_alloc_anon() combined with another thread accessing the same >> inode via an open(). >> >> So we introduce a stripped down version of d_alloc_anon, that won't try to find >> an existing dentry, nor will hash it. > > No, this is even more buggy than using d_alloc_anon. I must be missing a point here, can you please further explain why is it buggy ? We are indeed abusing the normal dentry life, but that's what we want libhandle to be. i.e. We really don't need it connected, we don't need to know anything about that file, we just want to access it. > What really needs to be done in the handle code is to do the full > reconnect logic nfsd would be doing. That would be slow, and we don't really need it. What is wrong with having a temp hanging dentry if it gets thorn appart properly ? The dentry we're using never makes it to any kind of cache. We don't even have security concerns as the 2 pieces of code can only be triggered by root. > Aka you should be using exportfs_decode_fh and update xfs's > fh_to_dentry method to accept the file handle type used by the handle > interface. Cheers, -- Niv Sardi From owner-xfs@oss.sgi.com Mon May 5 00:08:16 2008 Received: with ECARTIS (v1.0.0; list xfs); Mon, 05 May 2008 00:08:35 -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.1 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-r574664 Received: from larry.melbourne.sgi.com (larry.melbourne.sgi.com [134.14.52.130]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with SMTP id m4578CPJ030674 for ; Mon, 5 May 2008 00:08:15 -0700 Received: from snort.melbourne.sgi.com (snort.melbourne.sgi.com [134.14.54.149]) by larry.melbourne.sgi.com (950413.SGI.8.6.12/950213.SGI.AUTOCF) via ESMTP id RAA20989; Mon, 5 May 2008 17:08:52 +1000 Received: from snort.melbourne.sgi.com (localhost [127.0.0.1]) by snort.melbourne.sgi.com (SGI-8.12.5/8.12.5) with ESMTP id m4578osT156915963; Mon, 5 May 2008 17:08:51 +1000 (AEST) Received: (from dgc@localhost) by snort.melbourne.sgi.com (SGI-8.12.5/8.12.5/Submit) id m4578lVN155823411; Mon, 5 May 2008 17:08:47 +1000 (AEST) X-Authentication-Warning: snort.melbourne.sgi.com: dgc set sender to dgc@sgi.com using -f Date: Mon, 5 May 2008 17:08:47 +1000 From: David Chinner To: Eric Sandeen Cc: xfs-oss Subject: Re: [PATCH] fix dir2 shortform structures on ARM old ABI Message-ID: <20080505070847.GH155679365@sgi.com> References: <47DB4181.7040603@sandeen.net> <480E89B5.8070006@sandeen.net> <481B7FD1.3030107@sandeen.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <481B7FD1.3030107@sandeen.net> User-Agent: Mutt/1.4.2.1i X-Virus-Scanned: ClamAV 0.91.2/6021/Wed Feb 27 15:55:48 2008 on oss.sgi.com X-Virus-Status: Clean X-archive-position: 15783 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: dgc@sgi.com Precedence: bulk X-list: xfs On Fri, May 02, 2008 at 03:55:45PM -0500, Eric Sandeen wrote: > Eric Sandeen wrote: > > Eric Sandeen wrote: > >> This should fix the longstanding issues with xfs and old ABI > >> arm boxes, which lead to various asserts and xfs shutdowns, > >> and for which an (incorrect) patch has been floating around > >> for years. (Said patch made ARM internally consistent, but > >> altered the normal xfs on-disk format such that it looked > >> corrupted on other architectures): > >> http://lists.arm.linux.org.uk/lurker/message/20040311.002034.5ecf21a2.html > > > > ping again... > > ping #3... Looks like if I don't pick it up then nobody is going to answer. I'll run it through my ia64 and x86_64 test boxes and if it's ok then I'll commit it. Did you ever send an equivalent userspace patch? Cheers, Dave. -- Dave Chinner Principal Engineer SGI Australian Software Group From owner-xfs@oss.sgi.com Mon May 5 00:35:34 2008 Received: with ECARTIS (v1.0.0; list xfs); Mon, 05 May 2008 00:35:51 -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.1 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-r574664 Received: from larry.melbourne.sgi.com (larry.melbourne.sgi.com [134.14.52.130]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with SMTP id m457ZUuC005097 for ; Mon, 5 May 2008 00:35:32 -0700 Received: from pc-bnaujok.melbourne.sgi.com (pc-bnaujok.melbourne.sgi.com [134.14.55.58]) by larry.melbourne.sgi.com (950413.SGI.8.6.12/950213.SGI.AUTOCF) via ESMTP id RAA21572; Mon, 5 May 2008 17:36:15 +1000 To: xfs-oss Subject: Re: [PATCH] fix dir2 shortform structures on ARM old ABI From: "Barry Naujok" Organization: SGI Cc: "David Chinner" Content-Type: text/plain; format=flowed; delsp=yes; charset=utf-8 MIME-Version: 1.0 References: <47DB4181.7040603@sandeen.net> <47E1D3C3.1050000@sandeen.net> Date: Mon, 05 May 2008 17:38:00 +1000 Message-ID: In-Reply-To: <47E1D3C3.1050000@sandeen.net> User-Agent: Opera Mail/9.24 (Win32) X-Virus-Scanned: ClamAV 0.91.2/6021/Wed Feb 27 15:55:48 2008 on oss.sgi.com X-Virus-Status: Clean Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from Quoted-Printable to 8bit by oss.sgi.com id m457ZYuC005102 X-archive-position: 15784 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: bnaujok@sgi.com Precedence: bulk X-list: xfs On Thu, 20 Mar 2008 14:02:27 +1100, Eric Sandeen wrote: > Here's the userspace side. Dave, yes he did! > Jeff, I guess this means you have more work to do ;) > > -Eric > > > Index: xfs-cmds/xfsprogs/include/platform_defs.h.in > =================================================================== > --- xfs-cmds.orig/xfsprogs/include/platform_defs.h.in > +++ xfs-cmds/xfsprogs/include/platform_defs.h.in > @@ -147,4 +147,11 @@ typedef unsigned long long __psunsigned_ > | (minor&IRIX_DEV_MAXMIN))) > #define > IRIX_DEV_TO_KDEVT(dev) makedev(IRIX_DEV_MAJOR(dev),IRIX_DEV_MINOR(dev)) > +/* ARM old ABI has some weird alignment/padding */ > +#if defined(__arm__) && !defined(__ARM_EABI__) > +#define __arch_pack __attribute__((packed)) > +#else > +#define __arch_pack > +#endif > + > #endif /* __XFS_PLATFORM_DEFS_H__ */ > Index: xfs-cmds/xfsprogs/include/xfs_dir2_sf.h > =================================================================== > --- xfs-cmds.orig/xfsprogs/include/xfs_dir2_sf.h > +++ xfs-cmds/xfsprogs/include/xfs_dir2_sf.h > @@ -62,7 +62,7 @@ typedef union { > * Normalized offset (in a data block) of the entry, really > xfs_dir2_data_off_t. > * Only need 16 bits, this is the byte offset into the single block > form. > */ > -typedef struct { __uint8_t i[2]; } xfs_dir2_sf_off_t; > +typedef struct { __uint8_t i[2]; } __arch_pack xfs_dir2_sf_off_t; > /* > * The parent directory has a dedicated field, and the self-pointer must > @@ -76,14 +76,14 @@ typedef struct xfs_dir2_sf_hdr { > __uint8_t count; /* count of entries */ > __uint8_t i8count; /* count of 8-byte inode #s */ > xfs_dir2_inou_t parent; /* parent dir inode number */ > -} xfs_dir2_sf_hdr_t; > +} __arch_pack xfs_dir2_sf_hdr_t; > typedef struct xfs_dir2_sf_entry { > __uint8_t namelen; /* actual name length */ > xfs_dir2_sf_off_t offset; /* saved offset */ > __uint8_t name[1]; /* name, variable size */ > xfs_dir2_inou_t inumber; /* inode number, var. offset */ > -} xfs_dir2_sf_entry_t; > +} __arch_pack xfs_dir2_sf_entry_t; > typedef struct xfs_dir2_sf { > xfs_dir2_sf_hdr_t hdr; /* shortform header */ > > > > > From owner-xfs@oss.sgi.com Mon May 5 01:57:34 2008 Received: with ECARTIS (v1.0.0; list xfs); Mon, 05 May 2008 01:57:52 -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.5 required=5.0 tests=AWL,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 m458vXb3010443 for ; Mon, 5 May 2008 01:57:34 -0700 X-ASG-Debug-ID: 1209977897-761202430000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 72C2810F2BCA; Mon, 5 May 2008 01:58:17 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id Jj5YAvvfsrNUp7j5; Mon, 05 May 2008 01:58:17 -0700 (PDT) Received: from hch by bombadil.infradead.org with local (Exim 4.68 #1 (Red Hat Linux)) id 1JswWX-00016z-18; Mon, 05 May 2008 08:58:17 +0000 Date: Mon, 5 May 2008 04:58:17 -0400 From: Christoph Hellwig To: Barry Naujok Cc: Christoph Hellwig , "xfs@oss.sgi.com" , xfs-dev X-ASG-Orig-Subj: Re: REVIEW: ASCII CI support in xfsprogs Subject: Re: REVIEW: ASCII CI support in xfsprogs Message-ID: <20080505085817.GB2188@infradead.org> References: <20080501131725.GB7435@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.17 (2007-11-01) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1209977898 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: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.1, rules version 3.1.49707 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV 0.91.2/6021/Wed Feb 27 15:55:48 2008 on oss.sgi.com X-Virus-Status: Clean X-archive-position: 15785 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: hch@infradead.org Precedence: bulk X-list: xfs On Fri, May 02, 2008 at 10:13:38AM +1000, Barry Naujok wrote: > Yes, I was going to do "ascii-ci=Y|N", got to keep it clear in only > does CI for A-Z. Fine with me. > I was thinking of that, but libxfs is pretty out of date anyway from > all the cleanup changes that have occured and would like to sync them > back at some stage in the near future. The sync would bring those other > changes in at that time (Nathan can correct me if I misunderstand the > sync process!) Yeah, it should bring over the files from the kernel tree. From owner-xfs@oss.sgi.com Mon May 5 02:52:34 2008 Received: with ECARTIS (v1.0.0; list xfs); Mon, 05 May 2008 02:52:51 -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.5 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-r574664 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id m459qXYo013998 for ; Mon, 5 May 2008 02:52:34 -0700 X-ASG-Debug-ID: 1209981197-746f01520000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id D2A4F1636F79; Mon, 5 May 2008 02:53:17 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id v8LqwWaud2ojPcfP; Mon, 05 May 2008 02:53:17 -0700 (PDT) Received: from hch by bombadil.infradead.org with local (Exim 4.68 #1 (Red Hat Linux)) id 1JsxNk-0006YY-NI; Mon, 05 May 2008 09:53:16 +0000 Date: Mon, 5 May 2008 05:53:16 -0400 From: Christoph Hellwig To: Niv Sardi Cc: Christoph Hellwig , xfs-dev@sgi.com, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Don't use d_alloc_anon for open_by_handle Subject: Re: Don't use d_alloc_anon for open_by_handle Message-ID: <20080505095316.GA23934@infradead.org> References: <20080501070244.GH108924158@sgi.com> <1209693339-4861-1-git-send-email-xaiki@sgi.com> <20080502060654.GA23912@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.17 (2007-11-01) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1209981198 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: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.1, rules version 3.1.49711 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV 0.91.2/6021/Wed Feb 27 15:55:48 2008 on oss.sgi.com X-Virus-Status: Clean X-archive-position: 15786 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: hch@infradead.org Precedence: bulk X-list: xfs On Mon, May 05, 2008 at 04:33:34PM +1000, Niv Sardi wrote: > > > > No, this is even more buggy than using d_alloc_anon. > > I must be missing a point here, can you please further explain why is it > buggy ? We are indeed abusing the normal dentry life, but that's what we > want libhandle to be. i.e. We really don't need it connected, we don't > need to know anything about that file, we just want to access it. > > > What really needs to be done in the handle code is to do the full > > reconnect logic nfsd would be doing. > > That would be slow, and we don't really need it. What is wrong with > having a temp hanging dentry if it gets thorn appart properly ? The > dentry we're using never makes it to any kind of cache. We don't even > have security concerns as the 2 pieces of code can only be triggered by > root. It shouldn't be slow. You'd do the equivalent no_subtree check export without parent fh, so what we do is call the fh_to_dentry method and then call find_acceptable_alias to check if there's already an dentry around and if yes use that one. That latter part is what should fix your problem. If you want to be lazy you could just copy find_acceptable_alias into the xfs code and call it directly and let me clean up the mess later.. From owner-xfs@oss.sgi.com Mon May 5 06:07:18 2008 Received: with ECARTIS (v1.0.0; list xfs); Mon, 05 May 2008 06:07:37 -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.1 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-r574664 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.168.29]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id m45D7EWP005275 for ; Mon, 5 May 2008 06:07:18 -0700 X-ASG-Debug-ID: 1209992877-232e029f0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from sandeen.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id C95A278D567 for ; Mon, 5 May 2008 06:07:57 -0700 (PDT) Received: from sandeen.net (sandeen.net [209.173.210.139]) by cuda.sgi.com with ESMTP id xQuBHq13UJhEQDJJ for ; Mon, 05 May 2008 06:07:57 -0700 (PDT) Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTP id C5DA718002BEA; Mon, 5 May 2008 08:07:54 -0500 (CDT) Message-ID: <481F06AA.4060301@sandeen.net> Date: Mon, 05 May 2008 08:07:54 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.14 (Macintosh/20080421) MIME-Version: 1.0 To: David Chinner CC: xfs-oss X-ASG-Orig-Subj: Re: [PATCH] fix dir2 shortform structures on ARM old ABI Subject: Re: [PATCH] fix dir2 shortform structures on ARM old ABI References: <47DB4181.7040603@sandeen.net> <480E89B5.8070006@sandeen.net> <481B7FD1.3030107@sandeen.net> <20080505070847.GH155679365@sgi.com> In-Reply-To: <20080505070847.GH155679365@sgi.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[209.173.210.139] X-Barracuda-Start-Time: 1209992879 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: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.1, rules version 3.1.49724 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV 0.91.2/6021/Wed Feb 27 15:55:48 2008 on oss.sgi.com X-Virus-Status: Clean X-archive-position: 15787 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: sandeen@sandeen.net Precedence: bulk X-list: xfs David Chinner wrote: > On Fri, May 02, 2008 at 03:55:45PM -0500, Eric Sandeen wrote: >> Eric Sandeen wrote: >>> Eric Sandeen wrote: >>>> This should fix the longstanding issues with xfs and old ABI >>>> arm boxes, which lead to various asserts and xfs shutdowns, >>>> and for which an (incorrect) patch has been floating around >>>> for years. (Said patch made ARM internally consistent, but >>>> altered the normal xfs on-disk format such that it looked >>>> corrupted on other architectures): >>>> http://lists.arm.linux.org.uk/lurker/message/20040311.002034.5ecf21a2.html >>> ping again... >> ping #3... > > > > Looks like if I don't pick it up then nobody is going to answer. > I'll run it through my ia64 and x86_64 test boxes and if it's ok > then I'll commit it. > > Did you ever send an equivalent userspace patch? I did ... I can resend too. -Eric From owner-xfs@oss.sgi.com Mon May 5 11:30:42 2008 Received: with ECARTIS (v1.0.0; list xfs); Mon, 05 May 2008 11:30:59 -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.5 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-r574664 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id m45IUdMd014920 for ; Mon, 5 May 2008 11:30:42 -0700 X-ASG-Debug-ID: 1210012283-63a102a30000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 8972B1639D70; Mon, 5 May 2008 11:31:23 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id vLgiFEmkOylmZE0A; Mon, 05 May 2008 11:31:23 -0700 (PDT) Received: from hch by bombadil.infradead.org with local (Exim 4.68 #1 (Red Hat Linux)) id 1Jt5T8-0004Vi-R4; Mon, 05 May 2008 18:31:22 +0000 Date: Mon, 5 May 2008 14:31:22 -0400 From: Christoph Hellwig To: Timothy Shimmin Cc: Christoph Hellwig , xfs-dev , xfs-oss X-ASG-Orig-Subj: Re: review: xfstests/016 change Subject: Re: review: xfstests/016 change Message-ID: <20080505183122.GA11163@infradead.org> References: <481E7F17.5090601@sgi.com> <20080505055446.GB15609@infradead.org> <481EA70A.2030500@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <481EA70A.2030500@sgi.com> User-Agent: Mutt/1.5.17 (2007-11-01) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1210012284 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: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.1, rules version 3.1.49746 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV 0.91.2/6021/Wed Feb 27 15:55:48 2008 on oss.sgi.com X-Virus-Status: Clean X-archive-position: 15788 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: hch@infradead.org Precedence: bulk X-list: xfs On Mon, May 05, 2008 at 04:19:54PM +1000, Timothy Shimmin wrote: > Groan. Sorry. > I'll attach 016.patch for the moment. > > Need to see where things went wrong with the whitespace. Still fails for me with that patch applied: 016 43s ... - output mismatch (see 016.out.bad) 13a14,17 > *** generate log traffic > *** mount > *** fiddle > *** unmount Failures: 016 Failed 1 of 1 tests From owner-xfs@oss.sgi.com Mon May 5 11:43:41 2008 Received: with ECARTIS (v1.0.0; list xfs); Mon, 05 May 2008 11:43:58 -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.5 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_23 autolearn=no version=3.3.0-r574664 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.168.29]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id m45IheVn015874 for ; Mon, 5 May 2008 11:43:41 -0700 X-ASG-Debug-ID: 1210013064-607601a40000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 19F2512AEE5; Mon, 5 May 2008 11:44:25 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id iLrZohPv1bvKeJdZ; Mon, 05 May 2008 11:44:25 -0700 (PDT) Received: from hch by bombadil.infradead.org with local (Exim 4.68 #1 (Red Hat Linux)) id 1Jt5fk-0002wA-Nh; Mon, 05 May 2008 18:44:24 +0000 Date: Mon, 5 May 2008 14:44:24 -0400 From: Christoph Hellwig To: Niv Sardi Cc: xfs-dev@sgi.com, xfs@oss.sgi.com, gnb@sgi.com X-ASG-Orig-Subj: Re: Don't use d_alloc_anon for open_by_handle Subject: Re: Don't use d_alloc_anon for open_by_handle Message-ID: <20080505184424.GA25933@infradead.org> References: <20080501070244.GH108924158@sgi.com> <1209693339-4861-1-git-send-email-xaiki@sgi.com> <20080502060654.GA23912@infradead.org> <20080505095316.GA23934@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20080505095316.GA23934@infradead.org> User-Agent: Mutt/1.5.17 (2007-11-01) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1210013066 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: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.1, rules version 3.1.49746 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV 0.91.2/6021/Wed Feb 27 15:55:48 2008 on oss.sgi.com X-Virus-Status: Clean X-archive-position: 15789 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: hch@infradead.org Precedence: bulk X-list: xfs On Mon, May 05, 2008 at 05:53:16AM -0400, Christoph Hellwig wrote: > It shouldn't be slow. You'd do the equivalent no_subtree check export > without parent fh, so what we do is call the fh_to_dentry method > and then call find_acceptable_alias to check if there's already an > dentry around and if yes use that one. That latter part is what should > fix your problem. If you want to be lazy you could just copy > find_acceptable_alias into the xfs code and call it directly and let me > clean up the mess later.. Sorry, this was written before my cup of tea in the morning. find_acceptable_alias is of course a no-op in the no_subtree_check case, and thus it's identical to what we're currently doing in the handle code. So any problem you see here will also be seen in an nfs environment with no_subtree_check, which is the sensible choise and I think even the default these days. So we'd better fix the lacking expiry in the core code. Cc'ing Greg as he's been fighting this code quite a bit in the past. From owner-xfs@oss.sgi.com Mon May 5 13:52:04 2008 Received: with ECARTIS (v1.0.0; list xfs); Mon, 05 May 2008 13:52:20 -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.5 required=5.0 tests=BAYES_00,J_CHICKENPOX_23 autolearn=no version=3.3.0-r574664 Received: from relay.sgi.com (relay1.corp.sgi.com [192.26.58.214]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id m45Kq3nO028701 for ; Mon, 5 May 2008 13:52:04 -0700 Received: from outhouse.melbourne.sgi.com (outhouse.melbourne.sgi.com [134.14.52.145]) by relay1.corp.sgi.com (Postfix) with ESMTP id C5F578F807C; Mon, 5 May 2008 13:52:45 -0700 (PDT) Received: from [134.15.64.153] (cf-vpn-sw-corp-64-153.corp.sgi.com [134.15.64.153]) by outhouse.melbourne.sgi.com (SGI-8.12.5/8.12.5) with ESMTP id m45KqZjm962490; Tue, 6 May 2008 06:52:38 +1000 (AEST) Message-ID: <481F7334.8000408@melbourne.sgi.com> Date: Mon, 05 May 2008 13:51:00 -0700 From: Greg Banks Organization: File Serving Technologies ; Silicon Graphics Inc. User-Agent: Thunderbird 1.5.0.12 (X11/20060911) MIME-Version: 1.0 To: Christoph Hellwig CC: Niv Sardi , xfs-dev@sgi.com, xfs@oss.sgi.com, gnb@sgi.com Subject: Re: Don't use d_alloc_anon for open_by_handle References: <20080501070244.GH108924158@sgi.com> <1209693339-4861-1-git-send-email-xaiki@sgi.com> <20080502060654.GA23912@infradead.org> <20080505095316.GA23934@infradead.org> <20080505184424.GA25933@infradead.org> In-Reply-To: <20080505184424.GA25933@infradead.org> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Virus-Scanned: ClamAV 0.91.2/6021/Wed Feb 27 15:55:48 2008 on oss.sgi.com X-Virus-Status: Clean X-archive-position: 15790 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: gnb@melbourne.sgi.com Precedence: bulk X-list: xfs Christoph Hellwig wrote: > On Mon, May 05, 2008 at 05:53:16AM -0400, Christoph Hellwig wrote: > >> It shouldn't be slow. You'd do the equivalent no_subtree check export >> without parent fh, so what we do is call the fh_to_dentry method >> and then call find_acceptable_alias to check if there's already an >> dentry around and if yes use that one. That latter part is what should >> fix your problem. If you want to be lazy you could just copy >> find_acceptable_alias into the xfs code and call it directly and let me >> clean up the mess later.. >> > > Sorry, this was written before my cup of tea in the morning. > find_acceptable_alias is of course a no-op in the no_subtree_check case, > and thus it's identical to what we're currently doing in the handle > code. So any problem you see here will also be seen in an nfs > environment with no_subtree_check, which is the sensible choise Agreed. > and > I think even the default these days. I believe so. We also use that as default on our shipping NAS servers anyway. > So we'd better fix the lacking > expiry in the core code. Mmm, sounds like fun. > Cc'ing Greg as he's been fighting this code > quite a bit in the past. > > Thanks. I'm on xfs-dev now so I've been lurking while you guys discussed this :-) -- Greg Banks, P.Engineer, SGI Australian Software Group. The cake is *not* a lie. I don't speak for SGI. From owner-xfs@oss.sgi.com Mon May 5 16:17:22 2008 Received: with ECARTIS (v1.0.0; list xfs); Mon, 05 May 2008 16:17:41 -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.1 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-r574664 Received: from larry.melbourne.sgi.com (larry.melbourne.sgi.com [134.14.52.130]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with SMTP id m45NHIgq005930 for ; Mon, 5 May 2008 16:17:20 -0700 Received: from snort.melbourne.sgi.com (snort.melbourne.sgi.com [134.14.54.149]) by larry.melbourne.sgi.com (950413.SGI.8.6.12/950213.SGI.AUTOCF) via ESMTP id JAA15512; Tue, 6 May 2008 09:17:58 +1000 Received: from snort.melbourne.sgi.com (localhost [127.0.0.1]) by snort.melbourne.sgi.com (SGI-8.12.5/8.12.5) with ESMTP id m45NHvsT157934004; Tue, 6 May 2008 09:17:58 +1000 (AEST) Received: (from dgc@localhost) by snort.melbourne.sgi.com (SGI-8.12.5/8.12.5/Submit) id m45NHsTa157926046; Tue, 6 May 2008 09:17:54 +1000 (AEST) X-Authentication-Warning: snort.melbourne.sgi.com: dgc set sender to dgc@sgi.com using -f Date: Tue, 6 May 2008 09:17:54 +1000 From: David Chinner To: Marco Berizzi Cc: linux-kernel@vger.kernel.org, xfs@oss.sgi.com Subject: XFS shutdown in xfs_iunlink_remove() (was Re: 2.6.25: swapper: page allocation failure. order:3, mode:0x4020) Message-ID: <20080505231754.GL155679365@sgi.com> References: Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.4.2.1i X-Virus-Scanned: ClamAV 0.91.2/6021/Wed Feb 27 15:55:48 2008 on oss.sgi.com X-Virus-Status: Clean X-archive-position: 15791 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: dgc@sgi.com Precedence: bulk X-list: xfs [Please cc the XFS list (xfs@oss.sgi.com) on bug reports or put "XFS" in the subject line so ppl know to pay attention to your report.] On Mon, May 05, 2008 at 03:41:29PM +0200, Marco Berizzi wrote: > Hi. > Just few minutes ago an xfs filesystem > was shutdown with these errors: > > May 5 14:31:38 Pleiadi kernel: xfs_inotobp: xfs_imap() returned an > error 22 on hda8. Returning error. > May 5 14:31:38 Pleiadi kernel: xfs_iunlink_remove: xfs_inotobp() > returned an error 22 on hda8. Returning error. > May 5 14:31:38 Pleiadi kernel: xfs_inactive:^Ixfs_ifree() returned an > error = 22 on hda8 > May 5 14:31:38 Pleiadi kernel: xfs_force_shutdown(hda8,0x1) called from > line 1737 of file fs/xfs/xfs_vnodeops.c. Return address = 0xc01e6fde > May 5 14:31:38 Pleiadi kernel: Filesystem "hda8": I/O Error Detected. > Shutting down filesystem: hda8 > May 5 14:31:38 Pleiadi kernel: Please umount the filesystem, and > rectify the problem(s) > May 5 14:36:43 Pleiadi kernel: xfs_force_shutdown(hda8,0x1) called from > line 420 of file fs/xfs/xfs_rw.c. Return address = 0xc01eaf21 Is it reproducable? What were you doing at the time the problem occurred? Cheers, Dave. -- Dave Chinner Principal Engineer SGI Australian Software Group From owner-xfs@oss.sgi.com Mon May 5 18:27:52 2008 Received: with ECARTIS (v1.0.0; list xfs); Mon, 05 May 2008 18:28:11 -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.0 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-r574664 Received: from larry.melbourne.sgi.com (larry.melbourne.sgi.com [134.14.52.130]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with SMTP id m461RmsN017788 for ; Mon, 5 May 2008 18:27:50 -0700 Received: from chook.melbourne.sgi.com (chook.melbourne.sgi.com [134.14.54.237]) by larry.melbourne.sgi.com (950413.SGI.8.6.12/950213.SGI.AUTOCF) via ESMTP id LAA17961; Tue, 6 May 2008 11:28:32 +1000 From: tes@sgi.com Received: by chook.melbourne.sgi.com (Postfix, from userid 1116) id 890B358C4C15; Tue, 6 May 2008 11:28:32 +1000 (EST) Date: Tue, 06 May 2008 11:28:32 +1000 To: xfs-dev@sgi.com, xfs@oss.sgi.com Subject: review: 016.patch Message-ID: <481fb440.Vs2ofNh0UNXLCPCX%tes@sgi.com> User-Agent: nail 11.25 7/29/05 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Virus-Scanned: ClamAV 0.91.2/6021/Wed Feb 27 15:55:48 2008 on oss.sgi.com X-Virus-Status: Clean X-archive-position: 15792 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: tes@sgi.com Precedence: bulk X-list: xfs Forgot to include the updated 016.out for the sampling log traffic. 016 | 44 ++++++++++++++++++++++++++++++++++---------- 016.out | 4 ++++ 2 files changed, 38 insertions(+), 10 deletions(-) =========================================================================== Index: xfstests/016 =========================================================================== --- a/xfstests/016 2008-05-06 10:54:31.000000000 +1000 +++ b/xfstests/016 2008-05-05 13:07:01.040000000 +1000 @@ -50,7 +50,7 @@ _init() echo "*** reset partition" $here/src/devzero -b 2048 -n 50 -v 198 $SCRATCH_DEV echo "*** mkfs" - force_opts="-dsize=50m -lsize=2097152" + force_opts="-dsize=50m -lsize=$log_size" echo mkfs_xfs $force_opts $SCRATCH_DEV >>$seq.full _scratch_mkfs_xfs $force_opts >$tmp.mkfs0 2>&1 [ $? -ne 0 ] && \ @@ -156,6 +156,10 @@ _supported_os Linux rm -f $seq.full +# mkfs sizes +log_size=2097152 +log_size_bb=`expr $log_size / 512` + _require_scratch _init @@ -163,27 +167,47 @@ block=`_after_log $SCRATCH_DEV` echo "fsblock after log = $block" >>$seq.full _check_corrupt $SCRATCH_DEV $block -size=`_log_size` -echo "log size = $size BB" >>$seq.full +actual_log_size=`_log_size` +echo "log size = $actual_log_size BB" >>$seq.full head=`_log_head` echo "log position = $head" >>$seq.full lsunit=`_log_sunit` echo "log sunit = $lsunit" >>$seq.full -[ $size -eq 4096 ] || \ +# sanity checks +[ $actual_log_size -eq $log_size_bb ] || \ _fail "!!! unexpected log size $size" [ $head -eq 2 -o $head -eq $((lsunit/512)) ] || \ _fail "!!! unexpected initial log position $head vs. $((lsunit/512))" -echo " lots of traffic" >>$seq.full -_log_traffic 850 +# find how how many blocks per op for 100 ops +# ignore the fact that it will also include an unmount record etc... +# this should be small overall +echo " lots of traffic for sampling" >>$seq.full +sample_size_ops=100 +_log_traffic $sample_size_ops +head1=`_log_head` +num_blocks=`expr $head1 - $head` +blocks_per_op=`echo "scale=3; $num_blocks / $sample_size_ops" | bc` +echo "blocks_per_op = $blocks_per_op" >>$seq.full +num_expected_ops=`echo "$log_size_bb / $blocks_per_op" | bc` +echo "num_expected_ops = $num_expected_ops" >>$seq.full +num_expected_to_go=`echo "$num_expected_ops - $sample_size_ops" | bc` +echo "num_expected_to_go = $num_expected_to_go" >>$seq.full + +echo " lots more traffic" >>$seq.full +_log_traffic $num_expected_to_go head=`_log_head` echo "log position = $head" >>$seq.full -[ $head -gt 3850 -a $head -lt 4050 ] || \ - _fail "!!! unexpected log position $head" +# e.g. 3891 +near_end_min=`echo "0.95 * $log_size_bb" | bc | sed 's/\..*//'` +echo "near_end_min = $near_end_min" >>$seq.full + +[ $head -gt $near_end_min -a $head -lt $log_size_bb ] || \ + _fail "!!! unexpected near end log position $head" -for c in 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 +for c in `seq 0 20` do echo " little traffic" >>$seq.full _log_traffic 2 @@ -193,7 +217,7 @@ do done [ $head -lt 1000 ] || \ - _fail "!!! unexpected log position $head" + _fail "!!! unexpected wrapped log position $head" # success, all done status=0 =========================================================================== Index: xfstests/016.out =========================================================================== --- a/xfstests/016.out 2008-05-06 10:54:31.000000000 +1000 +++ b/xfstests/016.out 2008-05-05 12:58:55.380000000 +1000 @@ -11,6 +11,10 @@ Wrote 51200.00Kb (value 0xc6) *** mount *** fiddle *** unmount +*** generate log traffic + *** mount + *** fiddle + *** unmount *** check for corruption *** generate log traffic *** mount From owner-xfs@oss.sgi.com Mon May 5 18:29:27 2008 Received: with ECARTIS (v1.0.0; list xfs); Mon, 05 May 2008 18:29:35 -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.0 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-r574664 Received: from larry.melbourne.sgi.com (larry.melbourne.sgi.com [134.14.52.130]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with SMTP id m461TMe2017903 for ; Mon, 5 May 2008 18:29:26 -0700 Received: from boing.melbourne.sgi.com (boing.melbourne.sgi.com [134.14.55.141]) by larry.melbourne.sgi.com (950413.SGI.8.6.12/950213.SGI.AUTOCF) via ESMTP id LAA17983; Tue, 6 May 2008 11:29:57 +1000 Message-ID: <481FB495.6040709@sgi.com> Date: Tue, 06 May 2008 11:29:57 +1000 From: Timothy Shimmin User-Agent: Thunderbird 2.0.0.14 (Macintosh/20080421) MIME-Version: 1.0 To: Christoph Hellwig CC: xfs-dev , xfs-oss Subject: Re: review: xfstests/016 change References: <481E7F17.5090601@sgi.com> <20080505055446.GB15609@infradead.org> <481EA70A.2030500@sgi.com> <20080505183122.GA11163@infradead.org> In-Reply-To: <20080505183122.GA11163@infradead.org> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Virus-Scanned: ClamAV 0.91.2/6021/Wed Feb 27 15:55:48 2008 on oss.sgi.com X-Virus-Status: Clean X-archive-position: 15793 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: tes@sgi.com Precedence: bulk X-list: xfs Christoph Hellwig wrote: > On Mon, May 05, 2008 at 04:19:54PM +1000, Timothy Shimmin wrote: >> Groan. Sorry. >> I'll attach 016.patch for the moment. >> >> Need to see where things went wrong with the whitespace. > > Still fails for me with that patch applied: > > 016 43s ... > - output mismatch (see 016.out.bad) > 13a14,17 >> *** generate log traffic >> *** mount >> *** fiddle >> *** unmount > Failures: 016 > Failed 1 of 1 tests Forgot adding 016.out change to patch. The failure diff above means it worked ;-) --Tim From owner-xfs@oss.sgi.com Mon May 5 18:38:03 2008 Received: with ECARTIS (v1.0.0; list xfs); Mon, 05 May 2008 18:38:20 -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.3 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_23 autolearn=no version=3.3.0-r574664 Received: from relay.sgi.com (relay2.corp.sgi.com [192.26.58.22]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id m461bxFw018725 for ; Mon, 5 May 2008 18:38:03 -0700 Received: from outhouse.melbourne.sgi.com (outhouse.melbourne.sgi.com [134.14.52.145]) by relay2.corp.sgi.com (Postfix) with ESMTP id 57C77304080; Mon, 5 May 2008 18:38:41 -0700 (PDT) Received: from itchy (xaiki@itchy.melbourne.sgi.com [134.14.55.96]) by outhouse.melbourne.sgi.com (SGI-8.12.5/8.12.5) with ESMTP id m461cajm955238; Tue, 6 May 2008 11:38:37 +1000 (AEST) From: Niv Sardi To: Christoph Hellwig Cc: xfs-dev@sgi.com, xfs@oss.sgi.com, gnb@sgi.com Subject: Re: Don't use d_alloc_anon for open_by_handle References: <20080501070244.GH108924158@sgi.com> <1209693339-4861-1-git-send-email-xaiki@sgi.com> <20080502060654.GA23912@infradead.org> <20080505095316.GA23934@infradead.org> <20080505184424.GA25933@infradead.org> Date: Tue, 06 May 2008 11:38:37 +1000 In-Reply-To: <20080505184424.GA25933@infradead.org> (Christoph Hellwig's message of "Mon, 5 May 2008 14:44:24 -0400") Message-ID: User-Agent: Gnus/5.110009 (No Gnus v0.9) Emacs/23.0.60 (i486-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Virus-Scanned: ClamAV 0.91.2/6021/Wed Feb 27 15:55:48 2008 on oss.sgi.com X-Virus-Status: Clean X-archive-position: 15794 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: xaiki@sgi.com Precedence: bulk X-list: xfs Christoph Hellwig writes: > On Mon, May 05, 2008 at 05:53:16AM -0400, Christoph Hellwig wrote: >> It shouldn't be slow. You'd do the equivalent no_subtree check >> export without parent fh, so what we do is call the fh_to_dentry >> method and then call find_acceptable_alias to check if there's >> already an dentry around and if yes use that one. That latter part >> is what should fix your problem. If you want to be lazy you could >> just copy find_acceptable_alias into the xfs code and call it >> directly and let me clean up the mess later.. > > Sorry, this was written before my cup of tea in the morning. > find_acceptable_alias is of course a no-op in the no_subtree_check > case, and thus it's identical to what we're currently doing in the > handle code. So any problem you see here will also be seen in an nfs > environment with no_subtree_check, which is the sensible choise and I > think even the default these days. So we'd better fix the lacking > expiry in the core code. Cc'ing Greg as he's been fighting this code > quite a bit in the past. So I've looked at find_acceptable_alias, and all it does is going through the dentries associated with the inode associated with the dentry we give it, testing if it's 'acceptable' with a function we provide. In this very case *any* dentry is acceptable, so we'd just provide a NO-OP there. So if I do as you suggest and call xfs_fh_to_dentry, which would give me a dentry using d_alloc_anon, which already tries to do the same thing with d_find_alias (just lacking the 'acceptable' check)… So we're back to the exact same situation as now. The argument is that we should then fix the core code… which should also fix the issue in the way it is NOW… may I ask: ¿ what's the point in moving things around ? Further more, the only critic you gave to the proposed solution is 'even more buggy than d_alloc_anon', from anyone else than you that would have been a plain useless troll, but I belive you have your reasons to have this position, can you please explain ? The situation being now, that users of the xfs libhandle interface will have dentries and inodes hanging in space and time for ever until OOM. Cheers, -- Niv Sardi From owner-xfs@oss.sgi.com Mon May 5 19:26:30 2008 Received: with ECARTIS (v1.0.0; list xfs); Mon, 05 May 2008 19:26:48 -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.0 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_15 autolearn=no version=3.3.0-r574664 Received: from larry.melbourne.sgi.com (larry.melbourne.sgi.com [134.14.52.130]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with SMTP id m462QPT8021592 for ; Mon, 5 May 2008 19:26:27 -0700 Received: from snort.melbourne.sgi.com (snort.melbourne.sgi.com [134.14.54.149]) by larry.melbourne.sgi.com (950413.SGI.8.6.12/950213.SGI.AUTOCF) via ESMTP id MAA19364; Tue, 6 May 2008 12:27:04 +1000 Received: from snort.melbourne.sgi.com (localhost [127.0.0.1]) by snort.melbourne.sgi.com (SGI-8.12.5/8.12.5) with ESMTP id m462R2sT158038494; Tue, 6 May 2008 12:27:03 +1000 (AEST) Received: (from dgc@localhost) by snort.melbourne.sgi.com (SGI-8.12.5/8.12.5/Submit) id m462R1Bd157882535; Tue, 6 May 2008 12:27:01 +1000 (AEST) X-Authentication-Warning: snort.melbourne.sgi.com: dgc set sender to dgc@sgi.com using -f Date: Tue, 6 May 2008 12:27:01 +1000 From: David Chinner To: xfs-dev Cc: xfs-oss Subject: [PATCH] Fix xfs_fsync() b0rkage Message-ID: <20080506022701.GN155679365@sgi.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.4.2.1i X-Virus-Scanned: ClamAV 0.91.2/6021/Wed Feb 27 15:55:48 2008 on oss.sgi.com X-Virus-Status: Clean X-archive-position: 15795 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: dgc@sgi.com Precedence: bulk X-list: xfs Fix fsync() b0rkage. xfs_fsync() fails to wait for data I/O completion before checking if the inode is dirty or clean to decide whether to log the inode or not. This misses inode size updates when the data flushed by the fsync() is extending the file. This results in xfsqa test 179 failures. Hence, like fdatasync(), we need to wait for I/O completion first, then check the inode for cleanliness. Doing so makes the behaviour of xfs_fsync() identical for fsync and fdatasync and we *always* use synchronous semantics if the inode is dirty. Therefore also kill the differences and remove the unused flags from the xfs_fsync function and callers. Signed-off-by: Dave Chinner --- fs/xfs/dmapi/xfs_dm.c | 9 --- fs/xfs/linux-2.6/xfs_file.c | 17 ++++-- fs/xfs/linux-2.6/xfs_vnode.h | 8 --- fs/xfs/xfs_vnodeops.c | 108 ++++++++++++++++--------------------------- fs/xfs/xfs_vnodeops.h | 3 - 5 files changed, 56 insertions(+), 89 deletions(-) Index: 2.6.x-xfs-new/fs/xfs/dmapi/xfs_dm.c =================================================================== --- 2.6.x-xfs-new.orig/fs/xfs/dmapi/xfs_dm.c 2008-04-28 16:35:23.000000000 +1000 +++ 2.6.x-xfs-new/fs/xfs/dmapi/xfs_dm.c 2008-05-06 11:51:59.814232675 +1000 @@ -2880,19 +2880,14 @@ xfs_dm_sync_by_handle( /* We need to protect against concurrent writers.. */ ret = filemap_fdatawrite(inode->i_mapping); down_rw_sems(inode, DM_FLAGS_IMUX); - err = xfs_fsync(ip, FSYNC_WAIT, 0, -1); + err = -xfs_fsync(ip, 0, -1); if (!ret) ret = err; up_rw_sems(inode, DM_FLAGS_IMUX); err = filemap_fdatawait(inode->i_mapping); if (!ret) ret = err; - - xfs_iflags_clear(ip, XFS_ITRUNCATED); - if (ret > 0) - ret = -ret; /* Return negative errors to DMAPI */ - - return(ret); + return ret; } Index: 2.6.x-xfs-new/fs/xfs/linux-2.6/xfs_file.c =================================================================== --- 2.6.x-xfs-new.orig/fs/xfs/linux-2.6/xfs_file.c 2008-03-13 13:07:24.000000000 +1100 +++ 2.6.x-xfs-new/fs/xfs/linux-2.6/xfs_file.c 2008-05-06 12:06:08.715527861 +1000 @@ -187,19 +187,24 @@ xfs_file_release( return -xfs_release(XFS_I(inode)); } +/* + * We ignore the datasync flag here because a datasync is effectively + * identical to an fsync. That is, datasync implies that we need to write + * only the metadata needed to be able to access the data that is written + * if we crash after the call completes. Hence if we are writing beyond + * EOF we have to log the inode size change as well, which makes it a + * full fsync. If we don't write beyond EOF, the inode core will be + * clean in memory and so we don't need to log the inode, just like + * fsync. + */ STATIC int xfs_file_fsync( struct file *filp, struct dentry *dentry, int datasync) { - int flags = FSYNC_WAIT; - - if (datasync) - flags |= FSYNC_DATA; xfs_iflags_clear(XFS_I(dentry->d_inode), XFS_ITRUNCATED); - return -xfs_fsync(XFS_I(dentry->d_inode), flags, - (xfs_off_t)0, (xfs_off_t)-1); + return -xfs_fsync(XFS_I(dentry->d_inode), (xfs_off_t)0, (xfs_off_t)-1); } #ifdef HAVE_DMAPI Index: 2.6.x-xfs-new/fs/xfs/xfs_vnodeops.c =================================================================== --- 2.6.x-xfs-new.orig/fs/xfs/xfs_vnodeops.c 2008-04-30 12:32:59.000000000 +1000 +++ 2.6.x-xfs-new/fs/xfs/xfs_vnodeops.c 2008-05-06 11:51:51.063375280 +1000 @@ -856,16 +856,14 @@ xfs_readlink( /* * xfs_fsync * - * This is called to sync the inode and its data out to disk. - * We need to hold the I/O lock while flushing the data, and - * the inode lock while flushing the inode. The inode lock CANNOT - * be held while flushing the data, so acquire after we're done - * with that. + * This is called to sync the inode and its data out to disk. We need to hold + * the I/O lock while flushing the data, and the inode lock while flushing the + * inode. The inode lock CANNOT be held while flushing the data, so acquire + * after we're done with that. */ int xfs_fsync( xfs_inode_t *ip, - int flag, xfs_off_t start, xfs_off_t stop) { @@ -880,98 +878,76 @@ xfs_fsync( if (XFS_FORCED_SHUTDOWN(ip->i_mount)) return XFS_ERROR(EIO); - if (flag & FSYNC_DATA) - filemap_fdatawait(vn_to_inode(XFS_ITOV(ip))->i_mapping); + /* capture size updates in I/O completion before writing the inode. */ + error = filemap_fdatawait(vn_to_inode(XFS_ITOV(ip))->i_mapping); + if (error) + return XFS_ERROR(error); /* - * We always need to make sure that the required inode state - * is safe on disk. The vnode might be clean but because - * of committed transactions that haven't hit the disk yet. - * Likewise, there could be unflushed non-transactional - * changes to the inode core that have to go to disk. + * We always need to make sure that the required inode state is safe on + * disk. The vnode might be clean but we still might need to force the + * log because of committed transactions that haven't hit the disk yet. + * Likewise, there could be unflushed non-transactional changes to the + * inode core that have to go to disk and this requires us to issue + * a synchronous transaction to capture these changes correctly. * - * The following code depends on one assumption: that - * any transaction that changes an inode logs the core - * because it has to change some field in the inode core - * (typically nextents or nblocks). That assumption - * implies that any transactions against an inode will - * catch any non-transactional updates. If inode-altering - * transactions exist that violate this assumption, the - * code breaks. Right now, it figures that if the involved - * update_* field is clear and the inode is unpinned, the - * inode is clean. Either it's been flushed or it's been - * committed and the commit has hit the disk unpinning the inode. - * (Note that xfs_inode_item_format() called at commit clears - * the update_* fields.) + * This code relies on the assumption that if the update_* fields + * of the inode are clear and the inode is unpinned then it is clean + * and no action is required. */ xfs_ilock(ip, XFS_ILOCK_SHARED); - /* If we are flushing data then we care about update_size - * being set, otherwise we care about update_core - */ - if ((flag & FSYNC_DATA) ? - (ip->i_update_size == 0) : - (ip->i_update_core == 0)) { - /* - * Timestamps/size haven't changed since last inode - * flush or inode transaction commit. That means - * either nothing got written or a transaction - * committed which caught the updates. If the - * latter happened and the transaction hasn't - * hit the disk yet, the inode will be still - * be pinned. If it is, force the log. + if (!(ip->i_update_size || ip->i_update_core)) { + /* + * Timestamps/size haven't changed since last inode flush or + * inode transaction commit. That means either nothing got + * written or a transaction committed which caught the updates. + * If the latter happened and the transaction hasn't hit the + * disk yet, the inode will be still be pinned. If it is, + * force the log. */ xfs_iunlock(ip, XFS_ILOCK_SHARED); if (xfs_ipincount(ip)) { - _xfs_log_force(ip->i_mount, (xfs_lsn_t)0, - XFS_LOG_FORCE | - ((flag & FSYNC_WAIT) - ? XFS_LOG_SYNC : 0), + error = _xfs_log_force(ip->i_mount, (xfs_lsn_t)0, + XFS_LOG_FORCE | XFS_LOG_SYNC, &log_flushed); } else { /* - * If the inode is not pinned and nothing - * has changed we don't need to flush the - * cache. + * If the inode is not pinned and nothing has changed + * we don't need to flush the cache. */ changed = 0; } - error = 0; } else { /* - * Kick off a transaction to log the inode - * core to get the updates. Make it - * sync if FSYNC_WAIT is passed in (which - * is done by everybody but specfs). The - * sync transaction will also force the log. + * Kick off a transaction to log the inode core to get the + * updates. The sync transaction will also force the log. */ xfs_iunlock(ip, XFS_ILOCK_SHARED); tp = xfs_trans_alloc(ip->i_mount, XFS_TRANS_FSYNC_TS); - if ((error = xfs_trans_reserve(tp, 0, - XFS_FSYNC_TS_LOG_RES(ip->i_mount), - 0, 0, 0))) { + error = xfs_trans_reserve(tp, 0, + XFS_FSYNC_TS_LOG_RES(ip->i_mount), 0, 0, 0); + if (error) { xfs_trans_cancel(tp, 0); return error; } xfs_ilock(ip, XFS_ILOCK_EXCL); /* - * Note - it's possible that we might have pushed - * ourselves out of the way during trans_reserve - * which would flush the inode. But there's no - * guarantee that the inode buffer has actually - * gone out yet (it's delwri). Plus the buffer - * could be pinned anyway if it's part of an - * inode in another recent transaction. So we - * play it safe and fire off the transaction anyway. + * Note - it's possible that we might have pushed ourselves out + * of the way during trans_reserve which would flush the inode. + * But there's no guarantee that the inode buffer has actually + * gone out yet (it's delwri). Plus the buffer could be pinned + * anyway if it's part of an inode in another recent + * transaction. So we play it safe and fire off the + * transaction anyway. */ xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); xfs_trans_ihold(tp, ip); xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); - if (flag & FSYNC_WAIT) - xfs_trans_set_sync(tp); + xfs_trans_set_sync(tp); error = _xfs_trans_commit(tp, 0, &log_flushed); xfs_iunlock(ip, XFS_ILOCK_EXCL); Index: 2.6.x-xfs-new/fs/xfs/xfs_vnodeops.h =================================================================== --- 2.6.x-xfs-new.orig/fs/xfs/xfs_vnodeops.h 2008-04-30 12:32:59.000000000 +1000 +++ 2.6.x-xfs-new/fs/xfs/xfs_vnodeops.h 2008-05-06 11:43:38.031188770 +1000 @@ -18,8 +18,7 @@ int xfs_open(struct xfs_inode *ip); int xfs_setattr(struct xfs_inode *ip, struct bhv_vattr *vap, int flags, struct cred *credp); int xfs_readlink(struct xfs_inode *ip, char *link); -int xfs_fsync(struct xfs_inode *ip, int flag, xfs_off_t start, - xfs_off_t stop); +int xfs_fsync(struct xfs_inode *ip, xfs_off_t start, xfs_off_t stop); int xfs_release(struct xfs_inode *ip); int xfs_inactive(struct xfs_inode *ip); int xfs_lookup(struct xfs_inode *dp, struct xfs_name *name, Index: 2.6.x-xfs-new/fs/xfs/linux-2.6/xfs_vnode.h =================================================================== --- 2.6.x-xfs-new.orig/fs/xfs/linux-2.6/xfs_vnode.h 2008-04-30 12:32:59.000000000 +1000 +++ 2.6.x-xfs-new/fs/xfs/linux-2.6/xfs_vnode.h 2008-05-06 11:53:21.223604472 +1000 @@ -230,14 +230,6 @@ static inline void vn_atime_to_time_t(bh #define ATTR_NOSIZETOK 0x400 /* Don't get the SIZE token */ /* - * Flags to vop_fsync/reclaim. - */ -#define FSYNC_NOWAIT 0 /* asynchronous flush */ -#define FSYNC_WAIT 0x1 /* synchronous fsync or forced reclaim */ -#define FSYNC_INVAL 0x2 /* flush and invalidate cached data */ -#define FSYNC_DATA 0x4 /* synchronous fsync of data only */ - -/* * Tracking vnode activity. */ #if defined(XFS_INODE_TRACE) From owner-xfs@oss.sgi.com Mon May 5 21:21:09 2008 Received: with ECARTIS (v1.0.0; list xfs); Mon, 05 May 2008 21:21:31 -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.0 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-r574664 Received: from larry.melbourne.sgi.com (larry.melbourne.sgi.com [134.14.52.130]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with SMTP id m464L4wD032543 for ; Mon, 5 May 2008 21:21:07 -0700 Received: from boing.melbourne.sgi.com (boing.melbourne.sgi.com [134.14.55.141]) by larry.melbourne.sgi.com (950413.SGI.8.6.12/950213.SGI.AUTOCF) via ESMTP id OAA22276; Tue, 6 May 2008 14:21:37 +1000 Message-ID: <481FDCD1.2010905@sgi.com> Date: Tue, 06 May 2008 14:21:37 +1000 From: Timothy Shimmin User-Agent: Thunderbird 2.0.0.14 (Macintosh/20080421) MIME-Version: 1.0 To: David Chinner CC: Eric Sandeen , xfs-oss Subject: Re: [PATCH] fix dir2 shortform structures on ARM old ABI References: <47DB4181.7040603@sandeen.net> <480E89B5.8070006@sandeen.net> <481B7FD1.3030107@sandeen.net> <20080505070847.GH155679365@sgi.com> In-Reply-To: <20080505070847.GH155679365@sgi.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Virus-Scanned: ClamAV 0.91.2/6021/Wed Feb 27 15:55:48 2008 on oss.sgi.com X-Virus-Status: Clean X-archive-position: 15796 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: tes@sgi.com Precedence: bulk X-list: xfs David Chinner wrote: > On Fri, May 02, 2008 at 03:55:45PM -0500, Eric Sandeen wrote: >> Eric Sandeen wrote: >>> Eric Sandeen wrote: >>>> This should fix the longstanding issues with xfs and old ABI >>>> arm boxes, which lead to various asserts and xfs shutdowns, >>>> and for which an (incorrect) patch has been floating around >>>> for years. (Said patch made ARM internally consistent, but >>>> altered the normal xfs on-disk format such that it looked >>>> corrupted on other architectures): >>>> http://lists.arm.linux.org.uk/lurker/message/20040311.002034.5ecf21a2.html >>> ping again... >> ping #3... > > > > Looks like if I don't pick it up then nobody is going to answer. > I'll run it through my ia64 and x86_64 test boxes and if it's ok > then I'll commit it. > As it only defines __arch_pack for __arm__, I literally can't see how on earth it won't pass for ia64 and x86-64, though I realise (I guess) we need to test to be sure :) So Eric tested this on qemu-arm with success. And there was a little debate over whether ARM-EABI would work currently in XFS, with Luca Olivetti saying in one kernel he has success and in another he doesn't. And Andre Draszik saying that for ARM-EABI it wouldn't work. That aside, Eric has tried out on ARM without EABI (old ABI) and has had success, so it is at least useful for this case. I don't see us doing any arm testing for this ourselves :) --Tim From owner-xfs@oss.sgi.com Mon May 5 22:18:36 2008 Received: with ECARTIS (v1.0.0; list xfs); Mon, 05 May 2008 22:18:54 -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.5 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_15 autolearn=no 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 m465IZ5V003474 for ; Mon, 5 May 2008 22:18:36 -0700 X-ASG-Debug-ID: 1210051157-39d702400000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 4761510F49BF; Mon, 5 May 2008 22:19:17 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id UfQ8oBqMzIEZ3eiD; Mon, 05 May 2008 22:19:17 -0700 (PDT) Received: from hch by bombadil.infradead.org with local (Exim 4.68 #1 (Red Hat Linux)) id 1JtFa8-0005Pw-Rw; Tue, 06 May 2008 05:19:16 +0000 Date: Tue, 6 May 2008 01:19:16 -0400 From: Christoph Hellwig To: David Chinner Cc: xfs-dev , xfs-oss X-ASG-Orig-Subj: Re: [PATCH] Fix xfs_fsync() b0rkage Subject: Re: [PATCH] Fix xfs_fsync() b0rkage Message-ID: <20080506051916.GA7402@infradead.org> References: <20080506022701.GN155679365@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20080506022701.GN155679365@sgi.com> User-Agent: Mutt/1.5.17 (2007-11-01) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1210051161 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.32 X-Barracuda-Spam-Status: No, SCORE=-1.32 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE7568M, PR0N_SUBJECT X-Barracuda-Spam-Report: Code version 3.1, rules version 3.1.49761 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_RULE7568M Custom Rule 7568M 0.20 PR0N_SUBJECT Subject has letters around special characters (pr0n) X-Virus-Scanned: ClamAV 0.91.2/6021/Wed Feb 27 15:55:48 2008 on oss.sgi.com X-Virus-Status: Clean X-archive-position: 15797 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: hch@infradead.org Precedence: bulk X-list: xfs On Tue, May 06, 2008 at 12:27:01PM +1000, David Chinner wrote: > Fix fsync() b0rkage. > > xfs_fsync() fails to wait for data I/O completion before checking if > the inode is dirty or clean to decide whether to log the inode or not. > This misses inode size updates when the data flushed by the fsync() > is extending the file. This results in xfsqa test 179 failures. > > Hence, like fdatasync(), we need to wait for I/O completion first, > then check the inode for cleanliness. Doing so makes the behaviour of > xfs_fsync() identical for fsync and fdatasync and we *always* use > synchronous semantics if the inode is dirty. Therefore also kill the > differences and remove the unused flags from the xfs_fsync function > and callers. The change looks good from a quick look, but while you're at it you can also remove the unused start/stop arguments. From owner-xfs@oss.sgi.com Mon May 5 22:50:20 2008 Received: with ECARTIS (v1.0.0; list xfs); Mon, 05 May 2008 22:50:38 -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.0 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_15, J_CHICKENPOX_65 autolearn=no version=3.3.0-r574664 Received: from larry.melbourne.sgi.com (larry.melbourne.sgi.com [134.14.52.130]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with SMTP id m465oGff005559 for ; Mon, 5 May 2008 22:50:18 -0700 Received: from snort.melbourne.sgi.com (snort.melbourne.sgi.com [134.14.54.149]) by larry.melbourne.sgi.com (950413.SGI.8.6.12/950213.SGI.AUTOCF) via ESMTP id PAA02798; Tue, 6 May 2008 15:50:58 +1000 Received: from snort.melbourne.sgi.com (localhost [127.0.0.1]) by snort.melbourne.sgi.com (SGI-8.12.5/8.12.5) with ESMTP id m465ovsT158090865; Tue, 6 May 2008 15:50:57 +1000 (AEST) Received: (from dgc@localhost) by snort.melbourne.sgi.com (SGI-8.12.5/8.12.5/Submit) id m465otiu158080992; Tue, 6 May 2008 15:50:55 +1000 (AEST) X-Authentication-Warning: snort.melbourne.sgi.com: dgc set sender to dgc@sgi.com using -f Date: Tue, 6 May 2008 15:50:55 +1000 From: David Chinner To: Christoph Hellwig Cc: David Chinner , xfs-dev , xfs-oss Subject: Re: [PATCH] Fix xfs_fsync() b0rkage Message-ID: <20080506055055.GQ155679365@sgi.com> References: <20080506022701.GN155679365@sgi.com> <20080506051916.GA7402@infradead.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20080506051916.GA7402@infradead.org> User-Agent: Mutt/1.4.2.1i X-Virus-Scanned: ClamAV 0.91.2/6021/Wed Feb 27 15:55:48 2008 on oss.sgi.com X-Virus-Status: Clean X-archive-position: 15798 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: dgc@sgi.com Precedence: bulk X-list: xfs On Tue, May 06, 2008 at 01:19:16AM -0400, Christoph Hellwig wrote: > On Tue, May 06, 2008 at 12:27:01PM +1000, David Chinner wrote: > > Fix fsync() b0rkage. > > > > xfs_fsync() fails to wait for data I/O completion before checking if > > the inode is dirty or clean to decide whether to log the inode or not. > > This misses inode size updates when the data flushed by the fsync() > > is extending the file. This results in xfsqa test 179 failures. > > > > Hence, like fdatasync(), we need to wait for I/O completion first, > > then check the inode for cleanliness. Doing so makes the behaviour of > > xfs_fsync() identical for fsync and fdatasync and we *always* use > > synchronous semantics if the inode is dirty. Therefore also kill the > > differences and remove the unused flags from the xfs_fsync function > > and callers. > > The change looks good from a quick look, but while you're at it you > can also remove the unused start/stop arguments. Yup, good point. Updated patch below that also puts back the clearing of the ITRUNCATED flag in the dmapi code. Cheers, Dave. -- Dave Chinner Principal Engineer SGI Australian Software Group Fix fsync() b0rkage. xfs_fsync() fails to wait for data I/O completion before checking if the inode is dirty or clean to decide whether to log the inode or not. This misses inode size updates when the data flushed by the fsync() is extending the file. Hence, like fdatasync(), we need to wait for I/o completion first, then check the inode for cleanliness. Doing so makes the behaviour of xfs_fsync() identical for fsync and fdatasync and we *always* use synchronous semantics if the inode is dirty. Therefore also kill the differences and remove the unused flags from the xfs_fsync function and callers. Version 2: o remove unused ranges from xfs_fsync() as well. o still need to clear the XFS_ITRUNCATED flag in dmapi code Signed-off-by: Dave Chinner --- fs/xfs/dmapi/xfs_dm.c | 8 --- fs/xfs/linux-2.6/xfs_file.c | 17 ++++-- fs/xfs/linux-2.6/xfs_vnode.h | 8 --- fs/xfs/xfs_vnodeops.c | 114 ++++++++++++++++--------------------------- fs/xfs/xfs_vnodeops.h | 3 - 5 files changed, 57 insertions(+), 93 deletions(-) Index: 2.6.x-xfs-new/fs/xfs/dmapi/xfs_dm.c =================================================================== --- 2.6.x-xfs-new.orig/fs/xfs/dmapi/xfs_dm.c 2008-04-28 16:35:23.000000000 +1000 +++ 2.6.x-xfs-new/fs/xfs/dmapi/xfs_dm.c 2008-05-06 15:45:18.321651578 +1000 @@ -2880,19 +2880,15 @@ xfs_dm_sync_by_handle( /* We need to protect against concurrent writers.. */ ret = filemap_fdatawrite(inode->i_mapping); down_rw_sems(inode, DM_FLAGS_IMUX); - err = xfs_fsync(ip, FSYNC_WAIT, 0, -1); + err = -xfs_fsync(ip); if (!ret) ret = err; up_rw_sems(inode, DM_FLAGS_IMUX); err = filemap_fdatawait(inode->i_mapping); if (!ret) ret = err; - xfs_iflags_clear(ip, XFS_ITRUNCATED); - if (ret > 0) - ret = -ret; /* Return negative errors to DMAPI */ - - return(ret); + return ret; } Index: 2.6.x-xfs-new/fs/xfs/linux-2.6/xfs_file.c =================================================================== --- 2.6.x-xfs-new.orig/fs/xfs/linux-2.6/xfs_file.c 2008-03-13 13:07:24.000000000 +1100 +++ 2.6.x-xfs-new/fs/xfs/linux-2.6/xfs_file.c 2008-05-06 15:32:35.640495883 +1000 @@ -187,19 +187,24 @@ xfs_file_release( return -xfs_release(XFS_I(inode)); } +/* + * We ignore the datasync flag here because a datasync is effectively + * identical to an fsync. That is, datasync implies that we need to write + * only the metadata needed to be able to access the data that is written + * if we crash after the call completes. Hence if we are writing beyond + * EOF we have to log the inode size change as well, which makes it a + * full fsync. If we don't write beyond EOF, the inode core will be + * clean in memory and so we don't need to log the inode, just like + * fsync. + */ STATIC int xfs_file_fsync( struct file *filp, struct dentry *dentry, int datasync) { - int flags = FSYNC_WAIT; - - if (datasync) - flags |= FSYNC_DATA; xfs_iflags_clear(XFS_I(dentry->d_inode), XFS_ITRUNCATED); - return -xfs_fsync(XFS_I(dentry->d_inode), flags, - (xfs_off_t)0, (xfs_off_t)-1); + return -xfs_fsync(XFS_I(dentry->d_inode)); } #ifdef HAVE_DMAPI Index: 2.6.x-xfs-new/fs/xfs/xfs_vnodeops.c =================================================================== --- 2.6.x-xfs-new.orig/fs/xfs/xfs_vnodeops.c 2008-04-30 12:32:59.000000000 +1000 +++ 2.6.x-xfs-new/fs/xfs/xfs_vnodeops.c 2008-05-06 15:34:23.234545942 +1000 @@ -856,18 +856,14 @@ xfs_readlink( /* * xfs_fsync * - * This is called to sync the inode and its data out to disk. - * We need to hold the I/O lock while flushing the data, and - * the inode lock while flushing the inode. The inode lock CANNOT - * be held while flushing the data, so acquire after we're done - * with that. + * This is called to sync the inode and its data out to disk. We need to hold + * the I/O lock while flushing the data, and the inode lock while flushing the + * inode. The inode lock CANNOT be held while flushing the data, so acquire + * after we're done with that. */ int xfs_fsync( - xfs_inode_t *ip, - int flag, - xfs_off_t start, - xfs_off_t stop) + xfs_inode_t *ip) { xfs_trans_t *tp; int error; @@ -875,103 +871,79 @@ xfs_fsync( xfs_itrace_entry(ip); - ASSERT(start >= 0 && stop >= -1); - if (XFS_FORCED_SHUTDOWN(ip->i_mount)) return XFS_ERROR(EIO); - if (flag & FSYNC_DATA) - filemap_fdatawait(vn_to_inode(XFS_ITOV(ip))->i_mapping); + /* capture size updates in I/O completion before writing the inode. */ + error = filemap_fdatawait(vn_to_inode(XFS_ITOV(ip))->i_mapping); + if (error) + return XFS_ERROR(error); /* - * We always need to make sure that the required inode state - * is safe on disk. The vnode might be clean but because - * of committed transactions that haven't hit the disk yet. - * Likewise, there could be unflushed non-transactional - * changes to the inode core that have to go to disk. + * We always need to make sure that the required inode state is safe on + * disk. The vnode might be clean but we still might need to force the + * log because of committed transactions that haven't hit the disk yet. + * Likewise, there could be unflushed non-transactional changes to the + * inode core that have to go to disk and this requires us to issue + * a synchronous transaction to capture these changes correctly. * - * The following code depends on one assumption: that - * any transaction that changes an inode logs the core - * because it has to change some field in the inode core - * (typically nextents or nblocks). That assumption - * implies that any transactions against an inode will - * catch any non-transactional updates. If inode-altering - * transactions exist that violate this assumption, the - * code breaks. Right now, it figures that if the involved - * update_* field is clear and the inode is unpinned, the - * inode is clean. Either it's been flushed or it's been - * committed and the commit has hit the disk unpinning the inode. - * (Note that xfs_inode_item_format() called at commit clears - * the update_* fields.) + * This code relies on the assumption that if the update_* fields + * of the inode are clear and the inode is unpinned then it is clean + * and no action is required. */ xfs_ilock(ip, XFS_ILOCK_SHARED); - /* If we are flushing data then we care about update_size - * being set, otherwise we care about update_core - */ - if ((flag & FSYNC_DATA) ? - (ip->i_update_size == 0) : - (ip->i_update_core == 0)) { - /* - * Timestamps/size haven't changed since last inode - * flush or inode transaction commit. That means - * either nothing got written or a transaction - * committed which caught the updates. If the - * latter happened and the transaction hasn't - * hit the disk yet, the inode will be still - * be pinned. If it is, force the log. + if (!(ip->i_update_size || ip->i_update_core)) { + /* + * Timestamps/size haven't changed since last inode flush or + * inode transaction commit. That means either nothing got + * written or a transaction committed which caught the updates. + * If the latter happened and the transaction hasn't hit the + * disk yet, the inode will be still be pinned. If it is, + * force the log. */ xfs_iunlock(ip, XFS_ILOCK_SHARED); if (xfs_ipincount(ip)) { - _xfs_log_force(ip->i_mount, (xfs_lsn_t)0, - XFS_LOG_FORCE | - ((flag & FSYNC_WAIT) - ? XFS_LOG_SYNC : 0), + error = _xfs_log_force(ip->i_mount, (xfs_lsn_t)0, + XFS_LOG_FORCE | XFS_LOG_SYNC, &log_flushed); } else { /* - * If the inode is not pinned and nothing - * has changed we don't need to flush the - * cache. + * If the inode is not pinned and nothing has changed + * we don't need to flush the cache. */ changed = 0; } - error = 0; } else { /* - * Kick off a transaction to log the inode - * core to get the updates. Make it - * sync if FSYNC_WAIT is passed in (which - * is done by everybody but specfs). The - * sync transaction will also force the log. + * Kick off a transaction to log the inode core to get the + * updates. The sync transaction will also force the log. */ xfs_iunlock(ip, XFS_ILOCK_SHARED); tp = xfs_trans_alloc(ip->i_mount, XFS_TRANS_FSYNC_TS); - if ((error = xfs_trans_reserve(tp, 0, - XFS_FSYNC_TS_LOG_RES(ip->i_mount), - 0, 0, 0))) { + error = xfs_trans_reserve(tp, 0, + XFS_FSYNC_TS_LOG_RES(ip->i_mount), 0, 0, 0); + if (error) { xfs_trans_cancel(tp, 0); return error; } xfs_ilock(ip, XFS_ILOCK_EXCL); /* - * Note - it's possible that we might have pushed - * ourselves out of the way during trans_reserve - * which would flush the inode. But there's no - * guarantee that the inode buffer has actually - * gone out yet (it's delwri). Plus the buffer - * could be pinned anyway if it's part of an - * inode in another recent transaction. So we - * play it safe and fire off the transaction anyway. + * Note - it's possible that we might have pushed ourselves out + * of the way during trans_reserve which would flush the inode. + * But there's no guarantee that the inode buffer has actually + * gone out yet (it's delwri). Plus the buffer could be pinned + * anyway if it's part of an inode in another recent + * transaction. So we play it safe and fire off the + * transaction anyway. */ xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); xfs_trans_ihold(tp, ip); xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); - if (flag & FSYNC_WAIT) - xfs_trans_set_sync(tp); + xfs_trans_set_sync(tp); error = _xfs_trans_commit(tp, 0, &log_flushed); xfs_iunlock(ip, XFS_ILOCK_EXCL); Index: 2.6.x-xfs-new/fs/xfs/xfs_vnodeops.h =================================================================== --- 2.6.x-xfs-new.orig/fs/xfs/xfs_vnodeops.h 2008-04-30 12:32:59.000000000 +1000 +++ 2.6.x-xfs-new/fs/xfs/xfs_vnodeops.h 2008-05-06 15:34:35.472959313 +1000 @@ -18,8 +18,7 @@ int xfs_open(struct xfs_inode *ip); int xfs_setattr(struct xfs_inode *ip, struct bhv_vattr *vap, int flags, struct cred *credp); int xfs_readlink(struct xfs_inode *ip, char *link); -int xfs_fsync(struct xfs_inode *ip, int flag, xfs_off_t start, - xfs_off_t stop); +int xfs_fsync(struct xfs_inode *ip); int xfs_release(struct xfs_inode *ip); int xfs_inactive(struct xfs_inode *ip); int xfs_lookup(struct xfs_inode *dp, struct xfs_name *name, Index: 2.6.x-xfs-new/fs/xfs/linux-2.6/xfs_vnode.h =================================================================== --- 2.6.x-xfs-new.orig/fs/xfs/linux-2.6/xfs_vnode.h 2008-04-30 12:32:59.000000000 +1000 +++ 2.6.x-xfs-new/fs/xfs/linux-2.6/xfs_vnode.h 2008-05-06 11:53:21.223604472 +1000 @@ -230,14 +230,6 @@ static inline void vn_atime_to_time_t(bh #define ATTR_NOSIZETOK 0x400 /* Don't get the SIZE token */ /* - * Flags to vop_fsync/reclaim. - */ -#define FSYNC_NOWAIT 0 /* asynchronous flush */ -#define FSYNC_WAIT 0x1 /* synchronous fsync or forced reclaim */ -#define FSYNC_INVAL 0x2 /* flush and invalidate cached data */ -#define FSYNC_DATA 0x4 /* synchronous fsync of data only */ - -/* * Tracking vnode activity. */ #if defined(XFS_INODE_TRACE) From owner-xfs@oss.sgi.com Tue May 6 00:04:53 2008 Received: with ECARTIS (v1.0.0; list xfs); Tue, 06 May 2008 00:05:12 -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.5 required=5.0 tests=BAYES_00,J_CHICKENPOX_45 autolearn=no 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 m4674pgG012114 for ; Tue, 6 May 2008 00:04:53 -0700 X-ASG-Debug-ID: 1210057536-22f302490000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bay0-omc3-s41.bay0.hotmail.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 9D0AAB13A05 for ; Tue, 6 May 2008 00:05:36 -0700 (PDT) Received: from bay0-omc3-s41.bay0.hotmail.com (bay0-omc3-s41.bay0.hotmail.com [65.54.246.241]) by cuda.sgi.com with ESMTP id VIkfb0nBmzzUSjCB for ; Tue, 06 May 2008 00:05:36 -0700 (PDT) Received: from hotmail.com ([65.54.174.77]) by bay0-omc3-s41.bay0.hotmail.com with Microsoft SMTPSVC(6.0.3790.3959); Tue, 6 May 2008 00:05:35 -0700 Received: from mail pickup service by hotmail.com with Microsoft SMTPSVC; Tue, 6 May 2008 00:05:35 -0700 Message-ID: Received: from 85.32.103.134 by BAY103-DAV5.phx.gbl with DAV; Tue, 06 May 2008 07:05:30 +0000 X-Originating-IP: [85.32.103.134] X-Originating-Email: [pupilla@hotmail.com] X-Sender: pupilla@hotmail.com From: "Marco Berizzi" To: "David Chinner" Cc: , References: <20080505231754.GL155679365@sgi.com> X-ASG-Orig-Subj: Re: XFS shutdown in xfs_iunlink_remove() (was Re: 2.6.25: swapper: page allocation failure. order:3, mode:0x4020) Subject: Re: XFS shutdown in xfs_iunlink_remove() (was Re: 2.6.25: swapper: page allocation failure. order:3, mode:0x4020) Date: Tue, 6 May 2008 09:03:06 +0200 X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 6.00.2800.1123 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1123 X-OriginalArrivalTime: 06 May 2008 07:05:35.0448 (UTC) FILETIME=[94D36580:01C8AF47] X-Barracuda-Connect: bay0-omc3-s41.bay0.hotmail.com[65.54.246.241] X-Barracuda-Start-Time: 1210057536 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: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=MSGID_FROM_MTA_HEADER X-Barracuda-Spam-Report: Code version 3.1, rules version 3.1.49761 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MSGID_FROM_MTA_HEADER Message-Id was added by a relay X-Virus-Scanned: ClamAV 0.91.2/6021/Wed Feb 27 15:55:48 2008 on oss.sgi.com X-Virus-Status: Clean X-archive-position: 15799 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: pupilla@hotmail.com Precedence: bulk X-list: xfs David Chinner wrote: > [Please cc the XFS list (xfs@oss.sgi.com) on bug reports or put "XFS" in the > subject line so ppl know to pay attention to your report.] ok sorry. > On Mon, May 05, 2008 at 03:41:29PM +0200, Marco Berizzi wrote: > > Hi. > > Just few minutes ago an xfs filesystem > > was shutdown with these errors: > > > > May 5 14:31:38 Pleiadi kernel: xfs_inotobp: xfs_imap() returned an > > error 22 on hda8. Returning error. > > May 5 14:31:38 Pleiadi kernel: xfs_iunlink_remove: xfs_inotobp() > > returned an error 22 on hda8. Returning error. > > May 5 14:31:38 Pleiadi kernel: xfs_inactive:^Ixfs_ifree() returned an > > error = 22 on hda8 > > May 5 14:31:38 Pleiadi kernel: xfs_force_shutdown(hda8,0x1) called from > > line 1737 of file fs/xfs/xfs_vnodeops.c. Return address = 0xc01e6fde > > May 5 14:31:38 Pleiadi kernel: Filesystem "hda8": I/O Error Detected. > > Shutting down filesystem: hda8 > > May 5 14:31:38 Pleiadi kernel: Please umount the filesystem, and > > rectify the problem(s) > > May 5 14:36:43 Pleiadi kernel: xfs_force_shutdown(hda8,0x1) called from > > line 420 of file fs/xfs/xfs_rw.c. Return address = 0xc01eaf21 > > Is it reproducable? honestly, I don't know. As you may see from the dmesg output this box has been started on 24 april and the crash has happened yesterday. IMHO the crash happended because of this: At 12:23 squid complain that there is no left space on device, and it start to shrinking cache_dir, and at 12:57 the kernel start logging... This box is pretty slow (celeron) and the hda8 filesystem is about 2786928 1k-blocks. > What were you doing at the time the problem occurred? this box is running squid (http proxy): hda8 is where squid cache and logs are stored. I haven't rebooted this box since the problem happened. If you need ssh access just email me. This is the output from xfs_repair: Phase 1 - find and verify superblock... Phase 2 - using internal log - zero log... ALERT: The filesystem has valuable metadata changes in a log which is being destroyed because the -L option was used. - scan filesystem freespace and inode maps... - found root inode chunk Phase 3 - for each AG... - scan and clear agi unlinked lists... - process known inodes and perform inode discovery... - agno = 0 data fork in ino 351800 claims free block 25655 imap claims in-use inode 351800 is free, correcting imap data fork in ino 755175 claims free block 47552 data fork in ino 755175 claims free block 47553 data fork in ino 755175 claims free block 47554 imap claims in-use inode 755175 is free, correcting imap - agno = 1 - agno = 2 - agno = 3 data fork in ino 6750465 claims free block 422290 imap claims in-use inode 6750465 is free, correcting imap data fork in ino 6750520 claims free block 422467 data fork in ino 6750520 claims free block 422468 data fork in ino 6750520 claims free block 422469 data fork in ino 6750520 claims free block 422470 imap claims in-use inode 6750520 is free, correcting imap - agno = 4 - agno = 5 data fork in ino 10787308 claims free block 681220 imap claims in-use inode 10787308 is free, correcting imap data fork in ino 10787309 claims free block 681221 imap claims in-use inode 10787309 is free, correcting imap data fork in ino 10842499 claims free block 677665 imap claims in-use inode 10842499 is free, correcting imap data fork in ino 10870100 claims free block 679867 imap claims in-use inode 10870100 is free, correcting imap data fork in ino 10895430 claims free block 681114 imap claims in-use inode 10895430 is free, correcting imap data fork in ino 10895431 claims free block 681115 imap claims in-use inode 10895431 is free, correcting imap - agno = 6 data fork in ino 12986518 claims free block 813324 data fork in ino 12986518 claims free block 813325 data fork in ino 12986518 claims free block 813326 data fork in ino 12986518 claims free block 813327 data fork in ino 12986518 claims free block 813328 imap claims in-use inode 12986518 is free, correcting imap - agno = 7 - process newly discovered inodes... Phase 4 - check for duplicate blocks... - setting up duplicate extent list... - clear lost+found (if it exists) ... - check for inodes claiming duplicate blocks... - agno = 0 - agno = 1 - agno = 2 - agno = 3 - agno = 4 - agno = 5 - agno = 6 - agno = 7 Phase 5 - rebuild AG headers and trees... - reset superblock... Phase 6 - check inode connectivity... - resetting contents of realtime bitmap and summary inodes - ensuring existence of lost+found directory - traversing filesystem starting at / ... - traversal finished ... - traversing all unattached subtrees ... - traversals finished ... - moving disconnected inodes to lost+found ... disconnected inode 351800, moving to lost+found disconnected inode 755175, moving to lost+found disconnected inode 6750465, moving to lost+found disconnected inode 6750520, moving to lost+found disconnected inode 10787308, moving to lost+found disconnected inode 10787309, moving to lost+found disconnected inode 10842499, moving to lost+found disconnected inode 10870100, moving to lost+found disconnected inode 10895430, moving to lost+found disconnected inode 10895431, moving to lost+found disconnected inode 12986518, moving to lost+found Phase 7 - verify and correct link counts... done PS: xfsprogs is 2.8.10 from slackware 11.0 From owner-xfs@oss.sgi.com Tue May 6 01:16:25 2008 Received: with ECARTIS (v1.0.0; list xfs); Tue, 06 May 2008 01:16:45 -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=1.5 required=5.0 tests=BAYES_20,TVD_SPACE_RATIO autolearn=no 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 m468GLZP020943 for ; Tue, 6 May 2008 01:16:25 -0700 X-ASG-Debug-ID: 1210061825-2f9703950000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from www1458.sakura.ne.jp (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 15016B13CD5 for ; Tue, 6 May 2008 01:17:06 -0700 (PDT) Received: from www1458.sakura.ne.jp (www1458.sakura.ne.jp [219.94.163.68]) by cuda.sgi.com with ESMTP id jkez6rjrFWVbssPJ for ; Tue, 06 May 2008 01:17:06 -0700 (PDT) Received: from www1458.sakura.ne.jp (localhost [127.0.0.1]) by www1458.sakura.ne.jp (8.13.6/8.13.6) with ESMTP id m468H4q6079591 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 6 May 2008 17:17:04 +0900 (JST) (envelope-from kong@www1458.sakura.ne.jp) Received: (from kong@localhost) by www1458.sakura.ne.jp (8.13.6/8.13.6/Submit) id m468H3HM079590; Tue, 6 May 2008 17:17:03 +0900 (JST) (envelope-from kong) Date: Tue, 6 May 2008 17:17:03 +0900 (JST) Message-Id: <200805060817.m468H3HM079590@www1458.sakura.ne.jp> From: Reply-To: king@kong.sakura.ne.jp To: linux-xfs@oss.sgi.com X-ASG-Orig-Subj: =?iso-2022-jp?B??= Subject: =?iso-2022-jp?B??= MIME-Version: 1.0 Content-Type: text/plain; charset="iso-2022-jp" Content-Transfer-Encoding: 7bit X-Mailer: ppp-124-121-210-237.revip2.asianet.co.th(124.121.210.237:) X-Barracuda-Connect: www1458.sakura.ne.jp[219.94.163.68] X-Barracuda-Start-Time: 1210061827 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 0.55 X-Barracuda-Spam-Status: No, SCORE=0.55 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=NO_REAL_NAME, SUBJECT_EXCESS_BASE64 X-Barracuda-Spam-Report: Code version 3.1, rules version 3.1.49761 Rule breakdown