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 D9qA/wCAj/CpPtV3v2/bBj/dX/CqIv8AWGdv3lztXHRAefyp/wBt1nH37r/v 0P8ACkqrD2cS39su9237UMf7i/4UC7uyxH2sf9+wf6VWF5rOPv3P/fof4UG8 1lRnfcEnpmMf4VXtWHs4lkXd5kj7WD/2yH+FH2u7x/x9D/v0P8KqG+1pTgvc A5x/qx/hTlvdaO3dLMqscKxQfyxTVRi5Ilr7Xd7Hb7WCV6fuh/hVf+07wf8A Lxz/ANcx/hQNRvmkEZvJVcHBUqOv5VDJe6zHIUaS4U54zGOf0odRhyRLH9q3 v/Px/wCOL/hSHVr7tcj/AL4H+FVhqGsHOJrgEdmjH+FPivtXlkCLJP7nyx/h SVSVx8kTQiur50DNdYz/ANMx/hUglvyMi7/8hD+eKrPNq4cRiWZcdcoP8KX7 TqXP7+fH94oNv505VGV7OJK02pD7t3GfYhf8Kia/1CPh5wPcKv8AhTVu9TmG YZJmHTd5Qxmn/adRjA3yzyNxwIx3/Cp9rIPZxES/vmBP2nI9fLH+FTx3F9Io K3Yx7xD/AAqB59WUlnkljX02DmlgutSuZG2PKqjttAoVVh7OJaEt9nBvV/79 Cms+pKf+PxcevlCgXGoHg+bx3Kih7m+EZw827/dFV7SQeziLDLeTEgX6g+8Y /wAKnEN+wyNQXH/XMf4VVW51DK/vH59FFXhJeDA/eflWkZti5Ikfkah/z/r/ AN+h/hR5Oof8/wCv/fof4VMJLzPO/wDKlD3X+3+VVzC9nEh8nUR/y/L/AN+h /hR5Oo/8/wAn/fsf4VOHuv8Ab/KnBrjnIf8AKjmH7NEAg1Hvfp/37FL5Gof8 /wAn/fsVOGuM4w/5U7dL3L5o5g9mVvs+on/l+j/79ij7NqP/AD/L/wB+x/hV tWl96duk96OYPZootBqC8nUEX6xioz9tBwNQiP8A2zFToTI7eaTkdj0qdUUn AQfWlzh7MqiDUiNwvo2H/XIUeRqe7H2yPBx/yy6VJCXIlSLcAT8hJ4qH7du8 lg7KoHzZ53ZOP0oUg9mPFvqfH+mxnHfyhR5GqdPtceT38sVAt6fNaVi7JIpK xdCoXqfxpgluJ4BAqsjliCxPQ9cflRzByFnydVxxdLn/AK5immPVen2hR6kx gVAJZGaEgNyBxn1OB+ophnKJvO87icfN0HSjnQ+QeJ74nal7AzkcLgdaef7V 3lROjHGcBRwKoIGaFVRPmXI3A808RyvOQAysFGTu5/Gl7RC5C5/xOP8Anqv/ AH7FIW1dRkyL/wB+6zzMQyhxMoboxbg/SlaKQna4YYbHMmDT9oh+zL5bWOgd T9IqjkutRibElxCp/wBpQKqvbz4kZonBjOGAl4H40gs5nk2FAXAyctn8qObU OQuedqnl+Z5qbNud3l8fnRHc6lLzFNE4HXbHmqP2S4+VQgweP9dwPr6UsllP FIqxxrl+SVmx+Zochchf36wem3HvGKN2s99uPaOs42VyXSPymZ2GVAl4OOvN B0+6DhPKJduQomzx9aadw5DRMusLySmP9pAKp3F7cXN1DZTvHGpPzOoBzUMa SxuykOrKyqQWzgmlnjX+0Hg5IEpGe9NMUoaG/wD2Xa/88xRWVul/57y/nRTI 5V2HXrbdZclyo8scgZqvHNKL9QCHBcZPRgBU9+A2sSA/3B/KqsIA1NDnpIAK 5a0mnY2pInmMdwzyxrcEDja47+tR211Mc7oppGHQ44FS6oWtr1LlJWCM2No6 ZFWoJIdQth52Ecr8xRsVxuTbNB1r9vjUCRI4wexfNWEkuEP+q+U8/K2apmOe 3UyRv5i9d+3LgfSnRXcD7nS8JQjJTGCD71Sm0FjWjkDpuGcjqKSWVYULuxUf Ws2CUrfRt9oWUMu2RF7HtWXrWomW+a2R9qw8jPdh1rq9p7lyJaGlduzTthcc Dkmoyx4O7nr1pI5JGsxcTENmo3LEAKFAbj8643JsgljL7ACSc/McH8qmDEjH P4NUKjA2qcDuaepyu1BgdzVIoeSSvBP50jf6vLE7uq85poAwwzQrAAH3wapA KxLdDhsBs9axL6SS01gzYZmVcqC3y5Pt7VsIc5RTzu2/lVLW4lkW3lJxlTn8 KoRjgMTvLuZM7t/vWlDfO7Fbp2kB/jxyKrxxggc1YEQ2kfrU3YFkQSTsBEd5 zwc9q0oYfIjUBck8Ng81kKzQsXR2UjuO1adpe+erLIyq6dAP46uNwRM0yRgg NvY9EYZx+NNJbBa6uIwuMhIxjH+NLNILb95gKW6kDOKhFxaovmvKskijPmuM Bal3uaJku6aUK+8xRL/sYLCnGVIVLxoATzuznOKZLcA26TeYWRsf8C+ntUZt XlbdIfJQsQqetSUVLm6a4lKqNzZ4UHpWpaI0ECKxO7uRVW3himnYiALHH02j ndWgOR8uP/r0agGSGJJP0zTJcGEtuOfrUhDLhlGWJwRUVyo2dg3pWiEyGK8h t1AKszdCa0UcOMqxway1hRctIKFu/LnD/wAHSuiLsQzXx9fzo59/zpqMGA9C M07ArS4Bg+/50c+9OpCM9aYFSX55wj7gvbnvUgtoQwIU/XNSSKsgww49aiFu yjCSkCpd7gT/AI0ZwM5qsI5i2PPOPpR9nHV5HY9/Si4CzeQw/eEfgarG3M/y pvWP16VaWGFTkKCT3NP3c7T+GKW4EKWaKu1XbFILCBRKqr/rOue30qx0pRz+ VUloBUlt43ZISvyLtIx14p5hX7S0p++V2jngU+Ti4U+1HWQ/L+NYyvcaIDax eXMmCElOTjqD7VBeW5eJWRgrRLx8vUVcMiqNx6ZxRgZZSc9CfYVjNtMoxktY 5IIxht+CfMjPJ+oqWFP9KHmruZlADrwpHv8A4Ux0FveFCsuxlLLKnQfWi4uV jhwrZyMjHQD1+tZ8wMhl8keZbIHTy8hvNGVI/wBk1FuhNu8axshzk+Y2Wz2w fSqRc+Y7FpGA5KP/ADpCScZYn696abTuQ2bsRguJ1Lf6p/vRqcgn3FaEdvbO WlVOCAuCeAB/KuXiOw70DBgO1dDokrS2Lu+c+Y1dNOpfcClqQt/s85mVSerP 6D0UDqao28UNurSyW8kRflY1fcSD3b0PtV2LE0/lxR/KpAweSeThvw5zUOpS oJvs8R+QfeYdc+9ZV5uOqAPtEQSNGkzjgsFKn/dxWixsjEilvIZV4K8ED0B7 1g54CgEsenHJqW/S4Wzj8tgzscEOPu1zUsRK2oE7T2s195UJIOFbJ6s1MnOd clwP+Wp/lWDcvLZazHIzDqoIFbszbtdmUdpv6V20qnMhS2H+caKZRW9zG7LW oDOryFnwuwcfhVKMqNSjC8L5owTVy/ZRq8zOMqsQ/LFVLf57q1X5hiQAj3rm rfEb0javLZLyJ4Dglu+OlYVvDdqhKqrhCd8cZ+fA/wBmukdW3ZG7B9T37Vl6 ghtL6O/2kqwKyIDyD2I9a5GaDbe+M6M6uEkjfcyk7CR34P8AKp7gbgJobgW0 pxlmT5Xz2YVA32PUQHWfZcBQFm24y3ofWluv7QSwcxXCQT243FmTeki/TsaS V2BajunSbyrxVidxmMqvyn6muWvXka8kMqqJkbbmPoQOtdcsB+yNHG2XKllJ OdrY6D2rjCzNI7Ockk5Hr61vODRnM3NMuGkxz+6fOR6Gpi+HXPJjG8fh0qlp O4LO5x5asMDH8R6fhVxW+d2OMk/hXO3qZk0X+rHfPNTJghhnFV4jngZGMmrE Sqd2Cxxy2V6VqtikKEJYqAGY1HIBEpaV1XBAAzVW91mK0uVit4vPBHzyIeFr FNxCbpXjad42JMpl52+mKdwN6S5ghdxuLsoyvvWfNPJeuHddqjolO+URptAb d/GDx+VJkjqVDepouIfEmeqk+5qbABK5BPtUStuGDJ+Aq1EsaqAoznvTAh7f dppVTVvgDPXI6UwIrAs3yADPNNMCEzyeUIWOYx0pAFcbW+4cAjHvUzoMNgcK QCR0poQc5wQT1obGrmo80PmMRtLrwoI4xUEzvIp3TBWcgBAKbbuwU7YwZCR8 xGQBViAb5XlLBxGcKQuM+tSzVbE8cSRQhCM7Ru696WWRI1w3DMOBSPjyx6Mc ++M5qCcq7mXJYdFrSKuDLCsJU3ZwR/Om3BOxOe9Mic/Nkde1SNhuoqoojmIL kMwwPu1U45yOOMVemG6IAMCR6VVwCwGKtIW5eilleJdq47VJ5c/XeBSQZHB9 Ks9RW1tBkIkdSPMFTggjI6UxwChBpITmMe1AEhziopGO4KPSnknOO1Rg5kJ9 BRcBPLI53UoU+vFBOcGlzRoA0qM8GmsTnjtT84NJmhAKp34JqQVX3FX46Gpl PApoBWHIPpUeSCSOpp5NN75pOIyvKhMX40nmKs+WIRmUDJ71YK5FVLuJnRSI xIo9OorOrC+w0Rakji13xuEZGHz+tc5C32lx85QE5II4NdMXCrh9hibJKv1B xXM2kpScEAbdxAPoK5OWz1FJkk6ALzOg54+WkVG8slZAc9R2NaMisyFkjLKf 4iRUbQDKodh5+bB60EWKQV1yCMg8nYeK1tFuQiyxFwN3KhqpmJCOAFI4+ToP rSPG8YDLggDH1FVB2YIuaQrQabJdSZjaYk89VOTWY7F5pGI2k8kCrd9cyLb2 0OwoijOWOS3tVMkeYwGR7GsMRUvoNsmt1V7qJWZgCRyO1a15GHKIyDaCPwz0 A/rWbYoWv4uWAXk4Gc1pyJ/pSxhctwRvbovfAqIQ90pbGNq9kJrpyQAf3eMf Wo5SR4vnX+EsOfwrVvI9l0vHVVqhOg/4SKZ+5lx+lehShZImfwkmKKXf9KK6 bHMS6jk6rMvqqr+GOarIzNqcJbBYSqAAfSrt3j+2Jc+i/wAhWdNdx2N8s8m7 5ZOMDj6fjWco+9c3gzbaR83qSHdJFllI7Ljjj86mmjS6iaNjkSJgsP4Tjt6V yttfzQ6lNeum8Sj5gT0HYfhW7p+qRXyNGBKskDAMzjhvTn3rgnY1i7lWIrIf Ju54xdQAgSbfnQ9vqKj1bVLyxje2d0kmkj/duFwp+vpVvUjJAy3ccZeMfuri Hbu3L2OO+KzNVsg8UbW25IwduyUcqPYdhWcXqN7Glp+qtNpRkLJ9pjjw4Xu3 r9K5xSSd2PmOcehzSC3ubJmaMExng7e4PWrUenCSb/R2by1IBz/BmuipIyau XtPz9guiVxjCj396sxQlkDH5QFAGT1qW2tYoIGXc2c85ptwrSJt3gKG4FYJX ZNhfPhRQDGXwe4wPzrN1jU7uKLYkarbz/K0ir92rpikdRsdRzgA9zUhjV42j lXhhgj+EGtWtB7HMpGpG1WPC5YoOGq5FGdoCgqQOMnipE0ye2aTjZCh3rn+M UxZCwG5gqevv6VjZiHIRASYwGL/fHb61MCMZA8wfyppCAA7go7/Smo8NwWjt nMpHUJVK40idJVGCAAasrNggqc54IqsLe4Y5MMmB7VYg+0Ej/R8YP8Q5qlFs Lak0ZbeqqBkc81oJZxmJ1l+YOOcdqqlQ2PMGz3FLFDKZcpMfLrWKsaJFtoYR GU8shGIPvUUlpE6ZxtUHjFJtngO9m8z2o+0CVWGNpHarui7EawgLsRnwxxx1 q2xW3WKNFLbeoH9abCoI3A44xn0qQoAu4ZB7/wC1URhrcLEPkZnEsshZsYA7 U+Qbl9AD2pA2WHtQxJjb610qKsFhV6kjmnnI5IwPeq32gRk4XcajwZJN7DJ9 M1MYmdiQKGmJUnFSqAqsMAsehpYUAGT1qXywRWlirDoQQBznirGelQoMcVLT QWF6g571Ep2MwNPyKCAwwRTCwjyDGB1NIowOetHCnAFBZT9aQrAp59qXHFMU 04802NoZnk0E8ZpMc00thttAJBIcKpqYHgVBIdzKtS54pJgkPzSA03NGTVDs PPSoi2CcZHc+9SA8Gmcbx7cmk9gsc9r18quIkX5geuaxIWGBgkHORU+qow1W 4Dk43ZX6VAp44x+Ncc3qZt3Ny32y28TNHOzdDgfLTsKAMJOgXHzBcjmqFncO m5PN2he2eKuIzyM3zqR6huOPX3qbCF3KZDGsr7tx+Ur1qwkKudrMJBj7qHI/ E9qkiVkUhmYIeRsHzn/61SIWKF1H8J5U9PrS2DYz5LeNA4VOQvIZs4+lUyNh HJOexHNWJXJldh6daZIpLMw5O6uSpqwLmkx/PNMAQApGc1fs2WVozIoLrwHP eqdlKkdo25c9cjtVdbkQkOmMHsT0+ldNOaUUUky9qX/H+D2Crn86zZ+NdlJ/ 57H+VXLmb7ROCePlWqlyP+JzL/11P8q7otMU/hDaaKfRWpzFi651iX6L/KsD WxI1zDGD8hl5roLjA1mXceNoJ/Kua1G8MuogBSqrJ1NY1zaGxIcINq54FIpe MFo/lLd6UMSAzEHI4xTgpbGc4FcaQ72NjTb7fAlnOhKYKM7HkelNnR44vJkX eyPtO48kdjWdAqpIJXQsjfKfetS+V5LY7RlkUYf1HYVLp63NIy0JIYgvU5VR jH1qwYtrAIBsaoYX+0Qwy7cb0GV6Z96u+Xv2kgABcjHrVtXRFtSscBucn60b Soyy/KOoXqacisw5INI7hWCgMo7ketZvYLEZWONyskqf7O84/GpFeJv3aXET fRqxb3L31xJJllD7Fz2FWdOaf5obeO3AAzudea3jTuirFu6t4riJ4JVLRnDB QehFU7yKOCZZURTG5C4X7yGtILfDBxa57nB/wqtdxzSvFbzTWsZZiURW2tJj rxjmqVJ3BRK1lGI8su45/ifqa0EY452jPoAKjTT5UGNyY7YJ/wAKsJbOvXZV cjXQasBbj71RlmI9qlNu7KASv4UNAzEbWXA61PJLsPQhJVRzTo5SDxTpLbGX LqoA6mkFrIDwyYo5J9h6EpIXBLl2/u+lRvAWZSTw55FSNE5KqpVf7xB5qV13 Aeo6UuSb6DuhwwrMqj7opFYnk0imTbmTaD1yKMEnOeK0UHYLolEasPSo2UIS A2aerY6801wGzgYNXFMLorlfanotOKsOSRimWtzbXcCz2k8U8LZ2yROGU44O COKsLllF4qTtUe8ds0olUHB6mmF0ShadUfnL6GmLOhJAOcHBx2pE3JsUUzzl 9DSecvoaY7j6Q1Xhvbe6QvbTJKgYqWjYMAQcEcdwal8xfQ0DuOApc4OKZ5o9 DR5qnPBoC6HE5phTJo8we9NLDPegWg5UxzRnJzSbxnvQWGe9A7of6UnemmRQ OeKN496AuiQGmn749MCk3im7gcg9D/OgV0clrO46xOWyOmKrDAGcmt/U9Llv bkzROi5A+8TVX+w7nH+si/M/4VzTpyb2IaKVv/rgqoOex71uRKsZjfZGsnIC f3Qf61Wt9KmglEshicAcruPT64qbndyqn5i3qQahxa3EiY5zygXd8wIOc03O 1Gz82e1IiDcrBVTI6g8Z9xTbgkbFyqnPY9aiWwFR02J1xk9KawyzjBPHappc MgI5INBViryAEKBz7+lcclqCBLkW8ewzbCwGPaq17NkjMiyMRw7cFT7CrMyz MpSFEbgBhInf61HLp8MO1powrZAIhPBPvTaNEtCjDPIL4p5oPyr1q/cAnWJx /wBNP6VnrGt1qfmGILGoUDHGavz7hrk44xuz+lehQloiJr3SXNFRb2orq5jm JtTl8rUZzjJKqB+VYmoWex4JC2WWTLAVsar/AMhZs9CF/lUV9F5kkiqPmDCs 6iuzWBngKCfl59KkVWY4xQoA6DLKcGpCMrktiuTqBe01QbdotoZgehq5swww u5epFVrGFkVLgH7zdKt7QGGSec9KpFLQW3TuVJQYABGMYq3FF+7XGQeaijbZ GoUHJPerfmbV5HSrSQXK0kW0eWox3zVORMDBbnNXpXYyDaOCKhkUBFOBuNZT imJmbdoHt3Xb1fdmnaUMTHI52HPtyKnl2rFKZ2Ahxhsdag0vPnfOcsIzt/3c jrW1FstFCTxBqZ8Y3Wh2tlaTLHbLcI8s7REDIByQrZ5IxwOh5qLxBpGr+IbG O3msrKB4pVmimi1GQOjDuD5PuajsoxJ8U9TnVwfK06ONlHYswPPpwP1rrquM XNNSel2bSag04rojKE+vhcf2bpv1OoSf/Gan0n+1fseNYFmLkMebRmKFe3DD IP51eoIyCD0NaqLve5m5aWscd40g1CDTPOj1q+jWW6ii8uHZGFVmAOCF3f8A j1WptK8M6DoV1ZEpa2c0irITKz7JDgK3JO08A54xjPauT+KF1Z2z2GmRW5kK MLq4Xe33M7QM9s5b6cetTate6RNpV15OmrpuoW2oW4vkYAc787t/8Snk5OPX HNcUqkVOXdf8E64wbhHzJZ9Q+1+FbLQdQ8RadLPNJtu7uK8Q7IFOeTkbmIAX 3zznmu20C50250S2bSJN9ii+XEcMCAvGDu57d6gufEmhNazAa1ppJQgAXSen 1rN+G/8AyIth/vS/+jGranpUSvfT8rGU9YN2tr+ZP4p8PXWpiC+0e4W01e3Y COfcVDJnJRsA5HfBBHX1NM1640z+0DYS3upQ6nLb+ZGLVrllAyQG2RHB5Bz0 +tVfG1vfQaWs0Ot6hF5l3EgSMxoFDNjgqgb82qhrc/2H4l2Eh1K0tSNL2me9 XKn5364ZBk+x/CpqSSb07FQi2lr3Mi1lm1ue70q/m1W1S2bbcSW326Zp1bOB sYt5YIBzuBz2ArufCU+kyaN5GjNcG2tpDCRPu3KwwSPm6dc4HHPQVyWh6t5X irxFN/wkOiw+a8H76WPMc2Fb7n70Yx35br2rofh+2/w5I29XzeTnen3W+bqO Tx+NRh37y+f4P1Krr3X8iDxLJK/jXw/Z/abmO2nSfzkgneLfhcjJUg9RWRJf WF7r3hi40y81L7FNNP5onupyGMaqR99jxyenB5BrV8SHHxA8Mk/887n/ANAN cv4bUqvgQno016R+YH9KVRvna81/7b/mOC9xPy/+S/yPSDruly2MlxHexPAF YmVTlQB156Vyvw41GytfC9lalXE880m4xwMRnPBZgMDjAyT29q0PG95PdW8X hzTjm+1D/WYP+qgH3nb24x7845pPhp/yI9p/10k/9DNa8zddLsn+hnypUW+7 /wAzo721uLoIsOoTWgByxhRCze3zqwH5VyHhDSrO7P8AbWozz3Opx3ksUM89 w2QASAoAIGMZ4x3NdB4mubTStFu9UuE3PDHhAWI3MeFGB7kV534HutJt7O0t tW0bcZL5oobxl3hZ8L8pB+5/ABjOcdsE0qsoqqkx04t020dNb6tp2n+JL2+t NbsV0qSJjLZPOEcXCsQSqNjGccnuTnng07wXNpa31yx1CK51zUVN1cLHJ5ix rnhAw+X5c9M5/DFL4O1rSrHSLiC71Ozt5RezkpNcKrY3nsTmm2N7a3/xWkms 7mG4i/srbvhkDrnzBxkVMX8Mrrfb1HJfFG3T8jrbyTUE2fYba2mznf59w0WP TGEbPf0rn/EfiDWNE0eS5l0+wEjkRQiO9d3aRuBhfKG7HXGRwDW9qWqWek2w nvJdoZgiIqlnkY9FVRySfQV51q8t9qHjrRm1+2lhsHEklvZwF3mj2qcMfK53 ZCn5ScAexrWvNxVovV/gZ0YKTu1p+Zu+END1fw5oqQppenG4m/eTSPeurk9l IERxtBxgEjOT3rT1L/hLriFF0+PSbSQOGZ3uXl3KP4ceUMZ9fyx1qv8A8Sb/ AKmT/wAqNU/h3HGE16WNp8NqcqgSs+cDBGQ3O7nknn16VMdLU09PJ/8AAKlr eo1r5r/gnQ+IXkTwrqr7tsi2Uxyh6HYehrhbXSP7V0PwvYRT3ubkCa5/0qUo IY+20ttXJ2gYHGOOld14m/5FTWP+vGb/ANANcvYag+heCND1lVRoI40iulI5 8pmxlfcEg47jNFZJz97a36hSbUNN7/oO07ybnxh4kt768vlhgeDyUju5owuU O77jD0HWodZWCDxb4Zgsr2/MUs8hmV7yZw20KR99j6np1ptlqdxp3ivxXd29 vbzw+Za72luDFtypAIwjZ6+341Y8SNeRa/4d1LVlsLK1tbh1Z0uzJy4GOCi/ 3e2euTgDNZ3XJ53/APbu5dnz/L9Ox3VYnizWP7F8PXE6Za5kHk26AZLSNwMD vjr+FbLyIkRkZhsAyT14rnbPT7jWtZj1rUkaO2t/+QfZuMFc9ZXH949h/CPe uqo3bljuzmgle8tkRaf4auk8CTaRe3ck93cwtveVy4RyOAMnoOPxBPetLwzq iarokMgQRTw/uJ4eMxSLwVwOnTI9iKoWfiO81Lxpd6XZQQyabZRhbmcsQyyn PAIznoRjA6Hn1pa9pOp6NrD+I/D0ZmeQAX1jyROB/EB/e+nP1yQck1Fc0NUt GatOT5ZaN6nZ1z99feHLi5JudeijkT5CkeqtDgjrlVcc/WtbTrm4vLCKe6sp LOZhloJGVip+o/8ArH2FZGt65daXrek6bZ2kExv/ADB+9kMYUqAeoB9fQ1rO S5bvb0M4J81luV/O8Kf9DF/5Xpf/AI7WH4ivNIuPB+q3mh6reyT2jxozf2hc NtJkUZ2s+CCCcHGPTpW74i13XdE0K51E6dpwEIXkXbydWC/d8tc9f7wqHx3J JL8OLySZUWV0hZ1RsgEyJnBIGR+Fc9S3LJLouxtTvzRb6vudJbIE0qJGZ3Ah ALOxZm+XuTyT71XiVS6sQQB2BwfxqzHxpqH/AKYj+VRIRsxuB3daustjme4n O0ABSf7p7/jUcoBdTwxB646VKqAcYIx60xeSR71zz0RLIWAPA5J5xUq2gdFM yy4Vc7UP5UwglTkbgF/h61OXEdnERA29uFTd8ze5rntcqKEaQCJSd2/lto/r WPeXzXDlYwfmI5XgZrSa1MreZdHzSCBtU4VP96i1iNzdO7srRRMAiIPkHsPe mXsVVtTbBFOd5VSalueNbmPuf5VPfA/aycH7q1Dcj/ibzfjXZQ2RE/hI9p9v zop+KK67nOLqsZfULhl6qin9KS3lDXcEmOWkUEVYvGEeq3EjcqsY4/CqFrqE LanDGFKlpBtJHFRNq5pAW6tmtbqRT8sZYkN7+lMSIyuu1QT/AHfWt+W0SWFo Z/nAOQQe9UJIBAuyMYH97vWEYXd2VYdHcW8WY2RljXpJnJzThKJAGTjJwCBy frVcJtI2gcd6swIyQhm3bmc4JH5VU4KKBrQsIp8wbiOB0HSld8k8kZ9KhD4Q 5Hyt146ntT1JAAHBrK5NycMRkfxVVbDZ2nDCpc56E59agfCvkdxik9Q6lS4Z /IKs/wDEGp+lj987ZyGXNStEJlKBMlhgfWorONmhkgRjDIEK78ZK+9bUTRbG R4VQ3fiLxJrADCKa5W2jyOoiXaWHqCf5V1lVdN0620nToLG0jCQQrtUevqT7 k8mrVbU48sbMqcuaV0FIxIUkDJxwM9aWirIPN/G2jnT/AAfqN5cyCa/vbuOS aQLgAA4VB/sqMD867PX7rTtL0m51C+ghdIsSAOgJdx9zGe+cY9KZ4l0FfEek HT3uDArSK5cLuOAenX9aedBt59RW+v5ZbyWNg0KSn91CR0KoOM/7Ryfeuf2c oyfKt7fqb86cVzPa/wChxOn6VNptt4W+2pi7vNRkubgMOdzoeCOxwBkeua9A tprOK5OmW6xxtBGreVGoAVTkDAHQcGq2uaDa69BDHPLcQSQSCSKa2k2OjeoP NVdH8KWukanJqP27ULy7eLyvMvJ/MITOcDgd8dc9KIU5U3ZLT/gBOcZq7epk +KtTj1kjRtJilv7y3nSecQbdsQRskFiQNx5AA9DSW8o1b4j2mqWQaWzTTjFJ KFOI5N7Eo391uRwea622sbSyaZrW2ihMzmSQxoBvY9z6msrVPCOj6rcm7kge C9I4uraQxyA4xnI4Jx6g0Spzb5uv+QRqRS5f61Muw+1aP4g8V6nLpt5NbyPA YxCgLSBUO4qCRkDI6VZ8AeY/hgTvE8QuLiWZA4wSrNkGkHgkAYHibxIB/wBf /wD9jVvSPCdppN412by/vZ9u1GvZ/M8v12jA5Pr/APXpQhNSTtpr+LuOcoOL 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 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 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 below pts rule name description ---- ---------------------- -------------------------------------------------- 0.55 NO_REAL_NAME From: does not include a real name 0.00 SUBJECT_EXCESS_BASE64 Subject: base64 encoded encoded unnecessarily 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: 15800 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: king@kong.sakura.ne.jp Precedence: bulk X-list: xfs From owner-xfs@oss.sgi.com Tue May 6 01:55:56 2008 Received: with ECARTIS (v1.0.0; list xfs); Tue, 06 May 2008 01:56:13 -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 m468tqRJ023436 for ; Tue, 6 May 2008 01:55:55 -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 SAA07194; Tue, 6 May 2008 18:56:36 +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 m468uYsT158013372; Tue, 6 May 2008 18:56:35 +1000 (AEST) Received: (from dgc@localhost) by snort.melbourne.sgi.com (SGI-8.12.5/8.12.5/Submit) id m468uWIf157850722; Tue, 6 May 2008 18:56:32 +1000 (AEST) X-Authentication-Warning: snort.melbourne.sgi.com: dgc set sender to dgc@sgi.com using -f Date: Tue, 6 May 2008 18:56:32 +1000 From: David Chinner To: Marco Berizzi Cc: David Chinner , linux-kernel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: XFS shutdown in xfs_iunlink_remove() (was Re: 2.6.25: swapper: page allocation failure. order:3, mode:0x4020) Message-ID: <20080506085632.GT155679365@sgi.com> References: <20080505231754.GL155679365@sgi.com> 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: 15801 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 09:03:06AM +0200, Marco Berizzi wrote: > David Chinner wrote: > > > May 5 14:31:38 Pleiadi kernel: xfs_inactive:^Ixfs_ifree() returned > an > > > error = 22 on hda8 > > > > 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. Yeah, I noticed that it happened after substantial uptime. > 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. Hmmmmm - interesting. Both the reports of this problem are from machines running as squid proxies. Are you using AUFS for the cache? Interesting the ENOSPC condition, but I'm not sure it is at all relevant - the other case seemed to be triggered by some cron job doing cache cleanup so I think it's just the removal files that is triggering this.... > > 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: You've run repair, there's not much I can look at now. As a suggestion, when the cache gets close to full next time, can you take a metadump of the filesystem (obfuscates names and contains no data) and then trigger the cache cleanup function? If the filesystem falls over, I'd be very interested in getting a copy of hte metadump image and trying to reproduce the problem locally. (BTW, you'll need a newer xfsprogs to get xfs_metadump). Still, thank you for the information - the bit about squid proxies if definitely relevant, I think... Cheers, Dave. -- Dave Chinner Principal Engineer SGI Australian Software Group From owner-xfs@oss.sgi.com Tue May 6 02:27:04 2008 Received: with ECARTIS (v1.0.0; list xfs); Tue, 06 May 2008 02:27: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=-1.8 required=5.0 tests=AWL,BAYES_05 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 m469R0jj025852 for ; Tue, 6 May 2008 02:27:04 -0700 X-ASG-Debug-ID: 1210066066-66bc00660000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bay0-omc1-s30.bay0.hotmail.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id CDCC1B1418A for ; Tue, 6 May 2008 02:27:46 -0700 (PDT) Received: from bay0-omc1-s30.bay0.hotmail.com (bay0-omc1-s30.bay0.hotmail.com [65.54.246.102]) by cuda.sgi.com with ESMTP id YROHSlfGJwAsGt6m for ; Tue, 06 May 2008 02:27:46 -0700 (PDT) Received: from hotmail.com ([65.54.174.79]) by bay0-omc1-s30.bay0.hotmail.com with Microsoft SMTPSVC(6.0.3790.3959); Tue, 6 May 2008 02:27:46 -0700 Received: from mail pickup service by hotmail.com with Microsoft SMTPSVC; Tue, 6 May 2008 02:27:46 -0700 Message-ID: Received: from 85.32.103.134 by BAY103-DAV7.phx.gbl with DAV; Tue, 06 May 2008 09:27:44 +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: "David Chinner" , , References: <20080505231754.GL155679365@sgi.com> <20080506085632.GT155679365@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 11:25:21 +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 09:27:46.0132 (UTC) FILETIME=[71827940:01C8AF5B] X-Barracuda-Connect: bay0-omc1-s30.bay0.hotmail.com[65.54.246.102] X-Barracuda-Start-Time: 1210066066 X-Barracuda-Bayes: INNOCENT GLOBAL 0.2543 1.0000 -0.5548 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=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: 15802 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: > Hmmmmm - interesting. Both the reports of this problem are from > machines running as squid proxies. Are you using AUFS for the cache? no, I'm using cache_dir ufs with cache_replacement_policy heap LFUDA > You've run repair, there's not much I can look at now. > > As a suggestion, when the cache gets close to full next time, can > you take a metadump of the filesystem (obfuscates names and contains > no data) and then trigger the cache cleanup function? If the > filesystem falls over, I'd be very interested in getting a copy of > hte metadump image and trying to reproduce the problem locally. > (BTW, you'll need a newer xfsprogs to get xfs_metadump). could you please tell me the exact command to run when this happen again? > Still, thank you for the information no problem: 2.6.25 is a bit unlucky for me :-(( From owner-xfs@oss.sgi.com Tue May 6 06:43:16 2008 Received: with ECARTIS (v1.0.0; list xfs); Tue, 06 May 2008 06:43: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 m46DhEtc014925 for ; Tue, 6 May 2008 06:43:16 -0700 X-ASG-Debug-ID: 1210081438-20c503a00000-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 DE5EB131933 for ; Tue, 6 May 2008 06:43:58 -0700 (PDT) Received: from sandeen.net (sandeen.net [209.173.210.139]) by cuda.sgi.com with ESMTP id jHavppCDootS9Vj0 for ; Tue, 06 May 2008 06:43:58 -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 C41C218002BEA; Tue, 6 May 2008 08:43:56 -0500 (CDT) Message-ID: <4820609C.9090306@sandeen.net> Date: Tue, 06 May 2008 08:43:56 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.14 (Macintosh/20080421) MIME-Version: 1.0 To: Timothy Shimmin CC: David Chinner , 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> <481FDCD1.2010905@sgi.com> In-Reply-To: <481FDCD1.2010905@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: 1210081439 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.49761 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: 15803 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 Timothy Shimmin wrote: > 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. The patch should only affect behavior on *old* abi: +#if defined(__arm__) && !defined(__ARM_EABI__) it is the only one with the unique alignment that matters here. There *is* still another issue on some arm chips related to processor cache flushing; I didn't see the problem in qemu because it the emulator does not have this behavior. But, it's a separate issue from the structure alignment this patch addresses. One thing at a time. :) Thanks, -Eric > 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 Tue May 6 06:53:16 2008 Received: with ECARTIS (v1.0.0; list xfs); Tue, 06 May 2008 06:53: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.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 m46DrC37015854 for ; Tue, 6 May 2008 06:53:16 -0700 X-ASG-Debug-ID: 1210082038-21d600180000-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 9130D131AF5 for ; Tue, 6 May 2008 06:53:58 -0700 (PDT) Received: from sandeen.net (sandeen.net [209.173.210.139]) by cuda.sgi.com with ESMTP id 9Qm6vPJCmNoWi1RM for ; Tue, 06 May 2008 06:53:58 -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 B848B18002BEA; Tue, 6 May 2008 08:53:57 -0500 (CDT) Message-ID: <482062F5.9010402@sandeen.net> Date: Tue, 06 May 2008 08:53:57 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.14 (Macintosh/20080421) MIME-Version: 1.0 To: Marco Berizzi CC: David Chinner , linux-kernel@vger.kernel.org, xfs@oss.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) References: <20080505231754.GL155679365@sgi.com> <20080506085632.GT155679365@sgi.com> In-Reply-To: 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: 1210082038 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.49761 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: 15804 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 Marco Berizzi wrote: > David Chinner wrote: > >> Hmmmmm - interesting. Both the reports of this problem are from >> machines running as squid proxies. Are you using AUFS for the cache? > > no, I'm using cache_dir ufs with cache_replacement_policy heap LFUDA > >> You've run repair, there's not much I can look at now. >> >> As a suggestion, when the cache gets close to full next time, can >> you take a metadump of the filesystem (obfuscates names and contains >> no data) and then trigger the cache cleanup function? If the >> filesystem falls over, I'd be very interested in getting a copy of >> hte metadump image and trying to reproduce the problem locally. >> (BTW, you'll need a newer xfsprogs to get xfs_metadump). > > could you please tell me the exact command to run > when this happen again? xfs_metadump /dev/hda8 /path/to/the/image/you/are/creating will make a metadata image of the on device hda8 and store it in the filename given on the 2nd argument. The idea is to catch the metadata state shortly before the cache cleanup triggers; this might lead to a reproducible testcase (sgi guys could then restore the metadata image, simulate the cache cleanup, see what happens). Thanks, -Eric >> Still, thank you for the information > > no problem: 2.6.25 is a bit unlucky for me :-(( > > > > From owner-xfs@oss.sgi.com Tue May 6 09:10:55 2008 Received: with ECARTIS (v1.0.0; list xfs); Tue, 06 May 2008 09:11: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_43 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 m46GAqKJ030176 for ; Tue, 6 May 2008 09:10:55 -0700 X-ASG-Debug-ID: 1210090289-3dee024c0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from dubiel.endor.pl (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 4F53B164EBBD for ; Tue, 6 May 2008 09:11:30 -0700 (PDT) Received: from dubiel.endor.pl (mail.dubiel.pl [91.194.228.21]) by cuda.sgi.com with ESMTP id vkT6UGnIFAHblxg4 for ; Tue, 06 May 2008 09:11:30 -0700 (PDT) Received: (qmail 4739 invoked by uid 89); 6 May 2008 16:11:28 -0000 Received: from unknown (HELO orion) (postmaster@dubielvitrum.pl@83.12.36.210) by 0 with ESMTPA; 6 May 2008 16:11:28 -0000 Received: from [192.168.18.34] (ident=leszek) by orion with esmtpsa (TLS-1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.63) (envelope-from ) id 1JtPlI-0006Dp-0T for xfs@oss.sgi.com; Tue, 06 May 2008 18:11:28 +0200 Message-ID: <4820832B.3070903@dubielvitrum.pl> Date: Tue, 06 May 2008 18:11:23 +0200 From: Leszek Dubiel User-Agent: IceDove 1.5.0.14pre (X11/20080305) MIME-Version: 1.0 To: xfs@oss.sgi.com X-ASG-Orig-Subj: XFS for lots of small files Subject: XFS for lots of small files Content-Type: text/plain; charset=ISO-8859-2; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail.dubiel.pl[91.194.228.21] X-Barracuda-Start-Time: 1210090294 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0627 1.0000 -1.6205 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.62 X-Barracuda-Spam-Status: No, SCORE=-1.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.49761 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: 15805 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: Leszek.Dubiel@dubielvitrum.pl Precedence: bulk X-list: xfs Hello! I consider moving server from reiserfs to xfs. In all benchmarks I have read both file systems have had comparable results. But I've made a test: 1. formated /dev/hda2 with reiserfs with default options and made 10.000 files 2. formated /dev/hda2 with xfs with default options and made 10.000 Reiserfs created those files in 2 (two) seconds, and xfs created them in 35 (thirty five) seconds. Is that normal? What I am doing wrong? My system is Debian, current stable version. Below is a log of operation. Thanks in advance. debian:/mnt/hdc2# mkfs.xfs /dev/hdc2 -f; mount /dev/hdc2 /mnt/hdc2; cd /mnt/hdc2; mount | egrep hdc2 meta-data=/dev/hdc2 isize=256 agcount=16, agsize=1220688 blks = sectsz=512 attr=0 data = bsize=4096 blocks=19531008, imaxpct=25 = sunit=0 swidth=0 blks, unwritten=1 naming =version 2 bsize=4096 log =internal log bsize=4096 blocks=9536, version=1 = sectsz=512 sunit=0 blks realtime =none extsz=65536 blocks=0, rtextents=0 /dev/hdc2 on /mnt/hdc2 type xfs (rw) debian:/mnt/hdc2# time for f in `seq 9999`; do echo $f > $f; done real 0m35.558s user 0m0.256s sys 0m1.080s debian:/mnt/hdc2# time cat * | wc -l 9999 real 0m0.239s user 0m0.020s sys 0m0.172s debian:/mnt/hdc2# cd /; umount /dev/hdc2; mkreiserfs /dev/hdc2 -f; mount /dev/hdc2 /mnt/hdc2; cd /mnt/hdc2; mount | egrep hdc2 mkreiserfs 3.6.19 (2003 www.namesys.com) [...] ReiserFS is successfully created on /dev/hdc2. /dev/hdc2 on /mnt/hdc2 type reiserfs (rw) debian:/mnt/hdc2# time for f in `seq 9999`; do echo $f > $f; done real 0m1.075s user 0m0.232s sys 0m0.844s debian:/mnt/hdc2# time cat * | wc -l 9999 real 0m0.257s user 0m0.028s sys 0m0.256s debian:/mnt/hdc2# exit From owner-xfs@oss.sgi.com Tue May 6 09:22:50 2008 Received: with ECARTIS (v1.0.0; list xfs); Tue, 06 May 2008 09:23: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.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 m46GMjK0031461 for ; Tue, 6 May 2008 09:22:50 -0700 X-ASG-Debug-ID: 1210091009-3bd4018b0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from relay-dm.club-internet.fr (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id E4972132D7B for ; Tue, 6 May 2008 09:23:30 -0700 (PDT) Received: from relay-dm.club-internet.fr (relay-dm.club-internet.fr [194.158.104.222]) by cuda.sgi.com with ESMTP id Clye0ICvNM2duYOD for ; Tue, 06 May 2008 09:23:30 -0700 (PDT) Received: from petole.dyndns.org (i05m-87-90-240-206.d4.club-internet.fr [87.90.240.206]) by relay-dm.club-internet.fr (Postfix) with ESMTP id 5FE7825619 for ; Tue, 6 May 2008 18:23:28 +0200 (CEST) Received: from petole.dyndns.org (petole.dyndns.org [192.168.2.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by petole.dyndns.org (Postfix) with ESMTP id 452C9BF02 for ; Tue, 6 May 2008 18:23:28 +0200 (CEST) Date: Tue, 6 May 2008 18:23:28 +0200 From: Nicolas KOWALSKI To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: XFS for lots of small files Subject: Re: XFS for lots of small files In-Reply-To: <4820832B.3070903@dubielvitrum.pl> Message-ID: References: <4820832B.3070903@dubielvitrum.pl> User-Agent: Alpine 1.10 (DEB 962 2008-03-14) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Barracuda-Connect: relay-dm.club-internet.fr[194.158.104.222] X-Barracuda-Start-Time: 1210091010 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.49761 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: 15806 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: niko@petole.dyndns.org Precedence: bulk X-list: xfs On Tue, 6 May 2008, Leszek Dubiel wrote: > Hello! Hello, > Is that normal? What I am doing wrong? For metadata intensive work, you should consider a little bit of tuning. See this usefull advice: http://thread.gmane.org/gmane.comp.file-systems.xfs.general/21239/focus=21240 -- Nicolas From owner-xfs@oss.sgi.com Tue May 6 11:54:59 2008 Received: with ECARTIS (v1.0.0; list xfs); Tue, 06 May 2008 11:55: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.5 required=5.0 tests=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 m46IsvDU009169 for ; Tue, 6 May 2008 11:54:59 -0700 X-ASG-Debug-ID: 1210100140-2f4100e80000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.lichtvoll.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 12E98B1C9E9 for ; Tue, 6 May 2008 11:55:40 -0700 (PDT) Received: from mail.lichtvoll.de (mondschein.lichtvoll.de [194.150.191.11]) by cuda.sgi.com with ESMTP id ajozqk36i7hrfzEb for ; Tue, 06 May 2008 11:55:40 -0700 (PDT) Received: from [10.0.0.21] (e179178177.adsl.alicedsl.de [85.179.178.177]) by mail.lichtvoll.de (Postfix) with ESMTP id 88F735AE2C for ; Tue, 6 May 2008 20:54:21 +0200 (CEST) From: Martin Steigerwald To: linux-xfs@oss.sgi.com X-ASG-Orig-Subj: Re: XFS for lots of small files Subject: Re: XFS for lots of small files Date: Tue, 6 May 2008 20:55:36 +0200 User-Agent: KMail/1.9.9 References: <4820832B.3070903@dubielvitrum.pl> (sfid-20080506_185726_779300_46423265) In-Reply-To: <4820832B.3070903@dubielvitrum.pl> MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-2" Content-Transfer-Encoding: 7bit Content-Disposition: inline Message-Id: <200805062055.36755.Martin@lichtvoll.de> X-Barracuda-Connect: mondschein.lichtvoll.de[194.150.191.11] X-Barracuda-Start-Time: 1210100142 X-Barracuda-Bayes: INNOCENT GLOBAL 0.4685 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.49761 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: 15807 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: Martin@lichtvoll.de Precedence: bulk X-list: xfs Am Dienstag 06 Mai 2008 schrieb Leszek Dubiel: > Hello! Hi Leszek, > I consider moving server from reiserfs to xfs. In all benchmarks I have > read both file systems have had comparable results. > > But I've made a test: > > 1. formated /dev/hda2 with reiserfs with default options and made > 10.000 files > 2. formated /dev/hda2 with xfs with default options and made 10.000 > > Reiserfs created those files in 2 (two) seconds, and xfs created them > in 35 (thirty five) seconds. > > Is that normal? What I am doing wrong? > > My system is Debian, current stable version. Below is a log of > operation. > > > Thanks in advance. [...] > debian:/mnt/hdc2# time for f in `seq 9999`; do echo $f > $f; done > > real 0m35.558s > user 0m0.256s > sys 0m1.080s > > debian:/mnt/hdc2# time cat * | wc -l > 9999 > > real 0m0.239s > user 0m0.020s > sys 0m0.172s I get martin@shambala:~/Zeit/filetest -> rm *; sync ; time for ((I=1; I<=10000; I=I+1)); do echo $I > $I; done real 0m10.642s user 0m0.907s sys 0m1.713s martin@shambala:~/Zeit/filetest -> sync ; time cat * >/dev/null real 0m0.238s user 0m0.087s sys 0m0.153s martin@shambala:~/Zeit/filetest -> sync ; time cat * | wc -l 10000 real 0m0.375s user 0m0.120s sys 0m0.247s martin@shambala:~/Zeit/filetest -> sync ; time rm * real 0m7.600s user 0m0.113s sys 0m1.377s for XFS with optimized settings... shambala> xfs_info /home meta-data=/dev/sda5 isize=256 agcount=6, agsize=4883256 blks = sectsz=512 attr=2 data = bsize=4096 blocks=29299536, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 log =internal bsize=4096 blocks=32768, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 agcount is two more than would be optimal cause I growed the partition once. shambala> mount | grep home /dev/sda5 on /home type xfs (rw,relatime,logbsize=256k,logbufs=8) This is on a ThinkPad T42 internal laptop 160 GB harddisk drive with I think 5400rpm. Partition I tested on was not empty at that time and is heavily used. shambala> LANG=EN df -h /home Filesystem Size Used Avail Use% Mounted on /dev/sda5 112G 84G 29G 75% /home And there is quite some fragmentation on it: xfs_db> frag actual 653519, ideal 587066, fragmentation factor 10.17% I do not have free space in my playground LVM to test against ext3 and reiserfs at the moment. Ciao, -- Martin 'Helios' Steigerwald - http://www.Lichtvoll.de GPG: 03B0 0D6C 0040 0710 4AFA B82F 991B EAAC A599 84C7 From owner-xfs@oss.sgi.com Tue May 6 14:21:22 2008 Received: with ECARTIS (v1.0.0; list xfs); Tue, 06 May 2008 14:21: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=-1.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 m46LLGIr025063 for ; Tue, 6 May 2008 14:21:22 -0700 X-ASG-Debug-ID: 1210108919-3acc01cc0000-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 E832616513AF for ; Tue, 6 May 2008 14:22:00 -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 Y48tkLKCedjasZ66 for ; Tue, 06 May 2008 14:22:00 -0700 (PDT) Received: from agami.com (mail [192.168.168.5]) by ext.agami.com (8.12.5/8.12.5) with ESMTP id m46LLYww008265 for ; Tue, 6 May 2008 14:21:34 -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 m46LLYiA023790 for ; Tue, 6 May 2008 14:21:34 -0700 Received: from goldfinger.agami.com ([10.123.4.142]) by mx1.agami.com with Microsoft SMTPSVC(6.0.3790.1830); Tue, 6 May 2008 14:21:57 -0700 Message-ID: <4820CBF5.8090206@agami.com> Date: Tue, 06 May 2008 14:21:57 -0700 From: Michael Nishimoto User-Agent: Thunderbird 2.0.0.12 (X11/20080229) MIME-Version: 1.0 To: David Chinner CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: question about xfs_alloc_fix_freelist() Subject: Re: question about xfs_alloc_fix_freelist() References: <20080504235048.GC155679365@sgi.com> In-Reply-To: <20080504235048.GC155679365@sgi.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 06 May 2008 21:21:57.0454 (UTC) FILETIME=[36E34EE0:01C8AFBF] X-Barracuda-Connect: 64.221.212.177.ptr.us.xo.net[64.221.212.177] X-Barracuda-Start-Time: 1210108921 X-Barracuda-Bayes: INNOCENT GLOBAL 0.3311 1.0000 -0.2223 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -0.12 X-Barracuda-Spam-Status: No, SCORE=-0.12 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=RDNS_GENERIC_NO_PTR X-Barracuda-Spam-Report: Code version 3.1, rules version 3.1.49761 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 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: 15808 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 David Chinner wrote: > 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 I understood that the transaction abort code will free resources/locks when passing back an error. However, by returning args->agbp = NULL, aren't we telling the calling code that we have not satisfied the request in the current AG? I do see the part of about the AGF possibly getting modified. It would help to have a clear comment description of possible inputs vs. expected outputs for this function. :-) thanks, Michael From owner-xfs@oss.sgi.com Tue May 6 22:30:38 2008 Received: with ECARTIS (v1.0.0; list xfs); Tue, 06 May 2008 22:31: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 m475UY7F003494 for ; Tue, 6 May 2008 22:30:36 -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 PAA05763; Wed, 7 May 2008 15:31: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 m475VBsT159185683; Wed, 7 May 2008 15:31:12 +1000 (AEST) Received: (from dgc@localhost) by snort.melbourne.sgi.com (SGI-8.12.5/8.12.5/Submit) id m475V8Jp159109215; Wed, 7 May 2008 15:31:08 +1000 (AEST) X-Authentication-Warning: snort.melbourne.sgi.com: dgc set sender to dgc@sgi.com using -f Date: Wed, 7 May 2008 15:31:08 +1000 From: David Chinner To: Michael Nishimoto Cc: David Chinner , xfs@oss.sgi.com Subject: Re: question about xfs_alloc_fix_freelist() Message-ID: <20080507053108.GV103491721@sgi.com> References: <20080504235048.GC155679365@sgi.com> <4820CBF5.8090206@agami.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4820CBF5.8090206@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: 15809 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 02:21:57PM -0700, Michael Nishimoto wrote: > David Chinner wrote: > >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. > > I understood that the transaction abort code will free resources/locks > when passing back an error. However, by returning args->agbp = NULL, > aren't we telling the calling code that we have not satisfied the request > in the current AG? Yes. > I do see the part of about the AGF possibly getting modified. > > It would help to have a clear comment description of possible inputs vs. > expected outputs for this function. :-) Like a lot of code, not just XFS. :/ Cheers, Dave. -- Dave Chinner Principal Engineer SGI Australian Software Group From owner-xfs@oss.sgi.com Wed May 7 00:15:37 2008 Received: with ECARTIS (v1.0.0; list xfs); Wed, 07 May 2008 00:16: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=-1.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 m477FWTQ014163 for ; Wed, 7 May 2008 00:15:35 -0700 X-ASG-Debug-ID: 1210144575-44e000720000-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 F38481658392 for ; Wed, 7 May 2008 00:16:15 -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 jcKLRGGRLmlQI82X for ; Wed, 07 May 2008 00:16:15 -0700 (PDT) Received: from agami.com (mail [192.168.168.5]) by ext.agami.com (8.12.5/8.12.5) with ESMTP id m477Fqww025479 for ; Wed, 7 May 2008 00:15:52 -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 m477FqLi024685 for ; Wed, 7 May 2008 00:15:52 -0700 Received: from [127.0.0.1] ([10.123.1.239]) by mx1.agami.com with Microsoft SMTPSVC(6.0.3790.1830); Wed, 7 May 2008 00:16:14 -0700 Message-ID: <48215740.5050501@agami.com> Date: Wed, 07 May 2008 00:16:16 -0700 From: Michael Nishimoto User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.2) Gecko/20040804 Netscape/7.2 (ax) X-Accept-Language: en-us, en MIME-Version: 1.0 To: David Chinner CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: question about xfs_alloc_fix_freelist() Subject: Re: question about xfs_alloc_fix_freelist() References: <20080504235048.GC155679365@sgi.com> <4820CBF5.8090206@agami.com> <20080507053108.GV103491721@sgi.com> In-Reply-To: <20080507053108.GV103491721@sgi.com> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 07 May 2008 07:16:14.0995 (UTC) FILETIME=[3C704630:01C8B012] X-Barracuda-Connect: 64.221.212.177.ptr.us.xo.net[64.221.212.177] X-Barracuda-Start-Time: 1210144577 X-Barracuda-Bayes: INNOCENT GLOBAL 0.2958 1.0000 -0.3662 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -0.27 X-Barracuda-Spam-Status: No, SCORE=-0.27 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=RDNS_GENERIC_NO_PTR X-Barracuda-Spam-Report: Code version 3.1, rules version 3.1.49762 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 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: 15810 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 David Chinner wrote: > On Tue, May 06, 2008 at 02:21:57PM -0700, Michael Nishimoto wrote: > > David Chinner wrote: > > >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. > > > > I understood that the transaction abort code will free resources/locks > > when passing back an error. However, by returning args->agbp = NULL, > > aren't we telling the calling code that we have not satisfied the request > > in the current AG? > > Yes. If this happens and the calling function decides to choose another AG, is there a possibility of using up the entire transaction log reservation? Couldn't we end up affecting freelists in multiple AGs with the same transaction? > > > I do see the part of about the AGF possibly getting modified. > > > > It would help to have a clear comment description of possible inputs vs. > > expected outputs for this function. :-) > > Like a lot of code, not just XFS. :/\ > > Cheers, > > Dave. > -- > Dave Chinner > Principal Engineer > SGI Australian Software Group > From owner-xfs@oss.sgi.com Wed May 7 01:43:59 2008 Received: with ECARTIS (v1.0.0; list xfs); Wed, 07 May 2008 01:44: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.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 m478hsGw026303 for ; Wed, 7 May 2008 01:43:56 -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 SAA10317; Wed, 7 May 2008 18:44:27 +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 m478iPsT149281399; Wed, 7 May 2008 18:44:26 +1000 (AEST) Received: (from dgc@localhost) by snort.melbourne.sgi.com (SGI-8.12.5/8.12.5/Submit) id m478iLBw159216936; Wed, 7 May 2008 18:44:21 +1000 (AEST) X-Authentication-Warning: snort.melbourne.sgi.com: dgc set sender to dgc@sgi.com using -f Date: Wed, 7 May 2008 18:44:21 +1000 From: David Chinner To: Michael Nishimoto Cc: David Chinner , xfs@oss.sgi.com Subject: Re: question about xfs_alloc_fix_freelist() Message-ID: <20080507084421.GY103491721@sgi.com> References: <20080504235048.GC155679365@sgi.com> <4820CBF5.8090206@agami.com> <20080507053108.GV103491721@sgi.com> <48215740.5050501@agami.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <48215740.5050501@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: 15811 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 Wed, May 07, 2008 at 12:16:16AM -0700, Michael Nishimoto wrote: > David Chinner wrote: > >On Tue, May 06, 2008 at 02:21:57PM -0700, Michael Nishimoto wrote: > > > David Chinner wrote: > > > >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: ..... > > > > > 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. > > > > > > I understood that the transaction abort code will free resources/locks > > > when passing back an error. However, by returning args->agbp = NULL, > > > aren't we telling the calling code that we have not satisfied the request > > > in the current AG? > > > >Yes. > > If this happens and the calling function decides to choose another AG, is > there a possibility of using up the entire transaction log reservation? Yes, it could, but remember that if the calling code is obeying the rules then the AG will be considered ENOSPC before we try to touch the AGFL. i.e. this case will never happen if the code is correct. As it turns out, the recent fix I made for a long standing shutdown at ENOSPC during inode create was a result of the inode creation code not following the rules correctly - making it follows the rules meant it the early checks in xfs_alloc_fix_freelist() prevented the piece of code you pointed out dirtying the AGF/AGFL and then ENOSPCing in the AG. See: http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=75de2a91c98a6f486f261c1367fe59f5583e15a3 > Couldn't we end up affecting freelists in multiple AGs with the same > transaction? Yes and that is a bug if we don't actually end up allocating out of those AGs. However, in almost cases it is not a fatal bug and the code reflects that.... Cheers, Dave. -- Dave Chinner Principal Engineer SGI Australian Software Group From owner-xfs@oss.sgi.com Wed May 7 01:47:38 2008 Received: with ECARTIS (v1.0.0; list xfs); Wed, 07 May 2008 01:47:55 -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 m478lYZW026899 for ; Wed, 7 May 2008 01:47:38 -0700 X-ASG-Debug-ID: 1210150095-29e402550000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bay0-omc2-s24.bay0.hotmail.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 045EBB262D1 for ; Wed, 7 May 2008 01:48:15 -0700 (PDT) Received: from bay0-omc2-s24.bay0.hotmail.com (bay0-omc2-s24.bay0.hotmail.com [65.54.246.160]) by cuda.sgi.com with ESMTP id oj8GmTt2kspOQsxJ for ; Wed, 07 May 2008 01:48:15 -0700 (PDT) Received: from hotmail.com ([65.54.174.84]) by bay0-omc2-s24.bay0.hotmail.com with Microsoft SMTPSVC(6.0.3790.3959); Wed, 7 May 2008 01:48:16 -0700 Received: from mail pickup service by hotmail.com with Microsoft SMTPSVC; Wed, 7 May 2008 01:48:15 -0700 Message-ID: Received: from 85.32.103.134 by BAY103-DAV12.phx.gbl with DAV; Wed, 07 May 2008 08:48:11 +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> <20080506085632.GT155679365@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: Wed, 7 May 2008 10:45:44 +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: 07 May 2008 08:48:15.0286 (UTC) FILETIME=[16C9D560:01C8B01F] X-Barracuda-Connect: bay0-omc2-s24.bay0.hotmail.com[65.54.246.160] X-Barracuda-Start-Time: 1210150096 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.49762 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: 15812 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 just few minutes ago another error. However this time no xfs crash (I have taken an xfs_metadump and then I have run xfs_repair no errors detected), but squid was unable to clean cache: 2008/05/07 09:21:05| diskHandleWrite: FD 120: disk write error: (28) No space left on device 2008/05/07 09:21:05| storeUfsWriteDone: got failure (-6) 2008/05/07 09:21:05| storeSwapOutFileClosed: dirno 0, swapfile 00012D2D, errflag=-6 (28) No space left on device 2008/05/07 09:21:05| WARNING: Shrinking cache_dir #0 to 1183828 KB 2008/05/07 09:21:06| commSetEvents: epoll_ctl(EPOLL_CTL_ADD): failed on fd=125: (1) Operation not permitted 2008/05/07 09:21:06| diskHandleWrite: FD 120: disk write error: (28) No space left on device 2008/05/07 09:21:06| storeUfsWriteDone: got failure (-6) 2008/05/07 09:21:06| storeSwapOutFileClosed: dirno 0, swapfile 00012D2E, errflag=-6 (28) No space left on device 2008/05/07 09:21:06| commSetEvents: epoll_ctl(EPOLL_CTL_ADD): failed on fd=117: (1) Operation not permitted 2008/05/07 09:21:06| commSetEvents: epoll_ctl(EPOLL_CTL_ADD): failed on fd=108: (1) Operation not permitted 2008/05/07 09:44:28| commSetEvents: epoll_ctl(EPOLL_CTL_ADD): failed on fd=155: (1) Operation not permitted 2008/05/07 09:44:48| commSetEvents: epoll_ctl(EPOLL_CTL_ADD): failed on fd=89: (1) Operation not permitted 2008/05/07 09:44:56| diskHandleWrite: FD 73: disk write error: (28) No space left on device 2008/05/07 09:44:56| storeUfsWriteDone: got failure (-6) 2008/05/07 09:44:56| storeSwapOutFileClosed: dirno 0, swapfile 0001377E, errflag=-6 (28) No space left on device 2008/05/07 09:44:56| WARNING: Shrinking cache_dir #0 to 1065440 KB 2008/05/07 09:44:56| diskHandleWrite: FD 73: disk write error: (28) No space left on device 2008/05/07 09:44:56| storeUfsWriteDone: got failure (-6) 2008/05/07 09:44:56| storeSwapOutFileClosed: dirno 0, swapfile 0001377F, errflag=-6 (28) No space left on device 2008/05/07 09:44:56| diskHandleWrite: FD 73: disk write error: (28) No space left on device 2008/05/07 09:44:56| storeUfsWriteDone: got failure (-6) 2008/05/07 09:44:56| storeSwapOutFileClosed: dirno 0, swapfile 00013780, errflag=-6 (28) No space left on device 2008/05/07 09:44:56| diskHandleWrite: FD 73: disk write error: (28) No space left on device 2008/05/07 09:44:56| storeUfsWriteDone: got failure (-6) 2008/05/07 09:44:56| storeSwapOutFileClosed: dirno 0, swapfile 00013781, errflag=-6 (28) No space left on device 2008/05/07 10:36:49| commSetEvents: epoll_ctl(EPOLL_CTL_ADD): failed on fd=162: (1) Operation not permitted 2008/05/07 10:37:00| commSetEvents: epoll_ctl(EPOLL_CTL_ADD): failed on fd=123: (1) Operation not permitted 2008/05/07 10:37:00| commSetEvents: epoll_ctl(EPOLL_CTL_ADD): failed on fd=104: (1) Operation not permitted 2008/05/07 10:37:10| diskHandleWrite: FD 189: disk write error: (28) No space left on device 2008/05/07 10:37:10| storeUfsWriteDone: got failure (-6) 2008/05/07 10:37:10| storeSwapOutFileClosed: dirno 0, swapfile 00000C53, errflag=-6 (28) No space left on device 2008/05/07 10:37:10| WARNING: Shrinking cache_dir #0 to 1017288 KB 2008/05/07 10:37:10| diskHandleWrite: FD 189: disk write error: (28) No space left on device 2008/05/07 10:37:10| storeUfsWriteDone: got failure (-6) 2008/05/07 10:37:10| storeSwapOutFileClosed: dirno 0, swapfile 00000C54, errflag=-6 (28) No space left on device 2008/05/07 10:37:10| diskHandleWrite: FD 88: disk write error: (28) No space left on device 2008/05/07 10:37:10| storeUfsWriteDone: got failure (-6) 2008/05/07 10:37:10| storeSwapOutFileClosed: dirno 0, swapfile 00000C55, errflag=-6 (28) No space left on device May 7 09:44:57 Pleiadi kernel: printk: 103 messages suppressed. May 7 09:44:57 Pleiadi kernel: swapper: page allocation failure. order:3, mode:0x4020 May 7 09:44:57 Pleiadi kernel: Pid: 0, comm: swapper Not tainted 2.6.25 #1 May 7 09:44:57 Pleiadi kernel: [] __alloc_pages+0x30e/0x360 May 7 09:44:57 Pleiadi kernel: [] allocate_slab+0x35/0x90 May 7 09:44:57 Pleiadi kernel: [] new_slab+0x20/0x120 May 7 09:44:57 Pleiadi kernel: [] __slab_alloc+0xac/0x160 May 7 09:44:57 Pleiadi kernel: [] boomerang_rx+0x210/0x430 [3c59x] May 7 09:44:57 Pleiadi kernel: [] __kmalloc_track_caller+0xee/0x100 May 7 09:44:57 Pleiadi kernel: [] boomerang_rx+0x210/0x430 [3c59x] May 7 09:44:57 Pleiadi kernel: [] __alloc_skb+0x54/0x110 May 7 09:44:57 Pleiadi kernel: [] boomerang_rx+0x210/0x430 [3c59x] May 7 09:44:57 Pleiadi kernel: [] __update_rq_clock+0x23/0x120 May 7 09:44:57 Pleiadi kernel: [] boomerang_interrupt+0x11b/0x3c0 [3c59x] May 7 09:44:57 Pleiadi kernel: [] neigh_periodic_timer+0x0/0x120 May 7 09:44:57 Pleiadi kernel: [] run_timer_softirq+0x93/0x150 May 7 09:44:57 Pleiadi kernel: [] handle_IRQ_event+0x25/0x60 May 7 09:44:57 Pleiadi kernel: [] handle_level_irq+0x47/0xa0 May 7 09:44:57 Pleiadi kernel: [] do_IRQ+0x3c/0x70 May 7 09:44:57 Pleiadi kernel: [] common_interrupt+0x23/0x28 May 7 09:44:57 Pleiadi kernel: [] signal_wake_up+0x10/0x20 May 7 09:44:57 Pleiadi kernel: [] default_idle+0x39/0x70 May 7 09:44:57 Pleiadi kernel: [] default_idle+0x0/0x70 May 7 09:44:57 Pleiadi kernel: [] cpu_idle+0x26/0x60 May 7 09:44:57 Pleiadi kernel: ======================= May 7 09:44:57 Pleiadi kernel: Mem-info: May 7 09:44:57 Pleiadi kernel: DMA per-cpu: May 7 09:44:57 Pleiadi kernel: CPU 0: hi: 0, btch: 1 usd: 0 May 7 09:44:57 Pleiadi kernel: Normal per-cpu: May 7 09:44:57 Pleiadi kernel: CPU 0: hi: 42, btch: 7 usd: 20 May 7 09:44:57 Pleiadi kernel: Active:28761 inactive:6843 dirty:46 writeback:0 unstable:0 May 7 09:44:57 Pleiadi kernel: free:734 slab:2275 mapped:384 pagetables:300 bounce:0 May 7 09:44:57 Pleiadi kernel: DMA free:780kB min:160kB low:200kB high:240kB active:5928kB inactive:4988kB present:16256kB pages_scanned:0 all_unreclaimable? no May 7 09:44:57 Pleiadi kernel: lowmem_reserve[]: 0 142 142 May 7 09:44:57 Pleiadi kernel: Normal free:2156kB min:1448kB low:1808kB high:2172kB active:109116kB inactive:22384kB present:146304kB pages_scanned:43 all_unreclaimable? no May 7 09:44:57 Pleiadi kernel: lowmem_reserve[]: 0 0 0 May 7 09:44:57 Pleiadi kernel: DMA: 165*4kB 9*8kB 1*16kB 1*32kB 0*64kB 0*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 780kB May 7 09:44:57 Pleiadi kernel: Normal: 441*4kB 17*8kB 10*16kB 1*32kB 1*64kB 0*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 2156kB May 7 09:44:57 Pleiadi kernel: 7028 total pagecache pages May 7 09:44:57 Pleiadi kernel: Swap cache: add 3187137, delete 3181047, find 266145/761335 May 7 09:44:57 Pleiadi kernel: Free swap = 109020kB May 7 09:44:57 Pleiadi kernel: Total swap = 151160kB May 7 09:44:57 Pleiadi kernel: Free swap: 109020kB May 7 09:44:57 Pleiadi kernel: 40960 pages of RAM May 7 09:44:57 Pleiadi kernel: 0 pages of HIGHMEM May 7 09:44:57 Pleiadi kernel: 1202 reserved pages May 7 09:44:57 Pleiadi kernel: 3469 pages shared May 7 09:44:57 Pleiadi kernel: 6090 pages swap cached May 7 09:44:57 Pleiadi kernel: 46 pages dirty May 7 09:44:57 Pleiadi kernel: 0 pages writeback May 7 09:44:57 Pleiadi kernel: 384 pages mapped May 7 09:44:57 Pleiadi kernel: 2275 pages slab May 7 09:44:57 Pleiadi kernel: 300 pages pagetables May 7 09:44:57 Pleiadi kernel: swapper: page allocation failure. order:3, mode:0x4020 May 7 09:44:57 Pleiadi kernel: Pid: 0, comm: swapper Not tainted 2.6.25 #1 May 7 09:44:57 Pleiadi kernel: [] __alloc_pages+0x30e/0x360 May 7 09:44:57 Pleiadi kernel: [] allocate_slab+0x35/0x90 May 7 09:44:57 Pleiadi kernel: [] boomerang_rx+0x210/0x430 [3c59x] May 7 09:44:57 Pleiadi kernel: [] new_slab+0x20/0x120 May 7 09:44:57 Pleiadi kernel: [] boomerang_rx+0x210/0x430 [3c59x] May 7 09:44:57 Pleiadi kernel: [] __slab_alloc+0xac/0x160 May 7 09:44:57 Pleiadi kernel: [] boomerang_rx+0x210/0x430 [3c59x] May 7 09:44:57 Pleiadi kernel: [] __kmalloc_track_caller+0xee/0x100 May 7 09:44:57 Pleiadi kernel: [] boomerang_rx+0x210/0x430 [3c59x] May 7 09:44:57 Pleiadi kernel: [] __alloc_skb+0x54/0x110 May 7 09:44:57 Pleiadi kernel: [] boomerang_rx+0x210/0x430 [3c59x] May 7 09:44:57 Pleiadi kernel: [] __update_rq_clock+0x23/0x120 May 7 09:44:57 Pleiadi kernel: [] boomerang_interrupt+0x11b/0x3c0 [3c59x] May 7 09:44:57 Pleiadi kernel: [] neigh_periodic_timer+0x0/0x120 May 7 09:44:57 Pleiadi kernel: [] run_timer_softirq+0x93/0x150 May 7 09:44:57 Pleiadi kernel: [] handle_IRQ_event+0x25/0x60 May 7 09:44:57 Pleiadi kernel: [] handle_level_irq+0x47/0xa0 May 7 09:44:57 Pleiadi kernel: [] do_IRQ+0x3c/0x70 May 7 09:44:57 Pleiadi kernel: [] common_interrupt+0x23/0x28 May 7 09:44:57 Pleiadi kernel: [] signal_wake_up+0x10/0x20 May 7 09:44:57 Pleiadi kernel: [] default_idle+0x39/0x70 May 7 09:44:57 Pleiadi kernel: [] default_idle+0x0/0x70 May 7 09:44:57 Pleiadi kernel: [] cpu_idle+0x26/0x60 May 7 09:44:57 Pleiadi kernel: ======================= May 7 09:44:57 Pleiadi kernel: Mem-info: May 7 09:44:57 Pleiadi kernel: DMA per-cpu: May 7 09:44:57 Pleiadi kernel: CPU 0: hi: 0, btch: 1 usd: 0 May 7 09:44:57 Pleiadi kernel: Normal per-cpu: May 7 09:44:57 Pleiadi kernel: CPU 0: hi: 42, btch: 7 usd: 19 May 7 09:44:57 Pleiadi kernel: Active:28761 inactive:6843 dirty:46 writeback:0 unstable:0 May 7 09:44:57 Pleiadi kernel: free:734 slab:2275 mapped:384 pagetables:300 bounce:0 May 7 09:44:57 Pleiadi kernel: DMA free:780kB min:160kB low:200kB high:240kB active:5928kB inactive:4988kB present:16256kB pages_scanned:0 all_unreclaimable? no May 7 09:44:57 Pleiadi kernel: lowmem_reserve[]: 0 142 142 May 7 09:44:57 Pleiadi kernel: Normal free:2156kB min:1448kB low:1808kB high:2172kB active:109116kB inactive:22384kB present:146304kB pages_scanned:43 all_unreclaimable? no May 7 09:44:57 Pleiadi kernel: lowmem_reserve[]: 0 0 0 May 7 09:44:57 Pleiadi kernel: DMA: 165*4kB 9*8kB 1*16kB 1*32kB 0*64kB 0*128kB 0*256kB 0*512kB 0*10240/0x430 [3c59x] May 7 09:44:57 Pleiadi kernel: [] __kmalloc_track_caller+0xee/0x100 May 7 09:44:57 Pleiadi kernel: [] boomerang_rx+0x210/0x430 [3c59x] May 7 09:44:57 Pleiadi kernel: [] __alloc_skb+0x54/0x110 May 7 09:44:57 Pleiadi kernel: [] boomerang_rx+0x210/0x430 [3c59x] May 7 09:44:57 Pleiadi kernel: [] shrink_page_list+0x34c/0x430 May 7 09:44:57 Pleiadi kernel: [] __dequeue_entity+0x5a/0xb0 May 7 09:44:57 Pleiadi kernel: [] boomerang_interrupt+0x11b/0x3c0 [3c59x] May 7 09:44:57 Pleiadi kernel: [] handle_IRQ_event+0x25/0x60 May 7 09:44:57 Pleiadi kernel: [] handle_level_irq+0x47/0xa0 May 7 09:44:57 Pleiadi kernel: [] do_IRQ+0x3c/0x70 May 7 09:44:57 Pleiadi kernel: [] schedule_timeout+0x4f/0x90 May 7 09:44:57 Pleiadi kernel: [] common_interrupt+0x23/0x28 May 7 09:44:57 Pleiadi kernel: [] shrink_slab+0x14d/0x1b0 May 7 09:44:57 Pleiadi kernel: [] balance_pgdat+0x211/0x360 May 7 09:44:57 Pleiadi kernel: [] dequeue_task+0x15/0x30 May 7 09:44:57 Pleiadi kernel: [] isolate_pages_global+0x0/0x80 May 7 09:44:57 Pleiadi kernel: [] finish_wait+0x3/0x50 May 7 09:44:57 Pleiadi kernel: [] kswapd+0x89/0xc0 May 7 09:44:57 Pleiadi kernel: [] autoremove_wake_function+0x0/0x50 May 7 09:44:57 Pleiadi kernel: [] autoremove_wake_function+0x0/0x50 May 7 09:44:57 Pleiadi kernel: [] kswapd+0x0/0xc0 May 7 09:44:57 Pleiadi kernel: [] kthread+0x58/0xa0 May 7 09:44:57 Pleiadi kernel: [] kthread+0x0/0xa0 May 7 09:44:57 Pleiadi kernel: [] kernel_thread_helper+0x7/0x14 May 7 09:44:57 Pleiadi kernel: ======================= May 7 09:44:57 Pleiadi kernel: Mem-info: May 7 09:44:57 Pleiadi kernel: DMA per-cpu: May 7 09:44:57 Pleiadi kernel: CPU 0: hi: 0, btch: 1 usd: 0 May 7 09:44:57 Pleiadi kernel: Normal per-cpu: May 7 09:44:57 Pleiadi kernel: CPU 0: hi: 42, btch: 7 usd: 15 May 7 09:44:57 Pleiadi kernel: Active:28761 inactive:6844 dirty:46 writeback:0 unstable:0 May 7 09:44:57 Pleiadi kernel: free:734 slab:2275 mapped:384 pagetables:300 bounce:0 May 7 09:44:57 Pleiadi kernel: DMA free:780kB min:160kB low:200kB high:240kB active:5928kB inactive:4988kB present:16256kB pages_scanned:0 all_unreclaimable? no May 7 09:44:57 Pleiadi kernel: lowmem_reserve[]: 0 142 142 May 7 09:44:57 Pleiadi kernel: Normal free:2156kB min:1448kB low:1808kB high:2172kB active:109116kB inactive:22388kB present:146304kB pages_scanned:43 all_unreclaimable? no May 7 09:44:57 Pleiadi kernel: lowmem_reserve[]: 0 0 0 May 7 09:44:57 Pleiadi kernel: DMA: 165*4kB 9*8kB 1*16kB 1*32kB 0*64kB 0*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 780kB May 7 09:44:57 Pleiadi kernel: Normal: 441*4kB 17*8kB 10*16kB 1*32kB 1*64kB 0*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 2156kB May 7 09:44:57 Pleiadi kernel: 7029 total pagecache pages May 7 09:44:57 Pleiadi kernel: Swap cache: add 3187138, delete 3181047, find 266145/761336 May 7 09:44:57 Pleiadi kernel: Free swap = 109020kB May 7 09:44:57 Pleiadi kernel: Total swap = 151160kB May 7 09:44:57 Pleiadi kernel: Free swap: 109020kB May 7 09:44:57 Pleiadi kernel: 40960 pages of RAM May 7 09:44:57 Pleiadi kernel: 0 pages of HIGHMEM May 7 09:44:57 Pleiadi kernel: 1202 reserved pages May 7 09:44:57 Pleiadi kernel: 3468 pages shared May 7 09:44:57 Pleiadi kernel: 6091 pages swap cached May 7 09:44:57 Pleiadi kernel: 46 pages dirty May 7 09:44:57 Pleiadi kernel: 0 pages writeback May 7 09:44:57 Pleiadi kernel: 384 pages mapped May 7 09:44:57 Pleiadi kernel: 2275 pages slab May 7 09:44:57 Pleiadi kernel: 300 pages pagetables May 7 09:44:57 Pleiadi kernel: swapper: page allocation failure. order:3, mode:0x4020 May 7 09:44:57 Pleiadi kernel: Pid: 0, comm: swapper Not tainted 2.6.25 #1 May 7 09:44:57 Pleiadi kernel: [] __alloc_pages+0x30e/0x360 May 7 09:44:57 Pleiadi kernel: [] allocate_slab+0x35/0x90 May 7 09:44:57 Pleiadi kernel: [] new_slab+0x20/0x120 May 7 09:44:57 Pleiadi kernel: [] __slab_alloc+0xac/0x160 May 7 09:44:57 Pleiadi kernel: [] ip_forward_finish+0x19/0x30 May 7 09:44:57 Pleiadi kernel: [] boomerang_rx+0x210/0x430 [3c59x] May 7 09:44:57 Pleiadi kernel: [] __kmalloc_track_caller+0xee/0x100 May 7 09:44:57 Pleiadi kernel: [] boomerang_rx+0x210/0x430 [3c59x] May 7 09:44:57 Pleiadi kernel: [] __alloc_skb+0x54/0x110 May 7 09:44:57 Pleiadi kernel: [] boomerang_rx+0x210/0x430 [3c59x] May 7 09:44:57 Pleiadi kernel: [] ip_rcv+0x182/0x260 May 7 09:44:57 Pleiadi kernel: [] ip_rcv_finish+0x0/0x2e0 May 7 09:44:57 Pleiadi kernel: [] netif_receive_skb+0x20c/0x290 May 7 09:44:57 Pleiadi kernel: [] boomerang_interrupt+0x11b/0x3c0 [3c59x] May 7 09:44:57 Pleiadi kernel: [] handle_IRQ_event+0x25/0x60 May 7 09:44:58 Pleiadi kernel: [] handle_level_irq+0x47/0xa0 May 7 09:44:58 Pleiadi kernel: [] do_IRQ+0x3c/0x70 May 7 09:44:58 Pleiadi kernel: [] common_interrupt+0x23/0x28 May 7 09:44:58 Pleiadi kernel: [] signal_wake_up+0x10/0x20 May 7 09:44:58 Pleiadi kernel: [] default_idle+0x39/0x70 May 7 09:44:58 Pleiadi kernel: [] default_idle+0x0/0x70 May 7 09:44:58 Pleiadi kernel: [] cpu_idle+0x26/0x60 May 7 09:44:58 Pleiadi kernel: ======================= May 7 09:44:58 Pleiadi kernel: Mem-info: May 7 09:44:58 Pleiadi kernel: DMA per-cpu: May 7 09:44:58 Pleiadi kernel: CPU 0: hi: 0, btch: 1 usd: 0 May 7 09:44:58 Pleiadi kernel: Normal per-cpu: May 7 09:44:58 Pleiadi kernel: CPU 0: hi: 42, btch: 7 usd: 22 May 7 09:44:58 Pleiadi kernel: Active:28813 inactive:6785 dirty:46 writeback:0 unstable:0 May 7 09:44:58 Pleiadi kernel: free:734 slab:2275 mapped:384 pagetables:300 bounce:0 May 7 09:44:58 Pleiadi kernel: DMA free:780kB min:160kB low:200kB high:240kB active:5928kB inactive:4988kB present:16256kB pages_scanned:0 all_unreclaimable? no May 7 09:44:58 Pleiadi kernel: lowmem_reserve[]: 0 142 142 May 7 09:44:58 Pleiadi kernel: Normal free:2156kB min:1448kB low:1808kB high:2172kB active:109324kB inactive:22152kB present:146304kB pages_scanned:345 all_unreclaimable? no May 7 09:44:58 Pleiadi kernel: lowmem_reserve[]: 0 0 0 May 7 09:44:58 Pleiadi kernel: DMA: 165*4kB 9*8kB 1*16kB 1*32kB 0*64kB 0*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 780kB May 7 09:44:58 Pleiadi kernel: Normal: 441*4kB 17*8kB 10*16kB 1*32kB 1*64kB 0*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 2156kB May 7 09:44:58 Pleiadi kernel: 7021 total pagecache pages May 7 09:44:58 Pleiadi kernel: Swap cache: add 3187147, delete 3181064, find 266145/761338 May 7 09:44:58 Pleiadi kernel: Free swap = 109020kB May 7 09:44:58 Pleiadi kernel: Total swap = 151160kB May 7 09:44:58 Pleiadi kernel: Free swap: 109020kB May 7 09:44:58 Pleiadi kernel: 40960 pages of RAM May 7 09:44:58 Pleiadi kernel: 0 pages of HIGHMEM May 7 09:44:58 Pleiadi kernel: 1202 reserved pages May 7 09:44:58 Pleiadi kernel: 3468 pages shared May 7 09:44:58 Pleiadi kernel: 6083 pages swap cached May 7 09:44:58 Pleiadi kernel: 46 pages dirty May 7 09:44:58 Pleiadi kernel: 0 pages writeback May 7 09:44:58 Pleiadi kernel: 384 pages mapped May 7 09:44:58 Pleiadi kernel: 2275 pages slab May 7 09:44:58 Pleiadi kernel: 300 pages pagetables May 7 09:44:58 Pleiadi kernel: swapper: page allocation failure. order:3, mode:0x4020 May 7 09:44:58 Pleiadi kernel: Pid: 0, comm: swapper Not tainted 2.6.25 #1 May 7 09:44:58 Pleiadi kernel: [] __alloc_pages+0x30e/0x360 May 7 09:44:58 Pleiadi kernel: [] allocate_slab+0x35/0x90 May 7 09:44:58 Pleiadi kernel: [] new_slab+0x20/0x120 May 7 09:44:58 Pleiadi kernel: [] __slab_alloc+0xac/0x160 May 7 09:44:58 Pleiadi kernel: [] xfrm_lookup+0x1b/0x70 May 7 09:44:58 Pleiadi kernel: [] __kmalloc+0xf0/0x100 May 7 09:44:58 Pleiadi kernel: [] pskb_expand_head+0x50/0x170 May 7 09:44:58 Pleiadi kernel: [] pskb_expand_head+0x50/0x170 May 7 09:44:58 Pleiadi kernel: [] ip_forward+0x286/0x350 May 7 09:44:58 Pleiadi kernel: [] ip_rcv_finish+0xbf/0x2e0 May 7 09:44:58 Pleiadi kernel: [] nf_hook_slow+0x66/0x100 May 7 09:44:58 Pleiadi kernel: [] ip_rcv_finish+0x0/0x2e0 May 7 09:44:58 Pleiadi kernel: [] ip_rcv+0x182/0x260 May 7 09:44:58 Pleiadi kernel: [] ip_rcv_finish+0x0/0x2e0 May 7 09:44:58 Pleiadi kernel: [] netif_receive_skb+0x20c/0x290 May 7 09:44:58 Pleiadi kernel: [] process_backlog+0x67/0xc0 May 7 09:44:58 Pleiadi kernel: [] net_rx_action+0x63/0x130 May 7 09:44:58 Pleiadi kernel: [] __do_softirq+0x40/0xa0 May 7 09:44:58 Pleiadi kernel: [] do_softirq+0x26/0x30 May 7 09:44:58 Pleiadi kernel: [] do_IRQ+0x41/0x70 May 7 09:44:58 Pleiadi kernel: [] common_interrupt+0x23/0x28 May 7 09:44:58 Pleiadi kernel: [] signal_wake_up+0x10/0x20 May 7 09:44:58 Pleiadi kernel: [] default_idle+0x39/0x70 May 7 09:44:58 Pleiadi kernel: [] default_idle+0x0/0x70 May 7 09:44:58 Pleiadi kernel: [] cpu_idle+0x26/0x60 May 7 09:44:58 Pleiadi kernel: ======================= May 7 09:44:58 Pleiadi kernel: Mem-info: May 7 09:44:58 Pleiadi kernel: DMA per-cpu: May 7 09:44:58 Pleiadi kernel: CPU 0: hi: 0, btch: 1 usd: 0 May 7 09:44:58 Pleiadi kernel: Normal per-cpu: May 7 09:44:58 Pleiadi kernel: CPU 0: hi: 42, btch: 7 usd: 21 May 7 09:44:58 Pleiadi kernel: Active:28813 inactive:6785 dirty:46 writeback:0 unstable:0 May 7 09:44:58 Pleiadi kernel: free:734 slab:2275 mapped:384 pagetables:300 bounce:0 May 7 09:44:58 Pleiadi kernel: DMA free:780kB min:160kB low:200kB high:240kB active:5928kB inactive:4988kB present:16256kB pages_scanned:0 all_unreclaimable? no May 7 09:44:58 Pleiadi kernel: lowmem_reserve[]: 0 142 142 May 7 09:44:58 Pleiadi kernel: Normal free:2156kB min:1448kB low:1808kB high:2172kB active:109324kB inactive:22152kB present:146304kB pages_scanned:345 all_unreclaimable? no May 7 09:44:58 Pleiadi kernel: lowmem_reserve[]: 0 0 0 May 7 09:44:58 Pleiadi kernel: DMA: 165*4kB 9*8kB 1*16kB 1*32kB 0*64kB 0*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 780kB May 7 09:44:58 Pleiadi kernel: Normal: 441*4kB 17*8kB 10*16kB 1*32kB 1*64kB 0*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 2156kB May 7 09:44:58 Pleiadi kernel: 7021 total pagecache pages May 7 09:44:58 Pleiadi kernel: Swap cache: add 3187147, delete 3181064, find 266145/761338 May 7 09:44:58 Pleiadi kernel: Free swap = 109020kB May 7 09:44:58 Pleiadi kernel: Total swap = 151160kB May 7 09:44:58 Pleiadi kernel: Free swap: 109020kB May 7 09:44:58 Pleiadi kernel: 40960 pages of RAM May 7 09:44:58 Pleiadi kernel: 0 pages of HIGHMEM May 7 09:44:58 Pleiadi kernel: 1202 reserved pages May 7 09:44:58 Pleiadi kernel: 3468 pages shared May 7 09:44:58 Pleiadi kernel: 6083 pages swap cached May 7 09:44:58 Pleiadi kernel: 46 pages dirty May 7 09:44:58 Pleiadi kernel: 0 pages writeback May 7 09:44:58 Pleiadi kernel: 384 pages mapped May 7 09:44:58 Pleiadi kernel: 2275 pages slab May 7 09:44:58 Pleiadi kernel: 300 pages pagetables May 7 09:44:58 Pleiadi kernel: swapper: page allocation failure. order:3, mode:0x4020 May 7 09:44:58 Pleiadi kernel: Pid: 0, comm: swapper Not tainted 2.6.25 #1 May 7 09:44:58 Pleiadi kernel: [] __alloc_pages+0x30e/0x360 May 7 09:44:58 Pleiadi kernel: [] allocate_slab+0x35/0x90 May 7 09:44:58 Pleiadi kernel: [] boomerang_rx+0x210/0x430 [3c59x] May 7 09:44:58 Pleiadi kernel: [] new_slab+0x20/0x120 May 7 09:44:58 Pleiadi kernel: [] boomerang_rx+0x210/0x430 [3c59x] May 7 09:44:58 Pleiadi kernel: [] __slab_alloc+0xac/0x160 May 7 09:44:58 Pleiadi kernel: [] boomerang_rx+0x210/0x430 [3c59x] May 7 09:44:58 Pleiadi kernel: [] __kmalloc_track_caller+0xee/0x100 May 7 09:44:58 Pleiadi kernel: [] boomerang_rx+0x210/0x430 [3c59x] May 7 09:44:58 Pleiadi kernel: [] __alloc_skb+0x54/0x110 May 7 09:44:58 Pleiadi kernel: [] boomerang_rx+0x210/0x430 [3c59x] May 7 09:44:58 Pleiadi kernel: [] handle_IRQ_event+0x25/0x60 May 7 09:44:58 Pleiadi kernel: [] boomerang_interrupt+0x11b/0x3c0 [3c59x] May 7 09:44:58 Pleiadi kernel: [] handle_IRQ_event+0x25/0x60 May 7 09:44:58 Pleiadi kernel: [] handle_level_irq+0x47/0xa0 May 7 09:44:58 Pleiadi kernel: [] do_IRQ+0x3c/0x70 May 7 09:44:58 Pleiadi kernel: [] allocate_slab+0x35/0x90 May 7 09:44:58 Pleiadi kernel: [] common_interrupt+0x23/0x28 May 7 09:44:58 Pleiadi kernel: [] xfrm_spd_getinfo+0xb/0x50 May 7 09:44:58 Pleiadi kernel: [] __kmalloc+0x5c/0x100 May 7 09:44:58 Pleiadi kernel: [] pskb_expand_head+0x50/0x170 May 7 09:44:58 Pleiadi kernel: [] pskb_expand_head+0x50/0x170 May 7 09:44:58 Pleiadi kernel: [] ip_forward+0x286/0x350 May 7 09:44:58 Pleiadi kernel: [] ip_rcv_finish+0xbf/0x2e0 May 7 09:44:58 Pleiadi kernel: [] nf_hook_slow+0x66/0x100 May 7 09:44:58 Pleiadi kernel: [] ip_rcv_finish+0x0/0x2e0 May 7 09:44:58 Pleiadi kernel: [] ip_rcv+0x182/0x260 May 7 09:44:58 Pleiadi kernel: [] ip_rcv_finish+0x0/0x2e0 May 7 09:44:58 Pleiadi kernel: [] netif_receive_skb+0x20c/0x290 May 7 09:44:58 Pleiadi kernel: [] process_backlog+0x67/0xc0 May 7 09:44:58 Pleiadi kernel: [] net_rx_action+0x63/0x130 May 7 09:44:58 Pleiadi kernel: [] __do_softirq+0x40/0xa0 May 7 09:44:58 Pleiadi kernel: [] do_softirq+0x26/0x30 May 7 09:44:58 Pleiadi kernel: [] do_IRQ+0x41/0x70 May 7 09:44:58 Pleiadi kernel: [] common_interrupt+0x23/0x28 May 7 09:44:58 Pleiadi kernel: [] signal_wake_up+0x10/0x20 May 7 09:44:58 Pleiadi kernel: [] default_idle+0x39/0x70 May 7 09:44:58 Pleiadi kernel: [] default_idle+0x0/0x70 May 7 09:44:58 Pleiadi kernel: [] cpu_idle+0x26/0x60 May 7 09:44:58 Pleiadi kernel: ======================= May 7 09:44:58 Pleiadi kernel: Mem-info: May 7 09:44:58 Pleiadi kernel: DMA per-cpu: May 7 09:44:58 Pleiadi kernel: CPU 0: hi: 0, btch: 1 usd: 0 May 7 09:44:58 Pleiadi kernel: Normal per-cpu: May 7 09:44:58 Pleiadi kernel: CPU 0: hi: 42, btch: 7 usd: 20 May 7 09:44:58 Pleiadi kernel: Active:28813 inactive:6785 dirty:46 writeback:0 unstable:0 May 7 09:44:58 Pleiadi kernel: free:734 slab:2275 mapped:384 pagetables:300 bounce:0 May 7 09:44:58 Pleiadi kernel: DMA free:780kB min:160kB low:200kB high:240kB active:5928kB inactive:4988kB present:16256kB pages_scanned:0 all_unreclaimable? no May 7 09:44:58 Pleiadi kernel: lowmem_reserve[]: 0 142 142 May 7 09:44:58 Pleiadi kernel: Normal free:2156kB min:1448kB low:1808kB high:2172kB active:109324kB inactive:22152kB present:146304kB pages_scanned:345 all_unreclaimable? no May 7 09:44:58 Pleiadi kernel: lowmem_reserve[]: 0 0 0 May 7 09:44:58 Pleiadi kernel: DMA: 165*4kB 9*8kB 1*16kB 1*32kB 0*64kB 0*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 780kB May 7 09:44:58 Pleiadi kernel: Normal: 441*4kB 17*8kB 10*16kB 1*32kB 1*64kB 0*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 2156kB May 7 09:44:58 Pleiadi kernel: 7021 total pagecache pages May 7 09:44:58 Pleiadi kernel: Swap cache: add 3187147, delete 3181064, find 266145/761338 May 7 09:44:58 Pleiadi kernel: Free swap = 109020kB May 7 09:44:58 Pleiadi kernel: Total swap = 151160kB May 7 09:44:58 Pleiadi kernel: Free swap: 109020kB May 7 09:44:58 Pleiadi kernel: 40960 pages of RAM May 7 09:44:58 Pleiadi kernel: 0 pages of HIGHMEM May 7 09:44:58 Pleiadi kernel: 1202 reserved pages May 7 09:44:58 Pleiadi kernel: 3468 pages shared May 7 09:44:58 Pleiadi kernel: 6083 pages swap cached May 7 09:44:58 Pleiadi kernel: 46 pages dirty May 7 09:44:58 Pleiadi kernel: 0 pages writeback May 7 09:44:58 Pleiadi kernel: 384 pages mapped May 7 09:44:58 Pleiadi kernel: 2275 pages slab May 7 09:44:58 Pleiadi kernel: 300 pages pagetables May 7 09:44:58 Pleiadi kernel: swapper: page allocation failure. order:3, mode:0x4020 May 7 09:44:58 Pleiadi kernel: Pid: 0, comm: swapper Not tainted 2.6.25 #1 May 7 09:44:58 Pleiadi kernel: [] __alloc_pages+0x30e/0x360 May 7 09:44:58 Pleiadi kernel: [] allocate_slab+0x35/0x90 May 7 09:44:58 Pleiadi kernel: [] boomerang_rx+0x210/0x430 [3c59x] May 7 09:44:58 Pleiadi kernel: [] new_slab+0x20/0x120 May 7 09:44:58 Pleiadi kernel: [] boomerang_rx+0x210/0x430 [3c59x] May 7 09:44:58 Pleiadi kernel: [] __slab_alloc+0xac/0x160 May 7 09:44:58 Pleiadi kernel: [] boomerang_rx+0x210/0x430 [3c59x] May 7 09:44:58 Pleiadi kernel: [] __kmalloc_track_caller+0xee/0x100 May 7 09:44:58 Pleiadi kernel: [] boomerang_rx+0x210/0x430 [3c59x] May 7 09:44:58 Pleiadi kernel: [] __alloc_skb+0x54/0x110 May 7 09:44:58 Pleiadi kernel: [] boomerang_rx+0x210/0x430 [3c59x] May 7 09:44:58 Pleiadi kernel: [] __update_rq_clock+0x23/0x120 May 7 09:44:58 Pleiadi kernel: [] boomerang_interrupt+0x11b/0x3c0 [3c59x] May 7 09:44:58 Pleiadi kernel: [] profile_tick+0x4d/0x70 May 7 09:44:58 Pleiadi kernel: [] handle_IRQ_event+0x25/0x60 May 7 09:44:58 Pleiadi kernel: [] handle_level_irq+0x47/0xa0 May 7 09:44:58 Pleiadi kernel: [] do_IRQ+0x3c/0x70 May 7 09:44:58 Pleiadi kernel: [] allocate_slab+0x35/0x90 May 7 09:44:58 Pleiadi kernel: [] common_interrupt+0x23/0x28 May 7 09:44:58 Pleiadi kernel: [] __kmalloc_track_caller+0x5a/0x100 May 7 09:44:58 Pleiadi kernel: [] boomerang_rx+0x210/0x430 [3c59x] May 7 09:44:58 Pleiadi kernel: [] __alloc_skb+0x54/0x110 May 7 09:44:58 Pleiadi kernel: [] boomerang_rx+0x210/0x430 [3c59x] May 7 09:44:58 Pleiadi kernel: [] handle_IRQ_event+0x25/0x60 May 7 09:44:58 Pleiadi kernel: [] boomerang_interrupt+0x11b/0x3c0 [3c59x] May 7 09:44:58 Pleiadi kernel: [] handle_IRQ_event+0x25/0x60 May 7 09:44:58 Pleiadi kernel: [] handle_level_irq+0x47/0xa0 May 7 09:44:58 Pleiadi kernel: [] do_IRQ+0x3c/0x70 May 7 09:44:58 Pleiadi kernel: [] allocate_slab+0x35/0x90 May 7 09:44:58 Pleiadi kernel: [] common_interrupt+0x23/0x28 May 7 09:44:58 Pleiadi kernel: [] xfrm_spd_getinfo+0xb/0x50 May 7 09:44:58 Pleiadi kernel: [] __kmalloc+0x5c/0x100 May 7 09:44:58 Pleiadi kernel: [] pskb_expand_head+0x50/0x170 May 7 09:44:58 Pleiadi kernel: [] pskb_expand_head+0x50/0x170 May 7 09:44:58 Pleiadi kernel: [] ip_forward+0x286/0x350 May 7 09:44:58 Pleiadi kernel: [] ip_rcv_finish+0xbf/0x2e0 May 7 09:44:58 Pleiadi kernel: [] nf_hook_slow+0x66/0x100 May 7 09:44:58 Pleiadi kernel: [] ip_rcv_finish+0x0/0x2e0 May 7 09:44:58 Pleiadi kernel: [] ip_rcv+0x182/0x260 May 7 09:44:58 Pleiadi kernel: [] ip_rcv_finish+0x0/0x2e0 May 7 09:44:58 Pleiadi kernel: [] netif_receive_skb+0x20c/0x290 May 7 09:44:58 Pleiadi kernel: [] process_backlog+0x67/0xc0 May 7 09:44:58 Pleiadi kernel: [] net_rx_action+0x63/0x130 May 7 09:44:58 Pleiadi kernel: [] __do_softirq+0x40/0xa0 May 7 09:44:58 Pleiadi kernel: [] do_softirq+0x26/0x30 May 7 09:44:58 Pleiadi kernel: [] do_IRQ+0x41/0x70 May 7 09:44:58 Pleiadi kernel: [] common_interrupt+0x23/0x28 May 7 09:44:58 Pleiadi kernel: [] signal_wake_up+0x10/0x20 May 7 09:44:58 Pleiadi kernel: [] default_idle+0x39/0x70 May 7 09:44:58 Pleiadi kernel: [] default_idle+0x0/0x70 May 7 09:44:58 Pleiadi kernel: [] cpu_idle+0x26/0x60 May 7 09:44:58 Pleiadi kernel: ======================= May 7 09:44:58 Pleiadi kernel: Mem-info: May 7 09:44:58 Pleiadi kernel: DMA per-cpu: May 7 09:44:58 Pleiadi kernel: CPU 0: hi: 0, btch: 1 usd: 0 May 7 09:44:58 Pleiadi kernel: Normal per-cpu: May 7 09:44:58 Pleiadi kernel: CPU 0: hi: 42, btch: 7 usd: 19 May 7 09:44:58 Pleiadi kernel: Active:28813 inactive:6785 dirty:46 writeback:0 unstable:0 May 7 09:44:58 Pleiadi kernel: free:734 slab:2275 mapped:384 pagetables:300 bounce:0 May 7 09:44:58 Pleiadi kernel: DMA free:780kB min:160kB low:200kB high:240kB active:5928kB inactive:4988kB present:16256kB pages_scanned:0 all_unreclaimable? no May 7 09:44:58 Pleiadi kernel: lowmem_reserve[]: 0 142 142 May 7 09:44:58 Pleiadi kernel: Normal free:2156kB min:1448kB low:1808kB high:2172kB active:109324kB inactive:22152kB present:146304kB pages_scanned:345 all_unreclaimable? no May 7 09:44:58 Pleiadi kernel: lowmem_reserve[]: 0 0 0 May 7 09:44:58 Pleiadi kernel: DMA: 165*4kB 9*8kB 1*16kB 1*32kB 0*64kB 0*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 780kB May 7 09:44:58 Pleiadi kernel: Normal: 441*4kB 17*8kB 10*16kB 1*32kB 1*64kB 0*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 2156kB May 7 09:44:58 Pleiadi kernel: 7021 total pagecache pages May 7 09:44:58 Pleiadi kernel: Swap cache: add 3187147, delete 3181064, find 266145/761338 May 7 09:44:58 Pleiadi kernel: Free swap = 109020kB May 7 09:44:58 Pleiadi kernel: Total swap = 151160kB May 7 09:44:58 Pleiadi kernel: Free swap: 109020kB May 7 09:44:58 Pleiadi kernel: 40960 pages of RAM May 7 09:44:58 Pleiadi kernel: 0 pages of HIGHMEM May 7 09:44:58 Pleiadi kernel: 1202 reserved pages May 7 09:44:58 Pleiadi kernel: 3468 pages shared May 7 09:44:58 Pleiadi kernel: 6083 pages swap cached May 7 09:44:58 Pleiadi kernel: 46 pages dirty May 7 09:44:58 Pleiadi kernel: 0 pages writeback May 7 09:44:58 Pleiadi kernel: 384 pages mapped May 7 09:44:58 Pleiadi kernel: 2275 pages slab May 7 09:44:58 Pleiadi kernel: 300 pages pagetables May 7 09:44:58 Pleiadi kernel: swapper: page allocation failure. order:3, mode:0x4020 May 7 09:44:58 Pleiadi kernel: Pid: 0, comm: swapper Not tainted 2.6.25 #1 May 7 09:44:58 Pleiadi kernel: [] __alloc_pages+0x30e/0x360 May 7 09:44:58 Pleiadi kernel: [] allocate_slab+0x35/0x90 May 7 09:44:58 Pleiadi kernel: [] boomerang_rx+0x210/0x430 [3c59x] May 7 09:44:58 Pleiadi kernel: [] new_slab+0x20/0x120 May 7 09:44:58 Pleiadi kernel: [] boomerang_rx+0x210/0x430 [3c59x] May 7 09:44:58 Pleiadi kernel: [] __slab_alloc+0xac/0x160 May 7 09:44:58 Pleiadi kernel: [] boomerang_rx+0x210/0x430 [3c59x] May 7 09:44:58 Pleiadi kernel: [] __kmalloc_track_caller+0xee/0x100 May 7 09:44:58 Pleiadi kernel: [] boomerang_rx+0x210/0x430 [3c59x] May 7 09:44:58 Pleiadi kernel: [] __alloc_skb+0x54/0x110 May 7 09:44:58 Pleiadi kernel: [] boomerang_rx+0x210/0x430 [3c59x] May 7 09:44:58 Pleiadi kernel: [] handle_IRQ_event+0x25/0x60 May 7 09:44:58 Pleiadi kernel: [] boomerang_interrupt+0x11b/0x3c0 [3c59x] May 7 09:44:58 Pleiadi kernel: [] handle_IRQ_event+0x25/0x60 May 7 09:44:58 Pleiadi kernel: [] handle_level_irq+0x47/0xa0 May 7 09:44:58 Pleiadi kernel: [] do_IRQ+0x3c/0x70 May 7 09:44:58 Pleiadi kernel: [] allocate_slab+0x35/0x90 May 7 09:44:58 Pleiadi kernel: [] common_interrupt+0x23/0x28 May 7 09:44:58 Pleiadi kernel: [] xfrm_spd_getinfo+0xb/0x50 May 7 09:44:58 Pleiadi kernel: [] __kmalloc+0x5c/0x100 May 7 09:44:58 Pleiadi kernel: [] pskb_expand_head+0x50/0x170 May 7 09:44:58 Pleiadi kernel: [] pskb_expand_head+0x50/0x170 May 7 09:44:58 Pleiadi kernel: [] ip_forward+0x286/0x350 May 7 09:44:58 Pleiadi kernel: [] ip_rcv_finish+0xbf/0x2e0 May 7 09:44:58 Pleiadi kernel: [] nf_hook_slow+0x66/0x100 May 7 09:44:58 Pleiadi kernel: [] ip_rcv_finish+0x0/0x2e0 May 7 09:44:58 Pleiadi kernel: [] ip_rcv+0x182/0x260 May 7 09:44:58 Pleiadi kernel: [] ip_rcv_finish+0x0/0x2e0 May 7 09:44:58 Pleiadi kernel: [] netif_receive_skb+0x20c/0x290 May 7 09:44:58 Pleiadi kernel: [] process_backlog+0x67/0xc0 May 7 09:44:58 Pleiadi kernel: [] net_rx_action+0x63/0x130 May 7 09:44:58 Pleiadi kernel: [] __do_softirq+0x40/0xa0 May 7 09:44:58 Pleiadi kernel: [] do_softirq+0x26/0x30 May 7 09:44:58 Pleiadi kernel: [] do_IRQ+0x41/0x70 May 7 09:44:58 Pleiadi kernel: [] common_interrupt+0x23/0x28 May 7 09:44:58 Pleiadi kernel: [] signal_wake_up+0x10/0x20 May 7 09:44:58 Pleiadi kernel: [] default_idle+0x39/0x70 May 7 09:44:58 Pleiadi kernel: [] default_idle+0x0/0x70 May 7 09:44:58 Pleiadi kernel: [] cpu_idle+0x26/0x60 May 7 09:44:58 Pleiadi kernel: ======================= May 7 09:44:58 Pleiadi kernel: Mem-info: May 7 09:44:58 Pleiadi kernel: DMA per-cpu: May 7 09:44:58 Pleiadi kernel: CPU 0: hi: 0, btch: 1 usd: 0 May 7 09:44:58 Pleiadi kernel: Normal per-cpu: May 7 09:44:58 Pleiadi kernel: CPU 0: hi: 42, btch: 7 usd: 18 May 7 09:44:58 Pleiadi kernel: Active:28813 inactive:6785 dirty:46 writeback:0 unstable:0 May 7 09:44:58 Pleiadi kernel: free:734 slab:2275 mapped:384 pagetables:300 bounce:0 May 7 09:44:58 Pleiadi kernel: DMA free:780kB min:160kB low:200kB high:240kB active:5928kB inactive:4988kB present:16256kB pages_scanned:0 all_unreclaimable? no May 7 09:44:58 Pleiadi kernel: lowmem_reserve[]: 0 142 142 May 7 09:44:58 Pleiadi kernel: Normal free:2156kB min:1448kB low:1808kB high:2172kB active:109324kB inactive:22152kB present:146304kB pages_scanned:345 all_unreclaimable? no May 7 09:44:58 Pleiadi kernel: lowmem_reserve[]: 0 0 0 May 7 09:44:58 Pleiadi kernel: DMA: 165*4kB 9*8kB 1*16kB 1*32kB 0*64kB 0*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 780kB May 7 09:44:58 Pleiadi kernel: Normal: 441*4kB 17*8kB 10*16kB 1*32kB 1*64kB 0*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 2156kB May 7 09:44:58 Pleiadi kernel: 7021 total pagecache pages May 7 09:44:58 Pleiadi kernel: Swap cache: add 3187147, delete 3181064, find 266145/761338 May 7 09:44:58 Pleiadi kernel: Free swap = 109020kB May 7 09:44:58 Pleiadi kernel: Total swap = 151160kB May 7 09:44:58 Pleiadi kernel: Free swap: 109020kB May 7 09:44:58 Pleiadi kernel: 40960 pages of RAM May 7 09:44:58 Pleiadi kernel: 0 pages of HIGHMEM May 7 09:44:58 Pleiadi kernel: 1202 reserved pages May 7 09:44:58 Pleiadi kernel: 3468 pages shared May 7 09:44:58 Pleiadi kernel: 6083 pages swap cached May 7 09:44:58 Pleiadi kernel: 46 pages dirty May 7 09:44:58 Pleiadi kernel: 0 pages writeback May 7 09:44:58 Pleiadi kernel: 384 pages mapped May 7 09:44:58 Pleiadi kernel: 2275 pages slab May 7 09:44:58 Pleiadi kernel: 300 pages pagetables May 7 09:48:55 Pleiadi kernel: 1daa>] xfs_trans_log_buf+0x5a/0x90 May 7 09:49:01 Pleiadi kernel: [] common_interrupt+0x23/0x28 May 7 09:49:01 Pleiadi kernel: [] xlog_write+0x1af/0x4d0 May 7 09:49:01 Pleiadi kernel: [] xfs_log_write+0x3d/0x70 May 7 09:49:01 Pleiadi kernel: [] _xfs_trans_commit+0xe8/0x340 May 7 09:49:01 Pleiadi kernel: [] xfs_bmap_finish+0x11b/0x170 May 7 09:49:01 Pleiadi kernel: [] kmem_zone_zalloc+0x26/0x50 May 7 09:49:01 Pleiadi kernel: [] xfs_itruncate_finish+0x180/0x420 May 7 09:49:01 Pleiadi kernel: [] xfs_trans_ijoin+0x28/0x70 May 7 09:49:01 Pleiadi kernel: [] xfs_inactive+0x438/0x4b0 May 7 09:49:01 Pleiadi kernel: [] inotify_inode_is_dead+0x18/0x80 May 7 09:49:01 Pleiadi kernel: [] xfs_fs_clear_inode+0x36/0x80 May 7 09:49:01 Pleiadi kernel: [] invalidate_inode_buffers+0xa/0x80 May 7 09:49:02 Pleiadi kernel: [] clear_inode+0xa4/0xf0 May 7 09:49:02 Pleiadi kernel: [] generic_delete_inode+0xa2/0xb0 May 7 09:49:02 Pleiadi kernel: [] iput+0x53/0x60 May 7 09:49:02 Pleiadi kernel: [] do_unlinkat+0xc6/0x120 May 7 09:49:02 Pleiadi kernel: [] vfs_read+0xe0/0x140 May 7 09:49:02 Pleiadi kernel: [] sys_read+0x41/0x70 May 7 09:49:02 Pleiadi kernel: [] syscall_call+0x7/0xb May 7 09:49:02 Pleiadi kernel: ======================= May 7 09:49:02 Pleiadi kernel: Mem-info: May 7 09:49:02 Pleiadi kernel: DMA per-cpu: May 7 09:49:02 Pleiadi kernel: CPU 0: hi: 0, btch: 1 usd: 0 May 7 09:49:02 Pleiadi kernel: Normal per-cpu: May 7 09:49:02 Pleiadi kernel: CPU 0: hi: 42, btch: 7 usd: 20 May 7 09:49:02 Pleiadi kernel: Active:34425 inactive:1103 dirty:40 writeback:0 unstable:0 May 7 09:49:02 Pleiadi kernel: free:730 slab:2351 mapped:323 pagetables:301 bounce:0 May 7 09:49:02 Pleiadi kernel: DMA free:936kB min:160kB low:200kB high:240kB active:10072kB inactive:380kB present:16256kB pages_scanned:0 all_unreclaimable? no May 7 09:49:02 Pleiadi kernel: lowmem_reserve[]: 0 142 142 May 7 09:49:02 Pleiadi kernel: Normal free:1984kB min:1448kB low:1808kB high:2172kB active:127628kB inactive:4032kB present:146304kB pages_scanned:1897 all_unreclaimable? no May 7 09:49:02 Pleiadi kernel: lowmem_reserve[]: 0 0 0 May 7 09:49:02 Pleiadi kernel: DMA: 110*4kB 34*8kB 12*16kB 1*32kB 0*64kB 0*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 936kB May 7 09:49:02 Pleiadi kernel: Normal: 408*4kB 12*8kB 10*16kB 1*32kB 1*64kB 0*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 1984kB May 7 09:49:02 Pleiadi kernel: 12198 total pagecache pages May 7 09:49:02 Pleiadi kernel: Swap cache: add 3219731, delete 3208124, find 277400/779926 May 7 09:49:02 Pleiadi kernel: Free swap = 82100kB May 7 09:49:02 Pleiadi kernel: Total swap = 151160kB May 7 09:49:02 Pleiadi kernel: Free swap: 82100kB May 7 09:49:02 Pleiadi kernel: 40960 pages of RAM May 7 09:49:02 Pleiadi kernel: 0 pages of HIGHMEM May 7 09:49:02 Pleiadi kernel: 1202 reserved pages May 7 09:49:02 Pleiadi kernel: 4626 pages shared May 7 09:49:02 Pleiadi kernel: 11607 pages swap cached May 7 09:49:02 Pleiadi kernel: 40 pages dirty May 7 09:49:02 Pleiadi kernel: 0 pages writeback May 7 09:49:02 Pleiadi kernel: 323 pages mapped May 7 09:49:02 Pleiadi kernel: 2351 pages slab May 7 09:49:02 Pleiadi kernel: 301 pages pagetables May 7 09:49:02 Pleiadi kernel: unlinkd: page allocation failure. order:3, mode:0x4020 May 7 09:49:02 Pleiadi kernel: Pid: 3333, comm: unlinkd Not tainted 2.6.25 #1 May 7 09:49:02 Pleiadi kernel: [] __alloc_pages+0x30e/0x360 May 7 09:49:02 Pleiadi kernel: [] allocate_slab+0x35/0x90 May 7 09:49:02 Pleiadi kernel: [] boomerang_rx+0x210/0x430 [3c59x] May 7 09:49:02 Pleiadi kernel: [] new_slab+0x20/0x120 May 7 09:49:02 Pleiadi kernel: [] boomerang_rx+0x210/0x430 [3c59x] May 7 09:49:02 Pleiadi kernel: [] __slab_alloc+0xac/0x160 May 7 09:49:02 Pleiadi kernel: [] boomerang_rx+0x210/0x430 [3c59x] May 7 09:49:02 Pleiadi kernel: [] __kmalloc_track_caller+0xee/0x100 May 7 09:49:02 Pleiadi kernel: [] boomerang_rx+0x210/0x430 [3c59x] May 7 09:49:02 Pleiadi kernel: [] __alloc_skb+0x54/0x110 May 7 09:49:02 Pleiadi kernel: [] boomerang_rx+0x210/0x430 [3c59x] May 7 09:49:02 Pleiadi kernel: [] boomerang_interrupt+0x11b/0x3c0 [3c59x] May 7 09:49:02 Pleiadi kernel: [] handle_IRQ_event+0x25/0x60 May 7 09:49:02 Pleiadi kernel: [] handle_level_irq+0x47/0xa0 May 7 09:49:02 Pleiadi kernel: [] do_IRQ+0x3c/0x70 May 7 09:49:02 Pleiadi kernel: [] xfs_trans_log_buf+0x5a/0x90 May 7 09:49:02 Pleiadi kernel: [] common_interrupt+0x23/0x28 May 7 09:49:02 Pleiadi kernel: [] xlog_write+0x1af/0x4d0 May 7 09:49:02 Pleiadi kernel: [] xfs_log_write+0x3d/0x70 May 7 09:49:02 Pleiadi kernel: [] _xfs_trans_commit+0xe8/0x340 May 7 09:49:02 Pleiadi kernel: [] xfs_bmap_finish+0x11b/0x170 May 7 09:49:02 Pleiadi kernel: [] kmem_zone_zalloc+0x26/0x50 May 7 09:49:02 Pleiadi kernel: [] xfs_itruncate_finish+0x180/0x420 May 7 09:49:02 Pleiadi kernel: [] xfs_trans_ijoin+0x28/0x70 May 7 09:49:02 Pleiadi kernel: [] xfs_inactive+0x438/0x4b0 May 7 09:49:02 Pleiadi kernel: [] inotify_inode_is_dead+0x18/0x80 May 7 09:49:02 Pleiadi kernel: [] xfs_fs_clear_inode+0x36/0x80 May 7 09:49:02 Pleiadi kernel: [] invalidate_inode_buffers+0xa/0x80 May 7 09:49:02 Pleiadi kernel: [] clear_inode+0xa4/0xf0 May 7 09:49:02 Pleiadi kernel: [] generic_delete_inode+0xa2/0xb0 May 7 09:49:02 Pleiadi kernel: [] iput+0x53/0x60 May 7 09:49:02 Pleiadi kernel: [] do_unlinkat+0xc6/0x120 May 7 09:49:02 Pleiadi kernel: [] vfs_read+0xe0/0x140 May 7 09:49:02 Pleiadi kernel: [] sys_read+0x41/0x70 May 7 09:49:02 Pleiadi kernel: [] syscall_call+0x7/0xb May 7 09:49:02 Pleiadi kernel: ======================= May 7 09:49:02 Pleiadi kernel: Mem-info: May 7 09:49:02 Pleiadi kernel: DMA per-cpu: May 7 09:49:02 Pleiadi kernel: CPU 0: hi: 0, btch: 1 usd: 0 May 7 09:49:02 Pleiadi kernel: Normal per-cpu: May 7 09:49:02 Pleiadi kernel: CPU 0: hi: 42, btch: 7 usd: 19 May 7 09:49:02 Pleiadi kernel: Active:34425 inactive:1103 dirty:40 writeback:0 unstable:0 May 7 09:49:02 Pleiadi kernel: free:730 slab:2351 mapped:323 pagetables:301 bounce:0 May 7 09:49:02 Pleiadi kernel: DMA free:936kB min:160kB low:200kB high:240kB active:10072kB inactive:380kB present:16256kB pages_scanned:0 all_unreclaimable? no May 7 09:49:02 Pleiadi kernel: lowmem_reserve[]: 0 142 142 May 7 09:49:02 Pleiadi kernel: Normal free:1984kB min:1448kB low:1808kB high:2172kB active:127628kB inactive:4032kB present:146304kB pages_scanned:1897 all_unreclaimable? no May 7 09:49:02 Pleiadi kernel: lowmem_reserve[]: 0 0 0 May 7 09:49:02 Pleiadi kernel: DMA: 110*4kB 34*8kB 12*16kB 1*32kB 0*64kB 0*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 936kB May 7 09:49:02 Pleiadi kernel: Normal: 408*4kB 12*8kB 10*16kB 1*32kB 1*64kB 0*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 1984kB May 7 09:49:02 Pleiadi kernel: 12198 total pagecache pages May 7 09:49:02 Pleiadi kernel: Swap cache: add 3219731, delete 3208124, find 277400/779926 May 7 09:49:02 Pleiadi kernel: Free swap = 82100kB May 7 09:49:02 Pleiadi kernel: Total swap = 151160kB May 7 09:49:02 Pleiadi kernel: Free swap: 82100kB May 7 09:49:02 Pleiadi kernel: 40960 pages of RAM May 7 09:49:02 Pleiadi kernel: 0 pages of HIGHMEM May 7 09:49:02 Pleiadi kernel: 1202 reserved pages May 7 09:49:02 Pleiadi kernel: 4626 pages shared May 7 09:49:02 Pleiadi kernel: 11607 pages swap cached May 7 09:49:02 Pleiadi kernel: 40 pages dirty May 7 09:49:02 Pleiadi kernel: 0 pages writeback May 7 09:49:02 Pleiadi kernel: 323 pages mapped May 7 09:49:02 Pleiadi kernel: 2351 pages slab May 7 09:49:02 Pleiadi kernel: 301 pages pagetables May 7 09:49:02 Pleiadi kernel: unlinkd: page allocation failure. order:3, mode:0x4020 May 7 09:49:02 Pleiadi kernel: Pid: 3333, comm: unlinkd Not tainted 2.6.25 #1 May 7 09:49:02 Pleiadi kernel: [] __alloc_pages+0x30e/0x360 May 7 09:49:02 Pleiadi kernel: [] allocate_slab+0x35/0x90 May 7 09:49:02 Pleiadi kernel: [] boomerang_rx+0x210/0x430 [3c59x] May 7 09:49:02 Pleiadi kernel: [] new_slab+0x20/0x120 May 7 09:49:02 Pleiadi kernel: [] boomerang_rx+0x210/0x430 [3c59x] May 7 09:49:02 Pleiadi kernel: [] __slab_alloc+0xac/0x160 May 7 09:49:02 Pleiadi kernel: [] boomerang_rx+0x210/0x430 [3c59x] May 7 09:49:02 Pleiadi kernel: [] __kmalloc_track_caller+0xee/0x100 May 7 09:49:02 Pleiadi kernel: [] boomerang_rx+0x210/0x430 [3c59x] May 7 09:49:02 Pleiadi kernel: [] __alloc_skb+0x54/0x110 May 7 09:49:02 Pleiadi kernel: [] boomerang_rx+0x210/0x430 [3c59x] May 7 09:49:02 Pleiadi kernel: [] boomerang_interrupt+0x11b/0x3c0 [3c59x] May 7 09:49:02 Pleiadi kernel: [] handle_IRQ_event+0x25/0x60 May 7 09:49:02 Pleiadi kernel: [] handle_level_irq+0x47/0xa0 May 7 09:49:02 Pleiadi kernel: [] do_IRQ+0x3c/0x70 May 7 09:49:02 Pleiadi kernel: [] xfs_trans_log_buf+0x5a/0x90 May 7 09:49:02 Pleiadi kernel: [] common_interrupt+0x23/0x28 May 7 09:49:02 Pleiadi kernel: [] xlog_write+0x1af/0x4d0 May 7 09:49:02 Pleiadi kernel: [] xfs_log_write+0x3d/0x70 May 7 09:49:02 Pleiadi kernel: [] _xfs_trans_commit+0xe8/0x340 May 7 09:49:02 Pleiadi kernel: [] xfs_bmap_finish+0x11b/0x170 May 7 09:49:02 Pleiadi kernel: [] kmem_zone_zalloc+0x26/0x50 May 7 09:49:02 Pleiadi kernel: [] xfs_itruncate_finish+0x180/0x420 May 7 09:49:02 Pleiadi kernel: [] xfs_trans_ijoin+0x28/0x70 May 7 09:49:02 Pleiadi kernel: [] xfs_inactive+0x438/0x4b0 May 7 09:49:02 Pleiadi kernel: [] inotify_inode_is_dead+0x18/0x80 May 7 09:49:02 Pleiadi kernel: [] xfs_fs_clear_inode+0x36/0x80 May 7 09:49:02 Pleiadi kernel: [] invalidate_inode_buffers+0xa/0x80 May 7 09:49:02 Pleiadi kernel: [] clear_inode+0xa4/0xf0 May 7 09:49:02 Pleiadi kernel: [] generic_delete_inode+0xa2/0xb0 May 7 09:49:02 Pleiadi kernel: [] iput+0x53/0x60 May 7 09:49:02 Pleiadi kernel: [] do_unlinkat+0xc6/0x120 May 7 09:49:02 Pleiadi kernel: [] vfs_read+0xe0/0x140 May 7 09:49:02 Pleiadi kernel: [] sys_read+0x41/0x70 May 7 09:49:02 Pleiadi kernel: [] syscall_call+0x7/0xb May 7 09:49:02 Pleiadi kernel: ======================= May 7 09:49:02 Pleiadi kernel: Mem-info: May 7 09:49:02 Pleiadi kernel: DMA per-cpu: May 7 09:49:02 Pleiadi kernel: CPU 0: hi: 0, btch: 1 usd: 0 May 7 09:49:02 Pleiadi kernel: Normal per-cpu: May 7 09:49:02 Pleiadi kernel: CPU 0: hi: 42, btch: 7 usd: 18 May 7 09:49:02 Pleiadi kernel: Active:34425 inactive:1103 dirty:40 writeback:0 unstable:0 May 7 09:49:02 Pleiadi kernel: free:730 slab:2351 mapped:323 pagetables:301 bounce:0 May 7 09:49:02 Pleiadi kernel: DMA free:936kB min:160kB low:200kB high:240kB active:10072kB inactive:380kB present:16256kB pages_scanned:0 all_unreclaimable? no May 7 09:49:02 Pleiadi kernel: lowmem_reserve[]: 0 142 142 May 7 09:49:02 Pleiadi kernel: Normal free:1984kB min:1448kB low:1808kB high:2172kB active:127628kB inactive:4032kB present:146304kB pages_scanned:1897 all_unreclaimable? no May 7 09:49:02 Pleiadi kernel: lowmem_reserve[]: 0 0 0 May 7 09:49:02 Pleiadi kernel: DMA: 110*4kB 34*8kB 12*16kB 1*32kB 0*64kB 0*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 936kB May 7 09:49:02 Pleiadi kernel: Normal: 408*4kB 12*8kB 10*16kB 1*32kB 1*64kB 0*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 1984kB May 7 09:49:02 Pleiadi kernel: 12198 total pagecache pages May 7 09:49:02 Pleiadi kernel: Swap cache: add 3219731, delete 3208124, find 277400/779926 May 7 09:49:02 Pleiadi kernel: Free swap = 82100kB May 7 09:49:02 Pleiadi kernel: Total swap = 151160kB May 7 09:49:02 Pleiadi kernel: Free swap: 82100kB May 7 09:49:02 Pleiadi kernel: 40960 pages of RAM May 7 09:49:02 Pleiadi kernel: 0 pages of HIGHMEM May 7 09:49:02 Pleiadi kernel: 1202 reserved pages May 7 09:49:02 Pleiadi kernel: 4626 pages shared May 7 09:49:02 Pleiadi kernel: 11607 pages swap cached May 7 09:49:02 Pleiadi kernel: 40 pages dirty May 7 09:49:02 Pleiadi kernel: 0 pages writeback May 7 09:49:02 Pleiadi kernel: 323 pages mapped May 7 09:49:02 Pleiadi kernel: 2351 pages slab May 7 09:49:02 Pleiadi kernel: 301 pages pagetables May 7 09:49:02 Pleiadi kernel: unlinkd: page allocation failure. order:3, mode:0x4020 May 7 09:49:02 Pleiadi kernel: Pid: 3333, comm: unlinkd Not tainted 2.6.25 #1 May 7 09:49:02 Pleiadi kernel: [] __alloc_pages+0x30e/0x360 May 7 09:49:02 Pleiadi kernel: [] allocate_slab+0x35/0x90 May 7 09:49:02 Pleiadi kernel: [] boomerang_rx+0x210/0x430 [3c59x] May 7 09:49:02 Pleiadi kernel: [] new_slab+0x20/0x120 May 7 09:49:02 Pleiadi kernel: [] boomerang_rx+0x210/0x430 [3c59x] May 7 09:49:02 Pleiadi kernel: [] __slab_alloc+0xac/0x160 May 7 09:49:02 Pleiadi kernel: [] boomerang_rx+0x210/0x430 [3c59x] May 7 09:49:02 Pleiadi kernel: [] __kmalloc_track_caller+0xee/0x100 May 7 09:49:02 Pleiadi kernel: [] boomerang_rx+0x210/0x430 [3c59x] May 7 09:49:02 Pleiadi kernel: [] __alloc_skb+0x54/0x110 May 7 09:49:02 Pleiadi kernel: [] boomerang_rx+0x210/0x430 [3c59x] May 7 09:49:02 Pleiadi kernel: [] boomerang_interrupt+0x11b/0x3c0 [3c59x] May 7 09:49:02 Pleiadi kernel: [] handle_IRQ_event+0x25/0x60 May 7 09:49:02 Pleiadi kernel: [] handle_level_irq+0x47/0xa0 May 7 09:49:02 Pleiadi kernel: [] do_IRQ+0x3c/0x70 May 7 09:49:02 Pleiadi kernel: [] xfs_trans_log_buf+0x5a/0x90 May 7 09:49:02 Pleiadi kernel: [] common_interrupt+0x23/0x28 May 7 09:49:02 Pleiadi kernel: [] xlog_write+0x1af/0x4d0 May 7 09:49:02 Pleiadi kernel: [] xfs_log_write+0x3d/0x70 May 7 09:49:02 Pleiadi kernel: [] _xfs_trans_commit+0xe8/0x340 May 7 09:49:02 Pleiadi kernel: [] xfs_bmap_finish+0x11b/0x170 May 7 09:49:02 Pleiadi kernel: [] kmem_zone_zalloc+0x26/0x50 May 7 09:49:02 Pleiadi kernel: [] xfs_itruncate_finish+0x180/0x420 May 7 09:49:02 Pleiadi kernel: [] xfs_trans_ijoin+0x28/0x70 May 7 09:49:02 Pleiadi kernel: [] xfs_inactive+0x438/0x4b0 May 7 09:49:02 Pleiadi kernel: [] inotify_inode_is_dead+0x18/0x80 May 7 09:49:02 Pleiadi kernel: [] xfs_fs_clear_inode+0x36/0x80 May 7 09:49:02 Pleiadi kernel: [] invalidate_inode_buffers+0xa/0x80 May 7 09:49:02 Pleiadi kernel: [] clear_inode+0xa4/0xf0 May 7 09:49:02 Pleiadi kernel: [] generic_delete_inode+0xa2/0xb0 May 7 09:49:02 Pleiadi kernel: [] iput+0x53/0x60 May 7 09:49:02 Pleiadi kernel: [] do_unlinkat+0xc6/0x120 May 7 09:49:02 Pleiadi kernel: [] vfs_read+0xe0/0x140 May 7 09:49:02 Pleiadi kernel: [] sys_read+0x41/0x70 May 7 09:49:02 Pleiadi kernel: [] syscall_call+0x7/0xb May 7 09:49:02 Pleiadi kernel: ======================= May 7 09:49:02 Pleiadi kernel: Mem-info: May 7 09:49:02 Pleiadi kernel: DMA per-cpu: May 7 09:49:02 Pleiadi kernel: CPU 0: hi: 0, btch: 1 usd: 0 May 7 09:49:02 Pleiadi kernel: Normal per-cpu: May 7 09:49:02 Pleiadi kernel: CPU 0: hi: 42, btch: 7 usd: 23 May 7 09:49:02 Pleiadi kernel: Active:34425 inactive:1103 dirty:40 writeback:0 unstable:0 May 7 09:49:02 Pleiadi kernel: free:723 slab:2352 mapped:323 pagetables:301 bounce:0 May 7 09:49:02 Pleiadi kernel: DMA free:936kB min:160kB low:200kB high:240kB active:10072kB inactive:380kB present:16256kB pages_scanned:0 all_unreclaimable? no May 7 09:49:02 Pleiadi kernel: lowmem_reserve[]: 0 142 142 May 7 09:49:02 Pleiadi kernel: Normal free:1956kB min:1448kB low:1808kB high:2172kB active:127628kB inactive:4032kB present:146304kB pages_scanned:1897 all_unreclaimable? no May 7 09:49:02 Pleiadi kernel: lowmem_reserve[]: 0 0 0 May 7 09:49:02 Pleiadi kernel: DMA: 110*4kB 34*8kB 12*16kB 1*32kB 0*64kB 0*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 936kB May 7 09:49:02 Pleiadi kernel: Normal: 401*4kB 12*8kB 10*16kB 1*32kB 1*64kB 0*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 1956kB May 7 09:49:02 Pleiadi kernel: 12198 total pagecache pages May 7 09:49:02 Pleiadi kernel: Swap cache: add 3219731, delete 3208124, find 277400/779926 May 7 09:49:02 Pleiadi kernel: Free swap = 82100kB May 7 09:49:02 Pleiadi kernel: Total swap = 151160kB May 7 09:49:02 Pleiadi kernel: Free swap: 82100kB May 7 09:49:02 Pleiadi kernel: 40960 pages of RAM May 7 09:49:02 Pleiadi kernel: 0 pages of HIGHMEM May 7 09:49:02 Pleiadi kernel: 1202 reserved pages May 7 09:49:02 Pleiadi kernel: 4626 pages shared May 7 09:49:02 Pleiadi kernel: 11607 pages swap cached May 7 09:49:02 Pleiadi kernel: 40 pages dirty May 7 09:49:02 Pleiadi kernel: 0 pages writeback May 7 09:49:02 Pleiadi kernel: 323 pages mapped May 7 09:49:02 Pleiadi kernel: 2352 pages slab May 7 09:49:02 Pleiadi kernel: 301 pages pagetables May 7 09:49:02 Pleiadi kernel: unlinkd: page allocation failure. order:3, mode:0x4020 May 7 09:49:02 Pleiadi kernel: Pid: 3333, comm: unlinkd Not tainted 2.6.25 #1 May 7 09:49:02 Pleiadi kernel: [] __alloc_pages+0x30e/0x360 May 7 09:49:02 Pleiadi kernel: [] allocate_slab+0x35/0x90 May 7 09:49:02 Pleiadi kernel: [] boomerang_rx+0x210/0x430 [3c59x] May 7 09:49:02 Pleiadi kernel: [] new_slab+0x20/0x120 May 7 09:49:02 Pleiadi kernel: [] boomerang_rx+0x210/0x430 [3c59x] May 7 09:49:02 Pleiadi kernel: [] __slab_alloc+0xac/0x160 May 7 09:49:02 Pleiadi kernel: [] boomerang_rx+0x210/0x430 [3c59x] May 7 09:49:02 Pleiadi kernel: [] __kmalloc_track_caller+0xee/0x100 May 7 09:49:02 Pleiadi kernel: [] boomerang_rx+0x210/0x430 [3c59x] May 7 09:49:02 Pleiadi kernel: [] __alloc_skb+0x54/0x110 May 7 09:49:02 Pleiadi kernel: [] boomerang_rx+0x210/0x430 [3c59x] May 7 09:49:02 Pleiadi kernel: [] boomerang_interrupt+0x11b/0x3c0 [3c59x] May 7 09:49:02 Pleiadi kernel: [] handle_IRQ_event+0x25/0x60 May 7 09:49:02 Pleiadi kernel: [] handle_level_irq+0x47/0xa0 May 7 09:49:02 Pleiadi kernel: [] do_IRQ+0x3c/0x70 May 7 09:49:02 Pleiadi kernel: [] xfs_trans_log_buf+0x5a/0x90 May 7 09:49:02 Pleiadi kernel: [] common_interrupt+0x23/0x28 May 7 09:49:02 Pleiadi kernel: [] xlog_write+0x1af/0x4d0 May 7 09:49:02 Pleiadi kernel: [] xfs_log_write+0x3d/0x70 May 7 09:49:02 Pleiadi kernel: [] _xfs_trans_commit+0xe8/0x340 May 7 09:49:02 Pleiadi kernel: [] xfs_bmap_finish+0x11b/0x170 May 7 09:49:02 Pleiadi kernel: [] kmem_zone_zalloc+0x26/0x50 May 7 09:49:02 Pleiadi kernel: [] xfs_itruncate_finish+0x180/0x420 May 7 09:49:02 Pleiadi kernel: [] xfs_trans_ijoin+0x28/0x70 May 7 09:49:02 Pleiadi kernel: [] xfs_inactive+0x438/0x4b0 May 7 09:49:02 Pleiadi kernel: [] inotify_inode_is_dead+0x18/0x80 May 7 09:49:02 Pleiadi kernel: [] xfs_fs_clear_inode+0x36/0x80 May 7 09:49:02 Pleiadi kernel: [] invalidate_inode_buffers+0xa/0x80 May 7 09:49:02 Pleiadi kernel: [] clear_inode+0xa4/0xf0 May 7 09:49:02 Pleiadi kernel: [] generic_delete_inode+0xa2/0xb0 May 7 09:49:02 Pleiadi kernel: [] iput+0x53/0x60 May 7 09:49:02 Pleiadi kernel: [] do_unlinkat+0xc6/0x120 May 7 09:49:02 Pleiadi kernel: [] vfs_read+0xe0/0x140 May 7 09:49:02 Pleiadi kernel: [] sys_read+0x41/0x70 May 7 09:49:02 Pleiadi kernel: [] syscall_call+0x7/0xb May 7 09:49:02 Pleiadi kernel: ======================= May 7 09:49:02 Pleiadi kernel: Mem-info: May 7 09:49:02 Pleiadi kernel: DMA per-cpu: May 7 09:49:02 Pleiadi kernel: CPU 0: hi: 0, btch: 1 usd: 0 May 7 09:49:02 Pleiadi kernel: Normal per-cpu: May 7 09:49:02 Pleiadi kernel: CPU 0: hi: 42, btch: 7 usd: 22 May 7 09:49:02 Pleiadi kernel: Active:34425 inactive:1103 dirty:40 writeback:0 unstable:0 May 7 09:49:02 Pleiadi kernel: free:723 slab:2352 mapped:323 pagetables:301 bounce:0 May 7 09:49:02 Pleiadi kernel: DMA free:936kB min:160kB low:200kB high:240kB active:10072kB inactive:380kB present:16256kB pages_scanned:0 all_unreclaimable? no May 7 09:49:02 Pleiadi kernel: lowmem_reserve[]: 0 142 142 May 7 09:49:02 Pleiadi kernel: Normal free:1956kB min:1448kB low:1808kB high:2172kB active:127628kB inactive:4032kB present:146304kB pages_scanned:1897 all_unreclaimable? no May 7 09:49:02 Pleiadi kernel: lowmem_reserve[]: 0 0 0 May 7 09:49:02 Pleiadi kernel: DMA: 110*4kB 34*8kB 12*16kB 1*32kB 0*64kB 0*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 936kB May 7 09:49:02 Pleiadi kernel: Normal: 401*4kB 12*8kB 10*16kB 1*32kB 1*64kB 0*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 1956kB May 7 09:49:02 Pleiadi kernel: 12198 total pagecache pages May 7 09:49:02 Pleiadi kernel: Swap cache: add 3219731, delete 3208124, find 277400/779926 May 7 09:49:02 Pleiadi kernel: Free swap = 82100kB May 7 09:49:02 Pleiadi kernel: Total swap = 151160kB May 7 09:49:02 Pleiadi kernel: Free swap: 82100kB May 7 09:49:02 Pleiadi kernel: 40960 pages of RAM May 7 09:49:02 Pleiadi kernel: 0 pages of HIGHMEM May 7 09:49:02 Pleiadi kernel: 1202 reserved pages May 7 09:49:02 Pleiadi kernel: 4626 pages shared May 7 09:49:02 Pleiadi kernel: 11607 pages swap cached May 7 09:49:02 Pleiadi kernel: 40 pages dirty May 7 09:49:02 Pleiadi kernel: 0 pages writeback May 7 09:49:02 Pleiadi kernel: 323 pages mapped May 7 09:49:02 Pleiadi kernel: 2352 pages slab May 7 09:49:02 Pleiadi kernel: 301 pages pagetables May 7 09:49:02 Pleiadi kernel: unlinkd: page allocation failure. order:3, mode:0x4020 May 7 09:49:02 Pleiadi kernel: Pid: 3333, comm: unlinkd Not tainted 2.6.25 #1 May 7 09:49:02 Pleiadi kernel: [] __alloc_pages+0x30e/0x360 May 7 09:49:02 Pleiadi kernel: [] allocate_slab+0x35/0x90 May 7 09:49:02 Pleiadi kernel: [] boomerang_rx+0x210/0x430 [3c59x] May 7 09:49:02 Pleiadi kernel: [] new_slab+0x20/0x120 May 7 09:49:02 Pleiadi kernel: [] boomerang_rx+0x210/0x430 [3c59x] May 7 09:49:02 Pleiadi kernel: [] __slab_alloc+0xac/0x160 May 7 09:49:02 Pleiadi kernel: [] boomerang_rx+0x210/0x430 [3c59x] May 7 09:49:02 Pleiadi kernel: [] __kmalloc_track_caller+0xee/0x100 May 7 09:49:02 Pleiadi kernel: [] boomerang_rx+0x210/0x430 [3c59x] May 7 09:49:02 Pleiadi kernel: [] __alloc_skb+0x54/0x110 May 7 09:49:02 Pleiadi kernel: [] boomerang_rx+0x210/0x430 [3c59x] May 7 09:49:02 Pleiadi kernel: [] boomerang_interrupt+0x11b/0x3c0 [3c59x] May 7 09:49:02 Pleiadi kernel: [] handle_IRQ_event+0x25/0x60 May 7 09:49:02 Pleiadi kernel: [] handle_level_irq+0x47/0xa0 May 7 09:49:02 Pleiadi kernel: [] do_IRQ+0x3c/0x70 May 7 09:49:02 Pleiadi kernel: [] xfs_trans_log_buf+0x5a/0x90 May 7 09:49:02 Pleiadi kernel: [] common_interrupt+0x23/0x28 May 7 09:49:02 Pleiadi kernel: [] xlog_write+0x1af/0x4d0 May 7 09:49:02 Pleiadi kernel: [] xfs_log_write+0x3d/0x70 May 7 09:49:02 Pleiadi kernel: [] _xfs_trans_commit+0xe8/0x340 May 7 09:49:02 Pleiadi kernel: [] xfs_bmap_finish+0x11b/0x170 May 7 09:49:02 Pleiadi kernel: [] kmem_zone_zalloc+0x26/0x50 May 7 09:49:02 Pleiadi kernel: [] xfs_itruncate_finish+0x180/0x420 May 7 09:49:02 Pleiadi kernel: [] xfs_trans_ijoin+0x28/0x70 May 7 09:49:02 Pleiadi kernel: [] xfs_inactive+0x438/0x4b0 May 7 09:49:02 Pleiadi kernel: [] inotify_inode_is_dead+0x18/0x80 May 7 09:49:02 Pleiadi kernel: [] xfs_fs_clear_inode+0x36/0x80 May 7 09:49:02 Pleiadi kernel: [] invalidate_inode_buffers+0xa/0x80 May 7 09:49:02 Pleiadi kernel: [] clear_inode+0xa4/0xf0 May 7 09:49:02 Pleiadi kernel: [] generic_delete_inode+0xa2/0xb0 May 7 09:49:02 Pleiadi kernel: [] iput+0x53/0x60 May 7 09:49:02 Pleiadi kernel: [] do_unlinkat+0xc6/0x120 May 7 09:49:02 Pleiadi kernel: [] vfs_read+0xe0/0x140 May 7 09:49:02 Pleiadi kernel: [] sys_read+0x41/0x70 May 7 09:49:02 Pleiadi kernel: [] syscall_call+0x7/0xb May 7 09:49:02 Pleiadi kernel: ======================= May 7 09:49:02 Pleiadi kernel: Mem-info: May 7 09:49:02 Pleiadi kernel: DMA per-cpu: May 7 09:49:02 Pleiadi kernel: CPU 0: hi: 0, btch: 1 usd: 0 May 7 09:49:02 Pleiadi kernel: Normal per-cpu: May 7 09:49:02 Pleiadi kernel: CPU 0: hi: 42, btch: 7 usd: 21 May 7 09:49:02 Pleiadi kernel: Active:34425 inactive:1103 dirty:40 writeback:0 unstable:0 May 7 09:49:02 Pleiadi kernel: free:723 slab:2352 mapped:323 pagetables:301 bounce:0 May 7 09:49:02 Pleiadi kernel: DMA free:936kB min:160kB low:200kB high:240kB active:10072kB inactive:380kB present:16256kB pages_scanned:0 all_unreclaimable? no May 7 09:49:02 Pleiadi kernel: lowmem_reserve[]: 0 142 142 May 7 09:49:02 Pleiadi kernel: Normal free:1956kB min:1448kB low:1808kB high:2172kB active:127628kB inactive:4032kB present:146304kB pages_scanned:1897 all_unreclaimable? no May 7 09:49:02 Pleiadi kernel: lowmem_reserve[]: 0 0 0 May 7 09:49:02 Pleiadi kernel: DMA: 110*4kB 34*8kB 12*16kB 1*32kB 0*64kB 0*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 936kB May 7 09:49:02 Pleiadi kernel: Normal: 401*4kB 12*8kB 10*16kB 1*32kB 1*64kB 0*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 1956kB May 7 09:49:02 Pleiadi kernel: 12198 total pagecache pages May 7 09:49:02 Pleiadi kernel: Swap cache: add 3219731, delete 3208124, find 277400/779926 May 7 09:49:02 Pleiadi kernel: Free swap = 82100kB May 7 09:49:02 Pleiadi kernel: Total swap = 151160kB May 7 09:49:02 Pleiadi kernel: Free swap: 82100kB May 7 09:49:02 Pleiadi kernel: 40960 pages of RAM May 7 09:49:02 Pleiadi kernel: 0 pages of HIGHMEM May 7 09:49:02 Pleiadi kernel: 1202 reserved pages May 7 09:49:02 Pleiadi kernel: 4626 pages shared May 7 09:49:02 Pleiadi kernel: 11607 pages swap cached May 7 09:49:02 Pleiadi kernel: 40 pages dirty May 7 09:49:02 Pleiadi kernel: 0 pages writeback May 7 09:49:02 Pleiadi kernel: 323 pages mapped May 7 09:49:02 Pleiadi kernel: 2352 pages slab May 7 09:49:02 Pleiadi kernel: 301 pages pagetables May 7 09:49:02 Pleiadi kernel: printk: 446 messages suppressed. May 7 09:49:02 Pleiadi kernel: swapper: page allocation failure. order:3, mode:0x4020 May 7 09:49:02 Pleiadi kernel: Pid: 0, comm: swapper Not tainted 2.6.25 #1 May 7 09:49:02 Pleiadi kernel: [] __alloc_pages+0x30e/0x360 May 7 09:49:02 Pleiadi kernel: [] ide_build_sglist+0x6f/0xa0 May 7 09:49:02 Pleiadi kernel: [] allocate_slab+0x35/0x90 May 7 09:49:02 Pleiadi kernel: [] new_slab+0x20/0x120 May 7 09:49:02 Pleiadi kernel: [] dma_timer_expiry+0x0/0x80 May 7 09:49:02 Pleiadi kernel: [] __slab_alloc+0xac/0x160 May 7 09:49:02 Pleiadi kernel: [] ide_dma_start+0x21/0x40 May 7 09:49:02 Pleiadi kernel: [] boomerang_rx+0x210/0x430 [3c59x] May 7 09:49:02 Pleiadi kernel: [] __kmalloc_track_caller+0xee/0x100 May 7 09:49:02 Pleiadi kernel: [] boomerang_rx+0x210/0x430 [3c59x] May 7 09:49:02 Pleiadi kernel: [] __alloc_skb+0x54/0x110 May 7 09:49:02 Pleiadi kernel: [] boomerang_rx+0x210/0x430 [3c59x] May 7 09:49:02 Pleiadi kernel: [] enqueue_entity+0x2e/0x60 May 7 09:49:02 Pleiadi kernel: [] enqueue_task_fair+0x1b/0x20 May 7 09:49:02 Pleiadi kernel: [] enqueue_task+0x15/0x30 May 7 09:49:02 Pleiadi kernel: [] boomerang_interrupt+0x11b/0x3c0 [3c59x] May 7 09:49:02 Pleiadi kernel: [] process_timeout+0x0/0x10 May 7 09:49:02 Pleiadi kernel: [] run_timer_softirq+0x93/0x150 May 7 09:49:02 Pleiadi kernel: [] handle_IRQ_event+0x25/0x60 May 7 09:49:02 Pleiadi kernel: [] handle_level_irq+0x47/0xa0 May 7 09:49:02 Pleiadi kernel: [] do_IRQ+0x3c/0x70 May 7 09:49:02 Pleiadi kernel: [] common_interrupt+0x23/0x28 May 7 09:49:02 Pleiadi kernel: [] signal_wake_up+0x10/0x20 May 7 09:49:02 Pleiadi kernel: [] default_idle+0x39/0x70 May 7 09:49:02 Pleiadi kernel: [] default_idle+0x0/0x70 May 7 09:49:02 Pleiadi kernel: [] cpu_idle+0x26/0x60 May 7 09:49:02 Pleiadi kernel: ======================= May 7 09:49:02 Pleiadi kernel: Mem-info: May 7 09:49:02 Pleiadi kernel: DMA per-cpu: May 7 09:49:02 Pleiadi kernel: CPU 0: hi: 0, btch: 1 usd: 0 May 7 09:49:02 Pleiadi kernel: Normal per-cpu: May 7 09:49:02 Pleiadi kernel: CPU 0: hi: 42, btch: 7 usd: 37 May 7 09:49:02 Pleiadi kernel: Active:30366 inactive:3481 dirty:7 writeback:340 unstable:0 May 7 09:49:02 Pleiadi kernel: free:2290 slab:2369 mapped:300 pagetables:301 bounce:0 May 7 09:49:02 Pleiadi kernel: DMA free:2024kB min:160kB low:200kB high:240kB active:8400kB inactive:932kB present:16256kB pages_scanned:0 all_unreclaimable? no May 7 09:49:02 Pleiadi kernel: lowmem_reserve[]: 0 142 142 May 7 09:49:02 Pleiadi kernel: Normal free:7136kB min:1448kB low:1808kB high:2172kB active:113064kB inactive:12992kB present:146304kB pages_scanned:176 all_unreclaimable? no May 7 09:49:02 Pleiadi kernel: lowmem_reserve[]: 0 0 0 May 7 09:49:02 Pleiadi kernel: DMA: 244*4kB 95*8kB 16*16kB 1*32kB 0*64kB 0*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 2024kB May 7 09:49:02 Pleiadi kernel: Normal: 1240*4kB 190*8kB 35*16kB 1*32kB 1*64kB 0*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 7136kB May 7 09:49:02 Pleiadi kernel: 10866 total pagecache pages May 7 09:49:02 Pleiadi kernel: Swap cache: add 3220104, delete 3209653, find 277405/779939 May 7 09:49:02 Pleiadi kernel: Free swap = 80704kB May 7 09:49:02 Pleiadi kernel: Total swap = 151160kB May 7 09:49:02 Pleiadi kernel: Free swap: 80704kB May 7 09:49:02 Pleiadi kernel: 40960 pages of RAM May 7 09:49:02 Pleiadi kernel: 0 pages of HIGHMEM May 7 09:49:02 Pleiadi kernel: 1202 reserved pages May 7 09:49:02 Pleiadi kernel: 4542 pages shared May 7 09:49:02 Pleiadi kernel: 10451 pages swap cached May 7 09:49:02 Pleiadi kernel: 7 pages dirty May 7 09:49:02 Pleiadi kernel: 340 pages writeback May 7 09:49:02 Pleiadi kernel: 300 pages mapped May 7 09:49:02 Pleiadi kernel: 2369 pages slab May 7 09:49:02 Pleiadi kernel: 301 pages pagetables From owner-xfs@oss.sgi.com Wed May 7 08:36:06 2008 Received: with ECARTIS (v1.0.0; list xfs); Wed, 07 May 2008 08:36:27 -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=BAYES_00,WHOIS_DMNBYPROXY 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 m47Fa5vD004288 for ; Wed, 7 May 2008 08:36:06 -0700 X-ASG-Debug-ID: 1210174610-598200c30000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from fed1rmmtao107.cox.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 7D2A2B2872A for ; Wed, 7 May 2008 08:36:50 -0700 (PDT) Received: from fed1rmmtao107.cox.net (fed1rmmtao107.cox.net [68.230.241.39]) by cuda.sgi.com with ESMTP id vDPEMCpp0Xg3Iz7g for ; Wed, 07 May 2008 08:36:50 -0700 (PDT) Received: from fed1rmimpo02.cox.net ([70.169.32.72]) by fed1rmmtao107.cox.net (InterMail vM.7.08.02.01 201-2186-121-102-20070209) with ESMTP id <20080507153649.OZTX10668.fed1rmmtao107.cox.net@fed1rmimpo02.cox.net> for ; Wed, 7 May 2008 11:36:49 -0400 Received: from shin ([72.199.86.230]) by fed1rmimpo02.cox.net with bizsmtp id Nfcp1Z00C4yAxSY04fcpU2; Wed, 07 May 2008 11:36:49 -0400 From: "Bond Masuda" To: References: <007001c898f5$cae2f4a0$60a8dde0$@masuda@jlbond.com> <20080407220106.GF108924158@sgi.com> In-Reply-To: <20080407220106.GF108924158@sgi.com> X-ASG-Orig-Subj: Is this XFS problem or something else? : xfs_trans_read_buf error 5 buf count 4096 Subject: Is this XFS problem or something else? : xfs_trans_read_buf error 5 buf count 4096 Date: Wed, 7 May 2008 08:36:50 -0700 Message-ID: <000001c8b058$2ae68460$80b38d20$@net> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit X-Mailer: Microsoft Office Outlook 12.0 Thread-Index: AciY+ua2wdYV1uP4RtifohcPgNap0AXWJtFA Content-Language: en-us x-cr-hashedpuzzle: A2i0 ByAt CGaA Ecij FT5r Fzgb GY/E GgKT HArl ICEI IGdT IYC4 ItkC JvfW Kp4m MMTU;1;eABmAHMAQABvAHMAcwAuAHMAZwBpAC4AYwBvAG0A;Sosha1_v1;7;{97C578EC-9E32-4190-B12D-0FAEAE122E8F};YgBtADAAMAA3AEAAYwBvAHgALgBuAGUAdAA=;Wed, 07 May 2008 15:36:47 GMT;SQBzACAAdABoAGkAcwAgAFgARgBTACAAcAByAG8AYgBsAGUAbQAgAG8AcgAgAHMAbwBtAGUAdABoAGkAbgBnACAAZQBsAHMAZQA/ACAAOgAgAHgAZgBzAF8AdAByAGEAbgBzAF8AcgBlAGEAZABfAGIAdQBmACAAZQByAHIAbwByACAANQAgAGIAdQBmACAAYwBvAHUAbgB0ACAANAAwADkANgA= x-cr-puzzleid: {97C578EC-9E32-4190-B12D-0FAEAE122E8F} X-Barracuda-Connect: fed1rmmtao107.cox.net[68.230.241.39] X-Barracuda-Start-Time: 1210174610 X-Barracuda-Bayes: INNOCENT GLOBAL 0.1071 1.0000 -1.3503 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.35 X-Barracuda-Spam-Status: No, SCORE=-1.35 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.49785 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: 15813 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: bm007@cox.net Precedence: bulk X-list: xfs Not sure if this is XFS related or not, but this seems to be reoccurring. The hardware is: Dell Inspiron 530, Q6600 quad core, 4GB Ram, 2x750GB SATA HDD I have Fedora 8/64bit installed, using XFS for "/", ext3 for "/boot". The two identical 750GB drives are striped to create a 1.4TB "md1" device, which is mounted as "/". Kernel is from Fedora8, 2.6.24.4-64.fc8. During the install, everything seemed to work fine. I was able to use the system without any problems for about 2 days. Then I reboot, and the md1 device running XFS shows the following error messages: I/O error in filesystem ("md1") meta-data dev md1 block 0x15d048574120008 ("xfs_trans_read_buf") error 5 buf count 4096 attempt to access beyond end of device md1: rw=0, want=98239738096517136, limit=2927780864 The above message repeats several times, but the system manages to boot to runlevel 3. I can login, but almost any command triggers that message which has flooded the logs. here is xfs_info on "/": meta-data=/dev/root isize=256 agcount=32, agsize=11436608 blks = sectsz=512 attr=1 data = bsize=4096 blocks=365971456, imaxpct=25 = sunit=64 swidth=128 blks, unwritten=1 naming =version2 bsize=4096 log =internal bsize=4096 blocks=32768, version=1 = sectsz=512 sunit=0 blks, lazy-count=0 realtime =none extsz=524288 blocks=0, rtextents=0 At first, I thought perhaps something wrong with the disks so I had them replaced. Reinstalled Fedora8 as before, then again, 2 days later (I don't know if the 2 day time period is coincidental or not), I reboot, and the exact same problem occurred. Since I've gone through 4 brand new 750GB HDD now, (Seagate diagnostics show all the disks to be fine in both occurances, but I replaced them anyway) I'm feeling that this is not a hardware issue, but software related. A search on google seems to show others with possibly similar issues: http://ubuntuforums.org/archive/index.php/t-568309.html Is that related? Other google searches show a pattern of this problem only with >1TB XFS partitions, but that's just what I found googling. I'm considering re-installing again, but using ext3 for "/" to see if the problem reoccurs, in hopes of "isolating" the issue. Not sure if it is related to XFS, the software stripe md1, or something else (but I don't think it's HDD related now). Thanks for any info or assistance. Though the system isn't really usable, (many commands fail, but does boot to runlevel 3 and permits me to login) I'll leave it as is for today so let me know if there's other info I can try to gather that would be useful. Any help would be appreciated. -Bond From owner-xfs@oss.sgi.com Wed May 7 08:50:28 2008 Received: with ECARTIS (v1.0.0; list xfs); Wed, 07 May 2008 08:50: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,WHOIS_DMNBYPROXY 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 m47FoRFN005656 for ; Wed, 7 May 2008 08:50:28 -0700 X-ASG-Debug-ID: 1210175473-597a00fa0000-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 AA031B28CC1 for ; Wed, 7 May 2008 08:51:13 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by cuda.sgi.com with ESMTP id 3yf4FKBAWhtT4Kz8 for ; Wed, 07 May 2008 08:51:13 -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 m47FpAMX022020; Wed, 7 May 2008 11:51:10 -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 m47FpAvs011880; Wed, 7 May 2008 11:51:10 -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 m47Fp9hx001540; Wed, 7 May 2008 11:51:10 -0400 Message-ID: <4821CFED.4030804@sandeen.net> Date: Wed, 07 May 2008 10:51:09 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.12 (X11/20080226) MIME-Version: 1.0 To: Bond Masuda CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Is this XFS problem or something else? : xfs_trans_read_buf error 5 buf count 4096 Subject: Re: Is this XFS problem or something else? : xfs_trans_read_buf error 5 buf count 4096 References: <007001c898f5$cae2f4a0$60a8dde0$@masuda@jlbond.com> <20080407220106.GF108924158@sgi.com> <000001c8b058$2ae68460$80b38d20$@net> In-Reply-To: <000001c8b058$2ae68460$80b38d20$@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: 1210175473 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: 15814 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 Bond Masuda wrote: > Not sure if this is XFS related or not, but this seems to be reoccurring. You are probably hitting: https://bugzilla.redhat.com/show_bug.cgi?id=437968 Bugzilla Bug 437968: Corrupt xfs root filesystem with kernel kernel-2.6.24.3-xx Fix is in 2.6.25-rc9 upstream and kernel-2.6.24.5-85.fc8 has been submitted as an update for Fedora 8 and is now in stable. If you need to keep the system as-is I'd upgrade the kernel immediately, then try xfs_repair. A fresh install might be best; do an install, upgrade to that kernel, reboot into it, *then* yum update the rest. -Eric > The hardware is: > > Dell Inspiron 530, Q6600 quad core, 4GB Ram, 2x750GB SATA HDD > > I have Fedora 8/64bit installed, using XFS for "/", ext3 for "/boot". The > two identical 750GB drives are striped to create a 1.4TB "md1" device, which > is mounted as "/". Kernel is from Fedora8, 2.6.24.4-64.fc8. > > During the install, everything seemed to work fine. I was able to use the > system without any problems for about 2 days. Then I reboot, and the md1 > device running XFS shows the following error messages: > > I/O error in filesystem ("md1") meta-data dev md1 block 0x15d048574120008 > ("xfs_trans_read_buf") error 5 buf count 4096 > attempt to access beyond end of device > md1: rw=0, want=98239738096517136, limit=2927780864 > > The above message repeats several times, but the system manages to boot to > runlevel 3. I can login, but almost any command triggers that message which > has flooded the logs. here is xfs_info on "/": > > meta-data=/dev/root isize=256 agcount=32, > agsize=11436608 blks > = sectsz=512 attr=1 > data = bsize=4096 > blocks=365971456, imaxpct=25 > = sunit=64 swidth=128 > blks, unwritten=1 > naming =version2 bsize=4096 > log =internal bsize=4096 blocks=32768, > version=1 > = sectsz=512 sunit=0 > blks, lazy-count=0 > realtime =none extsz=524288 blocks=0, rtextents=0 > > At first, I thought perhaps something wrong with the disks so I had them > replaced. Reinstalled Fedora8 as before, then again, 2 days later (I don't > know if the 2 day time period is coincidental or not), I reboot, and the > exact same problem occurred. Since I've gone through 4 brand new 750GB HDD > now, (Seagate diagnostics show all the disks to be fine in both occurances, > but I replaced them anyway) I'm feeling that this is not a hardware issue, > but software related. > > A search on google seems to show others with possibly similar issues: > > http://ubuntuforums.org/archive/index.php/t-568309.html > > Is that related? Other google searches show a pattern of this problem only > with >1TB XFS partitions, but that's just what I found googling. > > I'm considering re-installing again, but using ext3 for "/" to see if the > problem reoccurs, in hopes of "isolating" the issue. Not sure if it is > related to XFS, the software stripe md1, or something else (but I don't > think it's HDD related now). > > Thanks for any info or assistance. Though the system isn't really usable, > (many commands fail, but does boot to runlevel 3 and permits me to login) > I'll leave it as is for today so let me know if there's other info I can try > to gather that would be useful. > > Any help would be appreciated. > -Bond > > > From owner-xfs@oss.sgi.com Wed May 7 17:01:25 2008 Received: with ECARTIS (v1.0.0; list xfs); Wed, 07 May 2008 17:01: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 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 m4801M2g013749 for ; Wed, 7 May 2008 17:01:24 -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 KAA02129; Thu, 8 May 2008 10:02:05 +1000 Received: by chook.melbourne.sgi.com (Postfix, from userid 16346) id 2E92158C4C15; Thu, 8 May 2008 10:02:05 +1000 (EST) To: sgi.bugs.xfs@engr.sgi.com Cc: xfs@oss.sgi.com Subject: TAKE 980705 - Correctly detect if dmapi is present or not in tests 175-177 Message-Id: <20080508000205.2E92158C4C15@chook.melbourne.sgi.com> Date: Thu, 8 May 2008 10:02:05 +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: 15816 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 Correctly detect if dmapi is present or not in tests 175-177 Date: Thu May 8 10:01:42 AEST 2008 Workarea: chook.melbourne.sgi.com:/build/dgc/isms/xfs-cmds 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:31032a xfstests/177 - 1.3 - changed http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-cmds/xfstests/177.diff?r1=text&tr1=1.3&r2=text&tr2=1.2&f=h xfstests/175 - 1.2 - changed http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-cmds/xfstests/175.diff?r1=text&tr1=1.2&r2=text&tr2=1.1&f=h xfstests/176 - 1.2 - changed http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-cmds/xfstests/176.diff?r1=text&tr1=1.2&r2=text&tr2=1.1&f=h - Correctly detect if dmapi is present. From owner-xfs@oss.sgi.com Wed May 7 16:58:25 2008 Received: with ECARTIS (v1.0.0; list xfs); Wed, 07 May 2008 16:58:53 -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 m47NwKKT013457 for ; Wed, 7 May 2008 16:58:24 -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 JAA01948; Thu, 8 May 2008 09:59:01 +1000 Received: by chook.melbourne.sgi.com (Postfix, from userid 16346) id 8680E58C4C15; Thu, 8 May 2008 09:59:01 +1000 (EST) To: sgi.bugs.xfs@engr.sgi.com Cc: xfs@oss.sgi.com Subject: TAKE 979083 - xfsqa 166 - Use standard awk comment format. Message-Id: <20080507235901.8680E58C4C15@chook.melbourne.sgi.com> Date: Thu, 8 May 2008 09:59:01 +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: 15815 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 Use standard awk comment format. Date: Thu May 8 09:58:42 AEST 2008 Workarea: chook.melbourne.sgi.com:/build/dgc/isms/xfs-cmds Inspected by: hch@infradead.org The following file(s) were checked into: longdrop.melbourne.sgi.com:/isms/xfs-cmds/master-melb Modid: master-melb:xfs-cmds:31031a xfstests/166 - 1.5 - changed http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-cmds/xfstests/166.diff?r1=text&tr1=1.5&r2=text&tr2=1.4&f=h - Use standard awk comment format. From owner-xfs@oss.sgi.com Wed May 7 18:13:04 2008 Received: with ECARTIS (v1.0.0; list xfs); Wed, 07 May 2008 18:13: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.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 m481D0s0018823 for ; Wed, 7 May 2008 18:13:02 -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 LAA03848; Thu, 8 May 2008 11:13:42 +1000 Received: by chook.melbourne.sgi.com (Postfix, from userid 16346) id 2710A58C4C15; Thu, 8 May 2008 11:13:42 +1000 (EST) To: sgi.bugs.xfs@engr.sgi.com Cc: xfs@oss.sgi.com Subject: TAKE 981296 - Fix fsync() b0rkage. Message-Id: <20080508011342.2710A58C4C15@chook.melbourne.sgi.com> Date: Thu, 8 May 2008 11:13:42 +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: 15817 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. 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. Date: Thu May 8 11:13:29 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:31033a fs/xfs/xfs_vnodeops.c - 1.758 - changed http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-linux/xfs_vnodeops.c.diff?r1=text&tr1=1.758&r2=text&tr2=1.757&f=h - fix xfs_fsync() to make fsync wait for data I/O completion and inode size updates correctly. fs/xfs/linux-2.6/xfs_file.c - 1.165 - changed http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-linux/linux-2.6/xfs_file.c.diff?r1=text&tr1=1.165&r2=text&tr2=1.164&f=h - fsync and fdatasync are implemented identically now. fs/xfs/linux-2.6/xfs_vnode.h - 1.150 - changed http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-linux/linux-2.6/xfs_vnode.h.diff?r1=text&tr1=1.150&r2=text&tr2=1.149&f=h - remove xfs_fsync() flags are they are unused now. fs/xfs/dmapi/xfs_dm.c - 1.71 - changed http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-linux/dmapi/xfs_dm.c.diff?r1=text&tr1=1.71&r2=text&tr2=1.70&f=h - clean up xfs_fsync() usage. fs/xfs/xfs_vnodeops.h - 1.16 - changed http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-linux/xfs_vnodeops.h.diff?r1=text&tr1=1.16&r2=text&tr2=1.15&f=h - remove unused flags from xfs_fsync(). From owner-xfs@oss.sgi.com Thu May 8 18:00:51 2008 Received: with ECARTIS (v1.0.0; list xfs); Thu, 08 May 2008 18:01: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.0 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_37 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 m4910kAW005802 for ; Thu, 8 May 2008 18:00:49 -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 LAA03744; Fri, 9 May 2008 11:01:31 +1000 Received: by chook.melbourne.sgi.com (Postfix, from userid 1116) id 2139D58C4C15; Fri, 9 May 2008 11:01:31 +1000 (EST) To: xfs@oss.sgi.com, xfs-bugs-internal@sgi.com Subject: TAKE 981362 - update of xfstests 018,081,082 for onlink/gen# changes Message-Id: <20080509010131.2139D58C4C15@chook.melbourne.sgi.com> Date: Fri, 9 May 2008 11:01:31 +1000 (EST) From: tes@sgi.com (Tim Shimmin) 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: 15818 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 Filter out onlink (because of v2 inodes by default) and gen# (because of random generation). Date: Fri May 9 10:56:30 AEST 2008 Workarea: emu.melbourne.sgi.com:/home/tes/isms/xfs-cmds Inspected by: xaiki@sgi.com The following file(s) were checked into: longdrop.melbourne.sgi.com:/isms/xfs-cmds/master-melb Modid: master-melb:xfs-cmds:31049a xfstests/common.log - 1.16 - changed http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-cmds/xfstests/common.log.diff?r1=text&tr1=1.16&r2=text&tr2=1.15&f=h xfstests/081.ugquota.trans_inode - 1.6 - changed http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-cmds/xfstests/081.ugquota.trans_inode.diff?r1=text&tr1=1.6&r2=text&tr2=1.5&f=h xfstests/018.trans_inode - 1.4 - changed http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-cmds/xfstests/018.trans_inode.diff?r1=text&tr1=1.4&r2=text&tr2=1.3&f=h xfstests/082.trans_inode - 1.4 - changed http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-cmds/xfstests/082.trans_inode.diff?r1=text&tr1=1.4&r2=text&tr2=1.3&f=h xfstests/082.op.irix - 1.4 - changed http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-cmds/xfstests/082.op.irix.diff?r1=text&tr1=1.4&r2=text&tr2=1.3&f=h xfstests/018.op.linux - 1.4 - changed http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-cmds/xfstests/018.op.linux.diff?r1=text&tr1=1.4&r2=text&tr2=1.3&f=h xfstests/018.op.irix - 1.4 - changed http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-cmds/xfstests/018.op.irix.diff?r1=text&tr1=1.4&r2=text&tr2=1.3&f=h xfstests/082.op.linux - 1.4 - changed http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-cmds/xfstests/082.op.linux.diff?r1=text&tr1=1.4&r2=text&tr2=1.3&f=h - Filter out onlink (because of v2 inodes by default) and gen# (because of random generation). Subject: TAKE update xfstests/dmapi....Makefile.in regenerate dmapi Makefile in using automake Date: Thu May 1 16:07:18 AEST 2008 Workarea: emu.melbourne.sgi.com:/home/tes/isms/xfs-cmds Inspected by: xaiki@sgi.com The following file(s) were checked into: longdrop.melbourne.sgi.com:/isms/xfs-cmds/master-melb Modid: master-melb:xfs-cmds:31014a xfstests/dmapi/aclocal.m4 - 1.7 - changed http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-cmds/xfstests/dmapi/aclocal.m4.diff?r1=text&tr1=1.7&r2=text&tr2=1.6&f=h - regenerate using aclocal xfstests/dmapi/src/suite1/cmd/Makefile.in - 1.9 - changed http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-cmds/xfstests/dmapi/src/suite1/Makefile.in.diff?r1=text&tr1=1.9&r2=text&tr2=1.8&f=h - regenerate using automake automake doesn't have "default" target but uses "all" target instead Date: Mon May 5 14:28:09 AEST 2008 Workarea: emu.melbourne.sgi.com:/home/tes/isms/xfs-cmds Inspected by: tes,bnaujok The following file(s) were checked into: longdrop.melbourne.sgi.com:/isms/xfs-cmds/master-melb Modid: master-melb:xfs-cmds:31021a xfstests/Makefile - 1.17 - changed http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-cmds/xfstests/Makefile.diff?r1=text&tr1=1.17&r2=text&tr2=1.16&f=h - automake doesn't have "default" target but uses "all" target instead From owner-xfs@oss.sgi.com Thu May 8 18:10:31 2008 Received: with ECARTIS (v1.0.0; list xfs); Thu, 08 May 2008 18:10: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.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 m491AOle006439 for ; Thu, 8 May 2008 18:10: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 LAA03865; Fri, 9 May 2008 11:11:06 +1000 Received: by chook.melbourne.sgi.com (Postfix, from userid 16346) id 68F2B58C4C15; Fri, 9 May 2008 11:11:06 +1000 (EST) To: sgi.bugs.xfs@engr.sgi.com Cc: xfs@oss.sgi.com Subject: PARTIAL TAKE 981498 - Remove unused arg from kmem_free() Message-Id: <20080509011106.68F2B58C4C15@chook.melbourne.sgi.com> Date: Fri, 9 May 2008 11:11:06 +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: 15819 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 Remove unused arg from kmem_free() kmem_free() function takes (ptr, size) arguments but doesn't actually use second one. This patch removes size argument from all callsites. Signed-off-by: Denys Vlasenko Date: Fri May 9 11:10:35 AEST 2008 Workarea: chook.melbourne.sgi.com:/build/dgc/isms/2.6.x-xfs Inspected by: vda.linux@googlemail.com The following file(s) were checked into: longdrop.melbourne.sgi.com:/isms/linux/2.6.x-xfs-melb Modid: xfs-linux-melb:xfs-kern:31050a fs/xfs/xfs_log.c - 1.357 - changed http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-linux/xfs_log.c.diff?r1=text&tr1=1.357&r2=text&tr2=1.356&f=h - Remove unused arg from kmem_free() fs/xfs/xfs_extfree_item.c - 1.69 - changed http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-linux/xfs_extfree_item.c.diff?r1=text&tr1=1.69&r2=text&tr2=1.68&f=h - Remove unused arg from kmem_free() fs/xfs/xfs_buf_item.c - 1.166 - changed http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-linux/xfs_buf_item.c.diff?r1=text&tr1=1.166&r2=text&tr2=1.165&f=h - Remove unused arg from kmem_free() fs/xfs/xfs_trans_inode.c - 1.55 - changed http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-linux/xfs_trans_inode.c.diff?r1=text&tr1=1.55&r2=text&tr2=1.54&f=h - Remove unused arg from kmem_free() fs/xfs/xfs_da_btree.c - 1.177 - changed http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-linux/xfs_da_btree.c.diff?r1=text&tr1=1.177&r2=text&tr2=1.176&f=h - Remove unused arg from kmem_free() fs/xfs/xfs_dir2_block.c - 1.59 - changed http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-linux/xfs_dir2_block.c.diff?r1=text&tr1=1.59&r2=text&tr2=1.58&f=h - Remove unused arg from kmem_free() fs/xfs/xfs_rtalloc.c - 1.112 - changed http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-linux/xfs_rtalloc.c.diff?r1=text&tr1=1.112&r2=text&tr2=1.111&f=h - Remove unused arg from kmem_free() fs/xfs/xfs_itable.c - 1.165 - changed http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-linux/xfs_itable.c.diff?r1=text&tr1=1.165&r2=text&tr2=1.164&f=h - Remove unused arg from kmem_free() fs/xfs/xfs_inode_item.c - 1.136 - changed http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-linux/xfs_inode_item.c.diff?r1=text&tr1=1.136&r2=text&tr2=1.135&f=h - Remove unused arg from kmem_free() fs/xfs/xfs_log_recover.c - 1.344 - changed http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-linux/xfs_log_recover.c.diff?r1=text&tr1=1.344&r2=text&tr2=1.343&f=h - Remove unused arg from kmem_free() fs/xfs/xfs_trans_item.c - 1.47 - changed http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-linux/xfs_trans_item.c.diff?r1=text&tr1=1.47&r2=text&tr2=1.46&f=h - Remove unused arg from kmem_free() fs/xfs/xfs_vfsops.c - 1.564 - changed http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-linux/xfs_vfsops.c.diff?r1=text&tr1=1.564&r2=text&tr2=1.563&f=h - Remove unused arg from kmem_free() fs/xfs/xfs_dfrag.c - 1.67 - changed http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-linux/xfs_dfrag.c.diff?r1=text&tr1=1.67&r2=text&tr2=1.66&f=h - Remove unused arg from kmem_free() fs/xfs/xfs_dir2_sf.c - 1.51 - changed http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-linux/xfs_dir2_sf.c.diff?r1=text&tr1=1.51&r2=text&tr2=1.50&f=h - Remove unused arg from kmem_free() fs/xfs/xfs_mount.c - 1.431 - changed http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-linux/xfs_mount.c.diff?r1=text&tr1=1.431&r2=text&tr2=1.430&f=h - Remove unused arg from kmem_free() fs/xfs/xfs_inode.c - 1.502 - changed http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-linux/xfs_inode.c.diff?r1=text&tr1=1.502&r2=text&tr2=1.501&f=h - Remove unused arg from kmem_free() fs/xfs/xfs_dir2_leaf.c - 1.61 - changed http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-linux/xfs_dir2_leaf.c.diff?r1=text&tr1=1.61&r2=text&tr2=1.60&f=h - Remove unused arg from kmem_free() fs/xfs/xfs_attr_leaf.c - 1.111 - changed http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-linux/xfs_attr_leaf.c.diff?r1=text&tr1=1.111&r2=text&tr2=1.110&f=h - Remove unused arg from kmem_free() fs/xfs/xfs_trans.c - 1.185 - changed http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-linux/xfs_trans.c.diff?r1=text&tr1=1.185&r2=text&tr2=1.184&f=h - Remove unused arg from kmem_free() fs/xfs/xfs_error.c - 1.60 - changed http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-linux/xfs_error.c.diff?r1=text&tr1=1.60&r2=text&tr2=1.59&f=h - Remove unused arg from kmem_free() fs/xfs/xfs_bmap.c - 1.392 - changed http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-linux/xfs_bmap.c.diff?r1=text&tr1=1.392&r2=text&tr2=1.391&f=h - Remove unused arg from kmem_free() fs/xfs/xfs_dir2.c - 1.64 - changed http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-linux/xfs_dir2.c.diff?r1=text&tr1=1.64&r2=text&tr2=1.63&f=h - Remove unused arg from kmem_free() fs/xfs/support/ktrace.c - 1.31 - changed http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-linux/support/ktrace.c.diff?r1=text&tr1=1.31&r2=text&tr2=1.30&f=h - Remove unused arg from kmem_free() fs/xfs/quota/xfs_qm_syscalls.c - 1.43 - changed http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-linux/quota/xfs_qm_syscalls.c.diff?r1=text&tr1=1.43&r2=text&tr2=1.42&f=h - Remove unused arg from kmem_free() fs/xfs/quota/xfs_dquot_item.c - 1.22 - changed http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-linux/quota/xfs_dquot_item.c.diff?r1=text&tr1=1.22&r2=text&tr2=1.21&f=h - Remove unused arg from kmem_free() fs/xfs/quota/xfs_qm.c - 1.69 - changed http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-linux/quota/xfs_qm.c.diff?r1=text&tr1=1.69&r2=text&tr2=1.68&f=h - Remove unused arg from kmem_free() fs/xfs/linux-2.6/xfs_super.c - 1.416 - changed http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-linux/linux-2.6/xfs_super.c.diff?r1=text&tr1=1.416&r2=text&tr2=1.415&f=h - Remove unused arg from kmem_free() fs/xfs/linux-2.6/xfs_buf.c - 1.255 - changed http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-linux/linux-2.6/xfs_buf.c.diff?r1=text&tr1=1.255&r2=text&tr2=1.254&f=h - Remove unused arg from kmem_free() fs/xfs/linux-2.6/kmem.h - 1.46 - changed http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-linux/linux-2.6/kmem.h.diff?r1=text&tr1=1.46&r2=text&tr2=1.45&f=h - Remove unused arg from kmem_free() fs/xfs/linux-2.6/kmem.c - 1.13 - changed http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-linux/linux-2.6/kmem.c.diff?r1=text&tr1=1.13&r2=text&tr2=1.12&f=h - Remove unused arg from kmem_free() fs/xfs/xfs_mru_cache.c - 1.6 - changed http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-linux/xfs_mru_cache.c.diff?r1=text&tr1=1.6&r2=text&tr2=1.5&f=h - Remove unused arg from kmem_free() From owner-xfs@oss.sgi.com Thu May 8 18:14:08 2008 Received: with ECARTIS (v1.0.0; list xfs); Thu, 08 May 2008 18:14: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.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 m491E3gL007037 for ; Thu, 8 May 2008 18:14:06 -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 LAA03950; Fri, 9 May 2008 11:14:45 +1000 Received: by chook.melbourne.sgi.com (Postfix, from userid 16346) id ABF3D58C4C15; Fri, 9 May 2008 11:14:45 +1000 (EST) To: sgi.bugs.xfs@engr.sgi.com Cc: xfs@oss.sgi.com Subject: PARTIAL TAKE 981498 - Remove unused kmem_free() args from XFS DMAPI code. Message-Id: <20080509011445.ABF3D58C4C15@chook.melbourne.sgi.com> Date: Fri, 9 May 2008 11:14:45 +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: 15820 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 Remove unused kmem_free() args from XFS DMAPI code. Date: Fri May 9 11:14:19 AEST 2008 Workarea: chook.melbourne.sgi.com:/build/dgc/isms/2.6.x-xfs Inspected by: dgc@sgi.com The following file(s) were checked into: longdrop.melbourne.sgi.com:/isms/linux/2.6.x-xfs-melb Modid: xfs-linux-melb:xfs-kern:31054a fs/xfs/dmapi/xfs_dm.c - 1.72 - changed http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-linux/dmapi/xfs_dm.c.diff?r1=text&tr1=1.72&r2=text&tr2=1.71&f=h - remove unused kmem_free() arg. From owner-xfs@oss.sgi.com Thu May 8 18:16:04 2008 Received: with ECARTIS (v1.0.0; list xfs); Thu, 08 May 2008 18:16: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.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 m491G0p4007308 for ; Thu, 8 May 2008 18:16:03 -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 LAA04024; Fri, 9 May 2008 11:16:46 +1000 Received: by chook.melbourne.sgi.com (Postfix, from userid 1116) id 5424558C4C15; Fri, 9 May 2008 11:16:46 +1000 (EST) To: xfs@oss.sgi.com, xfs-bugs-internal@sgi.com Subject: TAKE 981361 - xfstests/016 Message-Id: <20080509011646.5424558C4C15@chook.melbourne.sgi.com> Date: Fri, 9 May 2008 11:16:46 +1000 (EST) From: tes@sgi.com (Tim Shimmin) 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: 15821 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 Sample the log traffic to work out its data rate so that we have a better idea of predicting when it will get to the end of the log. This way we can handle a change in log traffic in the future. A test to keep an eye on log traffic is more of a performance test than should be done elsewhere. --Tim Date: Fri May 9 11:15:14 AEST 2008 Workarea: emu.melbourne.sgi.com:/home/tes/isms/xfs-cmds Inspected by: xaiki@sgi.com The following file(s) were checked into: longdrop.melbourne.sgi.com:/isms/xfs-cmds/master-melb Modid: master-melb:xfs-cmds:31053a xfstests/016 - 1.21 - changed http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-cmds/xfstests/016.diff?r1=text&tr1=1.21&r2=text&tr2=1.20&f=h xfstests/016.out - 1.2 - changed http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-cmds/xfstests/016.out.diff?r1=text&tr1=1.2&r2=text&tr2=1.1&f=h - Sample the log traffic to work out its data rate so that we have a better idea of predicting when it will get to the end of the log. This way we can handle a change in log traffic in the future. From owner-xfs@oss.sgi.com Thu May 8 18:19:55 2008 Received: with ECARTIS (v1.0.0; list xfs); Thu, 08 May 2008 18:20:02 -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 m491JpJG007951 for ; Thu, 8 May 2008 18:19:53 -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 LAA04270; Fri, 9 May 2008 11:20:26 +1000 Received: by chook.melbourne.sgi.com (Postfix, from userid 16346) id 1309558C4C15; Fri, 9 May 2008 11:20:26 +1000 (EST) To: sgi.bugs.xfs@engr.sgi.com Cc: xfs@oss.sgi.com Subject: PARTIAL TAKE 981498 - Remove unused flags parameter from xfs_qm_dqpurge Message-Id: <20080509012026.1309558C4C15@chook.melbourne.sgi.com> Date: Fri, 9 May 2008 11:20:26 +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: 15822 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 Remove unused flags parameter from xfs_qm_dqpurge() Signed-off-by: Denys Vlasenko Date: Fri May 9 11:19:40 AEST 2008 Workarea: chook.melbourne.sgi.com:/build/dgc/isms/2.6.x-xfs Inspected by: dgc@sgi.com The following file(s) were checked into: longdrop.melbourne.sgi.com:/isms/linux/2.6.x-xfs-melb Modid: xfs-linux-melb:xfs-kern:31056a fs/xfs/quota/xfs_dquot.h - 1.12 - changed http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-linux/quota/xfs_dquot.h.diff?r1=text&tr1=1.12&r2=text&tr2=1.11&f=h - remove unused flag parameter from xfs_qm_dqpurge. fs/xfs/quota/xfs_dquot.c - 1.34 - changed http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-linux/quota/xfs_dquot.c.diff?r1=text&tr1=1.34&r2=text&tr2=1.33&f=h - remove unused flag parameter from xfs_qm_dqpurge. fs/xfs/quota/xfs_qm.c - 1.70 - changed http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-linux/quota/xfs_qm.c.diff?r1=text&tr1=1.70&r2=text&tr2=1.69&f=h - remove unused flag parameter from xfs_qm_dqpurge. From owner-xfs@oss.sgi.com Thu May 8 18:23:57 2008 Received: with ECARTIS (v1.0.0; list xfs); Thu, 08 May 2008 18:24: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.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 m491NsrH008521 for ; Thu, 8 May 2008 18:23:56 -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 LAA04423; Fri, 9 May 2008 11:24:36 +1000 Received: by chook.melbourne.sgi.com (Postfix, from userid 16346) id 918CA58C4C15; Fri, 9 May 2008 11:24:36 +1000 (EST) To: sgi.bugs.xfs@engr.sgi.com Cc: xfs@oss.sgi.com Subject: PARTIAL TAKE 981498 - Remove unused wbc parameter from xfs_start_page_writeback() Message-Id: <20080509012436.918CA58C4C15@chook.melbourne.sgi.com> Date: Fri, 9 May 2008 11:24:36 +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: 15823 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 Remove unused wbc parameter from xfs_start_page_writeback() Signed-off-by: Denys Vlasenko Date: Fri May 9 11:24:08 AEST 2008 Workarea: chook.melbourne.sgi.com:/build/dgc/isms/2.6.x-xfs Inspected by: vda.linux@googlemail.com The following file(s) were checked into: longdrop.melbourne.sgi.com:/isms/linux/2.6.x-xfs-melb Modid: xfs-linux-melb:xfs-kern:31057a fs/xfs/linux-2.6/xfs_aops.c - 1.162 - changed http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-linux/linux-2.6/xfs_aops.c.diff?r1=text&tr1=1.162&r2=text&tr2=1.161&f=h - Remove unused wbc parameter from xfs_start_page_writeback From owner-xfs@oss.sgi.com Thu May 8 18:32:59 2008 Received: with ECARTIS (v1.0.0; list xfs); Thu, 08 May 2008 18:33: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.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 m491WtVt009256 for ; Thu, 8 May 2008 18:32:58 -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 LAA04685; Fri, 9 May 2008 11:33:38 +1000 Received: by chook.melbourne.sgi.com (Postfix, from userid 16346) id 4264358C4C15; Fri, 9 May 2008 11:33:38 +1000 (EST) To: sgi.bugs.xfs@engr.sgi.com Cc: xfs@oss.sgi.com Subject: TAKE 981502 - Ensure that 2 GiB xfs logs work properly. Message-Id: <20080509013338.4264358C4C15@chook.melbourne.sgi.com> Date: Fri, 9 May 2008 11:33:38 +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: 15824 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 Ensure that 2 GiB xfs logs work properly. We found this while experimenting with 2GiB xfs logs. The previous code never assumed that xfs logs would ever get so large. Signed-off-by: Michael Nishimoto Date: Fri May 9 11:33:19 AEST 2008 Workarea: chook.melbourne.sgi.com:/build/dgc/isms/2.6.x-xfs Inspected by: miken@agami.com The following file(s) were checked into: longdrop.melbourne.sgi.com:/isms/linux/2.6.x-xfs-melb Modid: xfs-linux-melb:xfs-kern:31058a fs/xfs/xfs_log.c - 1.358 - changed http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-linux/xfs_log.c.diff?r1=text&tr1=1.358&r2=text&tr2=1.357&f=h - Fix log space wrapping issue when using 2GB logs. From owner-xfs@oss.sgi.com Thu May 8 18:54:13 2008 Received: with ECARTIS (v1.0.0; list xfs); Thu, 08 May 2008 18: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.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 m491s8ws010488 for ; Thu, 8 May 2008 18:54:12 -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 LAA05301; Fri, 9 May 2008 11:54:50 +1000 Received: by chook.melbourne.sgi.com (Postfix, from userid 16346) id A416C58C4C15; Fri, 9 May 2008 11:54:50 +1000 (EST) To: sgi.bugs.xfs@engr.sgi.com Cc: xfs@oss.sgi.com Subject: TAKE 981507 - Convert l_flushsema to a sv_t Message-Id: <20080509015450.A416C58C4C15@chook.melbourne.sgi.com> Date: Fri, 9 May 2008 11:54:50 +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: 15825 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 Convert l_flushsema to a sv_t The l_flushsema doesn't exactly have completion semantics, nor mutex semantics. It's used as a list of tasks which are waiting to be notified that a flush has completed. It was also being used in a way that was potentially racy, depending on the semaphore implementation. By using a sv_t instead of a semaphore we avoid the need for a separate counter, since we know we just need to wake everything on the queue. Original waitqueue implementation from Matthew Wilcox. Cleanup and conversion to sv_t by Christoph Hellwig. Signed-off-by: Matthew Wilcox Signed-off-by: Christoph Hellwig Date: Fri May 9 11:54:32 AEST 2008 Workarea: chook.melbourne.sgi.com:/build/dgc/isms/2.6.x-xfs Inspected by: willy@linux.intel.com,hch@lst.de The following file(s) were checked into: longdrop.melbourne.sgi.com:/isms/linux/2.6.x-xfs-melb Modid: xfs-linux-melb:xfs-kern:31059a fs/xfs/xfsidbg.c - 1.349 - changed http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-linux/xfsidbg.c.diff?r1=text&tr1=1.349&r2=text&tr2=1.348&f=h - Convert l_flushsema to a sv_t fs/xfs/xfs_log.c - 1.359 - changed http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-linux/xfs_log.c.diff?r1=text&tr1=1.359&r2=text&tr2=1.358&f=h - Convert l_flushsema to a sv_t fs/xfs/xfs_log_priv.h - 1.131 - changed http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-linux/xfs_log_priv.h.diff?r1=text&tr1=1.131&r2=text&tr2=1.130&f=h - Convert l_flushsema to a sv_t From owner-xfs@oss.sgi.com Thu May 8 23:25:13 2008 Received: with ECARTIS (v1.0.0; list xfs); Thu, 08 May 2008 23:25: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 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 m496PADM029861 for ; Thu, 8 May 2008 23:25:13 -0700 X-ASG-Debug-ID: 1210314354-024101260000-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 7F71914A378 for ; Thu, 8 May 2008 23:25:54 -0700 (PDT) Received: from verein.lst.de (verein.lst.de [213.95.11.210]) by cuda.sgi.com with ESMTP id KC4kBaLIFtGaza6B for ; Thu, 08 May 2008 23:25:54 -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 m496PkF3024899 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO) for ; Fri, 9 May 2008 08:25:46 +0200 Received: (from hch@localhost) by verein.lst.de (8.12.3/8.12.3/Debian-6.6) id m496Pkpw024897 for xfs@oss.sgi.com; Fri, 9 May 2008 08:25:46 +0200 Date: Fri, 9 May 2008 08:25:45 +0200 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] merge xfs_mntupdate into xfs_fs_remount Subject: Re: [PATCH] merge xfs_mntupdate into xfs_fs_remount Message-ID: <20080509062545.GA24784@lst.de> References: <20080426201029.GB14172@lst.de> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20080426201029.GB14172@lst.de> 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: 1210314356 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.49834 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: 15826 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 Sat, Apr 26, 2008 at 10:10:29PM +0200, Christoph Hellwig wrote: > xfs_mntupdate already is completely Linux specific due to the VFS flags > passed in, so it might aswell be merged into xfs_fs_remount. > > > Signed-off-by: Christoph Hellwig Updated version ontop of the kmem_free signature change: 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-09 08:16:46.000000000 +0200 +++ linux-2.6-xfs/fs/xfs/linux-2.6/xfs_super.c 2008-05-09 08:17:30.000000000 +0200 @@ -52,6 +52,7 @@ #include "xfs_version.h" #include "xfs_log_priv.h" #include "xfs_trans_priv.h" +#include "xfs_filestream.h" #include #include @@ -1221,8 +1222,26 @@ xfs_fs_remount( int error; error = xfs_parseargs(mp, options, args, 1); - if (!error) - error = xfs_mntupdate(mp, flags, args); + if (error) + goto out_free_args; + + if (!(*flags & MS_RDONLY)) { /* rw/ro -> rw */ + if (mp->m_flags & XFS_MOUNT_RDONLY) + mp->m_flags &= ~XFS_MOUNT_RDONLY; + if (args->flags & XFSMNT_BARRIER) { + mp->m_flags |= XFS_MOUNT_BARRIER; + xfs_mountfs_check_barriers(mp); + } else { + mp->m_flags &= ~XFS_MOUNT_BARRIER; + } + } else if (!(mp->m_flags & XFS_MOUNT_RDONLY)) { /* rw -> ro */ + xfs_filestream_flush(mp); + xfs_sync(mp, SYNC_DATA_QUIESCE); + xfs_attr_quiesce(mp); + mp->m_flags |= XFS_MOUNT_RDONLY; + } + + out_free_args: kmem_free(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-09 08:16:46.000000000 +0200 +++ linux-2.6-xfs/fs/xfs/xfs_vfsops.c 2008-05-09 08:16:55.000000000 +0200 @@ -701,30 +701,6 @@ xfs_attr_quiesce( xfs_unmountfs_writesb(mp); } -int -xfs_mntupdate( - struct xfs_mount *mp, - int *flags, - struct xfs_mount_args *args) -{ - if (!(*flags & MS_RDONLY)) { /* rw/ro -> rw */ - if (mp->m_flags & XFS_MOUNT_RDONLY) - mp->m_flags &= ~XFS_MOUNT_RDONLY; - if (args->flags & XFSMNT_BARRIER) { - mp->m_flags |= XFS_MOUNT_BARRIER; - xfs_mountfs_check_barriers(mp); - } else { - mp->m_flags &= ~XFS_MOUNT_BARRIER; - } - } else if (!(mp->m_flags & XFS_MOUNT_RDONLY)) { /* rw -> ro */ - xfs_filestream_flush(mp); - xfs_sync(mp, SYNC_DATA_QUIESCE); - xfs_attr_quiesce(mp); - mp->m_flags |= XFS_MOUNT_RDONLY; - } - return 0; -} - /* * xfs_unmount_flush implements a set of flush operation on special * inodes, which are needed as a separate set of operations so that Index: linux-2.6-xfs/fs/xfs/xfs_vfsops.h =================================================================== --- linux-2.6-xfs.orig/fs/xfs/xfs_vfsops.h 2008-05-09 08:16:46.000000000 +0200 +++ linux-2.6-xfs/fs/xfs/xfs_vfsops.h 2008-05-09 08:16:55.000000000 +0200 @@ -11,8 +11,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_mntupdate(struct xfs_mount *mp, int *flags, - struct xfs_mount_args *args); 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 8 23:31:23 2008 Received: with ECARTIS (v1.0.0; list xfs); Thu, 08 May 2008 23:31: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.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 m496VJn6030379 for ; Thu, 8 May 2008 23:31:23 -0700 X-ASG-Debug-ID: 1210314725-568a018e0000-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 0E383167AE4C for ; Thu, 8 May 2008 23:32:05 -0700 (PDT) Received: from verein.lst.de (verein.lst.de [213.95.11.210]) by cuda.sgi.com with ESMTP id NSnIAbn7QMKDquWd for ; Thu, 08 May 2008 23:32:05 -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 m496VwF3025314 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO) for ; Fri, 9 May 2008 08:31:58 +0200 Received: (from hch@localhost) by verein.lst.de (8.12.3/8.12.3/Debian-6.6) id m496VwKd025312 for xfs@oss.sgi.com; Fri, 9 May 2008 08:31:58 +0200 Date: Fri, 9 May 2008 08:31:58 +0200 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 1/10] merge xfs_unmount into xfs_fs_put_super / xfs_fs_fill_super Subject: Re: [PATCH 1/10] merge xfs_unmount into xfs_fs_put_super / xfs_fs_fill_super Message-ID: <20080509063158.GA25251@lst.de> References: <20080501220048.GA2315@lst.de> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20080501220048.GA2315@lst.de> 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: 1210314726 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.49836 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: 15827 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 12:00:48AM +0200, Christoph Hellwig wrote: > 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. Respin ontop of the kmem_free signature change: 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-09 08:18:05.000000000 +0200 +++ linux-2.6-xfs/fs/xfs/linux-2.6/xfs_super.c 2008-05-09 08:27:09.000000000 +0200 @@ -1088,14 +1088,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); } STATIC void @@ -1402,7 +1449,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); fail_vfsop: kmem_free(args); Index: linux-2.6-xfs/fs/xfs/xfs_vfsops.c =================================================================== --- linux-2.6-xfs.orig/fs/xfs/xfs_vfsops.c 2008-05-09 08:16:55.000000000 +0200 +++ linux-2.6-xfs/fs/xfs/xfs_vfsops.c 2008-05-09 08:26:40.000000000 +0200 @@ -558,93 +558,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); - } - - 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-05-09 08:16:55.000000000 +0200 +++ linux-2.6-xfs/fs/xfs/xfs_vfsops.h 2008-05-09 08:26:11.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 8 23:39:34 2008 Received: with ECARTIS (v1.0.0; list xfs); Thu, 08 May 2008 23:39:53 -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_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 m496dWTu030969 for ; Thu, 8 May 2008 23:39:34 -0700 X-ASG-Debug-ID: 1210315213-7d8100de0000-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 C791C10FC42A for ; Thu, 8 May 2008 23:40:14 -0700 (PDT) Received: from verein.lst.de (verein.lst.de [213.95.11.210]) by cuda.sgi.com with ESMTP id KYkBWxaYlVGYDHaI for ; Thu, 08 May 2008 23:40:14 -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 m496e5F3025751 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO) for ; Fri, 9 May 2008 08:40:05 +0200 Received: (from hch@localhost) by verein.lst.de (8.12.3/8.12.3/Debian-6.6) id m496e5a7025747 for xfs@oss.sgi.com; Fri, 9 May 2008 08:40:05 +0200 Date: Fri, 9 May 2008 08:40:05 +0200 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 2/10] merge xfs_mount into xfs_fs_fill_super Subject: Re: [PATCH 2/10] merge xfs_mount into xfs_fs_fill_super Message-ID: <20080509064004.GB25251@lst.de> References: <20080501220054.GB2315@lst.de> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20080501220054.GB2315@lst.de> 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: 1210315217 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.49834 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: 15828 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 12:00:54AM +0200, Christoph Hellwig wrote: > 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 Respin ontop of the kmem_free signature change: Index: linux-2.6-xfs/fs/xfs/xfs_vfsops.h =================================================================== --- linux-2.6-xfs.orig/fs/xfs/xfs_vfsops.h 2008-05-09 08:26:11.000000000 +0200 +++ linux-2.6-xfs/fs/xfs/xfs_vfsops.h 2008-05-09 08:32:07.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-09 08:27:09.000000000 +0200 +++ linux-2.6-xfs/fs/xfs/linux-2.6/xfs_super.c 2008-05-09 08:32:33.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); 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); -fail_vfsop: + fail_vfsop: kmem_free(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-09 08:26:40.000000000 +0200 +++ linux-2.6-xfs/fs/xfs/xfs_vfsops.c 2008-05-09 08:32:07.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 8 23:42:34 2008 Received: with ECARTIS (v1.0.0; list xfs); Thu, 08 May 2008 23:42: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.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 m496gUvQ031221 for ; Thu, 8 May 2008 23:42:34 -0700 X-ASG-Debug-ID: 1210315395-7d8101000000-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 CB19210FC776 for ; Thu, 8 May 2008 23:43:15 -0700 (PDT) Received: from verein.lst.de (verein.lst.de [213.95.11.210]) by cuda.sgi.com with ESMTP id 1qZ3Y1jGaTnMXoQO for ; Thu, 08 May 2008 23:43:15 -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 m496h8F3025904 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO) for ; Fri, 9 May 2008 08:43:09 +0200 Received: (from hch@localhost) by verein.lst.de (8.12.3/8.12.3/Debian-6.6) id m496h86G025902 for xfs@oss.sgi.com; Fri, 9 May 2008 08:43:08 +0200 Date: Fri, 9 May 2008 08:43:08 +0200 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 6/10] allow xfs_args_allocate to fail Subject: Re: [PATCH 6/10] allow xfs_args_allocate to fail Message-ID: <20080509064308.GC25251@lst.de> References: <20080501220115.GF2315@lst.de> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20080501220115.GF2315@lst.de> 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: 1210315396 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.49834 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: 15829 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 12:01:15AM +0200, Christoph Hellwig wrote: > Switch xfs_args_allocate to kzalloc and handle failures. > > Signed-off-by: Christoph Hellwig Respin ontop of the kmem_free signature change: 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-09 08:40:14.000000000 +0200 +++ linux-2.6-xfs/fs/xfs/linux-2.6/xfs_super.c 2008-05-09 08:40:54.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); + 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); + kfree(args); return 0; error2: @@ -1875,7 +1886,7 @@ xfs_fs_fill_super( kmem_free(mp); fail_vfsop: - kmem_free(args); + kfree(args); return -error; } From owner-xfs@oss.sgi.com Thu May 8 23:47:15 2008 Received: with ECARTIS (v1.0.0; list xfs); Thu, 08 May 2008 23:47: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.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 m496lE1U031874 for ; Thu, 8 May 2008 23:47:15 -0700 X-ASG-Debug-ID: 1210315679-4741031e0000-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 261BF167AF62 for ; Thu, 8 May 2008 23:47:59 -0700 (PDT) Received: from verein.lst.de (verein.lst.de [213.95.11.210]) by cuda.sgi.com with ESMTP id 8WOBI6kulf8kdilQ for ; Thu, 08 May 2008 23:47:59 -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 m496lqF3026076 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO) for ; Fri, 9 May 2008 08:47:52 +0200 Received: (from hch@localhost) by verein.lst.de (8.12.3/8.12.3/Debian-6.6) id m496lq3L026074 for xfs@oss.sgi.com; Fri, 9 May 2008 08:47:52 +0200 Date: Fri, 9 May 2008 08:47:52 +0200 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 7/10] kill xfs_mount_init Subject: Re: [PATCH 7/10] kill xfs_mount_init Message-ID: <20080509064752.GD25251@lst.de> References: <20080501220119.GG2315@lst.de> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20080501220119.GG2315@lst.de> 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: 1210315681 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.49836 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: 15830 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 12:01:19AM +0200, Christoph Hellwig wrote: > 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 Resping ontop of the kmem_free signature change: 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-09 08:40:54.000000000 +0200 +++ linux-2.6-xfs/fs/xfs/linux-2.6/xfs_super.c 2008-05-09 08:44:57.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); + 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(struct xfs_mount), 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); - - 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-09 08:40:13.000000000 +0200 +++ linux-2.6-xfs/fs/xfs/xfs_mount.c 2008-05-09 08:43:37.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) { @@ -177,8 +155,6 @@ xfs_mount_free( kmem_free(mp->m_rtname); if (mp->m_logname != NULL) kmem_free(mp->m_logname); - - xfs_icsb_destroy_counters(mp); } /* @@ -2092,7 +2068,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-09 08:40:13.000000000 +0200 +++ linux-2.6-xfs/fs/xfs/xfs_mount.h 2008-05-09 08:43:20.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-09 08:14:56.000000000 +0200 +++ linux-2.6-xfs/fs/xfs/linux-2.6/xfs_ksyms.c 2008-05-09 08:43:20.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 Sat May 10 20:47:37 2008 Received: with ECARTIS (v1.0.0; list xfs); Sat, 10 May 2008 20:48: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.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 m4B3lVrP016898 for ; Sat, 10 May 2008 20:47:37 -0700 X-ASG-Debug-ID: 1210477694-063402ba0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from e23smtp04.au.ibm.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 6D350150FB3 for ; Sat, 10 May 2008 20:48:15 -0700 (PDT) Received: from e23smtp04.au.ibm.com (E23SMTP04.au.ibm.com [202.81.18.173]) by cuda.sgi.com with ESMTP id FNpKd7yYCeMkOPjA for ; Sat, 10 May 2008 20:48:15 -0700 (PDT) Received: from sd0109e.au.ibm.com (d23rh905.au.ibm.com [202.81.18.225]) by e23smtp04.au.ibm.com (8.13.1/8.13.1) with ESMTP id m4B3lYvm021408 for ; Sun, 11 May 2008 13:47:34 +1000 Received: from d23av04.au.ibm.com (d23av04.au.ibm.com [9.190.235.139]) by sd0109e.au.ibm.com (8.13.8/8.13.8/NCO v8.7) with ESMTP id m4B3qGt5179872 for ; Sun, 11 May 2008 13:52:17 +1000 Received: from d23av04.au.ibm.com (loopback [127.0.0.1]) by d23av04.au.ibm.com (8.12.11.20060308/8.13.3) with ESMTP id m4B3mCYq013544 for ; Sun, 11 May 2008 13:48:12 +1000 Received: from [9.124.217.171] ([9.124.217.171]) by d23av04.au.ibm.com (8.12.11.20060308/8.12.11) with ESMTP id m4B3m8R3013524; Sun, 11 May 2008 13:48:09 +1000 Message-ID: <48266C77.3040102@linux.vnet.ibm.com> Date: Sun, 11 May 2008 09:18:07 +0530 From: Kamalesh Babulal User-Agent: Thunderbird 1.5.0.14ubu (X11/20080505) MIME-Version: 1.0 To: pvp-lsts@fs.ru.acad.bg CC: Alexander Beregalov , kernel-testers@vger.kernel.org, kernel list , Ingo Molnar , peterz@infradead.org, xfs@oss.sgi.com, David Chinner X-ASG-Orig-Subj: Re: 2.6.26-rc1: possible circular locking dependency with xfs filesystem Subject: Re: 2.6.26-rc1: possible circular locking dependency with xfs filesystem References: <4825DF71.1030209@linux.vnet.ibm.com> In-Reply-To: <4825DF71.1030209@linux.vnet.ibm.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: E23SMTP04.au.ibm.com[202.81.18.173] X-Barracuda-Start-Time: 1210477697 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.50020 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: 15831 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: kamalesh@linux.vnet.ibm.com Precedence: bulk X-list: xfs Kamalesh Babulal wrote: > Adding the cc to kernel-list, Ingo Molnar and Peter Zijlstra > > Alexander Beregalov wrote: >> [ INFO: possible circular locking dependency detected ] >> 2.6.26-rc1-00279-g28a4acb #13 >> ------------------------------------------------------- >> nfsd/3087 is trying to acquire lock: >> (iprune_mutex){--..}, at: [] shrink_icache_memory+0x38/0x19b >> >> but task is already holding lock: >> (&(&ip->i_iolock)->mr_lock){----}, at: [] xfs_ilock+0xa2/0xd6 >> >> which lock already depends on the new lock. >> >> >> the existing dependency chain (in reverse order) is: >> >> -> #1 (&(&ip->i_iolock)->mr_lock){----}: >> [] __lock_acquire+0xa0c/0xbc6 >> [] lock_acquire+0x6a/0x86 >> [] down_write_nested+0x33/0x6a >> [] xfs_ilock+0x7b/0xd6 >> [] xfs_ireclaim+0x1d/0x59 >> [] xfs_finish_reclaim+0x173/0x195 >> [] xfs_reclaim+0xb3/0x138 >> [] xfs_fs_clear_inode+0x55/0x8e >> [] clear_inode+0x83/0xd2 >> [] dispose_list+0x3c/0xc1 >> [] shrink_icache_memory+0x173/0x19b >> [] shrink_slab+0xda/0x14e >> [] try_to_free_pages+0x1e4/0x2a2 >> [] __alloc_pages_internal+0x23a/0x39d >> [] __alloc_pages+0xa/0xc >> [] __do_page_cache_readahead+0xaa/0x16a >> [] force_page_cache_readahead+0x4a/0x74 >> [] sys_madvise+0x308/0x400 >> [] sysenter_past_esp+0x6a/0xb1 >> [] 0xffffffff >> >> -> #0 (iprune_mutex){--..}: >> [] __lock_acquire+0x929/0xbc6 >> [] lock_acquire+0x6a/0x86 >> [] mutex_lock_nested+0xb4/0x226 >> [] shrink_icache_memory+0x38/0x19b >> [] shrink_slab+0xda/0x14e >> [] try_to_free_pages+0x1e4/0x2a2 >> [] __alloc_pages_internal+0x23a/0x39d >> [] __alloc_pages+0xa/0xc >> [] __do_page_cache_readahead+0xaa/0x16a >> [] ondemand_readahead+0x119/0x127 >> [] page_cache_async_readahead+0x52/0x5d >> [] generic_file_splice_read+0x290/0x4a8 >> [] xfs_splice_read+0x4b/0x78 >> [] xfs_file_splice_read+0x24/0x29 >> [] do_splice_to+0x45/0x63 >> [] splice_direct_to_actor+0xab/0x150 >> [] nfsd_vfs_read+0x1ed/0x2d0 >> [] nfsd_read+0x82/0x99 >> [] nfsd3_proc_read+0xdf/0x12a >> [] nfsd_dispatch+0xcf/0x19e >> [] svc_process+0x3b3/0x68b >> [] nfsd+0x168/0x26b >> [] kernel_thread_helper+0x7/0x10 >> [] 0xffffffff >> >> other info that might help us debug this: >> >> 3 locks held by nfsd/3087: >> #0: (hash_sem){..--}, at: [] exp_readlock+0xd/0xf >> #1: (&(&ip->i_iolock)->mr_lock){----}, at: [] xfs_ilock+0xa2/0xd6 >> #2: (shrinker_rwsem){----}, at: [] shrink_slab+0x24/0x14e >> >> stack backtrace: >> Pid: 3087, comm: nfsd Not tainted 2.6.26-rc1-00279-g28a4acb #13 >> [] print_circular_bug_tail+0x5a/0x65 >> [] ? print_circular_bug_header+0xa8/0xb3 >> [] __lock_acquire+0x929/0xbc6 >> [] ? native_sched_clock+0x8b/0x9f >> [] lock_acquire+0x6a/0x86 >> [] ? shrink_icache_memory+0x38/0x19b >> [] mutex_lock_nested+0xb4/0x226 >> [] ? shrink_icache_memory+0x38/0x19b >> [] ? shrink_icache_memory+0x38/0x19b >> [] shrink_icache_memory+0x38/0x19b >> [] shrink_slab+0xda/0x14e >> [] try_to_free_pages+0x1e4/0x2a2 >> [] ? _spin_unlock_irqrestore+0x36/0x58 >> [] ? isolate_pages_global+0x0/0x3e >> [] __alloc_pages_internal+0x23a/0x39d >> [] __alloc_pages+0xa/0xc >> [] __do_page_cache_readahead+0xaa/0x16a >> [] ondemand_readahead+0x119/0x127 >> [] page_cache_async_readahead+0x52/0x5d >> [] generic_file_splice_read+0x290/0x4a8 >> [] ? _spin_unlock+0x27/0x3c >> [] ? _atomic_dec_and_lock+0x25/0x30 >> [] ? iput+0x24/0x4e >> [] ? __lock_acquire+0xbaa/0xbc6 >> [] ? exportfs_decode_fh+0x9b/0x1a1 >> [] ? spd_release_page+0x0/0xf >> [] xfs_splice_read+0x4b/0x78 >> [] xfs_file_splice_read+0x24/0x29 >> [] do_splice_to+0x45/0x63 >> [] splice_direct_to_actor+0xab/0x150 >> [] ? nfsd_direct_splice_actor+0x0/0xf >> [] nfsd_vfs_read+0x1ed/0x2d0 >> [] nfsd_read+0x82/0x99 >> [] nfsd3_proc_read+0xdf/0x12a >> [] nfsd_dispatch+0xcf/0x19e >> [] svc_process+0x3b3/0x68b >> [] nfsd+0x168/0x26b >> [] ? nfsd+0x0/0x26b >> [] kernel_thread_helper+0x7/0x10 >> -- Adding the trimmed forward message of syslog from Plamen Petrov May 9 02:16:46 nomad64 kernel: [42951853.992912] May 9 02:16:46 nomad64 kernel: [42951853.992913] ======================================================= May 9 02:16:46 nomad64 kernel: [42951853.992920] [ INFO: possible circular locking dependency detected ] May 9 02:16:46 nomad64 kernel: [42951853.992922] 2.6.26-rc1-00243-g46e4965 #1 May 9 02:16:46 nomad64 kernel: [42951853.992924] ------------------------------------------------------- May 9 02:16:46 nomad64 kernel: [42951853.992927] kio_http/3813 is trying to acquire lock: May 9 02:16:46 nomad64 kernel: [42951853.992930] (&mm->mmap_sem){----}, at: [] do_page_fault+0xdd/0x890 May 9 02:16:46 nomad64 kernel: [42951853.992944] May 9 02:16:46 nomad64 kernel: [42951853.992944] but task is already holding lock: May 9 02:16:46 nomad64 kernel: [42951853.992947] (&(&ip->i_iolock)->mr_lock){----}, at: [] xfs_ilock+0x65/0xa0 May 9 02:16:46 nomad64 kernel: [42951853.992960] May 9 02:16:46 nomad64 kernel: [42951853.992960] which lock already depends on the new lock. May 9 02:16:46 nomad64 kernel: [42951853.992961] May 9 02:16:46 nomad64 kernel: [42951853.992964] May 9 02:16:46 nomad64 kernel: [42951853.992965] the existing dependency chain (in reverse order) is: May 9 02:16:46 nomad64 kernel: [42951853.992967] May 9 02:16:46 nomad64 kernel: [42951853.992968] -> #1 (&(&ip->i_iolock)->mr_lock){----}: May 9 02:16:46 nomad64 kernel: [42951853.992974] [] __lock_acquire+0xf92/0x1080 May 9 02:16:46 nomad64 kernel: [42951853.992989] [] lock_acquire+0xa2/0xd0 May 9 02:16:46 nomad64 kernel: [42951853.993002] [] down_write_nested+0x46/0x80 May 9 02:16:46 nomad64 kernel: [42951853.993018] [] xfs_ilock+0x99/0xa0 May 9 02:16:46 nomad64 kernel: [42951853.993034] [] xfs_free_eofblocks+0x1c7/0x250 May 9 02:16:46 nomad64 kernel: [42951853.993049] [] xfs_release+0x186/0x1d0 May 9 02:16:46 nomad64 kernel: [42951853.993062] [] xfs_file_release+0x10/0x20 May 9 02:16:46 nomad64 kernel: [42951853.993076] [] __fput+0xcc/0x1c0 May 9 02:16:46 nomad64 kernel: [42951853.993091] [] fput+0x16/0x20 May 9 02:16:46 nomad64 kernel: [42951853.993105] [] remove_vma+0x4a/0x80 May 9 02:16:46 nomad64 kernel: [42951853.993120] [] do_munmap+0x281/0x2e0 May 9 02:16:46 nomad64 kernel: [42951853.993134] [] sys_munmap+0x4b/0x70 May 9 02:16:46 nomad64 kernel: [42951853.993148] [] system_call_after_swapgs+0x7b/0x80 May 9 02:16:46 nomad64 kernel: [42951853.993161] [] 0xffffffffffffffff May 9 02:16:46 nomad64 kernel: [42951853.993178] May 9 02:16:46 nomad64 kernel: [42951853.993178] -> #0 (&mm->mmap_sem){----}: May 9 02:16:46 nomad64 kernel: [42951853.993185] [] __lock_acquire+0xdb0/0x1080 May 9 02:16:46 nomad64 kernel: [42951853.993197] [] lock_acquire+0xa2/0xd0 May 9 02:16:46 nomad64 kernel: [42951853.993213] [] down_read+0x3b/0x70 May 9 02:16:46 nomad64 kernel: [42951853.993228] [] do_page_fault+0xdd/0x890 May 9 02:16:46 nomad64 kernel: [42951853.993241] [] error_exit+0x0/0xa9 May 9 02:16:46 nomad64 kernel: [42951853.993256] [] 0xffffffffffffffff May 9 02:16:46 nomad64 kernel: [42951853.993269] May 9 02:16:46 nomad64 kernel: [42951853.993270] other info that might help us debug this: May 9 02:16:46 nomad64 kernel: [42951853.993270] May 9 02:16:46 nomad64 kernel: [42951853.993273] 1 lock held by kio_http/3813: May 9 02:16:46 nomad64 kernel: [42951853.993275] #0: (&(&ip->i_iolock)->mr_lock){----}, at: [] xfs_ilock+0x65/0xa0 May 9 02:16:46 nomad64 kernel: [42951853.993286] May 9 02:16:46 nomad64 kernel: [42951853.993287] stack backtrace: May 9 02:16:46 nomad64 kernel: [42951853.993290] Pid: 3813, comm: kio_http Not tainted 2.6.26-rc1-00243-g46e4965 #1 May 9 02:16:46 nomad64 kernel: [42951853.993292] May 9 02:16:46 nomad64 kernel: [42951853.993293] Call Trace: May 9 02:16:46 nomad64 kernel: [42951853.993297] [] print_circular_bug_tail+0x83/0x90 May 9 02:16:46 nomad64 kernel: [42951853.993302] [] __lock_acquire+0xdb0/0x1080 May 9 02:16:46 nomad64 kernel: [42951853.993306] [] ? do_page_fault+0xdd/0x890 May 9 02:16:46 nomad64 kernel: [42951853.993310] [] lock_acquire+0xa2/0xd0 May 9 02:16:46 nomad64 kernel: [42951853.993313] [] ? do_page_fault+0xdd/0x890 May 9 02:16:46 nomad64 kernel: [42951853.993317] [] down_read+0x3b/0x70 May 9 02:16:46 nomad64 kernel: [42951853.993320] [] do_page_fault+0xdd/0x890 May 9 02:16:46 nomad64 kernel: [42951853.993324] [] error_exit+0x0/0xa9 May 9 02:16:46 nomad64 kernel: [42951853.993328] [] ? file_read_actor+0x46/0x1b0 May 9 02:16:46 nomad64 kernel: [42951853.993331] [] ? _read_unlock_irq+0x36/0x60 May 9 02:16:46 nomad64 kernel: [42951853.993335] [] ? generic_file_aio_read+0x2cc/0x5d0 May 9 02:16:46 nomad64 kernel: [42951853.993339] [] ? get_lock_stats+0x19/0x70 May 9 02:16:46 nomad64 kernel: [42951853.993343] [] ? xfs_read+0x139/0x220 May 9 02:16:46 nomad64 kernel: [42951853.993347] [] ? xfs_file_aio_read+0x4d/0x60 May 9 02:16:46 nomad64 kernel: [42951853.993350] [] ? do_sync_read+0xf1/0x130 May 9 02:16:46 nomad64 kernel: [42951853.993354] [] ? autoremove_wake_function+0x0/0x40 May 9 02:16:46 nomad64 kernel: [42951853.993358] [] ? trace_hardirqs_on+0xda/0x170 May 9 02:16:46 nomad64 kernel: [42951853.993361] [] ? __rcu_read_unlock+0xb5/0xc0 May 9 02:16:46 nomad64 kernel: [42951853.993365] [] ? trace_hardirqs_on+0xda/0x170 May 9 02:16:46 nomad64 kernel: [42951853.993369] [] ? security_file_permission+0x11/0x20 May 9 02:16:46 nomad64 kernel: [42951853.993374] [] ? vfs_read+0xc4/0x160 May 9 02:16:46 nomad64 kernel: [42951853.993377] [] ? sys_read+0x50/0x90 May 9 02:16:46 nomad64 kernel: [42951853.993380] [] ? system_call_after_swapgs+0x7b/0x80 -- Thanks & Regards, Kamalesh Babulal, Linux Technology Center, IBM, ISTL. From owner-xfs@oss.sgi.com Sun May 11 16:09:52 2008 Received: with ECARTIS (v1.0.0; list xfs); Sun, 11 May 2008 16:10: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.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 m4BN9lEP026535 for ; Sun, 11 May 2008 16:09:50 -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 JAA06330; Mon, 12 May 2008 09:10:15 +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 m4BNAAsT164415468; Mon, 12 May 2008 09:10:11 +1000 (AEST) Received: (from dgc@localhost) by snort.melbourne.sgi.com (SGI-8.12.5/8.12.5/Submit) id m4BNA22k164600775; Mon, 12 May 2008 09:10:02 +1000 (AEST) X-Authentication-Warning: snort.melbourne.sgi.com: dgc set sender to dgc@sgi.com using -f Date: Mon, 12 May 2008 09:10:02 +1000 From: David Chinner To: Kamalesh Babulal Cc: pvp-lsts@fs.ru.acad.bg, Alexander Beregalov , kernel-testers@vger.kernel.org, kernel list , Ingo Molnar , peterz@infradead.org, xfs@oss.sgi.com, David Chinner Subject: Re: 2.6.26-rc1: possible circular locking dependency with xfs filesystem Message-ID: <20080511231002.GN103491721@sgi.com> References: <4825DF71.1030209@linux.vnet.ibm.com> <48266C77.3040102@linux.vnet.ibm.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <48266C77.3040102@linux.vnet.ibm.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: 15832 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 Sun, May 11, 2008 at 09:18:07AM +0530, Kamalesh Babulal wrote: > Kamalesh Babulal wrote: > > Adding the cc to kernel-list, Ingo Molnar and Peter Zijlstra > > > > Alexander Beregalov wrote: > >> [ INFO: possible circular locking dependency detected ] > >> 2.6.26-rc1-00279-g28a4acb #13 > >> ------------------------------------------------------- > >> nfsd/3087 is trying to acquire lock: > >> (iprune_mutex){--..}, at: [] shrink_icache_memory+0x38/0x19b > >> > >> but task is already holding lock: > >> (&(&ip->i_iolock)->mr_lock){----}, at: [] xfs_ilock+0xa2/0xd6 > >> > >> which lock already depends on the new lock. > >> > >> > >> the existing dependency chain (in reverse order) is: > >> > >> -> #1 (&(&ip->i_iolock)->mr_lock){----}: > >> [] __lock_acquire+0xa0c/0xbc6 > >> [] lock_acquire+0x6a/0x86 > >> [] down_write_nested+0x33/0x6a > >> [] xfs_ilock+0x7b/0xd6 > >> [] xfs_ireclaim+0x1d/0x59 > >> [] xfs_finish_reclaim+0x173/0x195 > >> [] xfs_reclaim+0xb3/0x138 > >> [] xfs_fs_clear_inode+0x55/0x8e > >> [] clear_inode+0x83/0xd2 > >> [] dispose_list+0x3c/0xc1 > >> [] shrink_icache_memory+0x173/0x19b > >> [] shrink_slab+0xda/0x14e > >> [] try_to_free_pages+0x1e4/0x2a2 > >> [] __alloc_pages_internal+0x23a/0x39d > >> [] __alloc_pages+0xa/0xc > >> [] __do_page_cache_readahead+0xaa/0x16a > >> [] force_page_cache_readahead+0x4a/0x74 > >> [] sys_madvise+0x308/0x400 > >> [] sysenter_past_esp+0x6a/0xb1 > >> [] 0xffffffff > >> > >> -> #0 (iprune_mutex){--..}: > >> [] __lock_acquire+0x929/0xbc6 > >> [] lock_acquire+0x6a/0x86 > >> [] mutex_lock_nested+0xb4/0x226 > >> [] shrink_icache_memory+0x38/0x19b > >> [] shrink_slab+0xda/0x14e > >> [] try_to_free_pages+0x1e4/0x2a2 > >> [] __alloc_pages_internal+0x23a/0x39d > >> [] __alloc_pages+0xa/0xc > >> [] __do_page_cache_readahead+0xaa/0x16a > >> [] ondemand_readahead+0x119/0x127 > >> [] page_cache_async_readahead+0x52/0x5d > >> [] generic_file_splice_read+0x290/0x4a8 > >> [] xfs_splice_read+0x4b/0x78 > >> [] xfs_file_splice_read+0x24/0x29 > >> [] do_splice_to+0x45/0x63 > >> [] splice_direct_to_actor+0xab/0x150 > >> [] nfsd_vfs_read+0x1ed/0x2d0 > >> [] nfsd_read+0x82/0x99 > >> [] nfsd3_proc_read+0xdf/0x12a > >> [] nfsd_dispatch+0xcf/0x19e > >> [] svc_process+0x3b3/0x68b > >> [] nfsd+0x168/0x26b > >> [] kernel_thread_helper+0x7/0x10 > >> [] 0xffffffff Oh, yeah, that. Direct inode reclaim through memory pressure. Effectively memory reclaim inverts locking order w.r.t. iprune_mutex when it recurses into the filesystem. False positive - can never cause a deadlock on XFS. Can't be solved from the XFS side of things without effectively turning off lockdep checking for xfs inode locking. The fix is needed to lockdep via iprune_mutex annotations here.... > May 9 02:16:46 nomad64 kernel: [42951853.992965] the existing dependency chain (in reverse order) is: > May 9 02:16:46 nomad64 kernel: [42951853.992967] > May 9 02:16:46 nomad64 kernel: [42951853.992968] -> #1 (&(&ip->i_iolock)->mr_lock){----}: > May 9 02:16:46 nomad64 kernel: [42951853.992974] [] __lock_acquire+0xf92/0x1080 > May 9 02:16:46 nomad64 kernel: [42951853.992989] [] lock_acquire+0xa2/0xd0 > May 9 02:16:46 nomad64 kernel: [42951853.993002] [] down_write_nested+0x46/0x80 > May 9 02:16:46 nomad64 kernel: [42951853.993018] [] xfs_ilock+0x99/0xa0 > May 9 02:16:46 nomad64 kernel: [42951853.993034] [] xfs_free_eofblocks+0x1c7/0x250 > May 9 02:16:46 nomad64 kernel: [42951853.993049] [] xfs_release+0x186/0x1d0 > May 9 02:16:46 nomad64 kernel: [42951853.993062] [] xfs_file_release+0x10/0x20 > May 9 02:16:46 nomad64 kernel: [42951853.993076] [] __fput+0xcc/0x1c0 > May 9 02:16:46 nomad64 kernel: [42951853.993091] [] fput+0x16/0x20 > May 9 02:16:46 nomad64 kernel: [42951853.993105] [] remove_vma+0x4a/0x80 > May 9 02:16:46 nomad64 kernel: [42951853.993120] [] do_munmap+0x281/0x2e0 > May 9 02:16:46 nomad64 kernel: [42951853.993134] [] sys_munmap+0x4b/0x70 > May 9 02:16:46 nomad64 kernel: [42951853.993148] [] system_call_after_swapgs+0x7b/0x80 > May 9 02:16:46 nomad64 kernel: [42951853.993161] [] 0xffffffffffffffff hmmmm. Sounds like: fd = open() addr = mmap(fd) close(fd) ..... munmap(addr); But yes, XFS takes locks in ->release which means..... > May 9 02:16:46 nomad64 kernel: [42951853.993293] Call Trace: > May 9 02:16:46 nomad64 kernel: [42951853.993297] [] print_circular_bug_tail+0x83/0x90 > May 9 02:16:46 nomad64 kernel: [42951853.993302] [] __lock_acquire+0xdb0/0x1080 > May 9 02:16:46 nomad64 kernel: [42951853.993306] [] ? do_page_fault+0xdd/0x890 > May 9 02:16:46 nomad64 kernel: [42951853.993310] [] lock_acquire+0xa2/0xd0 > May 9 02:16:46 nomad64 kernel: [42951853.993313] [] ? do_page_fault+0xdd/0x890 > May 9 02:16:46 nomad64 kernel: [42951853.993317] [] down_read+0x3b/0x70 > May 9 02:16:46 nomad64 kernel: [42951853.993320] [] do_page_fault+0xdd/0x890 > May 9 02:16:46 nomad64 kernel: [42951853.993324] [] error_exit+0x0/0xa9 > May 9 02:16:46 nomad64 kernel: [42951853.993328] [] ? file_read_actor+0x46/0x1b0 > May 9 02:16:46 nomad64 kernel: [42951853.993331] [] ? _read_unlock_irq+0x36/0x60 > May 9 02:16:46 nomad64 kernel: [42951853.993335] [] ? generic_file_aio_read+0x2cc/0x5d0 > May 9 02:16:46 nomad64 kernel: [42951853.993339] [] ? get_lock_stats+0x19/0x70 > May 9 02:16:46 nomad64 kernel: [42951853.993343] [] ? xfs_read+0x139/0x220 > May 9 02:16:46 nomad64 kernel: [42951853.993347] [] ? xfs_file_aio_read+0x4d/0x60 > May 9 02:16:46 nomad64 kernel: [42951853.993350] [] ? do_sync_read+0xf1/0x130 > May 9 02:16:46 nomad64 kernel: [42951853.993354] [] ? autoremove_wake_function+0x0/0x40 > May 9 02:16:46 nomad64 kernel: [42951853.993358] [] ? trace_hardirqs_on+0xda/0x170 > May 9 02:16:46 nomad64 kernel: [42951853.993361] [] ? __rcu_read_unlock+0xb5/0xc0 > May 9 02:16:46 nomad64 kernel: [42951853.993365] [] ? trace_hardirqs_on+0xda/0x170 > May 9 02:16:46 nomad64 kernel: [42951853.993369] [] ? security_file_permission+0x11/0x20 > May 9 02:16:46 nomad64 kernel: [42951853.993374] [] ? vfs_read+0xc4/0x160 > May 9 02:16:46 nomad64 kernel: [42951853.993377] [] ? sys_read+0x50/0x90 > May 9 02:16:46 nomad64 kernel: [42951853.993380] [] ? system_call_after_swapgs+0x7b/0x80 Oh, joy - a page fault during a read() call triggers lock order inversions on the mmap->sem. I don't think this can deadlock (can't be page faulting in a vma that is being torn down), but it's clear from the last trace that the VM has a mmap->sem inversion problem with ->release vs ->read and page faults... Basically what we are seeing here in both cases is that the VM is calling inode ->release or ->clear_inode methods with different high level locks held. If the filesystem has to take the same locks in these methods as it does in, say, ->read (like XFS does), then we are guaranteed to get reports like this. AFAICT there's nothing we can do from the filesystem perspective to prevent false positives like this from being reported.... Cheers, Dave. -- Dave Chinner Principal Engineer SGI Australian Software Group From owner-xfs@oss.sgi.com Sun May 11 18:47:05 2008 Received: with ECARTIS (v1.0.0; list xfs); Sun, 11 May 2008 18:47: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.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 m4C1kuuU008572 for ; Sun, 11 May 2008 18:47:03 -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 LAA09480; Mon, 12 May 2008 11:47:25 +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 m4C1lNsT164617517; Mon, 12 May 2008 11:47:24 +1000 (AEST) Received: (from dgc@localhost) by snort.melbourne.sgi.com (SGI-8.12.5/8.12.5/Submit) id m4C1lLV8164544894; Mon, 12 May 2008 11:47:21 +1000 (AEST) X-Authentication-Warning: snort.melbourne.sgi.com: dgc set sender to dgc@sgi.com using -f Date: Mon, 12 May 2008 11:47:21 +1000 From: David Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/2] kill attr_capable callbacks Message-ID: <20080512014721.GV155679365@sgi.com> References: <20080430112213.GA16966@lst.de> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20080430112213.GA16966@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: 15834 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 Tim, Seeing you are working on xattr stuff right now, can you pick this up? (and the followup patch as well?) Cheers, Dave. On Wed, Apr 30, 2008 at 01:22:13PM +0200, Christoph Hellwig wrote: > No need for addition permission checks in the xattr handler, > fs/xattr.c:xattr_permission() already does them, and in fact slightly > more strict then what was in the attr_capable handlers. > > > 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-04-29 21:32:56.000000000 +0200 > +++ linux-2.6-xfs/fs/xfs/linux-2.6/xfs_iops.c 2008-04-29 21:33:30.000000000 +0200 > @@ -747,15 +747,11 @@ xfs_vn_setxattr( > char *attr = (char *)name; > attrnames_t *namesp; > int xflags = 0; > - int error; > > namesp = attr_lookup_namespace(attr, attr_namespaces, ATTR_NAMECOUNT); > if (!namesp) > return -EOPNOTSUPP; > attr += namesp->attr_namelen; > - error = namesp->attr_capable(vp, NULL); > - if (error) > - return error; > > /* Convert Linux syscall to XFS internal ATTR flags */ > if (flags & XATTR_CREATE) > @@ -777,15 +773,11 @@ xfs_vn_getxattr( > char *attr = (char *)name; > attrnames_t *namesp; > int xflags = 0; > - ssize_t error; > > namesp = attr_lookup_namespace(attr, attr_namespaces, ATTR_NAMECOUNT); > if (!namesp) > return -EOPNOTSUPP; > attr += namesp->attr_namelen; > - error = namesp->attr_capable(vp, NULL); > - if (error) > - return error; > > /* Convert Linux syscall to XFS internal ATTR flags */ > if (!size) { > @@ -825,15 +817,12 @@ xfs_vn_removexattr( > char *attr = (char *)name; > attrnames_t *namesp; > int xflags = 0; > - int error; > > namesp = attr_lookup_namespace(attr, attr_namespaces, ATTR_NAMECOUNT); > if (!namesp) > return -EOPNOTSUPP; > attr += namesp->attr_namelen; > - error = namesp->attr_capable(vp, NULL); > - if (error) > - return error; > + > xflags |= namesp->attr_flag; > return namesp->attr_remove(vp, attr, xflags); > } > Index: linux-2.6-xfs/fs/xfs/xfs_attr.c > =================================================================== > --- linux-2.6-xfs.orig/fs/xfs/xfs_attr.c 2008-04-29 21:32:25.000000000 +0200 > +++ linux-2.6-xfs/fs/xfs/xfs_attr.c 2008-04-29 21:32:51.000000000 +0200 > @@ -2622,43 +2622,6 @@ attr_lookup_namespace( > return NULL; > } > > -/* > - * Some checks to prevent people abusing EAs to get over quota: > - * - Don't allow modifying user EAs on devices/symlinks; > - * - Don't allow modifying user EAs if sticky bit set; > - */ > -STATIC int > -attr_user_capable( > - bhv_vnode_t *vp, > - cred_t *cred) > -{ > - struct inode *inode = vn_to_inode(vp); > - > - if (IS_IMMUTABLE(inode) || IS_APPEND(inode)) > - return -EPERM; > - if (!S_ISREG(inode->i_mode) && !S_ISDIR(inode->i_mode) && > - !capable(CAP_SYS_ADMIN)) > - return -EPERM; > - if (S_ISDIR(inode->i_mode) && (inode->i_mode & S_ISVTX) && > - (current_fsuid(cred) != inode->i_uid) && !capable(CAP_FOWNER)) > - return -EPERM; > - return 0; > -} > - > -STATIC int > -attr_trusted_capable( > - bhv_vnode_t *vp, > - cred_t *cred) > -{ > - struct inode *inode = vn_to_inode(vp); > - > - if (IS_IMMUTABLE(inode) || IS_APPEND(inode)) > - return -EPERM; > - if (!capable(CAP_SYS_ADMIN)) > - return -EPERM; > - return 0; > -} > - > STATIC int > attr_system_set( > bhv_vnode_t *vp, char *name, void *data, size_t size, int xflags) > @@ -2709,7 +2672,6 @@ struct attrnames attr_system = { > .attr_get = attr_system_get, > .attr_set = attr_system_set, > .attr_remove = attr_system_remove, > - .attr_capable = (attrcapable_t)fs_noerr, > }; > > struct attrnames attr_trusted = { > @@ -2719,7 +2681,6 @@ struct attrnames attr_trusted = { > .attr_get = attr_generic_get, > .attr_set = attr_generic_set, > .attr_remove = attr_generic_remove, > - .attr_capable = attr_trusted_capable, > }; > > struct attrnames attr_secure = { > @@ -2729,7 +2690,6 @@ struct attrnames attr_secure = { > .attr_get = attr_generic_get, > .attr_set = attr_generic_set, > .attr_remove = attr_generic_remove, > - .attr_capable = (attrcapable_t)fs_noerr, > }; > > struct attrnames attr_user = { > @@ -2738,7 +2698,6 @@ struct attrnames attr_user = { > .attr_get = attr_generic_get, > .attr_set = attr_generic_set, > .attr_remove = attr_generic_remove, > - .attr_capable = attr_user_capable, > }; > > struct attrnames *attr_namespaces[] = > Index: linux-2.6-xfs/fs/xfs/xfs_attr.h > =================================================================== > --- linux-2.6-xfs.orig/fs/xfs/xfs_attr.h 2008-04-29 21:33:38.000000000 +0200 > +++ linux-2.6-xfs/fs/xfs/xfs_attr.h 2008-04-29 21:33:52.000000000 +0200 > @@ -42,7 +42,6 @@ typedef int (*attrset_t)(bhv_vnode_t *, > typedef int (*attrget_t)(bhv_vnode_t *, char *, void *, size_t, int); > typedef int (*attrremove_t)(bhv_vnode_t *, char *, int); > typedef int (*attrexists_t)(bhv_vnode_t *); > -typedef int (*attrcapable_t)(bhv_vnode_t *, struct cred *); > > typedef struct attrnames { > char * attr_name; > @@ -52,7 +51,6 @@ typedef struct attrnames { > attrset_t attr_set; > attrremove_t attr_remove; > attrexists_t attr_exists; > - attrcapable_t attr_capable; > } attrnames_t; > > #define ATTR_NAMECOUNT 4 > -- Dave Chinner Principal Engineer SGI Australian Software Group From owner-xfs@oss.sgi.com Sun May 11 18:43:25 2008 Received: with ECARTIS (v1.0.0; list xfs); Sun, 11 May 2008 18:43: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.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 m4C1hKAn008284 for ; Sun, 11 May 2008 18:43:23 -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 LAA09302; Mon, 12 May 2008 11:43:55 +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 m4C1hrsT164618241; Mon, 12 May 2008 11:43:54 +1000 (AEST) Received: (from dgc@localhost) by snort.melbourne.sgi.com (SGI-8.12.5/8.12.5/Submit) id m4C1houa161925717; Mon, 12 May 2008 11:43:50 +1000 (AEST) X-Authentication-Warning: snort.melbourne.sgi.com: dgc set sender to dgc@sgi.com using -f Date: Mon, 12 May 2008 11:43:50 +1000 From: David Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/10] merge xfs_unmount into xfs_fs_put_super / xfs_fs_fill_super Message-ID: <20080512014350.GQ103491721@sgi.com> References: <20080501220048.GA2315@lst.de> <20080509063158.GA25251@lst.de> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20080509063158.GA25251@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: 15833 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 09, 2008 at 08:31:58AM +0200, Christoph Hellwig wrote: > Index: linux-2.6-xfs/fs/xfs/xfs_vfsops.h > =================================================================== > --- linux-2.6-xfs.orig/fs/xfs/xfs_vfsops.h 2008-05-09 08:16:55.000000000 +0200 > +++ linux-2.6-xfs/fs/xfs/xfs_vfsops.h 2008-05-09 08:26:11.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); This hunk does not apply - xfs_mntupdate() is defined in this file in the current tree. Oh, this is on top a bunch of other patches you sent a while back that no-one has picked up. I'll go get those now.... Cheers, Dave. -- Dave Chinner Principal Engineer SGI Australian Software Group From owner-xfs@oss.sgi.com Sun May 11 19:03:53 2008 Received: with ECARTIS (v1.0.0; list xfs); Sun, 11 May 2008 19:04: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.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 m4C23lZD009800 for ; Sun, 11 May 2008 19:03:50 -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 MAA09918; Mon, 12 May 2008 12:04:26 +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 m4C24OsT162646107; Mon, 12 May 2008 12:04:25 +1000 (AEST) Received: (from dgc@localhost) by snort.melbourne.sgi.com (SGI-8.12.5/8.12.5/Submit) id m4C24L1d161213787; Mon, 12 May 2008 12:04:21 +1000 (AEST) X-Authentication-Warning: snort.melbourne.sgi.com: dgc set sender to dgc@sgi.com using -f Date: Mon, 12 May 2008 12:04:21 +1000 From: David Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 4/10] sort out opening and closing of the block devices Message-ID: <20080512020421.GW155679365@sgi.com> References: <20080501220105.GD2315@lst.de> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20080501220105.GD2315@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: 15835 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 12:01:05AM +0200, Christoph Hellwig wrote: > +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."); error needs to be set to something here. > + 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); And that looks broken - we either haven't allocated m_rtdev_targp yet or we've freed it above. incremental patch to fix is fine... Cheers, Dave. -- Dave Chinner Principal Engineer SGI Australian Software Group From owner-xfs@oss.sgi.com Sun May 11 19:21:15 2008 Received: with ECARTIS (v1.0.0; list xfs); Sun, 11 May 2008 19:21:33 -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_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 m4C2LAmC011232 for ; Sun, 11 May 2008 19:21:13 -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 MAA10269; Mon, 12 May 2008 12:21:45 +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 m4C2LfsT162712915; Mon, 12 May 2008 12:21:44 +1000 (AEST) Received: (from dgc@localhost) by snort.melbourne.sgi.com (SGI-8.12.5/8.12.5/Submit) id m4C2LcO8164472660; Mon, 12 May 2008 12:21:38 +1000 (AEST) X-Authentication-Warning: snort.melbourne.sgi.com: dgc set sender to dgc@sgi.com using -f Date: Mon, 12 May 2008 12:21:38 +1000 From: David Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/10] merge xfs_unmount into xfs_fs_put_super / xfs_fs_fill_super Message-ID: <20080512022138.GX155679365@sgi.com> References: <20080501220048.GA2315@lst.de> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20080501220048.GA2315@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: 15836 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 12:00:48AM +0200, Christoph Hellwig wrote: > 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); > + } #ifdef HAVE_DMAPI around this chunk? I know the old code didn't, but it would then match the pre-unmount event hunk above... Cheers, Dave. -- Dave Chinner Principal Engineer SGI Australian Software Group From owner-xfs@oss.sgi.com Sun May 11 22:42:44 2008 Received: with ECARTIS (v1.0.0; list xfs); Sun, 11 May 2008 22:43: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=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 m4C5gf2L030369 for ; Sun, 11 May 2008 22:42:43 -0700 X-ASG-Debug-ID: 1210571008-583003790000-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 1E1321545FF; Sun, 11 May 2008 22:43:28 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 0lzWUCUBtnU5MEgF; Sun, 11 May 2008 22:43:28 -0700 (PDT) Received: from hch by bombadil.infradead.org with local (Exim 4.68 #1 (Red Hat Linux)) id 1JvQop-00077D-1b; Mon, 12 May 2008 05:43:27 +0000 Date: Mon, 12 May 2008 01:43:27 -0400 From: Christoph Hellwig To: David Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 1/10] merge xfs_unmount into xfs_fs_put_super / xfs_fs_fill_super Subject: Re: [PATCH 1/10] merge xfs_unmount into xfs_fs_put_super / xfs_fs_fill_super Message-ID: <20080512054327.GA26038@infradead.org> References: <20080501220048.GA2315@lst.de> <20080512022138.GX155679365@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20080512022138.GX155679365@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: 1210571009 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.50122 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: 15837 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 12, 2008 at 12:21:38PM +1000, David Chinner wrote: > > + if (mp->m_flags & XFS_MOUNT_DMAPI) { > > + XFS_SEND_UNMOUNT(mp, rip, DM_RIGHT_NULL, 0, 0, > > + unmount_event_flags); > > + } > > #ifdef HAVE_DMAPI around this chunk? I know the old code didn't, > but it would then match the pre-unmount event hunk above... We don't have #ifdefs around the other dmapi namespace bits. In fact I'd prefer to kill the one above aswell. It's on my todo list because I wan't to prove that using the normal event enabled macros are safe in the unmount path first and just switch to those. From owner-xfs@oss.sgi.com Sun May 11 23:01:46 2008 Received: with ECARTIS (v1.0.0; list xfs); Sun, 11 May 2008 23:02: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 (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 m4C61krN031578 for ; Sun, 11 May 2008 23:01:46 -0700 X-ASG-Debug-ID: 1210572150-38a600380000-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 543501541E3; Sun, 11 May 2008 23:02:30 -0700 (PDT) Received: from verein.lst.de (verein.lst.de [213.95.11.210]) by cuda.sgi.com with ESMTP id sVbHjM3Ibs12QnfH; Sun, 11 May 2008 23:02: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 m4C62MF3016020 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Mon, 12 May 2008 08:02:22 +0200 Received: (from hch@localhost) by verein.lst.de (8.12.3/8.12.3/Debian-6.6) id m4C62Mor016018; Mon, 12 May 2008 08:02:22 +0200 Date: Mon, 12 May 2008 08:02:22 +0200 From: Christoph Hellwig To: David Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 4/10] sort out opening and closing of the block devices Subject: Re: [PATCH 4/10] sort out opening and closing of the block devices Message-ID: <20080512060222.GA15488@lst.de> References: <20080501220105.GD2315@lst.de> <20080512020421.GW155679365@sgi.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20080512020421.GW155679365@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: 1210572152 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.50124 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: 15838 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 Mon, May 12, 2008 at 12:04:21PM +1000, David Chinner wrote: > error needs to be set to something here. Fixed. > > + 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); > > And that looks broken - we either haven't allocated m_rtdev_targp > yet or we've freed it above. Yeah, we should just use the local struct block_device pointers here (and for the logdev case just below) > incremental patch to fix is fine... But in the days of quit a new one is much easier :) New patch below: 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-12 07:45:03.000000000 +0200 +++ linux-2.6-xfs/fs/xfs/linux-2.6/xfs_super.c 2008-05-12 08:00:10.000000000 +0200 @@ -766,6 +766,103 @@ 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."); + error = EINVAL; + 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 (rtdev) + xfs_blkdev_put(rtdev); + out_close_logdev: + if (logdev && logdev != ddev) + xfs_blkdev_put(logdev); + out: + return error; +} + + + /* * XFS AIL push thread support */ @@ -1139,7 +1236,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); @@ -1586,16 +1684,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 +1693,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 +1722,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 +1749,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 +1759,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 +1824,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 +1857,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); Index: linux-2.6-xfs/fs/xfs/xfs_mount.c =================================================================== --- linux-2.6-xfs.orig/fs/xfs/xfs_mount.c 2008-05-12 07:45:03.000000000 +0200 +++ linux-2.6-xfs/fs/xfs/xfs_mount.c 2008-05-12 07:45:05.000000000 +0200 @@ -1278,7 +1278,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; @@ -1345,7 +1345,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); @@ -1356,16 +1355,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-12 07:45:03.000000000 +0200 +++ linux-2.6-xfs/fs/xfs/xfs_mount.h 2008-05-12 07:45:05.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-12 07:45:03.000000000 +0200 +++ linux-2.6-xfs/fs/xfs/linux-2.6/xfs_super.h 2008-05-12 07:45:05.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-12 07:45:03.000000000 +0200 +++ linux-2.6-xfs/fs/xfs/linux-2.6/xfs_buf.c 2008-05-12 07:45:05.000000000 +0200 @@ -1412,13 +1412,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-12 07:45:03.000000000 +0200 +++ linux-2.6-xfs/fs/xfs/linux-2.6/xfs_buf.h 2008-05-12 07:45:05.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 Sun May 11 23:22:14 2008 Received: with ECARTIS (v1.0.0; list xfs); Sun, 11 May 2008 23:22: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.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 m4C6M8wZ000884 for ; Sun, 11 May 2008 23:22:12 -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 QAA14686; Mon, 12 May 2008 16:22:37 +1000 Message-ID: <4827E22D.8030500@sgi.com> Date: Mon, 12 May 2008 16:22:37 +1000 From: Timothy Shimmin User-Agent: Thunderbird 2.0.0.14 (Macintosh/20080421) MIME-Version: 1.0 To: David Chinner CC: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: [PATCH 1/2] kill attr_capable callbacks References: <20080430112213.GA16966@lst.de> <20080512014721.GV155679365@sgi.com> In-Reply-To: <20080512014721.GV155679365@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: 15839 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: > Tim, > > Seeing you are working on xattr stuff right now, can you pick this up? > (and the followup patch as well?) > > Cheers, > > Dave. > Yep. --Tim > On Wed, Apr 30, 2008 at 01:22:13PM +0200, Christoph Hellwig wrote: >> No need for addition permission checks in the xattr handler, >> fs/xattr.c:xattr_permission() already does them, and in fact slightly >> more strict then what was in the attr_capable handlers. >> >> >> 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-04-29 21:32:56.000000000 +0200 >> +++ linux-2.6-xfs/fs/xfs/linux-2.6/xfs_iops.c 2008-04-29 21:33:30.000000000 +0200 >> @@ -747,15 +747,11 @@ xfs_vn_setxattr( >> char *attr = (char *)name; >> attrnames_t *namesp; >> int xflags = 0; >> - int error; >> >> namesp = attr_lookup_namespace(attr, attr_namespaces, ATTR_NAMECOUNT); >> if (!namesp) >> return -EOPNOTSUPP; >> attr += namesp->attr_namelen; >> - error = namesp->attr_capable(vp, NULL); >> - if (error) >> - return error; >> >> /* Convert Linux syscall to XFS internal ATTR flags */ >> if (flags & XATTR_CREATE) >> @@ -777,15 +773,11 @@ xfs_vn_getxattr( >> char *attr = (char *)name; >> attrnames_t *namesp; >> int xflags = 0; >> - ssize_t error; >> >> namesp = attr_lookup_namespace(attr, attr_namespaces, ATTR_NAMECOUNT); >> if (!namesp) >> return -EOPNOTSUPP; >> attr += namesp->attr_namelen; >> - error = namesp->attr_capable(vp, NULL); >> - if (error) >> - return error; >> >> /* Convert Linux syscall to XFS internal ATTR flags */ >> if (!size) { >> @@ -825,15 +817,12 @@ xfs_vn_removexattr( >> char *attr = (char *)name; >> attrnames_t *namesp; >> int xflags = 0; >> - int error; >> >> namesp = attr_lookup_namespace(attr, attr_namespaces, ATTR_NAMECOUNT); >> if (!namesp) >> return -EOPNOTSUPP; >> attr += namesp->attr_namelen; >> - error = namesp->attr_capable(vp, NULL); >> - if (error) >> - return error; >> + >> xflags |= namesp->attr_flag; >> return namesp->attr_remove(vp, attr, xflags); >> } >> Index: linux-2.6-xfs/fs/xfs/xfs_attr.c >> =================================================================== >> --- linux-2.6-xfs.orig/fs/xfs/xfs_attr.c 2008-04-29 21:32:25.000000000 +0200 >> +++ linux-2.6-xfs/fs/xfs/xfs_attr.c 2008-04-29 21:32:51.000000000 +0200 >> @@ -2622,43 +2622,6 @@ attr_lookup_namespace( >> return NULL; >> } >> >> -/* >> - * Some checks to prevent people abusing EAs to get over quota: >> - * - Don't allow modifying user EAs on devices/symlinks; >> - * - Don't allow modifying user EAs if sticky bit set; >> - */ >> -STATIC int >> -attr_user_capable( >> - bhv_vnode_t *vp, >> - cred_t *cred) >> -{ >> - struct inode *inode = vn_to_inode(vp); >> - >> - if (IS_IMMUTABLE(inode) || IS_APPEND(inode)) >> - return -EPERM; >> - if (!S_ISREG(inode->i_mode) && !S_ISDIR(inode->i_mode) && >> - !capable(CAP_SYS_ADMIN)) >> - return -EPERM; >> - if (S_ISDIR(inode->i_mode) && (inode->i_mode & S_ISVTX) && >> - (current_fsuid(cred) != inode->i_uid) && !capable(CAP_FOWNER)) >> - return -EPERM; >> - return 0; >> -} >> - >> -STATIC int >> -attr_trusted_capable( >> - bhv_vnode_t *vp, >> - cred_t *cred) >> -{ >> - struct inode *inode = vn_to_inode(vp); >> - >> - if (IS_IMMUTABLE(inode) || IS_APPEND(inode)) >> - return -EPERM; >> - if (!capable(CAP_SYS_ADMIN)) >> - return -EPERM; >> - return 0; >> -} >> - >> STATIC int >> attr_system_set( >> bhv_vnode_t *vp, char *name, void *data, size_t size, int xflags) >> @@ -2709,7 +2672,6 @@ struct attrnames attr_system = { >> .attr_get = attr_system_get, >> .attr_set = attr_system_set, >> .attr_remove = attr_system_remove, >> - .attr_capable = (attrcapable_t)fs_noerr, >> }; >> >> struct attrnames attr_trusted = { >> @@ -2719,7 +2681,6 @@ struct attrnames attr_trusted = { >> .attr_get = attr_generic_get, >> .attr_set = attr_generic_set, >> .attr_remove = attr_generic_remove, >> - .attr_capable = attr_trusted_capable, >> }; >> >> struct attrnames attr_secure = { >> @@ -2729,7 +2690,6 @@ struct attrnames attr_secure = { >> .attr_get = attr_generic_get, >> .attr_set = attr_generic_set, >> .attr_remove = attr_generic_remove, >> - .attr_capable = (attrcapable_t)fs_noerr, >> }; >> >> struct attrnames attr_user = { >> @@ -2738,7 +2698,6 @@ struct attrnames attr_user = { >> .attr_get = attr_generic_get, >> .attr_set = attr_generic_set, >> .attr_remove = attr_generic_remove, >> - .attr_capable = attr_user_capable, >> }; >> >> struct attrnames *attr_namespaces[] = >> Index: linux-2.6-xfs/fs/xfs/xfs_attr.h >> =================================================================== >> --- linux-2.6-xfs.orig/fs/xfs/xfs_attr.h 2008-04-29 21:33:38.000000000 +0200 >> +++ linux-2.6-xfs/fs/xfs/xfs_attr.h 2008-04-29 21:33:52.000000000 +0200 >> @@ -42,7 +42,6 @@ typedef int (*attrset_t)(bhv_vnode_t *, >> typedef int (*attrget_t)(bhv_vnode_t *, char *, void *, size_t, int); >> typedef int (*attrremove_t)(bhv_vnode_t *, char *, int); >> typedef int (*attrexists_t)(bhv_vnode_t *); >> -typedef int (*attrcapable_t)(bhv_vnode_t *, struct cred *); >> >> typedef struct attrnames { >> char * attr_name; >> @@ -52,7 +51,6 @@ typedef struct attrnames { >> attrset_t attr_set; >> attrremove_t attr_remove; >> attrexists_t attr_exists; >> - attrcapable_t attr_capable; >> } attrnames_t; >> >> #define ATTR_NAMECOUNT 4 >> > From owner-xfs@oss.sgi.com Sun May 11 23:27:04 2008 Received: with ECARTIS (v1.0.0; list xfs); Sun, 11 May 2008 23:27: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.1 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_64, J_CHICKENPOX_66 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 m4C6QwB4002032 for ; Sun, 11 May 2008 23:27:04 -0700 X-ASG-Debug-ID: 1210573661-4f5100120000-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 AD024154306; Sun, 11 May 2008 23:27:41 -0700 (PDT) Received: from verein.lst.de (verein.lst.de [213.95.11.210]) by cuda.sgi.com with ESMTP id 4ZuLjKdSn5ECS8FC; Sun, 11 May 2008 23:27:41 -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 m4C6RXF3017081 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Mon, 12 May 2008 08:27:33 +0200 Received: (from hch@localhost) by verein.lst.de (8.12.3/8.12.3/Debian-6.6) id m4C6RXXP017079; Mon, 12 May 2008 08:27:33 +0200 Date: Mon, 12 May 2008 08:27:33 +0200 From: Christoph Hellwig To: David Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 1/2] kill attr_capable callbacks Subject: Re: [PATCH 1/2] kill attr_capable callbacks Message-ID: <20080512062732.GA17007@lst.de> References: <20080430112213.GA16966@lst.de> <20080512014721.GV155679365@sgi.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20080512014721.GV155679365@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: 1210573663 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.50126 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: 15840 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 Mon, May 12, 2008 at 11:47:21AM +1000, David Chinner wrote: > Tim, > > Seeing you are working on xattr stuff right now, can you pick this up? > (and the followup patch as well?) Btw, here's the generic acl conversion rebased ontop of these two patches. Still haven't managed to sort out the other issues with it. Index: linux-2.6-xfs/fs/xfs/linux-2.6/xfs_acl.c =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.6-xfs/fs/xfs/linux-2.6/xfs_acl.c 2008-05-02 19:34:18.000000000 +0200 @@ -0,0 +1,437 @@ +/* + * Copyright (C) 2008 Christoph Hellwig. + * Released under GPL v2. + */ +#include "xfs.h" +#include "xfs_acl.h" +#include "xfs_attr.h" +#include "xfs_bmap_btree.h" /* required by xfs_inode.h */ +#include "xfs_inode.h" +#include "xfs_vnodeops.h" + +#include +#include + + +#define XFS_ACL_NOT_CACHED ((void *)-1) + +/* + * Convert from extended attribute to in-memory representation. + */ +static struct posix_acl *xfs_acl_from_disk(struct xfs_acl *aclp) +{ + struct posix_acl_entry *acl_e; + struct posix_acl *acl; + struct xfs_acl_entry *ace; + int count, i; + + count = be32_to_cpu(aclp->acl_cnt); + + acl = posix_acl_alloc(count, GFP_KERNEL); + if (!acl) + return ERR_PTR(-ENOMEM); + + for (i = 0; i < count; i++) { + acl_e = &acl->a_entries[i]; + ace = &aclp->acl_entry[i]; + + /* + * XXX(hch): the tag is 32 bits on disk and 16 bits in core. + * Any special handling required?? + */ + acl_e->e_tag = be32_to_cpu(ace->ae_tag); + acl_e->e_perm = be16_to_cpu(ace->ae_perm); + + switch(acl_e->e_tag) { + case ACL_USER: + case ACL_GROUP: + acl_e->e_id = be32_to_cpu(ace->ae_id); + break; + case ACL_USER_OBJ: + case ACL_GROUP_OBJ: + case ACL_MASK: + case ACL_OTHER: + acl_e->e_id = ACL_UNDEFINED_ID; + break; + default: + goto fail; + } + } + return acl; + +fail: + posix_acl_release(acl); + return ERR_PTR(-EINVAL); +} + +/* + * Convert from in-memory to extended attribute representation. + */ +static void xfs_acl_to_disk(struct xfs_acl *aclp, const struct posix_acl *acl) +{ + const struct posix_acl_entry *acl_e; + struct xfs_acl_entry *ace; + int i; + + for (i = 0; i < acl->a_count; i++) { + ace = &aclp->acl_entry[i]; + acl_e = &acl->a_entries[i]; + + ace->ae_tag = cpu_to_be32(acl_e->e_tag); + ace->ae_id = cpu_to_be32(acl_e->e_id); + ace->ae_perm = cpu_to_be16(acl_e->e_perm); + } +} + +struct posix_acl *xfs_get_acl(struct inode *inode, int type) +{ + struct xfs_inode *ip = XFS_I(inode); + struct posix_acl *acl = NULL, **p_acl; + struct xfs_acl *xfs_acl; + int len = sizeof(struct xfs_acl); + char *ea_name; + int error; + + switch (type) { + case ACL_TYPE_ACCESS: + ea_name = SGI_ACL_FILE; + p_acl = &ip->i_acl; + break; + case ACL_TYPE_DEFAULT: + ea_name = SGI_ACL_DEFAULT; + p_acl = &ip->i_default_acl; + break; + default: + return ERR_PTR(-EINVAL); + } + + if (*p_acl != XFS_ACL_NOT_CACHED) + return posix_acl_dup(*p_acl); + + xfs_acl = kzalloc(sizeof(struct xfs_acl), GFP_KERNEL); + if (!xfs_acl) + return ERR_PTR(-ENOMEM); + + error = -xfs_attr_get(ip, ea_name, (char *)xfs_acl, &len, ATTR_ROOT); + if (!error) { + acl = xfs_acl_from_disk(xfs_acl); + if (!IS_ERR(acl)) + *p_acl = posix_acl_dup(acl); + } else { + *p_acl = NULL; + } + + kfree(xfs_acl); + return acl; +} + +static int xfs_set_acl(struct inode *inode, int type, struct posix_acl *acl) +{ + struct xfs_inode *ip = XFS_I(inode); + struct posix_acl **p_acl; + char *ea_name; + int error; + + if (S_ISLNK(inode->i_mode)) + return -EOPNOTSUPP; + + switch (type) { + case ACL_TYPE_ACCESS: + ea_name = SGI_ACL_FILE; + p_acl = &ip->i_acl; + break; + case ACL_TYPE_DEFAULT: + ea_name = SGI_ACL_DEFAULT; + p_acl = &ip->i_default_acl; + if (!S_ISDIR(inode->i_mode)) + return acl ? -EACCES : 0; + break; + default: + return -EINVAL; + } + + if (acl) { + struct xfs_acl *xfs_acl; + int len; + + xfs_acl = kzalloc(sizeof(struct xfs_acl), GFP_KERNEL); + if (!xfs_acl) + return -ENOMEM; + + xfs_acl_to_disk(xfs_acl, acl); + len = sizeof(struct xfs_acl) - + (sizeof(struct xfs_acl_entry) * + (XFS_ACL_MAX_ENTRIES - acl->a_count)); + + error = -xfs_attr_set(ip, ea_name, (char *)xfs_acl, + len, ATTR_ROOT); + + kfree(xfs_acl); + } else { + error = -xfs_attr_remove(ip, ea_name, ATTR_ROOT); + + /* + * If the attribute didn't exist to start with that's fine. + */ + if (error == -ENOATTR) + error = 0; + } + + if (!error) { + if (*p_acl && *p_acl != XFS_ACL_NOT_CACHED) + posix_acl_release(*p_acl); + *p_acl = posix_acl_dup(acl); + } + return error; +} + +static int xfs_check_acl(struct inode *inode, int mask) +{ + struct xfs_inode *ip = XFS_I(inode); + + xfs_itrace_entry(ip); + + if (!XFS_IFORK_Q(ip)) + return -EAGAIN; + + if (ip->i_acl == XFS_ACL_NOT_CACHED) { + struct posix_acl *acl = xfs_get_acl(inode, ACL_TYPE_ACCESS); + if (IS_ERR(acl)) + return PTR_ERR(acl); + posix_acl_release(acl); + } + + if (ip->i_acl) + return posix_acl_permission(inode, ip->i_acl, mask); + return -EAGAIN; +} + +int xfs_vn_permission(struct inode *inode, int mask, struct nameidata *nd) +{ + return generic_permission(inode, mask, xfs_check_acl); +} + + +/* + * Helper to propagate i_mode the xfs_inode. + */ +static int xfs_set_mode(struct inode *inode, mode_t mode) +{ + int error = 0; + + if (mode != inode->i_mode) { + struct bhv_vattr va = { + .va_mask = XFS_AT_MODE, + .va_mode = mode, + }; + + va.va_mask = XFS_AT_MODE; + va.va_mode = mode; + + error = -xfs_setattr(XFS_I(inode), &va, 0, sys_cred); + inode->i_mode = mode; + } + + return error; +} + +static int xfs_acl_exists(struct inode *inode, char *name) +{ + int len = sizeof(struct xfs_acl); + + return xfs_attr_get(XFS_I(inode), name, NULL, &len, + ATTR_ROOT|ATTR_KERNOVAL); +} + +int posix_acl_access_exists(struct inode *inode) +{ + return xfs_acl_exists(inode, SGI_ACL_FILE); +} + +int posix_acl_default_exists(struct inode *inode) +{ + if (!S_ISDIR(inode->i_mode)) + return 0; + return xfs_acl_exists(inode, SGI_ACL_DEFAULT); +} + +static int +xfs_decode_acl(const char *name) +{ + if (strcmp(name, "posix_acl_access") == 0) + return ACL_TYPE_ACCESS; + else if (strcmp(name, "posix_acl_default") == 0) + return ACL_TYPE_DEFAULT; + return -EINVAL; +} + +/* + * Extended attribute handlers + */ + +static int +xfs_xattr_system_get(struct inode *inode, const char *name, + void *value, size_t size) +{ + struct posix_acl *acl; + int type, error; + + type = xfs_decode_acl(name); + if (type < 0) + return type; + + acl = xfs_get_acl(inode, type); + if (IS_ERR(acl)) + return PTR_ERR(acl); + if (acl == NULL) + return -ENODATA; + error = posix_acl_to_xattr(acl, value, size); + posix_acl_release(acl); + + return error; +} + +static int +xfs_xattr_system_set(struct inode *inode, const char *name, + const void *value, size_t size, int flags) +{ + struct posix_acl *acl = NULL; + int error, type; + + type = xfs_decode_acl(name); + if (type < 0) + return type; + if (flags & XATTR_CREATE) + return -EINVAL; + if (type == ACL_TYPE_DEFAULT && !S_ISDIR(inode->i_mode)) + return value ? -EACCES : 0; + if ((current->fsuid != inode->i_uid) && !capable(CAP_FOWNER)) + return -EPERM; + + if (!value) + goto set_acl; + + acl = posix_acl_from_xattr(value, size); + if (IS_ERR(acl)) + return PTR_ERR(acl); + if (!acl) + goto set_acl; + + error = posix_acl_valid(acl); + if (error) + goto out_release; + + error = -EINVAL; + if (acl->a_count > XFS_ACL_MAX_ENTRIES) + goto out_release; + + if (type == ACL_TYPE_ACCESS) { + mode_t mode = inode->i_mode; + error = posix_acl_equiv_mode(acl, &mode); + if (error < 0) + return error; // XXX + + if (error == 0) { + posix_acl_release(acl); + acl = NULL; + } + error = xfs_set_mode(inode, mode); + if (error) + goto out_release; + } + + set_acl: + error = xfs_set_acl(inode, type, acl); + + out_release: + posix_acl_release(acl); + if (!error) + vn_revalidate(inode); + return error; +} + +struct xattr_handler xfs_xattr_system_handler = { + .prefix = XATTR_SYSTEM_PREFIX, + .get = xfs_xattr_system_get, + .set = xfs_xattr_system_set, +}; + +/* + * Unlike the other functions in this file this returns positive errors. + */ +int xfs_inherit_acl(struct inode *inode, struct posix_acl *default_acl) +{ + struct xfs_inode *ip = XFS_I(inode); + struct posix_acl *clone; + mode_t mode; + int error = 0; + + if (S_ISDIR(inode->i_mode)) { + error = xfs_set_acl(inode, ACL_TYPE_DEFAULT, default_acl); + if (error) + return -error; + } + + clone = posix_acl_clone(default_acl, GFP_KERNEL); + if (!clone) + return ENOMEM; + + mode = inode->i_mode; + error = posix_acl_create_masq(clone, &mode); + if (error < 0) + goto out_release_clone; + + error = xfs_set_mode(inode, mode); + if (error > 0) + error = xfs_set_acl(inode, ACL_TYPE_ACCESS, clone); + xfs_iflags_set(ip, XFS_IMODIFIED); + + out_release_clone: + posix_acl_release(clone); + return -error; +} + +int xfs_acl_chmod(struct inode *inode) +{ + struct posix_acl *acl, *clone; + int error; + + if (S_ISLNK(inode->i_mode)) + return -EOPNOTSUPP; + + acl = xfs_get_acl(inode, ACL_TYPE_ACCESS); + if (IS_ERR(acl) || !acl) + return PTR_ERR(acl); + + clone = posix_acl_clone(acl, GFP_KERNEL); + posix_acl_release(acl); + if (!clone) + return -ENOMEM; + + error = posix_acl_chmod_masq(clone, inode->i_mode); + if (!error) + error = xfs_set_acl(inode, ACL_TYPE_ACCESS, clone); + + posix_acl_release(clone); + return error; +} + +void xfs_inode_init_acls(struct xfs_inode *ip) +{ + ip->i_acl = XFS_ACL_NOT_CACHED; + ip->i_default_acl = XFS_ACL_NOT_CACHED; +} + +static void xfs_clear_acl(struct posix_acl **aclp) +{ + if (*aclp != XFS_ACL_NOT_CACHED) { + posix_acl_release(*aclp); + *aclp = XFS_ACL_NOT_CACHED; + } +} + +void xfs_inode_clear_acls(struct xfs_inode *ip) +{ + xfs_clear_acl(&ip->i_acl); + xfs_clear_acl(&ip->i_default_acl); +} 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 19:20:38.000000000 +0200 +++ linux-2.6-xfs/fs/xfs/linux-2.6/xfs_iops.c 2008-05-02 19:34:18.000000000 +0200 @@ -51,6 +51,7 @@ #include #include #include +#include #include #include @@ -276,9 +277,8 @@ xfs_vn_mknod( { struct inode *inode; struct xfs_inode *ip = NULL; - xfs_acl_t *default_acl = NULL; + struct posix_acl *default_acl = NULL; struct xfs_name name; - int (*test_default_acl)(struct inode *) = _ACL_DEFAULT_EXISTS; int error; /* @@ -288,21 +288,17 @@ xfs_vn_mknod( if (unlikely(!sysv_valid_dev(rdev) || MAJOR(rdev) & ~0x1ff)) return -EINVAL; - if (test_default_acl && test_default_acl(dir)) { - if (!_ACL_ALLOC(default_acl)) { - return -ENOMEM; - } - if (!_ACL_GET_DEFAULT(dir, default_acl)) { - _ACL_FREE(default_acl); - default_acl = NULL; - } + if (IS_POSIXACL(dir)) { + default_acl = xfs_get_acl(dir, ACL_TYPE_DEFAULT); + if (IS_ERR(default_acl)) + return -PTR_ERR(default_acl); + + if (!default_acl) + mode &= ~current->fs->umask; } xfs_dentry_to_name(&name, dentry); - if (IS_POSIXACL(dir) && !default_acl) - mode &= ~current->fs->umask; - switch (mode & S_IFMT) { case S_IFCHR: case S_IFBLK: @@ -330,11 +326,11 @@ xfs_vn_mknod( goto out_cleanup_inode; if (default_acl) { - error = _ACL_INHERIT(inode, mode, default_acl); + error = xfs_inherit_acl(inode, default_acl); if (unlikely(error)) goto out_cleanup_inode; xfs_iflags_set(ip, XFS_IMODIFIED); - _ACL_FREE(default_acl); + posix_acl_release(default_acl); } @@ -347,8 +343,7 @@ xfs_vn_mknod( out_cleanup_inode: xfs_cleanup_inode(dir, inode, dentry); out_free_acl: - if (default_acl) - _ACL_FREE(default_acl); + posix_acl_release(default_acl); return -error; } @@ -550,38 +545,6 @@ xfs_vn_put_link( kfree(s); } -#ifdef CONFIG_XFS_POSIX_ACL -STATIC int -xfs_check_acl( - struct inode *inode, - int mask) -{ - struct xfs_inode *ip = XFS_I(inode); - int error; - - xfs_itrace_entry(ip); - - if (XFS_IFORK_Q(ip)) { - error = xfs_acl_iaccess(ip, mask, NULL); - if (error != -1) - return -error; - } - - return -EAGAIN; -} - -STATIC int -xfs_vn_permission( - struct inode *inode, - int mask, - struct nameidata *nd) -{ - return generic_permission(inode, mask, xfs_check_acl); -} -#else -#define xfs_vn_permission NULL -#endif - STATIC int xfs_vn_getattr( struct vfsmount *mnt, @@ -694,6 +657,9 @@ xfs_vn_setattr( error = xfs_setattr(XFS_I(inode), &vattr, flags, NULL); if (likely(!error)) vn_revalidate(vn_from_inode(inode)); + + if (!error && (attr->ia_valid & ATTR_MODE)) + error = -xfs_acl_chmod(inode); return -error; } 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 19:14:00.000000000 +0200 +++ linux-2.6-xfs/fs/xfs/linux-2.6/xfs_iops.h 2008-05-02 19:34:18.000000000 +0200 @@ -31,6 +31,12 @@ extern void xfs_ichgtime_fast(struct xfs extern void xfs_setup_inode(struct xfs_inode *); +#ifdef CONFIG_XFS_POSIX_ACL +int xfs_vn_permission(struct inode *inode, int mask, struct nameidata *nd); +#else +#define xfs_vn_permission NULL +#endif + #define xfs_vtoi(vp) \ ((struct xfs_inode *)vn_to_inode(vp)->i_private) Index: linux-2.6-xfs/fs/xfs/xfs_acl.h =================================================================== --- linux-2.6-xfs.orig/fs/xfs/xfs_acl.h 2008-05-02 19:14:00.000000000 +0200 +++ linux-2.6-xfs/fs/xfs/xfs_acl.h 2008-05-02 19:34:18.000000000 +0200 @@ -18,27 +18,25 @@ #ifndef __XFS_ACL_H__ #define __XFS_ACL_H__ +struct inode; +struct posix_acl; +struct xfs_inode; + + /* * Access Control Lists */ -typedef __uint16_t xfs_acl_perm_t; -typedef __int32_t xfs_acl_type_t; -typedef __int32_t xfs_acl_tag_t; -typedef __int32_t xfs_acl_id_t; - #define XFS_ACL_MAX_ENTRIES 25 #define XFS_ACL_NOT_PRESENT (-1) -typedef struct xfs_acl_entry { - xfs_acl_tag_t ae_tag; - xfs_acl_id_t ae_id; - xfs_acl_perm_t ae_perm; -} xfs_acl_entry_t; - -typedef struct xfs_acl { - __int32_t acl_cnt; - xfs_acl_entry_t acl_entry[XFS_ACL_MAX_ENTRIES]; -} xfs_acl_t; +struct xfs_acl { + __be32 acl_cnt; + struct xfs_acl_entry { + __be32 ae_tag; + __be32 ae_id; + __be16 ae_perm; + } acl_entry[XFS_ACL_MAX_ENTRIES]; +}; /* On-disk XFS extended attribute names */ #define SGI_ACL_FILE "SGI_ACL_FILE" @@ -49,51 +47,35 @@ typedef struct xfs_acl { #ifdef CONFIG_XFS_POSIX_ACL -struct vattr; -struct xfs_inode; - -extern struct kmem_zone *xfs_acl_zone; -#define xfs_acl_zone_init(zone, name) \ - (zone) = kmem_zone_init(sizeof(xfs_acl_t), (name)) -#define xfs_acl_zone_destroy(zone) kmem_zone_destroy(zone) - -extern int xfs_acl_inherit(bhv_vnode_t *, mode_t mode, xfs_acl_t *); -extern int xfs_acl_iaccess(struct xfs_inode *, mode_t, cred_t *); -extern int xfs_acl_vtoacl(bhv_vnode_t *, xfs_acl_t *, xfs_acl_t *); -extern int xfs_acl_vhasacl_access(bhv_vnode_t *); -extern int xfs_acl_vhasacl_default(bhv_vnode_t *); -extern int xfs_acl_vset(bhv_vnode_t *, void *, size_t, int); -extern int xfs_acl_vget(bhv_vnode_t *, void *, size_t, int); -extern int xfs_acl_vremove(bhv_vnode_t *, int); - -#define _ACL_TYPE_ACCESS 1 -#define _ACL_TYPE_DEFAULT 2 -#define _ACL_PERM_INVALID(perm) ((perm) & ~(ACL_READ|ACL_WRITE|ACL_EXECUTE)) - -#define _ACL_INHERIT(c,m,d) (xfs_acl_inherit(c,m,d)) -#define _ACL_GET_ACCESS(pv,pa) (xfs_acl_vtoacl(pv,pa,NULL) == 0) -#define _ACL_GET_DEFAULT(pv,pd) (xfs_acl_vtoacl(pv,NULL,pd) == 0) -#define _ACL_ACCESS_EXISTS xfs_acl_vhasacl_access -#define _ACL_DEFAULT_EXISTS xfs_acl_vhasacl_default +struct posix_acl *xfs_get_acl(struct inode *inode, int type); +int xfs_inherit_acl(struct inode *inode, struct posix_acl *default_acl); +int xfs_acl_chmod(struct inode *inode); +void xfs_inode_init_acls(struct xfs_inode *ip); +void xfs_inode_clear_acls(struct xfs_inode *ip); +int posix_acl_access_exists(struct inode *inode); +int posix_acl_default_exists(struct inode *inode); -#define _ACL_ALLOC(a) ((a) = kmem_zone_alloc(xfs_acl_zone, KM_SLEEP)) -#define _ACL_FREE(a) ((a)? kmem_zone_free(xfs_acl_zone, (a)):(void)0) +extern struct xattr_handler xfs_xattr_system_handler; #else -#define xfs_acl_zone_init(zone,name) -#define xfs_acl_zone_destroy(zone) -#define xfs_acl_vset(v,p,sz,t) (-EOPNOTSUPP) -#define xfs_acl_vget(v,p,sz,t) (-EOPNOTSUPP) -#define xfs_acl_vremove(v,t) (-EOPNOTSUPP) -#define xfs_acl_vhasacl_access(v) (0) -#define xfs_acl_vhasacl_default(v) (0) -#define _ACL_ALLOC(a) (1) /* successfully allocate nothing */ -#define _ACL_FREE(a) ((void)0) -#define _ACL_INHERIT(c,m,d) (0) -#define _ACL_GET_ACCESS(pv,pa) (0) -#define _ACL_GET_DEFAULT(pv,pd) (0) -#define _ACL_ACCESS_EXISTS (NULL) -#define _ACL_DEFAULT_EXISTS (NULL) -#endif +static inline struct posix_acl *xfs_get_acl(struct inode *inode, int type) +{ + BUG(); +} +static inline int xfs_inherit_acl(struct inode *inode, + struct posix_acl *default_acl) +{ + BUG(); +} + +static inline void xfs_inode_init_acls(struct xfs_inode *ip) +{ +} + +static inline void xfs_inode_clear_acls(struct xfs_inode *ip) +{ +} + +#endif /* CONFIG_XFS_POSIX_ACL */ #endif /* __XFS_ACL_H__ */ 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 19:14:00.000000000 +0200 +++ linux-2.6-xfs/fs/xfs/linux-2.6/xfs_ksyms.c 2008-05-02 19:34:18.000000000 +0200 @@ -51,7 +51,6 @@ #include "xfs_dir2_block.h" #include "xfs_dir2_node.h" #include "xfs_dir2_trace.h" -#include "xfs_acl.h" #include "xfs_attr.h" #include "xfs_attr_leaf.h" #include "xfs_inode_item.h" @@ -179,10 +178,6 @@ EXPORT_SYMBOL(uuid_table_remove); EXPORT_SYMBOL(vn_hold); EXPORT_SYMBOL(vn_revalidate); -#if defined(CONFIG_XFS_POSIX_ACL) -EXPORT_SYMBOL(xfs_acl_vtoacl); -EXPORT_SYMBOL(xfs_acl_inherit); -#endif EXPORT_SYMBOL(xfs_alloc_buftarg); EXPORT_SYMBOL(xfs_flush_buftarg); EXPORT_SYMBOL(xfs_free_buftarg); Index: linux-2.6-xfs/fs/xfs/xfs_vfsops.c =================================================================== --- linux-2.6-xfs.orig/fs/xfs/xfs_vfsops.c 2008-05-02 19:14:00.000000000 +0200 +++ linux-2.6-xfs/fs/xfs/xfs_vfsops.c 2008-05-02 19:34:18.000000000 +0200 @@ -80,7 +80,6 @@ xfs_init(void) xfs_dabuf_zone = kmem_zone_init(sizeof(xfs_dabuf_t), "xfs_dabuf"); xfs_ifork_zone = kmem_zone_init(sizeof(xfs_ifork_t), "xfs_ifork"); xfs_trans_zone = kmem_zone_init(sizeof(xfs_trans_t), "xfs_trans"); - xfs_acl_zone_init(xfs_acl_zone, "xfs_acl"); xfs_mru_cache_init(); xfs_filestream_init(); @@ -157,7 +156,6 @@ xfs_cleanup(void) xfs_sysctl_unregister(); xfs_filestream_uninit(); xfs_mru_cache_uninit(); - xfs_acl_zone_destroy(xfs_acl_zone); #ifdef XFS_DIR2_TRACE ktrace_free(xfs_dir2_trace_buf); Index: linux-2.6-xfs/fs/xfs/xfs_acl.c =================================================================== --- linux-2.6-xfs.orig/fs/xfs/xfs_acl.c 2008-05-02 19:14:00.000000000 +0200 +++ /dev/null 1970-01-01 00:00:00.000000000 +0000 @@ -1,882 +0,0 @@ -/* - * Copyright (c) 2001-2002,2005 Silicon Graphics, Inc. - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it would be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -#include "xfs.h" -#include "xfs_fs.h" -#include "xfs_types.h" -#include "xfs_bit.h" -#include "xfs_inum.h" -#include "xfs_ag.h" -#include "xfs_dir2.h" -#include "xfs_bmap_btree.h" -#include "xfs_alloc_btree.h" -#include "xfs_ialloc_btree.h" -#include "xfs_dir2_sf.h" -#include "xfs_attr_sf.h" -#include "xfs_dinode.h" -#include "xfs_inode.h" -#include "xfs_btree.h" -#include "xfs_acl.h" -#include "xfs_attr.h" -#include "xfs_vnodeops.h" - -#include -#include - -STATIC int xfs_acl_setmode(bhv_vnode_t *, xfs_acl_t *, int *); -STATIC void xfs_acl_filter_mode(mode_t, xfs_acl_t *); -STATIC void xfs_acl_get_endian(xfs_acl_t *); -STATIC int xfs_acl_access(uid_t, gid_t, xfs_acl_t *, mode_t, cred_t *); -STATIC int xfs_acl_invalid(xfs_acl_t *); -STATIC void xfs_acl_sync_mode(mode_t, xfs_acl_t *); -STATIC void xfs_acl_get_attr(bhv_vnode_t *, xfs_acl_t *, int, int, int *); -STATIC void xfs_acl_set_attr(bhv_vnode_t *, xfs_acl_t *, int, int *); -STATIC int xfs_acl_allow_set(bhv_vnode_t *, int); - -kmem_zone_t *xfs_acl_zone; - - -/* - * Test for existence of access ACL attribute as efficiently as possible. - */ -int -xfs_acl_vhasacl_access( - bhv_vnode_t *vp) -{ - int error; - - xfs_acl_get_attr(vp, NULL, _ACL_TYPE_ACCESS, ATTR_KERNOVAL, &error); - return (error == 0); -} - -/* - * Test for existence of default ACL attribute as efficiently as possible. - */ -int -xfs_acl_vhasacl_default( - bhv_vnode_t *vp) -{ - int error; - - if (!S_ISDIR(vp->i_mode)) - return 0; - xfs_acl_get_attr(vp, NULL, _ACL_TYPE_DEFAULT, ATTR_KERNOVAL, &error); - return (error == 0); -} - -/* - * Convert from extended attribute representation to in-memory for XFS. - */ -STATIC int -posix_acl_xattr_to_xfs( - posix_acl_xattr_header *src, - size_t size, - xfs_acl_t *dest) -{ - posix_acl_xattr_entry *src_entry; - xfs_acl_entry_t *dest_entry; - int n; - - if (!src || !dest) - return EINVAL; - - if (size < sizeof(posix_acl_xattr_header)) - return EINVAL; - - if (src->a_version != cpu_to_le32(POSIX_ACL_XATTR_VERSION)) - return EOPNOTSUPP; - - memset(dest, 0, sizeof(xfs_acl_t)); - dest->acl_cnt = posix_acl_xattr_count(size); - if (dest->acl_cnt < 0 || dest->acl_cnt > XFS_ACL_MAX_ENTRIES) - return EINVAL; - - /* - * acl_set_file(3) may request that we set default ACLs with - * zero length -- defend (gracefully) against that here. - */ - if (!dest->acl_cnt) - return 0; - - src_entry = (posix_acl_xattr_entry *)((char *)src + sizeof(*src)); - dest_entry = &dest->acl_entry[0]; - - for (n = 0; n < dest->acl_cnt; n++, src_entry++, dest_entry++) { - dest_entry->ae_perm = le16_to_cpu(src_entry->e_perm); - if (_ACL_PERM_INVALID(dest_entry->ae_perm)) - return EINVAL; - dest_entry->ae_tag = le16_to_cpu(src_entry->e_tag); - switch(dest_entry->ae_tag) { - case ACL_USER: - case ACL_GROUP: - dest_entry->ae_id = le32_to_cpu(src_entry->e_id); - break; - case ACL_USER_OBJ: - case ACL_GROUP_OBJ: - case ACL_MASK: - case ACL_OTHER: - dest_entry->ae_id = ACL_UNDEFINED_ID; - break; - default: - return EINVAL; - } - } - if (xfs_acl_invalid(dest)) - return EINVAL; - - return 0; -} - -/* - * Comparison function called from xfs_sort(). - * Primary key is ae_tag, secondary key is ae_id. - */ -STATIC int -xfs_acl_entry_compare( - const void *va, - const void *vb) -{ - xfs_acl_entry_t *a = (xfs_acl_entry_t *)va, - *b = (xfs_acl_entry_t *)vb; - - if (a->ae_tag == b->ae_tag) - return (a->ae_id - b->ae_id); - return (a->ae_tag - b->ae_tag); -} - -/* - * Convert from in-memory XFS to extended attribute representation. - */ -STATIC int -posix_acl_xfs_to_xattr( - xfs_acl_t *src, - posix_acl_xattr_header *dest, - size_t size) -{ - int n; - size_t new_size = posix_acl_xattr_size(src->acl_cnt); - posix_acl_xattr_entry *dest_entry; - xfs_acl_entry_t *src_entry; - - if (size < new_size) - return -ERANGE; - - /* Need to sort src XFS ACL by */ - xfs_sort(src->acl_entry, src->acl_cnt, sizeof(src->acl_entry[0]), - xfs_acl_entry_compare); - - dest->a_version = cpu_to_le32(POSIX_ACL_XATTR_VERSION); - dest_entry = &dest->a_entries[0]; - src_entry = &src->acl_entry[0]; - for (n = 0; n < src->acl_cnt; n++, dest_entry++, src_entry++) { - dest_entry->e_perm = cpu_to_le16(src_entry->ae_perm); - if (_ACL_PERM_INVALID(src_entry->ae_perm)) - return -EINVAL; - dest_entry->e_tag = cpu_to_le16(src_entry->ae_tag); - switch (src_entry->ae_tag) { - case ACL_USER: - case ACL_GROUP: - dest_entry->e_id = cpu_to_le32(src_entry->ae_id); - break; - case ACL_USER_OBJ: - case ACL_GROUP_OBJ: - case ACL_MASK: - case ACL_OTHER: - dest_entry->e_id = cpu_to_le32(ACL_UNDEFINED_ID); - break; - default: - return -EINVAL; - } - } - return new_size; -} - -int -xfs_acl_vget( - bhv_vnode_t *vp, - void *acl, - size_t size, - int kind) -{ - int error; - xfs_acl_t *xfs_acl = NULL; - posix_acl_xattr_header *ext_acl = acl; - int flags = 0; - - VN_HOLD(vp); - if(size) { - if (!(_ACL_ALLOC(xfs_acl))) { - error = ENOMEM; - goto out; - } - memset(xfs_acl, 0, sizeof(xfs_acl_t)); - } else - flags = ATTR_KERNOVAL; - - xfs_acl_get_attr(vp, xfs_acl, kind, flags, &error); - if (error) - goto out; - - if (!size) { - error = -posix_acl_xattr_size(XFS_ACL_MAX_ENTRIES); - } else { - if (xfs_acl_invalid(xfs_acl)) { - error = EINVAL; - goto out; - } - if (kind == _ACL_TYPE_ACCESS) - xfs_acl_sync_mode(xfs_vtoi(vp)->i_d.di_mode, xfs_acl); - error = -posix_acl_xfs_to_xattr(xfs_acl, ext_acl, size); - } -out: - VN_RELE(vp); - if(xfs_acl) - _ACL_FREE(xfs_acl); - return -error; -} - -int -xfs_acl_vremove( - bhv_vnode_t *vp, - int kind) -{ - int error; - - VN_HOLD(vp); - error = xfs_acl_allow_set(vp, kind); - if (!error) { - error = xfs_attr_remove(xfs_vtoi(vp), - kind == _ACL_TYPE_DEFAULT? - SGI_ACL_DEFAULT: SGI_ACL_FILE, - ATTR_ROOT); - if (error == ENOATTR) - error = 0; /* 'scool */ - } - VN_RELE(vp); - return -error; -} - -int -xfs_acl_vset( - bhv_vnode_t *vp, - void *acl, - size_t size, - int kind) -{ - posix_acl_xattr_header *ext_acl = acl; - xfs_acl_t *xfs_acl; - int error; - int basicperms = 0; /* more than std unix perms? */ - - if (!acl) - return -EINVAL; - - if (!(_ACL_ALLOC(xfs_acl))) - return -ENOMEM; - - error = posix_acl_xattr_to_xfs(ext_acl, size, xfs_acl); - if (error) { - _ACL_FREE(xfs_acl); - return -error; - } - if (!xfs_acl->acl_cnt) { - _ACL_FREE(xfs_acl); - return 0; - } - - VN_HOLD(vp); - error = xfs_acl_allow_set(vp, kind); - - /* Incoming ACL exists, set file mode based on its value */ - if (!error && kind == _ACL_TYPE_ACCESS) - error = xfs_acl_setmode(vp, xfs_acl, &basicperms); - - if (error) - goto out; - - /* - * If we have more than std unix permissions, set up the actual attr. - * Otherwise, delete any existing attr. This prevents us from - * having actual attrs for permissions that can be stored in the - * standard permission bits. - */ - if (!basicperms) { - xfs_acl_set_attr(vp, xfs_acl, kind, &error); - } else { - error = -xfs_acl_vremove(vp, _ACL_TYPE_ACCESS); - } - -out: - VN_RELE(vp); - _ACL_FREE(xfs_acl); - return -error; -} - -int -xfs_acl_iaccess( - xfs_inode_t *ip, - mode_t mode, - cred_t *cr) -{ - xfs_acl_t *acl; - int rval; - struct xfs_name acl_name = {SGI_ACL_FILE, SGI_ACL_FILE_SIZE}; - - if (!(_ACL_ALLOC(acl))) - return -1; - - /* If the file has no ACL return -1. */ - rval = sizeof(xfs_acl_t); - if (xfs_attr_fetch(ip, &acl_name, (char *)acl, &rval, - ATTR_ROOT | ATTR_KERNACCESS)) { - _ACL_FREE(acl); - return -1; - } - xfs_acl_get_endian(acl); - - /* If the file has an empty ACL return -1. */ - if (acl->acl_cnt == XFS_ACL_NOT_PRESENT) { - _ACL_FREE(acl); - return -1; - } - - /* Synchronize ACL with mode bits */ - xfs_acl_sync_mode(ip->i_d.di_mode, acl); - - rval = xfs_acl_access(ip->i_d.di_uid, ip->i_d.di_gid, acl, mode, cr); - _ACL_FREE(acl); - return rval; -} - -STATIC int -xfs_acl_allow_set( - bhv_vnode_t *vp, - int kind) -{ - if (vp->i_flags & (S_IMMUTABLE|S_APPEND)) - return EPERM; - if (kind == _ACL_TYPE_DEFAULT && !S_ISDIR(vp->i_mode)) - return ENOTDIR; - if (vp->i_sb->s_flags & MS_RDONLY) - return EROFS; - if (xfs_vtoi(vp)->i_d.di_uid != current->fsuid && !capable(CAP_FOWNER)) - return EPERM; - return 0; -} - -/* - * Note: cr is only used here for the capability check if the ACL test fails. - * It is not used to find out the credentials uid or groups etc, as was - * done in IRIX. It is assumed that the uid and groups for the current - * thread are taken from "current" instead of the cr parameter. - */ -STATIC int -xfs_acl_access( - uid_t fuid, - gid_t fgid, - xfs_acl_t *fap, - mode_t md, - cred_t *cr) -{ - xfs_acl_entry_t matched; - int i, allows; - int maskallows = -1; /* true, but not 1, either */ - int seen_userobj = 0; - - matched.ae_tag = 0; /* Invalid type */ - matched.ae_perm = 0; - - for (i = 0; i < fap->acl_cnt; i++) { - /* - * Break out if we've got a user_obj entry or - * a user entry and the mask (and have processed USER_OBJ) - */ - if (matched.ae_tag == ACL_USER_OBJ) - break; - if (matched.ae_tag == ACL_USER) { - if (maskallows != -1 && seen_userobj) - break; - if (fap->acl_entry[i].ae_tag != ACL_MASK && - fap->acl_entry[i].ae_tag != ACL_USER_OBJ) - continue; - } - /* True if this entry allows the requested access */ - allows = ((fap->acl_entry[i].ae_perm & md) == md); - - switch (fap->acl_entry[i].ae_tag) { - case ACL_USER_OBJ: - seen_userobj = 1; - if (fuid != current->fsuid) - continue; - matched.ae_tag = ACL_USER_OBJ; - matched.ae_perm = allows; - break; - case ACL_USER: - if (fap->acl_entry[i].ae_id != current->fsuid) - continue; - matched.ae_tag = ACL_USER; - matched.ae_perm = allows; - break; - case ACL_GROUP_OBJ: - if ((matched.ae_tag == ACL_GROUP_OBJ || - matched.ae_tag == ACL_GROUP) && !allows) - continue; - if (!in_group_p(fgid)) - continue; - matched.ae_tag = ACL_GROUP_OBJ; - matched.ae_perm = allows; - break; - case ACL_GROUP: - if ((matched.ae_tag == ACL_GROUP_OBJ || - matched.ae_tag == ACL_GROUP) && !allows) - continue; - if (!in_group_p(fap->acl_entry[i].ae_id)) - continue; - matched.ae_tag = ACL_GROUP; - matched.ae_perm = allows; - break; - case ACL_MASK: - maskallows = allows; - break; - case ACL_OTHER: - if (matched.ae_tag != 0) - continue; - matched.ae_tag = ACL_OTHER; - matched.ae_perm = allows; - break; - } - } - /* - * First possibility is that no matched entry allows access. - * The capability to override DAC may exist, so check for it. - */ - switch (matched.ae_tag) { - case ACL_OTHER: - case ACL_USER_OBJ: - if (matched.ae_perm) - return 0; - break; - case ACL_USER: - case ACL_GROUP_OBJ: - case ACL_GROUP: - if (maskallows && matched.ae_perm) - return 0; - break; - case 0: - break; - } - - /* EACCES tells generic_permission to check for capability overrides */ - return EACCES; -} -EXPORT_SYMBOL(xfs_acl_access); - -/* - * ACL validity checker. - * This acl validation routine checks each ACL entry read in makes sense. - */ -STATIC int -xfs_acl_invalid( - xfs_acl_t *aclp) -{ - xfs_acl_entry_t *entry, *e; - int user = 0, group = 0, other = 0, mask = 0; - int mask_required = 0; - int i, j; - - if (!aclp) - goto acl_invalid; - - if (aclp->acl_cnt > XFS_ACL_MAX_ENTRIES) - goto acl_invalid; - - for (i = 0; i < aclp->acl_cnt; i++) { - entry = &aclp->acl_entry[i]; - switch (entry->ae_tag) { - case ACL_USER_OBJ: - if (user++) - goto acl_invalid; - break; - case ACL_GROUP_OBJ: - if (group++) - goto acl_invalid; - break; - case ACL_OTHER: - if (other++) - goto acl_invalid; - break; - case ACL_USER: - case ACL_GROUP: - for (j = i + 1; j < aclp->acl_cnt; j++) { - e = &aclp->acl_entry[j]; - if (e->ae_id == entry->ae_id && - e->ae_tag == entry->ae_tag) - goto acl_invalid; - } - mask_required++; - break; - case ACL_MASK: - if (mask++) - goto acl_invalid; - break; - default: - goto acl_invalid; - } - } - if (!user || !group || !other || (mask_required && !mask)) - goto acl_invalid; - else - return 0; -acl_invalid: - return EINVAL; -} - -/* - * Do ACL endian conversion. - */ -STATIC void -xfs_acl_get_endian( - xfs_acl_t *aclp) -{ - xfs_acl_entry_t *ace, *end; - - INT_SET(aclp->acl_cnt, ARCH_CONVERT, aclp->acl_cnt); - end = &aclp->acl_entry[0]+aclp->acl_cnt; - for (ace = &aclp->acl_entry[0]; ace < end; ace++) { - INT_SET(ace->ae_tag, ARCH_CONVERT, ace->ae_tag); - INT_SET(ace->ae_id, ARCH_CONVERT, ace->ae_id); - INT_SET(ace->ae_perm, ARCH_CONVERT, ace->ae_perm); - } -} - -/* - * Get the ACL from the EA and do endian conversion. - */ -STATIC void -xfs_acl_get_attr( - bhv_vnode_t *vp, - xfs_acl_t *aclp, - int kind, - int flags, - int *error) -{ - int len = sizeof(xfs_acl_t); - - ASSERT((flags & ATTR_KERNOVAL) ? (aclp == NULL) : 1); - flags |= ATTR_ROOT; - *error = xfs_attr_get(xfs_vtoi(vp), - kind == _ACL_TYPE_ACCESS ? - SGI_ACL_FILE : SGI_ACL_DEFAULT, - (char *)aclp, &len, flags); - if (*error || (flags & ATTR_KERNOVAL)) - return; - xfs_acl_get_endian(aclp); -} - -/* - * Set the EA with the ACL and do endian conversion. - */ -STATIC void -xfs_acl_set_attr( - bhv_vnode_t *vp, - xfs_acl_t *aclp, - int kind, - int *error) -{ - xfs_acl_entry_t *ace, *newace, *end; - xfs_acl_t *newacl; - int len; - - if (!(_ACL_ALLOC(newacl))) { - *error = ENOMEM; - return; - } - - len = sizeof(xfs_acl_t) - - (sizeof(xfs_acl_entry_t) * (XFS_ACL_MAX_ENTRIES - aclp->acl_cnt)); - end = &aclp->acl_entry[0]+aclp->acl_cnt; - for (ace = &aclp->acl_entry[0], newace = &newacl->acl_entry[0]; - ace < end; - ace++, newace++) { - INT_SET(newace->ae_tag, ARCH_CONVERT, ace->ae_tag); - INT_SET(newace->ae_id, ARCH_CONVERT, ace->ae_id); - INT_SET(newace->ae_perm, ARCH_CONVERT, ace->ae_perm); - } - INT_SET(newacl->acl_cnt, ARCH_CONVERT, aclp->acl_cnt); - *error = xfs_attr_set(xfs_vtoi(vp), - kind == _ACL_TYPE_ACCESS ? - SGI_ACL_FILE: SGI_ACL_DEFAULT, - (char *)newacl, len, ATTR_ROOT); - _ACL_FREE(newacl); -} - -int -xfs_acl_vtoacl( - bhv_vnode_t *vp, - xfs_acl_t *access_acl, - xfs_acl_t *default_acl) -{ - int error = 0; - - if (access_acl) { - /* - * Get the Access ACL and the mode. If either cannot - * be obtained for some reason, invalidate the access ACL. - */ - xfs_acl_get_attr(vp, access_acl, _ACL_TYPE_ACCESS, 0, &error); - if (error) - access_acl->acl_cnt = XFS_ACL_NOT_PRESENT; - else /* We have a good ACL and the file mode, synchronize. */ - xfs_acl_sync_mode(xfs_vtoi(vp)->i_d.di_mode, access_acl); - } - - if (default_acl) { - xfs_acl_get_attr(vp, default_acl, _ACL_TYPE_DEFAULT, 0, &error); - if (error) - default_acl->acl_cnt = XFS_ACL_NOT_PRESENT; - } - return error; -} - -/* - * This function retrieves the parent directory's acl, processes it - * and lets the child inherit the acl(s) that it should. - */ -int -xfs_acl_inherit( - bhv_vnode_t *vp, - mode_t mode, - xfs_acl_t *pdaclp) -{ - xfs_acl_t *cacl; - int error = 0; - int basicperms = 0; - - /* - * If the parent does not have a default ACL, or it's an - * invalid ACL, we're done. - */ - if (!vp) - return 0; - if (!pdaclp || xfs_acl_invalid(pdaclp)) - return 0; - - /* - * Copy the default ACL of the containing directory to - * the access ACL of the new file and use the mode that - * was passed in to set up the correct initial values for - * the u::,g::[m::], and o:: entries. This is what makes - * umask() "work" with ACL's. - */ - - if (!(_ACL_ALLOC(cacl))) - return ENOMEM; - - memcpy(cacl, pdaclp, sizeof(xfs_acl_t)); - xfs_acl_filter_mode(mode, cacl); - error = xfs_acl_setmode(vp, cacl, &basicperms); - if (error) - goto out_error; - - /* - * Set the Default and Access ACL on the file. The mode is already - * set on the file, so we don't need to worry about that. - * - * If the new file is a directory, its default ACL is a copy of - * the containing directory's default ACL. - */ - if (S_ISDIR(vp->i_mode)) - xfs_acl_set_attr(vp, pdaclp, _ACL_TYPE_DEFAULT, &error); - if (!error && !basicperms) - xfs_acl_set_attr(vp, cacl, _ACL_TYPE_ACCESS, &error); -out_error: - _ACL_FREE(cacl); - return error; -} - -/* - * Set up the correct mode on the file based on the supplied ACL. This - * makes sure that the mode on the file reflects the state of the - * u::,g::[m::], and o:: entries in the ACL. Since the mode is where - * the ACL is going to get the permissions for these entries, we must - * synchronize the mode whenever we set the ACL on a file. - */ -STATIC int -xfs_acl_setmode( - bhv_vnode_t *vp, - xfs_acl_t *acl, - int *basicperms) -{ - bhv_vattr_t va; - xfs_acl_entry_t *ap; - xfs_acl_entry_t *gap = NULL; - int i, nomask = 1; - - *basicperms = 1; - - if (acl->acl_cnt == XFS_ACL_NOT_PRESENT) - return 0; - - /* - * Copy the u::, g::, o::, and m:: bits from the ACL into the - * mode. The m:: bits take precedence over the g:: bits. - */ - va.va_mask = XFS_AT_MODE; - va.va_mode = xfs_vtoi(vp)->i_d.di_mode; - va.va_mode &= ~(S_IRWXU|S_IRWXG|S_IRWXO); - ap = acl->acl_entry; - for (i = 0; i < acl->acl_cnt; ++i) { - switch (ap->ae_tag) { - case ACL_USER_OBJ: - va.va_mode |= ap->ae_perm << 6; - break; - case ACL_GROUP_OBJ: - gap = ap; - break; - case ACL_MASK: /* more than just standard modes */ - nomask = 0; - va.va_mode |= ap->ae_perm << 3; - *basicperms = 0; - break; - case ACL_OTHER: - va.va_mode |= ap->ae_perm; - break; - default: /* more than just standard modes */ - *basicperms = 0; - break; - } - ap++; - } - - /* Set the group bits from ACL_GROUP_OBJ if there's no ACL_MASK */ - if (gap && nomask) - va.va_mode |= gap->ae_perm << 3; - - return xfs_setattr(xfs_vtoi(vp), &va, 0, sys_cred); -} - -/* - * The permissions for the special ACL entries (u::, g::[m::], o::) are - * actually stored in the file mode (if there is both a group and a mask, - * the group is stored in the ACL entry and the mask is stored on the file). - * This allows the mode to remain automatically in sync with the ACL without - * the need for a call-back to the ACL system at every point where the mode - * could change. This function takes the permissions from the specified mode - * and places it in the supplied ACL. - * - * This implementation draws its validity from the fact that, when the ACL - * was assigned, the mode was copied from the ACL. - * If the mode did not change, therefore, the mode remains exactly what was - * taken from the special ACL entries at assignment. - * If a subsequent chmod() was done, the POSIX spec says that the change in - * mode must cause an update to the ACL seen at user level and used for - * access checks. Before and after a mode change, therefore, the file mode - * most accurately reflects what the special ACL entries should permit/deny. - * - * CAVEAT: If someone sets the SGI_ACL_FILE attribute directly, - * the existing mode bits will override whatever is in the - * ACL. Similarly, if there is a pre-existing ACL that was - * never in sync with its mode (owing to a bug in 6.5 and - * before), it will now magically (or mystically) be - * synchronized. This could cause slight astonishment, but - * it is better than inconsistent permissions. - * - * The supplied ACL is a template that may contain any combination - * of special entries. These are treated as place holders when we fill - * out the ACL. This routine does not add or remove special entries, it - * simply unites each special entry with its associated set of permissions. - */ -STATIC void -xfs_acl_sync_mode( - mode_t mode, - xfs_acl_t *acl) -{ - int i, nomask = 1; - xfs_acl_entry_t *ap; - xfs_acl_entry_t *gap = NULL; - - /* - * Set ACL entries. POSIX1003.1eD16 requires that the MASK - * be set instead of the GROUP entry, if there is a MASK. - */ - for (ap = acl->acl_entry, i = 0; i < acl->acl_cnt; ap++, i++) { - switch (ap->ae_tag) { - case ACL_USER_OBJ: - ap->ae_perm = (mode >> 6) & 0x7; - break; - case ACL_GROUP_OBJ: - gap = ap; - break; - case ACL_MASK: - nomask = 0; - ap->ae_perm = (mode >> 3) & 0x7; - break; - case ACL_OTHER: - ap->ae_perm = mode & 0x7; - break; - default: - break; - } - } - /* Set the ACL_GROUP_OBJ if there's no ACL_MASK */ - if (gap && nomask) - gap->ae_perm = (mode >> 3) & 0x7; -} - -/* - * When inheriting an Access ACL from a directory Default ACL, - * the ACL bits are set to the intersection of the ACL default - * permission bits and the file permission bits in mode. If there - * are no permission bits on the file then we must not give them - * the ACL. This is what what makes umask() work with ACLs. - */ -STATIC void -xfs_acl_filter_mode( - mode_t mode, - xfs_acl_t *acl) -{ - int i, nomask = 1; - xfs_acl_entry_t *ap; - xfs_acl_entry_t *gap = NULL; - - /* - * Set ACL entries. POSIX1003.1eD16 requires that the MASK - * be merged with GROUP entry, if there is a MASK. - */ - for (ap = acl->acl_entry, i = 0; i < acl->acl_cnt; ap++, i++) { - switch (ap->ae_tag) { - case ACL_USER_OBJ: - ap->ae_perm &= (mode >> 6) & 0x7; - break; - case ACL_GROUP_OBJ: - gap = ap; - break; - case ACL_MASK: - nomask = 0; - ap->ae_perm &= (mode >> 3) & 0x7; - break; - case ACL_OTHER: - ap->ae_perm &= mode & 0x7; - break; - default: - break; - } - } - /* Set the ACL_GROUP_OBJ if there's no ACL_MASK */ - if (gap && nomask) - gap->ae_perm &= (mode >> 3) & 0x7; -} Index: linux-2.6-xfs/fs/xfs/Makefile =================================================================== --- linux-2.6-xfs.orig/fs/xfs/Makefile 2008-05-02 19:14:00.000000000 +0200 +++ linux-2.6-xfs/fs/xfs/Makefile 2008-05-02 19:34:18.000000000 +0200 @@ -29,7 +29,7 @@ obj-$(CONFIG_XFS_QUOTA) += quota/ obj-$(CONFIG_XFS_DMAPI) += dmapi/ xfs-$(CONFIG_XFS_RT) += xfs_rtalloc.o -xfs-$(CONFIG_XFS_POSIX_ACL) += xfs_acl.o +xfs-$(CONFIG_XFS_POSIX_ACL) += $(XFS_LINUX)/xfs_acl.o xfs-$(CONFIG_PROC_FS) += $(XFS_LINUX)/xfs_stats.o xfs-$(CONFIG_SYSCTL) += $(XFS_LINUX)/xfs_sysctl.o xfs-$(CONFIG_COMPAT) += $(XFS_LINUX)/xfs_ioctl32.o Index: linux-2.6-xfs/fs/xfs/xfs_inode.c =================================================================== --- linux-2.6-xfs.orig/fs/xfs/xfs_inode.c 2008-05-02 19:14:00.000000000 +0200 +++ linux-2.6-xfs/fs/xfs/xfs_inode.c 2008-05-02 19:34:18.000000000 +0200 @@ -52,6 +52,7 @@ #include "xfs_acl.h" #include "xfs_filestream.h" #include "xfs_vnodeops.h" +#include "xfs_acl.h" kmem_zone_t *xfs_ifork_zone; kmem_zone_t *xfs_inode_zone; @@ -816,6 +817,7 @@ xfs_iread( ip->i_mount = mp; atomic_set(&ip->i_iocount, 0); spin_lock_init(&ip->i_flags_lock); + xfs_inode_init_acls(ip); /* * Get pointer's to the on-disk inode and the buffer containing it. @@ -2668,6 +2670,8 @@ xfs_idestroy( } xfs_inode_item_destroy(ip); } + + xfs_inode_clear_acls(ip); kmem_zone_free(xfs_inode_zone, ip); } Index: linux-2.6-xfs/fs/xfs/xfs_inode.h =================================================================== --- linux-2.6-xfs.orig/fs/xfs/xfs_inode.h 2008-05-02 19:14:00.000000000 +0200 +++ linux-2.6-xfs/fs/xfs/xfs_inode.h 2008-05-02 19:34:18.000000000 +0200 @@ -18,6 +18,7 @@ #ifndef __XFS_INODE_H__ #define __XFS_INODE_H__ +struct posix_acl; struct xfs_dinode; struct xfs_dinode_core; @@ -239,6 +240,11 @@ typedef struct xfs_inode { xfs_fsize_t i_size; /* in-memory size */ xfs_fsize_t i_new_size; /* size when write completes */ atomic_t i_iocount; /* outstanding I/O count */ + +#ifdef CONFIG_XFS_POSIX_ACL + struct posix_acl *i_acl; + struct posix_acl *i_default_acl; +#endif /* Trace buffers per inode. */ #ifdef XFS_INODE_TRACE struct ktrace *i_trace; /* general inode trace */ Index: linux-2.6-xfs/fs/xfs/linux-2.6/xfs_xattr.c =================================================================== --- linux-2.6-xfs.orig/fs/xfs/linux-2.6/xfs_xattr.c 2008-05-02 19:14:00.000000000 +0200 +++ linux-2.6-xfs/fs/xfs/linux-2.6/xfs_xattr.c 2008-05-02 19:34:18.000000000 +0200 @@ -12,66 +12,6 @@ #include -/* - * ACL handling. Should eventually be moved into xfs_acl.c - */ - -static int -xfs_decode_acl(const char *name) -{ - if (strcmp(name, "posix_acl_access") == 0) - return _ACL_TYPE_ACCESS; - else if (strcmp(name, "posix_acl_default") == 0) - return _ACL_TYPE_DEFAULT; - return -EINVAL; -} - -static int -xfs_xattr_system_get(struct inode *inode, const char *name, - void *buffer, size_t size) -{ - int acl; - - acl = xfs_decode_acl(name); - if (acl < 0) - return acl; - - return xfs_acl_vget(inode, buffer, size, acl); -} - -static int -xfs_xattr_system_set(struct inode *inode, const char *name, - const void *value, size_t size, int flags) -{ - int error, acl; - - acl = xfs_decode_acl(name); - if (acl < 0) - return acl; - if (flags & XATTR_CREATE) - return -EINVAL; - - if (!value) - return xfs_acl_vremove(inode, acl); - - error = xfs_acl_vset(inode, (void *)value, size, acl); - if (!error) - vn_revalidate(inode); - return error; -} - -static struct xattr_handler xfs_xattr_system_handler = { - .prefix = XATTR_SYSTEM_PREFIX, - .get = xfs_xattr_system_get, - .set = xfs_xattr_system_set, -}; - - -/* - * Real xattr handling. The only difference between the namespaces is - * a flag passed to the low-level attr code. - */ - static int __xfs_xattr_get(struct inode *inode, const char *name, void *value, size_t size, int xflags) @@ -196,7 +136,9 @@ struct xattr_handler *xfs_xattr_handlers &xfs_xattr_user_handler, &xfs_xattr_trusted_handler, &xfs_xattr_security_handler, +#ifdef CONFIG_XFS_POSIX_ACL &xfs_xattr_system_handler, +#endif NULL }; @@ -246,7 +188,7 @@ xfs_vn_listxattr(struct dentry *dentry, /* * Then add the two synthetic ACL attributes. */ - if (xfs_acl_vhasacl_access(inode)) { + if (posix_acl_access_exists(inode)) { error = list_one_attr(POSIX_ACL_XATTR_ACCESS, strlen(POSIX_ACL_XATTR_ACCESS) + 1, data, size, &result); @@ -254,7 +196,7 @@ xfs_vn_listxattr(struct dentry *dentry, return error; } - if (xfs_acl_vhasacl_default(inode)) { + if (posix_acl_default_exists(inode)) { error = list_one_attr(POSIX_ACL_XATTR_DEFAULT, strlen(POSIX_ACL_XATTR_DEFAULT) + 1, data, size, &result); Index: linux-2.6-xfs/fs/xfs/Kconfig =================================================================== --- linux-2.6-xfs.orig/fs/xfs/Kconfig 2008-05-02 19:14:00.000000000 +0200 +++ linux-2.6-xfs/fs/xfs/Kconfig 2008-05-02 19:34:18.000000000 +0200 @@ -51,6 +51,7 @@ config XFS_DMAPI config XFS_POSIX_ACL bool "XFS POSIX ACL support" depends on XFS_FS + select FS_POSIX_ACL help POSIX Access Control Lists (ACLs) support permissions for users and groups beyond the owner/group/world scheme. From owner-xfs@oss.sgi.com Sun May 11 23:40:39 2008 Received: with ECARTIS (v1.0.0; list xfs); Sun, 11 May 2008 23:40: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.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 m4C6eZiB002971 for ; Sun, 11 May 2008 23:40:38 -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 QAA15016; Mon, 12 May 2008 16:41:19 +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 m4C6fIsT164763590; Mon, 12 May 2008 16:41:19 +1000 (AEST) Received: (from dgc@localhost) by snort.melbourne.sgi.com (SGI-8.12.5/8.12.5/Submit) id m4C6fFMD164765327; Mon, 12 May 2008 16:41:15 +1000 (AEST) X-Authentication-Warning: snort.melbourne.sgi.com: dgc set sender to dgc@sgi.com using -f Date: Mon, 12 May 2008 16:41:15 +1000 From: David Chinner To: tes@sgi.com Cc: xfs-dev@sgi.com, xfs@oss.sgi.com Subject: Re: review: log_filter.patch 018,081,082 pv#981362 Message-ID: <20080512064115.GF155679365@sgi.com> References: <48227ef3.WIWE0hYubr4nS8cD%tes@sgi.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <48227ef3.WIWE0hYubr4nS8cD%tes@sgi.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: 15841 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 08, 2008 at 02:17:55PM +1000, tes@sgi.com wrote: > Due to the changes for default mkfs options where we now have > version 2 inodes, we no longer update the di_onlink field. > To be consistent with previous output, we filter these values out. > Also, as part of changes to the inode generation number which uses > a random num generator, we need to filter out the gen# too. > > --Tim > > 018.op.irix | 400 +++++++++++------------ > 018.op.linux | 400 +++++++++++------------ > 018.trans_inode | 800 +++++++++++++++++++++++------------------------ > 081.ugquota.trans_inode | 816 ++++++++++++++++++++++++------------------------ > 082.op.irix | 400 +++++++++++------------ > 082.op.linux | 400 +++++++++++------------ > 082.trans_inode | 800 +++++++++++++++++++++++------------------------ > common.log | 3 > 8 files changed, 2011 insertions(+), 2008 deletions(-) Worth noting is that these tests all still fail on a config that corrects a problem with the superblock features2 field on mount. Probably not worth bothering about - but I thought I'd mention it as updating the tests didn't fix the failure on my machine. Updating xfsprogs now.... Cheers, Dave. -- Dave Chinner Principal Engineer SGI Australian Software Group From owner-xfs@oss.sgi.com Sun May 11 23:46:38 2008 Received: with ECARTIS (v1.0.0; list xfs); Sun, 11 May 2008 23:46: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.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 m4C6kY3O003484 for ; Sun, 11 May 2008 23:46:36 -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 QAA15225; Mon, 12 May 2008 16:47:16 +1000 Message-ID: <4827E7F4.7010706@sgi.com> Date: Mon, 12 May 2008 16:47:16 +1000 From: Timothy Shimmin User-Agent: Thunderbird 2.0.0.14 (Macintosh/20080421) MIME-Version: 1.0 To: David Chinner CC: xfs-dev@sgi.com, xfs@oss.sgi.com Subject: Re: review: log_filter.patch 018,081,082 pv#981362 References: <48227ef3.WIWE0hYubr4nS8cD%tes@sgi.com> <20080512064115.GF155679365@sgi.com> In-Reply-To: <20080512064115.GF155679365@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: 15842 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 Thu, May 08, 2008 at 02:17:55PM +1000, tes@sgi.com wrote: >> Due to the changes for default mkfs options where we now have >> version 2 inodes, we no longer update the di_onlink field. >> To be consistent with previous output, we filter these values out. >> Also, as part of changes to the inode generation number which uses >> a random num generator, we need to filter out the gen# too. >> >> --Tim >> >> 018.op.irix | 400 +++++++++++------------ >> 018.op.linux | 400 +++++++++++------------ >> 018.trans_inode | 800 +++++++++++++++++++++++------------------------ >> 081.ugquota.trans_inode | 816 ++++++++++++++++++++++++------------------------ >> 082.op.irix | 400 +++++++++++------------ >> 082.op.linux | 400 +++++++++++------------ >> 082.trans_inode | 800 +++++++++++++++++++++++------------------------ >> common.log | 3 >> 8 files changed, 2011 insertions(+), 2008 deletions(-) > > Worth noting is that these tests all still fail on a config that > corrects a problem with the superblock features2 field on mount. > > Probably not worth bothering about - but I thought I'd mention it > as updating the tests didn't fix the failure on my machine. Updating > xfsprogs now.... > > Cheers, > > Dave. :-) Yeah, I had the same failure until I updated mkfs. I had an extra SB_UNIT sb buffer transaction at the start of the log for the features2 correction. I didn't think it was worth bothering about for that interim scenario. --Tim From owner-xfs@oss.sgi.com Mon May 12 00:25:42 2008 Received: with ECARTIS (v1.0.0; list xfs); Mon, 12 May 2008 00:26: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.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 m4C7PdN3012993 for ; Mon, 12 May 2008 00:25:41 -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 RAA15976; Mon, 12 May 2008 17:26:23 +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 m4C7QMsT164788173; Mon, 12 May 2008 17:26:22 +1000 (AEST) Received: (from dgc@localhost) by snort.melbourne.sgi.com (SGI-8.12.5/8.12.5/Submit) id m4C7QLb463423447; Mon, 12 May 2008 17:26:21 +1000 (AEST) X-Authentication-Warning: snort.melbourne.sgi.com: dgc set sender to dgc@sgi.com using -f Date: Mon, 12 May 2008 17:26:21 +1000 From: David Chinner To: xfs-dev Cc: xfs-oss Subject: xfsprogs 2.9.8 gives unaligned access warnings on ia64 Message-ID: <20080512072621.GG155679365@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: 15843 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 Barry, I just upgraded to xfsprogs 2.9.8 and now every time xfs_check or xfs_repair runs I get a bunch of unaligned access warnings. I can't remember what the proevious version was on this machine; might have been 2.9.4. $ sudo ./check 018 [sudo] password for dgc: FSTYP -- xfs (debug) PLATFORM -- Linux/ia64 budgie 2.6.25-rc3-dgc-xfs MKFS_OPTIONS -- -f -bsize=4096 /dev/sdb6 MOUNT_OPTIONS -- /dev/sdb6 /mnt/scratch xfs_db(23565): unaligned access to 0x6000000000041264, ip=0x4000000000062a71 xfs_db(23565): unaligned access to 0x600000000004126c, ip=0x4000000000062a80 xfs_repair(23566): unaligned access to 0x2000000004000e64, ip=0x4000000000080c81 xfs_repair(23566): unaligned access to 0x2000000004000e6c, ip=0x4000000000080c90 xfs_repair(23566): unaligned access to 0x2000000004001664, ip=0x4000000000080c81 018 xfs_db(24234): unaligned access to 0x6000000000041264, ip=0x4000000000062a71 xfs_db(24234): unaligned access to 0x600000000004126c, ip=0x4000000000062a80 xfs_repair(24235): unaligned access to 0x6000000000020264, ip=0x4000000000080c81 xfs_repair(24235): unaligned access to 0x600000000002026c, ip=0x4000000000080c90 xfs_repair(24235): unaligned access to 0x6000000000020a64, ip=0x4000000000080c81 Passed all 1 tests $ sudo xfs_repair -V xfs_repair version 2.9.8 I'm going to turn this warning off manually (systune), but this really needs fixing ASAP. Cheers, Dave. -- Dave Chinner Principal Engineer SGI Australian Software Group From owner-xfs@oss.sgi.com Mon May 12 04:01:04 2008 Received: with ECARTIS (v1.0.0; list xfs); Mon, 12 May 2008 04:01:27 -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 m4CB10If027379 for ; Mon, 12 May 2008 04:01:02 -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 VAA19506; Mon, 12 May 2008 21:01:38 +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 m4CB1asT164508537; Mon, 12 May 2008 21:01:37 +1000 (AEST) Received: (from dgc@localhost) by snort.melbourne.sgi.com (SGI-8.12.5/8.12.5/Submit) id m4CB1Y24162101412; Mon, 12 May 2008 21:01:34 +1000 (AEST) X-Authentication-Warning: snort.melbourne.sgi.com: dgc set sender to dgc@sgi.com using -f Date: Mon, 12 May 2008 21:01:34 +1000 From: David Chinner To: xfs-dev Cc: xfs-oss Subject: [patch] xfsqa 008 takes too long on UML... Message-ID: <20080512110134.GH155679365@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: 15844 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 With the recent change for reliability with 64k page size made to test 008,the file sizes got much larger. It appears that randholes actually reads the entire file, so this has slowed the test down by a factor of ten (all file sizes were increased by 10x). This means the test is now taking about 18 minutes to run on a UML session, and all the time is spent reading the files. Instead, scale the file size based on the page size. We know how many holes we are trying to produce and the I/O size being used to produce them, so the size of the files can be finely tuned. Assuming a decent random distribution, if the number of blocks in the file is 4x the page size and the I/O size is page sized, this means that every I/O should generate a new hole and we'll only get a small amount of adjacent extents. This has passed over 10 times on ia64 w/ 64k page and another 15 times on UML with 4k page. UML runtime is down from ~1000s to 5s, ia64 runtime is down from ~30s to 7s. Cheers, Dave. -- Dave Chinner Principal Engineer SGI Australian Software Group --- xfstests/008 | 13 +++++++------ xfstests/008.out | 10 +++++----- 2 files changed, 12 insertions(+), 11 deletions(-) Index: xfs-cmds/xfstests/008 =================================================================== --- xfs-cmds.orig/xfstests/008 2008-04-28 15:57:02.000000000 +1000 +++ xfs-cmds/xfstests/008 2008-05-12 20:43:11.946325031 +1000 @@ -28,7 +28,8 @@ _cleanup() _filter() { - sed -e "s/-b $pgsize/-b PGSIZE/g" + sed -e "s/-b $pgsize/-b PGSIZE/g" \ + -e "s/-l .* -c/-l FSIZE -c/g" } # get standard environment, filters and checks @@ -79,13 +80,13 @@ _setup_testdir rm -f $here/$seq.out.full -_do_test 1 50 "-l 50000000 -c 50 -b $pgsize" -_do_test 2 100 "-l 100000000 -c 100 -b $pgsize" -_do_test 3 100 "-l 100000000 -c 100 -b 512" # test partial pages +_do_test 1 50 "-l `expr 200 \* $pgsize` -c 50 -b $pgsize" +_do_test 2 100 "-l `expr 400 \* $pgsize` -c 100 -b $pgsize" +_do_test 3 100 "-l `expr 400 \* $pgsize` -c 100 -b 512" # test partial pages # rinse, lather, repeat for direct IO -_do_test 4 50 "-d -l 50000000 -c 50 -b $pgsize" -_do_test 5 100 "-d -l 100000000 -c 100 -b $pgsize" +_do_test 4 50 "-d -l `expr 200 \* $pgsize` -c 50 -b $pgsize" +_do_test 5 100 "-d -l `expr 400 \* $pgsize` -c 100 -b $pgsize" # note: direct IO requires page aligned IO # todo: realtime. Index: xfs-cmds/xfstests/008.out =================================================================== --- xfs-cmds.orig/xfstests/008.out 2008-04-28 15:57:02.000000000 +1000 +++ xfs-cmds/xfstests/008.out 2008-05-12 20:41:12.053827580 +1000 @@ -1,21 +1,21 @@ QA output created by 008 -randholes.1 : -l 50000000 -c 50 -b PGSIZE +randholes.1 : -l FSIZE -c 50 -b PGSIZE ------------------------------------------ holes is in range -randholes.2 : -l 100000000 -c 100 -b PGSIZE +randholes.2 : -l FSIZE -c 100 -b PGSIZE ------------------------------------------ holes is in range -randholes.3 : -l 100000000 -c 100 -b 512 +randholes.3 : -l FSIZE -c 100 -b 512 ------------------------------------------ holes is in range -randholes.4 : -d -l 50000000 -c 50 -b PGSIZE +randholes.4 : -d -l FSIZE -c 50 -b PGSIZE ------------------------------------------ holes is in range -randholes.5 : -d -l 100000000 -c 100 -b PGSIZE +randholes.5 : -d -l FSIZE -c 100 -b PGSIZE ------------------------------------------ holes is in range From owner-xfs@oss.sgi.com Mon May 12 09:25:37 2008 Received: with ECARTIS (v1.0.0; list xfs); Mon, 12 May 2008 09:25: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.6 required=5.0 tests=BAYES_00 autolearn=ham version=3.3.0-r574664 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.168.28]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id m4CGPYiC026466 for ; Mon, 12 May 2008 09:25:37 -0700 X-ASG-Debug-ID: 1210609579-320203db0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp1.betherenow.co.uk (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with SMTP id F21E61143646 for ; Mon, 12 May 2008 09:26:20 -0700 (PDT) Received: from smtp1.betherenow.co.uk (smtp1.betherenow.co.uk [87.194.0.68]) by cuda.sgi.com with SMTP id f9YCFAtGED5IXuAg for ; Mon, 12 May 2008 09:26:20 -0700 (PDT) Received: from damocles.lan (87-194-153-38.bethere.co.uk [87.194.153.38]) by smtp1.betherenow.co.uk (Postfix) with ESMTP id 993CF9809C; Mon, 12 May 2008 17:26:16 +0100 (BST) From: Alistair John Strachan To: Linus Torvalds X-ASG-Orig-Subj: XFS/md/blkdev warning (was Re: Linux 2.6.26-rc2) Subject: XFS/md/blkdev warning (was Re: Linux 2.6.26-rc2) Date: Mon, 12 May 2008 17:26:15 +0100 User-Agent: KMail/1.9.9 References: In-Reply-To: Cc: xfs@oss.sgi.com, Jens Axboe , neilb@suse.de MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-15" Content-Transfer-Encoding: 7bit Content-Disposition: inline Message-Id: <200805121726.15576.alistair@devzero.co.uk> X-Barracuda-Connect: smtp1.betherenow.co.uk[87.194.0.68] X-Barracuda-Start-Time: 1210609581 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.50165 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: 15845 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: alistair@devzero.co.uk Precedence: bulk X-list: xfs I've been getting this since -rc1. It's still present in -rc2, so I thought I'd bug some people. Everything seems to be working fine. I'm not sure who's to blame here so I've added a few people to CC; if I've done so in error, sorry for the noise. The taint is from loading a custom (fixed) DSDT which I've been doing for ages, and which shouldn't affect this trace. XFS: correcting sb_features alignment problem XFS mounting filesystem md1 ------------[ cut here ]------------ WARNING: at include/linux/blkdev.h:443 blk_remove_plug+0x60/0x88() Modules linked in: Pid: 1, comm: swapper Tainted: G A 2.6.26-rc2-damocles #2 Call Trace: [] warn_on_slowpath+0x58/0x82 [] ? find_symbol+0x21e/0x236 [] ? __rmqueue+0x1f/0x1c1 [] blk_remove_plug+0x60/0x88 [] raid5_unplug_device+0x31/0xe6 [] get_active_stripe+0x21b/0x4c0 [] ? __wake_up+0x43/0x50 [] ? default_wake_function+0x0/0xf [] make_request+0x4d7/0x675 [] ? mempool_alloc_slab+0x11/0x13 [] ? autoremove_wake_function+0x0/0x38 [] ? mempool_alloc_slab+0x11/0x13 [] generic_make_request+0x1ec/0x227 [] ? __get_free_pages+0x15/0x54 [] submit_bio+0x112/0x11b [] _xfs_buf_ioapply+0x1eb/0x216 [] xfs_buf_iorequest+0x3e/0x65 [] xfs_bdstrat_cb+0x19/0x3b [] xfs_bwrite+0x5f/0xc0 [] xlog_bwrite+0x81/0xac [] xlog_write_log_records+0x1eb/0x228 [] xlog_clear_stale_blocks+0x13a/0x147 [] xlog_find_tail+0x33f/0x3a5 [] xlog_recover+0x19/0x88 [] xfs_log_mount+0xb9/0x10d [] xfs_mountfs+0x252/0x5a2 [] ? kmem_zalloc+0x11/0x2c [] ? xfs_mru_cache_create+0x119/0x166 [] xfs_mount+0x2a1/0x352 [] xfs_fs_fill_super+0xc3/0x1f9 [] get_sb_bdev+0xfe/0x14d [] ? xfs_fs_fill_super+0x0/0x1f9 [] xfs_fs_get_sb+0x13/0x15 [] vfs_kern_mount+0x52/0x99 [] do_kern_mount+0x47/0xe2 [] do_new_mount+0x5f/0x92 [] do_mount+0x1af/0x1de [] ? __alloc_pages+0xb/0xd [] sys_mount+0x89/0xd5 [] mount_block_root+0xda/0x263 [] mount_root+0x56/0x5a [] prepare_namespace+0x11d/0x14a [] kernel_init+0x251/0x267 [] child_rip+0xa/0x12 [] ? kernel_init+0x0/0x267 [] ? child_rip+0x0/0x12 ---[ end trace 693a3c7fd0010c41 ]--- Ending clean XFS mount for filesystem: md1 -- Cheers, Alistair. 137/1 Warrender Park Road, Edinburgh, UK. From owner-xfs@oss.sgi.com Mon May 12 09:40:20 2008 Received: with ECARTIS (v1.0.0; list xfs); Mon, 12 May 2008 09:40: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.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 m4CGeGfe027560 for ; Mon, 12 May 2008 09:40:20 -0700 X-ASG-Debug-ID: 1210610460-01f000af0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from kernel.dk (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id A2FC8158C1C for ; Mon, 12 May 2008 09:41:00 -0700 (PDT) Received: from kernel.dk (brick.kernel.dk [87.55.233.238]) by cuda.sgi.com with ESMTP id NIF7ZThKWZpiB4FJ for ; Mon, 12 May 2008 09:41:00 -0700 (PDT) Received: by kernel.dk (Postfix, from userid 500) id F2560258326; Mon, 12 May 2008 18:40:53 +0200 (CEST) Date: Mon, 12 May 2008 18:40:53 +0200 From: Jens Axboe To: Alistair John Strachan Cc: Linus Torvalds , xfs@oss.sgi.com, neilb@suse.de X-ASG-Orig-Subj: Re: XFS/md/blkdev warning (was Re: Linux 2.6.26-rc2) Subject: Re: XFS/md/blkdev warning (was Re: Linux 2.6.26-rc2) Message-ID: <20080512164053.GD16217@kernel.dk> References: <200805121726.15576.alistair@devzero.co.uk> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <200805121726.15576.alistair@devzero.co.uk> X-Barracuda-Connect: brick.kernel.dk[87.55.233.238] X-Barracuda-Start-Time: 1210610463 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.50166 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: 15846 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: jens.axboe@oracle.com Precedence: bulk X-list: xfs On Mon, May 12 2008, Alistair John Strachan wrote: > I've been getting this since -rc1. It's still present in -rc2, so I thought > I'd bug some people. Everything seems to be working fine. > > I'm not sure who's to blame here so I've added a few people to CC; if I've > done so in error, sorry for the noise. > > The taint is from loading a custom (fixed) DSDT which I've been doing for > ages, and which shouldn't affect this trace. Neil should have a pending patch for this warning. Don't worry about it :-) -- Jens Axboe From owner-xfs@oss.sgi.com Mon May 12 09:47:13 2008 Received: with ECARTIS (v1.0.0; list xfs); Mon, 12 May 2008 09:47: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=-1.1 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 m4CGlASo028168 for ; Mon, 12 May 2008 09:47:13 -0700 X-ASG-Debug-ID: 1210610877-6aa202fa0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp1.linux-foundation.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 892B61142FC1 for ; Mon, 12 May 2008 09:47:57 -0700 (PDT) Received: from smtp1.linux-foundation.org (smtp1.linux-foundation.org [140.211.169.13]) by cuda.sgi.com with ESMTP id I7xisHlzuajwfvCr for ; Mon, 12 May 2008 09:47:57 -0700 (PDT) Received: from imap1.linux-foundation.org (imap1.linux-foundation.org [140.211.169.55]) by smtp1.linux-foundation.org (8.14.2/8.13.5/Debian-3ubuntu1.1) with ESMTP id m4CGliIe008355 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Mon, 12 May 2008 09:47:46 -0700 Received: from localhost (localhost [127.0.0.1]) by imap1.linux-foundation.org (8.13.5.20060308/8.13.5/Debian-3ubuntu1.1) with ESMTP id m4CGlh6J031665; Mon, 12 May 2008 09:47:43 -0700 Date: Mon, 12 May 2008 09:47:43 -0700 (PDT) From: Linus Torvalds To: Alistair John Strachan cc: xfs@oss.sgi.com, Jens Axboe , Neil Brown , Nick Piggin X-ASG-Orig-Subj: Re: XFS/md/blkdev warning (was Re: Linux 2.6.26-rc2) Subject: Re: XFS/md/blkdev warning (was Re: Linux 2.6.26-rc2) In-Reply-To: <200805121726.15576.alistair@devzero.co.uk> Message-ID: References: <200805121726.15576.alistair@devzero.co.uk> User-Agent: Alpine 1.10 (LFD 962 2008-03-14) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-MIMEDefang-Filter: lf$Revision: 1.188 $ X-Scanned-By: MIMEDefang 2.63 on 140.211.169.13 X-Barracuda-Connect: smtp1.linux-foundation.org[140.211.169.13] X-Barracuda-Start-Time: 1210610877 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.52 X-Barracuda-Spam-Status: No, SCORE=-1.52 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE7568M X-Barracuda-Spam-Report: Code version 3.1, rules version 3.1.50167 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_RULE7568M Custom Rule 7568M 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: 15847 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: torvalds@linux-foundation.org Precedence: bulk X-list: xfs On Mon, 12 May 2008, Alistair John Strachan wrote: > > I've been getting this since -rc1. It's still present in -rc2, so I thought > I'd bug some people. Everything seems to be working fine. Hmm. The problem is that blk_remove_plug() does a non-atomic queue_flag_clear(QUEUE_FLAG_PLUGGED, q); without holding the queue lock. Now, sometimes that's ok, because of higher-level locking on the same queue, so there is no possibility of any races. And yes, this comes through the raid5 layer, and yes, the raid layer holds the 'device_lock' on the raid5_conf_t, so it's all safe from other accesses by that raid5 configuration, but I wonder if at least in theory somebody could access that same device directly. So I do suspect that this whole situation with md needs to be resolved some way. Either the queue is already safe (because of md layer locking), and in that case maybe the queue lock should be changed to point to that md layer lock (or that sanity test simply needs to be removed). Or the queue is unsafe (because non-md users can find it too), and we need to fix the locking. Alternatively, we may just need to totally revert the thing that made the bit operations non-atomic and depend on the locking. This was introduced by Nick in commit 75ad23bc0fcb4f992a5d06982bf0857ab1738e9e ("block: make queue flags non-atomic"), and maybe it simply isn't viable. Anyway, this is not an XFS bug, and no, I do not think you can ever actually find any problems in real life that comes from this. But we do need to resolve it one way or another. (I'm leaving the rest of your report quoted, since I added Nick to the list of Cc's). Linus --- > The taint is from loading a custom (fixed) DSDT which I've been doing for > ages, and which shouldn't affect this trace. > > XFS: correcting sb_features alignment problem > XFS mounting filesystem md1 > ------------[ cut here ]------------ > WARNING: at include/linux/blkdev.h:443 blk_remove_plug+0x60/0x88() > Modules linked in: > Pid: 1, comm: swapper Tainted: G A 2.6.26-rc2-damocles #2 > > Call Trace: > [] warn_on_slowpath+0x58/0x82 > [] ? find_symbol+0x21e/0x236 > [] ? __rmqueue+0x1f/0x1c1 > [] blk_remove_plug+0x60/0x88 > [] raid5_unplug_device+0x31/0xe6 > [] get_active_stripe+0x21b/0x4c0 > [] ? __wake_up+0x43/0x50 > [] ? default_wake_function+0x0/0xf > [] make_request+0x4d7/0x675 > [] ? mempool_alloc_slab+0x11/0x13 > [] ? autoremove_wake_function+0x0/0x38 > [] ? mempool_alloc_slab+0x11/0x13 > [] generic_make_request+0x1ec/0x227 > [] ? __get_free_pages+0x15/0x54 > [] submit_bio+0x112/0x11b > [] _xfs_buf_ioapply+0x1eb/0x216 > [] xfs_buf_iorequest+0x3e/0x65 > [] xfs_bdstrat_cb+0x19/0x3b > [] xfs_bwrite+0x5f/0xc0 > [] xlog_bwrite+0x81/0xac > [] xlog_write_log_records+0x1eb/0x228 > [] xlog_clear_stale_blocks+0x13a/0x147 > [] xlog_find_tail+0x33f/0x3a5 > [] xlog_recover+0x19/0x88 > [] xfs_log_mount+0xb9/0x10d > [] xfs_mountfs+0x252/0x5a2 > [] ? kmem_zalloc+0x11/0x2c > [] ? xfs_mru_cache_create+0x119/0x166 > [] xfs_mount+0x2a1/0x352 > [] xfs_fs_fill_super+0xc3/0x1f9 > [] get_sb_bdev+0xfe/0x14d > [] ? xfs_fs_fill_super+0x0/0x1f9 > [] xfs_fs_get_sb+0x13/0x15 > [] vfs_kern_mount+0x52/0x99 > [] do_kern_mount+0x47/0xe2 > [] do_new_mount+0x5f/0x92 > [] do_mount+0x1af/0x1de > [] ? __alloc_pages+0xb/0xd > [] sys_mount+0x89/0xd5 > [] mount_block_root+0xda/0x263 > [] mount_root+0x56/0x5a > [] prepare_namespace+0x11d/0x14a > [] kernel_init+0x251/0x267 > [] child_rip+0xa/0x12 > [] ? kernel_init+0x0/0x267 > [] ? child_rip+0x0/0x12 > > ---[ end trace 693a3c7fd0010c41 ]--- > Ending clean XFS mount for filesystem: md1 > > -- > Cheers, > Alistair. > > 137/1 Warrender Park Road, Edinburgh, UK. > From owner-xfs@oss.sgi.com Mon May 12 09:48:43 2008 Received: with ECARTIS (v1.0.0; list xfs); Mon, 12 May 2008 09:48: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.6 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 m4CGmea2028353 for ; Mon, 12 May 2008 09:48:43 -0700 X-ASG-Debug-ID: 1210610966-037100e80000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from kernel.dk (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id B9010158A65 for ; Mon, 12 May 2008 09:49:26 -0700 (PDT) Received: from kernel.dk (brick.kernel.dk [87.55.233.238]) by cuda.sgi.com with ESMTP id 4l4q7iT5FnCTwXCo for ; Mon, 12 May 2008 09:49:26 -0700 (PDT) Received: by kernel.dk (Postfix, from userid 500) id 6A358258329; Mon, 12 May 2008 18:49:20 +0200 (CEST) Date: Mon, 12 May 2008 18:49:20 +0200 From: Jens Axboe To: Linus Torvalds Cc: Alistair John Strachan , xfs@oss.sgi.com, Neil Brown , Nick Piggin X-ASG-Orig-Subj: Re: XFS/md/blkdev warning (was Re: Linux 2.6.26-rc2) Subject: Re: XFS/md/blkdev warning (was Re: Linux 2.6.26-rc2) Message-ID: <20080512164920.GE16217@kernel.dk> References: <200805121726.15576.alistair@devzero.co.uk> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: X-Barracuda-Connect: brick.kernel.dk[87.55.233.238] X-Barracuda-Start-Time: 1210610967 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.52 X-Barracuda-Spam-Status: No, SCORE=-1.52 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE7568M X-Barracuda-Spam-Report: Code version 3.1, rules version 3.1.50168 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_RULE7568M Custom Rule 7568M 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: 15848 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: jens.axboe@oracle.com Precedence: bulk X-list: xfs On Mon, May 12 2008, Linus Torvalds wrote: > > > On Mon, 12 May 2008, Alistair John Strachan wrote: > > > > I've been getting this since -rc1. It's still present in -rc2, so I thought > > I'd bug some people. Everything seems to be working fine. > > Hmm. The problem is that blk_remove_plug() does a non-atomic > > queue_flag_clear(QUEUE_FLAG_PLUGGED, q); > > without holding the queue lock. > > Now, sometimes that's ok, because of higher-level locking on the same > queue, so there is no possibility of any races. > > And yes, this comes through the raid5 layer, and yes, the raid layer holds > the 'device_lock' on the raid5_conf_t, so it's all safe from other > accesses by that raid5 configuration, but I wonder if at least in theory > somebody could access that same device directly. > > So I do suspect that this whole situation with md needs to be resolved > some way. Either the queue is already safe (because of md layer locking), > and in that case maybe the queue lock should be changed to point to that > md layer lock (or that sanity test simply needs to be removed). Or the > queue is unsafe (because non-md users can find it too), and we need to fix > the locking. > > Alternatively, we may just need to totally revert the thing that made the > bit operations non-atomic and depend on the locking. This was introduced > by Nick in commit 75ad23bc0fcb4f992a5d06982bf0857ab1738e9e ("block: make > queue flags non-atomic"), and maybe it simply isn't viable. There's been a proposed patch for at least a week, so Neil just needs to send it in... -- Jens Axboe From owner-xfs@oss.sgi.com Mon May 12 15:54:47 2008 Received: with ECARTIS (v1.0.0; list xfs); Mon, 12 May 2008 15:55: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.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 m4CMsfVF023432 for ; Mon, 12 May 2008 15:54:47 -0700 X-ASG-Debug-ID: 1210632925-289b03bc0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ns.unixsol.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id D0ACD157D2F for ; Mon, 12 May 2008 15:55:25 -0700 (PDT) Received: from ns.unixsol.org ([193.110.159.2]) by cuda.sgi.com with ESMTP id DAGNpR1I6NkPV6HW for ; Mon, 12 May 2008 15:55:25 -0700 (PDT) Received: from [85.187.186.121] ([::ffff:85.187.186.121]) (AUTH: CRAM-MD5 gf, SSL: TLSv1/SSLv3,256bits,AES256-SHA) by ns.unixsol.org with esmtp; Tue, 13 May 2008 01:54:55 +0300 id 0013E5AC.4828CABF.00006CEC Message-ID: <4828CAC6.3090402@unixsol.org> Date: Tue, 13 May 2008 01:55:02 +0300 From: Georgi Chorbadzhiyski Organization: Unix Solutions (http://unixsol.org) User-Agent: Thunderbird 2.0.0.12 (X11/20080213) MIME-Version: 1.0 To: xfs@oss.sgi.com, jfs-discussion@lists.sourceforge.net, cluster-devel@redhat.com CC: Linux Kernel Mailing List X-ASG-Orig-Subj: Unneeded kernel threads (xfs, jfs, gfs2) Subject: Unneeded kernel threads (xfs, jfs, gfs2) Content-Type: text/plain; charset=windows-1251 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: UNKNOWN[193.110.159.2] X-Barracuda-Start-Time: 1210632927 X-Barracuda-Bayes: INNOCENT GLOBAL 0.1571 1.0000 -1.0610 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -0.96 X-Barracuda-Spam-Status: No, SCORE=-0.96 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.1, rules version 3.1.50189 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 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: 15849 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: gf@unixsol.org Precedence: bulk X-list: xfs Hi guys, I know that not all kernel thread users are converted to start only when needed but the following is little annoying specially when I'm not even using jfs, xfs and gfs2. Look at the ps output from a standard distro 2.6.24.5 kernel after a fresh boot: > PID TTY STAT TIME COMMAND > 2 ? S< 0:00 [kthreadd] > 3 ? S< 0:00 \_ [migration/0] > 4 ? S< 0:00 \_ [ksoftirqd/0] > 5 ? S< 0:00 \_ [migration/1] > 6 ? S< 0:00 \_ [ksoftirqd/1] > 7 ? S< 0:00 \_ [events/0] > 8 ? S< 0:00 \_ [events/1] > 9 ? S< 0:00 \_ [khelper] > 102 ? S< 0:00 \_ [kblockd/0] > 103 ? S< 0:00 \_ [kblockd/1] > 106 ? S< 0:00 \_ [kacpid] > 107 ? S< 0:00 \_ [kacpi_notify] > 230 ? S< 0:00 \_ [ata/0] > 231 ? S< 0:00 \_ [ata/1] > 232 ? S< 0:00 \_ [ata_aux] > 233 ? S< 0:00 \_ [ksuspend_usbd] > 239 ? S< 0:00 \_ [khubd] > 242 ? S< 0:00 \_ [kseriod] > 284 ? S 0:00 \_ [pdflush] > 285 ? S 0:00 \_ [pdflush] > 286 ? S< 0:00 \_ [kswapd0] > 326 ? S< 0:00 \_ [aio/0] > 327 ? S< 0:00 \_ [aio/1] > 349 ? S< 0:00 \_ [jfsIO] > 350 ? S< 0:00 \_ [jfsCommit] > 351 ? S< 0:00 \_ [jfsCommit] > 352 ? S< 0:00 \_ [jfsSync] Not needed here, because no jfs partition is in use. > 354 ? S< 0:00 \_ [xfslogd/0] > 355 ? S< 0:00 \_ [xfslogd/1] > 356 ? S< 0:00 \_ [xfsdatad/0] > 357 ? S< 0:00 \_ [xfsdatad/1] > 361 ? S< 0:00 \_ [xfs_mru_cache] Not needed here, because no xfs partition is in use. > 366 ? S< 0:00 \_ [gfs2_scand] > 367 ? S< 0:00 \_ [glock_workqueue] > 368 ? S< 0:00 \_ [glock_workqueue] I dont use gfs2 > 1047 ? S< 0:00 \_ [scsi_tgtd/0] > 1048 ? S< 0:00 \_ [scsi_tgtd/1] > 1118 ? S< 0:00 \_ [scsi_eh_2] > 1120 ? S< 0:00 \_ [scsi_eh_3] > 1122 ? S< 0:00 \_ [scsi_eh_4] > 1124 ? S< 0:00 \_ [scsi_eh_5] > 1133 ? S< 0:00 \_ [exec-osm/0] > 1134 ? S< 0:00 \_ [exec-osm/1] > 1140 ? S< 0:00 \_ [block-osm/0] > 1141 ? S< 0:00 \_ [block-osm/1] What is osm? Can't find anything in kernel config? > 1148 ? S< 0:00 \_ [khpsbpkt] What is this? > 1193 ? S< 0:00 \_ [ksnapd] > 1201 ? S< 0:00 \_ [rpciod/0] > 1202 ? S< 0:00 \_ [rpciod/1] > 1204 ? S< 0:00 \_ [kjournald] > 2448 ? S< 0:00 \_ [kjournald] > 2649 ? S 0:00 \_ [lockd] Kernel config can be found here: http://mirrors.unixsol.org/slackware/slackware-12.1/kernels/hugesmp.s/config -- Georgi Chorbadzhiyski http://georgi.unixsol.org/ From owner-xfs@oss.sgi.com Mon May 12 16:20:38 2008 Received: with ECARTIS (v1.0.0; list xfs); Mon, 12 May 2008 16:21: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.6 required=5.0 tests=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 m4CNKZBo030096 for ; Mon, 12 May 2008 16:20:38 -0700 X-ASG-Debug-ID: 1210634480-143201dc0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from sovereign.computergmbh.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id A0A5716A24AF for ; Mon, 12 May 2008 16:21:20 -0700 (PDT) Received: from sovereign.computergmbh.de (sovereign.computergmbh.de [85.214.69.204]) by cuda.sgi.com with ESMTP id 8RsuRBLQH1SFnHOB for ; Mon, 12 May 2008 16:21:20 -0700 (PDT) Received: by sovereign.computergmbh.de (Postfix, from userid 25121) id 6C7181803EB72; Tue, 13 May 2008 01:21:19 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by sovereign.computergmbh.de (Postfix) with ESMTP id 622861C00DB1A; Tue, 13 May 2008 01:21:19 +0200 (CEST) Date: Tue, 13 May 2008 01:21:19 +0200 (CEST) From: Jan Engelhardt To: Georgi Chorbadzhiyski cc: xfs@oss.sgi.com, jfs-discussion@lists.sourceforge.net, cluster-devel@redhat.com, Linux Kernel Mailing List X-ASG-Orig-Subj: Re: Unneeded kernel threads (xfs, jfs, gfs2) Subject: Re: Unneeded kernel threads (xfs, jfs, gfs2) In-Reply-To: <4828CAC6.3090402@unixsol.org> Message-ID: References: <4828CAC6.3090402@unixsol.org> User-Agent: Alpine 1.10 (LNX 962 2008-03-14) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Barracuda-Connect: sovereign.computergmbh.de[85.214.69.204] X-Barracuda-Start-Time: 1210634482 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.50189 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: 15850 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: jengelh@medozas.de Precedence: bulk X-list: xfs On Tuesday 2008-05-13 00:55, Georgi Chorbadzhiyski wrote: > >Not needed here, because no jfs partition is in use. >Not needed here, because no xfs partition is in use. >I dont use gfs2 You miss the best of Linux. So, why not unload the modules? >> 1141 ? S< 0:00 \_ [block-osm/1] > >What is osm? Can't find anything in kernel config? drivers/message/i2o/i2o_block.c:#define OSM_NAME "block-osm" >> 1148 ? S< 0:00 \_ [khpsbpkt] > >What is this? ieee1394/ieee1394_core.c:static struct task_struct *khpsbpkt_thread; From owner-xfs@oss.sgi.com Mon May 12 17:57:22 2008 Received: with ECARTIS (v1.0.0; list xfs); Mon, 12 May 2008 17:57:29 -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 m4D0vHW1003257 for ; Mon, 12 May 2008 17:57:21 -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 KAA06513; Tue, 13 May 2008 10:58:01 +1000 To: "David Chinner" , xfs-dev Subject: Re: [patch] xfsqa - fix 17[5-7] "unmount" typo From: "Barry Naujok" Organization: SGI Cc: xfs-oss Content-Type: text/plain; format=flowed; delsp=yes; charset=utf-8 MIME-Version: 1.0 References: <20080513005436.GQ155679365@sgi.com> Date: Tue, 13 May 2008 10:58:15 +1000 Message-ID: In-Reply-To: <20080513005436.GQ155679365@sgi.com> 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 m4D0vMW1003268 X-archive-position: 15852 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 Tue, 13 May 2008 10:54:36 +1000, David Chinner wrote: > 177 fails because mkfs tries to run on a mounted filesystem. > All 17[5-7] have the same problem - "unmount" is not the command > to unmount a filesystem. Looks fine (or looks fie). > Signed-off-by: Dave Chinner > --- > xfstests/175 | 2 +- > xfstests/176 | 2 +- > xfstests/177 | 2 +- > 3 files changed, 3 insertions(+), 3 deletions(-) > > Index: xfs-cmds/xfstests/175 > =================================================================== > --- xfs-cmds.orig/xfstests/175 2008-05-08 09:59:28.000000000 +1000 > +++ xfs-cmds/xfstests/175 2008-05-13 10:50:01.581533095 +1000 > @@ -40,7 +40,7 @@ _require_scratch > # test that we have DMAPI support > _dmapi_scratch_mount > -unmount $SCRATCH_MNT > /dev/null 2>&1 > +umount $SCRATCH_MNT > /dev/null 2>&1 > # _test_punch args: blksize extsize_hint filesize "pp1 pp2 pp3" \ > # "ps1 ps2 ps3" "pt1 pt2 pt3" "wp1 wp2" "ws1 ws2" \ > Index: xfs-cmds/xfstests/176 > =================================================================== > --- xfs-cmds.orig/xfstests/176 2008-05-08 09:59:28.000000000 +1000 > +++ xfs-cmds/xfstests/176 2008-05-13 10:50:05.281061350 +1000 > @@ -38,7 +38,7 @@ _require_scratch > # test that we have DMAPI support > _dmapi_scratch_mount > -unmount $SCRATCH_MNT > /dev/null 2>&1 > +umount $SCRATCH_MNT > /dev/null 2>&1 > # _test_punch args: blksize extsize_hint filesize "pp1 pp2 pp3" \ > # "ps1 ps2 ps3" "pt1 pt2 pt3" "wp1 wp2" "ws1 ws2" \ > Index: xfs-cmds/xfstests/177 > =================================================================== > --- xfs-cmds.orig/xfstests/177 2008-05-08 09:59:28.000000000 +1000 > +++ xfs-cmds/xfstests/177 2008-05-13 10:49:58.181966589 +1000 > @@ -40,7 +40,7 @@ _require_scratch > # test that we have DMAPI support > _dmapi_scratch_mount > -unmount $SCRATCH_MNT > /dev/null 2>&1 > +umount $SCRATCH_MNT > /dev/null 2>&1 > _scratch_mkfs_xfs >/dev/null 2>&1 \ > || _fail "mkfs failed" From owner-xfs@oss.sgi.com Mon May 12 17:53:59 2008 Received: with ECARTIS (v1.0.0; list xfs); Mon, 12 May 2008 17:54: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.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 m4D0rsx0002981 for ; Mon, 12 May 2008 17:53:58 -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 KAA06449; Tue, 13 May 2008 10:54:38 +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 m4D0sbsT163986750; Tue, 13 May 2008 10:54:38 +1000 (AEST) Received: (from dgc@localhost) by snort.melbourne.sgi.com (SGI-8.12.5/8.12.5/Submit) id m4D0saCE165776403; Tue, 13 May 2008 10:54:36 +1000 (AEST) X-Authentication-Warning: snort.melbourne.sgi.com: dgc set sender to dgc@sgi.com using -f Date: Tue, 13 May 2008 10:54:36 +1000 From: David Chinner To: xfs-dev Cc: xfs-oss Subject: [patch] xfsqa - fix 17[5-7] "unmount" typo Message-ID: <20080513005436.GQ155679365@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: 15851 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 177 fails because mkfs tries to run on a mounted filesystem. All 17[5-7] have the same problem - "unmount" is not the command to unmount a filesystem. Signed-off-by: Dave Chinner --- xfstests/175 | 2 +- xfstests/176 | 2 +- xfstests/177 | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) Index: xfs-cmds/xfstests/175 =================================================================== --- xfs-cmds.orig/xfstests/175 2008-05-08 09:59:28.000000000 +1000 +++ xfs-cmds/xfstests/175 2008-05-13 10:50:01.581533095 +1000 @@ -40,7 +40,7 @@ _require_scratch # test that we have DMAPI support _dmapi_scratch_mount -unmount $SCRATCH_MNT > /dev/null 2>&1 +umount $SCRATCH_MNT > /dev/null 2>&1 # _test_punch args: blksize extsize_hint filesize "pp1 pp2 pp3" \ # "ps1 ps2 ps3" "pt1 pt2 pt3" "wp1 wp2" "ws1 ws2" \ Index: xfs-cmds/xfstests/176 =================================================================== --- xfs-cmds.orig/xfstests/176 2008-05-08 09:59:28.000000000 +1000 +++ xfs-cmds/xfstests/176 2008-05-13 10:50:05.281061350 +1000 @@ -38,7 +38,7 @@ _require_scratch # test that we have DMAPI support _dmapi_scratch_mount -unmount $SCRATCH_MNT > /dev/null 2>&1 +umount $SCRATCH_MNT > /dev/null 2>&1 # _test_punch args: blksize extsize_hint filesize "pp1 pp2 pp3" \ # "ps1 ps2 ps3" "pt1 pt2 pt3" "wp1 wp2" "ws1 ws2" \ Index: xfs-cmds/xfstests/177 =================================================================== --- xfs-cmds.orig/xfstests/177 2008-05-08 09:59:28.000000000 +1000 +++ xfs-cmds/xfstests/177 2008-05-13 10:49:58.181966589 +1000 @@ -40,7 +40,7 @@ _require_scratch # test that we have DMAPI support _dmapi_scratch_mount -unmount $SCRATCH_MNT > /dev/null 2>&1 +umount $SCRATCH_MNT > /dev/null 2>&1 _scratch_mkfs_xfs >/dev/null 2>&1 \ || _fail "mkfs failed" From owner-xfs@oss.sgi.com Mon May 12 18:05:12 2008 Received: with ECARTIS (v1.0.0; list xfs); Mon, 12 May 2008 18:05: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=-1.4 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 m4D159Vd004106 for ; Mon, 12 May 2008 18:05:12 -0700 X-ASG-Debug-ID: 1210640756-2216037e0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx2.suse.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 51E9616A3989 for ; Mon, 12 May 2008 18:05:56 -0700 (PDT) Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id eANQ7eUlla9d22DJ for ; Mon, 12 May 2008 18:05:56 -0700 (PDT) X-ASG-Whitelist: Client Received: from Relay1.suse.de (relay-ext.suse.de [195.135.221.8]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx2.suse.de (Postfix) with ESMTP id 47D74457AA; Tue, 13 May 2008 03:05:55 +0200 (CEST) From: Neil Brown To: Linus Torvalds Date: Tue, 13 May 2008 11:05:42 +1000 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Message-ID: <18472.59750.744829.929828@notabene.brown> Cc: Dan Williams , Jens Axboe , Alistair John Strachan , xfs@oss.sgi.com, Nick Piggin , "Rafael J. Wysocki" , Jacek Luczak , Prakash Punnoor , Linux Kernel list , linux-raid@vger.kernel.org X-ASG-Orig-Subj: [PATCH] Remove blkdev warning triggered by using md. Subject: [PATCH] Remove blkdev warning triggered by using md. In-Reply-To: message from Jens Axboe on Monday May 12 References: <200805121726.15576.alistair@devzero.co.uk> <20080512164920.GE16217@kernel.dk> X-Mailer: VM 7.19 under Emacs 21.4.1 X-face: [Gw_3E*Gng}4rRrKRYotwlE?.2|**#s9Dqueue_lock to point to the appropriate lock. Those personalities which didn't previously use a spin_lock, us q->__queue_lock. So always initialise that lock when allocated. With this in place, setting/clearing of the QUEUE_FLAG_PLUGGED bit will no longer cause warnings as it will be clear that the proper lock is held. Thanks to Dan Williams for review and fixing the silly bugs. Signed-off-by: NeilBrown -- diffstat output --------------- block/blk-core.c | 5 ++--- block/blk-settings.c | 8 +++++++- drivers/md/linear.c | 1 + drivers/md/multipath.c | 1 + drivers/md/raid0.c | 1 + drivers/md/raid1.c | 4 +++- drivers/md/raid10.c | 4 +++- drivers/md/raid5.c | 1 + 8 files changed, 19 insertions(+), 6 deletions(-) diff --git a/block/blk-core.c b/block/blk-core.c index 2987fe4..6a9cc0d 100644 --- a/block/blk-core.c +++ b/block/blk-core.c @@ -482,6 +482,7 @@ struct request_queue *blk_alloc_queue_node(gfp_t gfp_mask, int node_id) kobject_init(&q->kobj, &blk_queue_ktype); mutex_init(&q->sysfs_lock); + spin_lock_init(&q->__queue_lock); return q; } @@ -544,10 +545,8 @@ blk_init_queue_node(request_fn_proc *rfn, spinlock_t *lock, int node_id) * if caller didn't supply a lock, they get per-queue locking with * our embedded lock */ - if (!lock) { - spin_lock_init(&q->__queue_lock); + if (!lock) lock = &q->__queue_lock; - } q->request_fn = rfn; q->prep_rq_fn = NULL; diff --git a/block/blk-settings.c b/block/blk-settings.c index bb93d4c..8dd8641 100644 --- a/block/blk-settings.c +++ b/block/blk-settings.c @@ -286,8 +286,14 @@ void blk_queue_stack_limits(struct request_queue *t, struct request_queue *b) t->max_hw_segments = min(t->max_hw_segments, b->max_hw_segments); t->max_segment_size = min(t->max_segment_size, b->max_segment_size); t->hardsect_size = max(t->hardsect_size, b->hardsect_size); - if (!test_bit(QUEUE_FLAG_CLUSTER, &b->queue_flags)) + if (!t->queue_lock) + WARN_ON_ONCE(1); + else if (!test_bit(QUEUE_FLAG_CLUSTER, &b->queue_flags)) { + unsigned long flags; + spin_lock_irqsave(t->queue_lock, flags); queue_flag_clear(QUEUE_FLAG_CLUSTER, t); + spin_unlock_irqrestore(t->queue_lock, flags); + } } EXPORT_SYMBOL(blk_queue_stack_limits); diff --git a/drivers/md/linear.c b/drivers/md/linear.c index 0b85117..1074824 100644 --- a/drivers/md/linear.c +++ b/drivers/md/linear.c @@ -250,6 +250,7 @@ static int linear_run (mddev_t *mddev) { linear_conf_t *conf; + mddev->queue->queue_lock = &mddev->queue->__queue_lock; conf = linear_conf(mddev, mddev->raid_disks); if (!conf) diff --git a/drivers/md/multipath.c b/drivers/md/multipath.c index 42ee1a2..4f4d1f3 100644 --- a/drivers/md/multipath.c +++ b/drivers/md/multipath.c @@ -417,6 +417,7 @@ static int multipath_run (mddev_t *mddev) * bookkeeping area. [whatever we allocate in multipath_run(), * should be freed in multipath_stop()] */ + mddev->queue->queue_lock = &mddev->queue->__queue_lock; conf = kzalloc(sizeof(multipath_conf_t), GFP_KERNEL); mddev->private = conf; diff --git a/drivers/md/raid0.c b/drivers/md/raid0.c index 818b482..914c04d 100644 --- a/drivers/md/raid0.c +++ b/drivers/md/raid0.c @@ -280,6 +280,7 @@ static int raid0_run (mddev_t *mddev) (mddev->chunk_size>>1)-1); blk_queue_max_sectors(mddev->queue, mddev->chunk_size >> 9); blk_queue_segment_boundary(mddev->queue, (mddev->chunk_size>>1) - 1); + mddev->queue->queue_lock = &mddev->queue->__queue_lock; conf = kmalloc(sizeof (raid0_conf_t), GFP_KERNEL); if (!conf) diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index 6778b7c..ac409b7 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c @@ -1935,6 +1935,9 @@ static int run(mddev_t *mddev) if (!conf->r1bio_pool) goto out_no_mem; + spin_lock_init(&conf->device_lock); + mddev->queue->queue_lock = &conf->device_lock; + rdev_for_each(rdev, tmp, mddev) { disk_idx = rdev->raid_disk; if (disk_idx >= mddev->raid_disks @@ -1958,7 +1961,6 @@ static int run(mddev_t *mddev) } conf->raid_disks = mddev->raid_disks; conf->mddev = mddev; - spin_lock_init(&conf->device_lock); INIT_LIST_HEAD(&conf->retry_list); spin_lock_init(&conf->resync_lock); diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index faf3d89..8536ede 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c @@ -2082,6 +2082,9 @@ static int run(mddev_t *mddev) goto out_free_conf; } + spin_lock_init(&conf->device_lock); + mddev->queue->queue_lock = &conf->device_lock; + rdev_for_each(rdev, tmp, mddev) { disk_idx = rdev->raid_disk; if (disk_idx >= mddev->raid_disks @@ -2103,7 +2106,6 @@ static int run(mddev_t *mddev) disk->head_position = 0; } - spin_lock_init(&conf->device_lock); INIT_LIST_HEAD(&conf->retry_list); spin_lock_init(&conf->resync_lock); diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index 087eee0..4fafc79 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c @@ -4256,6 +4256,7 @@ static int run(mddev_t *mddev) goto abort; } spin_lock_init(&conf->device_lock); + mddev->queue->queue_lock = &conf->device_lock; init_waitqueue_head(&conf->wait_for_stripe); init_waitqueue_head(&conf->wait_for_overlap); INIT_LIST_HEAD(&conf->handle_list); From owner-xfs@oss.sgi.com Mon May 12 18:28:59 2008 Received: with ECARTIS (v1.0.0; list xfs); Mon, 12 May 2008 18:29: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.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 m4D1Stp9005690 for ; Mon, 12 May 2008 18:28:58 -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 LAA07166; Tue, 13 May 2008 11:29:38 +1000 Received: by chook.melbourne.sgi.com (Postfix, from userid 16346) id 45EE158C4C29; Tue, 13 May 2008 11:29:38 +1000 (EST) To: sgi.bugs.xfs@engr.sgi.com Cc: xfs@oss.sgi.com Subject: TAKE 980705 - xfsqa 17[5-7] - fix "unmount" typo Message-Id: <20080513012938.45EE158C4C29@chook.melbourne.sgi.com> Date: Tue, 13 May 2008 11:29:38 +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: 15854 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 silly "unmount" typo in dmapi test. Date: Tue May 13 11:29:01 AEST 2008 Workarea: chook.melbourne.sgi.com:/build/dgc/isms/xfs-cmds Inspected by: bnaujok@sgi.com The following file(s) were checked into: longdrop.melbourne.sgi.com:/isms/xfs-cmds/master-melb Modid: master-melb:xfs-cmds:31069a xfstests/177 - 1.4 - changed http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-cmds/xfstests/177.diff?r1=text&tr1=1.4&r2=text&tr2=1.3&f=h xfstests/175 - 1.3 - changed http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-cmds/xfstests/175.diff?r1=text&tr1=1.3&r2=text&tr2=1.2&f=h xfstests/176 - 1.3 - changed http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-cmds/xfstests/176.diff?r1=text&tr1=1.3&r2=text&tr2=1.2&f=h - Fix silly "unmount" typo in dmapi test. From owner-xfs@oss.sgi.com Mon May 12 22:29:04 2008 Received: with ECARTIS (v1.0.0; list xfs); Mon, 12 May 2008 22:29: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.3 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 m4D5Sxdl022830 for ; Mon, 12 May 2008 22:29:03 -0700 Received: from cxfsmac10.melbourne.sgi.com (cxfsmac10.melbourne.sgi.com [134.14.55.100]) by larry.melbourne.sgi.com (950413.SGI.8.6.12/950213.SGI.AUTOCF) via ESMTP id PAA11667; Tue, 13 May 2008 15:29:38 +1000 Message-ID: <48292742.8090409@sgi.com> Date: Tue, 13 May 2008 15:29:38 +1000 From: Donald Douwsma User-Agent: Thunderbird 2.0.0.14 (Macintosh/20080421) MIME-Version: 1.0 To: Georgi Chorbadzhiyski CC: xfs@oss.sgi.com, jfs-discussion@lists.sourceforge.net, cluster-devel@redhat.com, Linux Kernel Mailing List Subject: Re: Unneeded kernel threads (xfs, jfs, gfs2) References: <4828CAC6.3090402@unixsol.org> In-Reply-To: <4828CAC6.3090402@unixsol.org> Content-Type: text/plain; charset=windows-1251; 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: 15855 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: donaldd@sgi.com Precedence: bulk X-list: xfs Georgi Chorbadzhiyski wrote: > Hi guys, I know that not all kernel thread users are converted to > start only when needed but the following is little annoying specially > when I'm not even using jfs, xfs and gfs2. > > Look at the ps output from a standard distro 2.6.24.5 kernel after a > fresh boot: ... > > Kernel config can be found here: > http://mirrors.unixsol.org/slackware/slackware-12.1/kernels/hugesmp.s/config > Your distro is building all of these modules into the kernel. CONFIG_XFS_FS=y CONFIG_JFS_FS=y CONFIG_GFS2_FS=y This isnt exactly standard practice, normally they'd be set to =m and only used if required to mount a filesystem. You may want to ask the slackware people why they chose to do this for their hugexxx.s kernels. Don From owner-xfs@oss.sgi.com Mon May 12 22:50:24 2008 Received: with ECARTIS (v1.0.0; list xfs); Mon, 12 May 2008 22:50: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.6 required=5.0 tests=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 m4D5oMvD024105 for ; Mon, 12 May 2008 22:50:23 -0700 X-ASG-Debug-ID: 1210657868-308c02ca0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp5-g19.free.fr (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 50AEE16A721D for ; Mon, 12 May 2008 22:51:09 -0700 (PDT) Received: from smtp5-g19.free.fr (smtp5-g19.free.fr [212.27.42.35]) by cuda.sgi.com with ESMTP id VzernGI891CuPGmH for ; Mon, 12 May 2008 22:51:09 -0700 (PDT) Received: from smtp5-g19.free.fr (localhost.localdomain [127.0.0.1]) by smtp5-g19.free.fr (Postfix) with ESMTP id 5137D3F6169; Tue, 13 May 2008 07:51:08 +0200 (CEST) Received: from olorin (wmh38-1-82-225-54-107.fbx.proxad.net [82.225.54.107]) by smtp5-g19.free.fr (Postfix) with ESMTP id A62C83F61CD; Tue, 13 May 2008 07:51:07 +0200 (CEST) Date: Tue, 13 May 2008 07:51:07 +0200 From: FD Cami To: Donald Douwsma Cc: Georgi Chorbadzhiyski , xfs@oss.sgi.com, jfs-discussion@lists.sourceforge.net, cluster-devel@redhat.com, Linux Kernel Mailing List , volkerdi@slackware.com X-ASG-Orig-Subj: Re: Unneeded kernel threads (xfs, jfs, gfs2) Subject: Re: Unneeded kernel threads (xfs, jfs, gfs2) Message-ID: <20080513075107.2edc44d3@olorin> In-Reply-To: <48292742.8090409@sgi.com> References: <4828CAC6.3090402@unixsol.org> <48292742.8090409@sgi.com> X-Mailer: Claws Mail 3.3.1 (GTK+ 2.12.5; x86_64-redhat-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Barracuda-Connect: smtp5-g19.free.fr[212.27.42.35] X-Barracuda-Start-Time: 1210657870 X-Barracuda-Bayes: INNOCENT GLOBAL 0.1967 1.0000 -0.8454 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -0.85 X-Barracuda-Spam-Status: No, SCORE=-0.85 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.50214 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: 15856 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: francois.cami@free.fr Precedence: bulk X-list: xfs On Tue, 13 May 2008 15:29:38 +1000 Donald Douwsma wrote: > Georgi Chorbadzhiyski wrote: > > Hi guys, I know that not all kernel thread users are converted to > > start only when needed but the following is little annoying specially > > when I'm not even using jfs, xfs and gfs2. > > > > Look at the ps output from a standard distro 2.6.24.5 kernel after a > > fresh boot: > ... > > > > > Kernel config can be found here: > > http://mirrors.unixsol.org/slackware/slackware-12.1/kernels/hugesmp.s/config > > > > Your distro is building all of these modules into the kernel. > CONFIG_XFS_FS=y > CONFIG_JFS_FS=y > CONFIG_GFS2_FS=y > > This isnt exactly standard practice, normally they'd be set to =m and only > used if required to mount a filesystem. You may want to ask the slackware > people why they chose to do this for their hugexxx.s kernels. To be able to use those filesystems on root partitions without requiring an initrd. Georgi might be interested to use the generic kernel instead of the huge one, it is available there : http://mirrors.unixsol.org/slackware/slackware-12.1/slackware/a/kernel-generic-smp-2.6.24.5_smp-i686-2.tgz Documentation : http://mirrors.unixsol.org/slackware/slackware-12.1/README.TXT http://mirrors.unixsol.org/slackware/slackware-12.1/README.initrd http://mirrors.unixsol.org/slackware/slackware-12.1/RELEASE_NOTES Cheers Francois From owner-xfs@oss.sgi.com Mon May 12 23:23:31 2008 Received: with ECARTIS (v1.0.0; list xfs); Mon, 12 May 2008 23:23: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.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 m4D6NSdt026318 for ; Mon, 12 May 2008 23:23:30 -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 QAA12797; Tue, 13 May 2008 16:24:12 +1000 Message-ID: <4829340B.4090708@sgi.com> Date: Tue, 13 May 2008 16:24:11 +1000 From: Timothy Shimmin User-Agent: Thunderbird 2.0.0.14 (Macintosh/20080421) MIME-Version: 1.0 To: David Chinner CC: xfs-dev , xfs-oss Subject: Re: [patch] xfsqa 008 takes too long on UML... References: <20080512110134.GH155679365@sgi.com> In-Reply-To: <20080512110134.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: 15857 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 Sounds reasonable to me. Might be nice to have the description as a comment in the test so it is easy to see the thought behind the calculations in the future. --Tim David Chinner wrote: > With the recent change for reliability with 64k page size > made to test 008,the file sizes got much larger. It appears > that randholes actually reads the entire file, so this has > slowed the test down by a factor of ten (all file sizes > were increased by 10x). This means the test is now taking > about 18 minutes to run on a UML session, and all the time > is spent reading the files. > > Instead, scale the file size based on the page size. We know > how many holes we are trying to produce and the I/O size > being used to produce them, so the size of the files can be > finely tuned. Assuming a decent random distribution, if the > number of blocks in the file is 4x the page size and the > I/O size is page sized, this means that every I/O should > generate a new hole and we'll only get a small amount of > adjacent extents. This has passed over 10 times on ia64 > w/ 64k page and another 15 times on UML with 4k page. > > UML runtime is down from ~1000s to 5s, ia64 runtime is down from > ~30s to 7s. > > Cheers, > > Dave. From owner-xfs@oss.sgi.com Tue May 13 01:01:19 2008 Received: with ECARTIS (v1.0.0; list xfs); Tue, 13 May 2008 01:01: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.0 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_45, J_CHICKENPOX_53,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 m4D816nL006485 for ; Tue, 13 May 2008 01:01:09 -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 SAA14884; Tue, 13 May 2008 18:01:53 +1000 Received: by chook.melbourne.sgi.com (Postfix, from userid 1161) id 2878758C4C36; Tue, 13 May 2008 18:01:53 +1000 (EST) Message-Id: <20080513080152.911303131@chook.melbourne.sgi.com> References: <20080513075749.477238845@chook.melbourne.sgi.com> User-Agent: quilt/0.46-1 Date: Tue, 13 May 2008 17:57:52 +1000 From: Barry Naujok To: xfs@oss.sgi.com Cc: linux-fsdevel@vger.kernel.org Subject: [PATCH 3/4] XFS: Return case-insensitive match for dentry cache Content-Disposition: inline; filename=return_name.patch 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: 15862 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 This implements the code to store the actual filename found during a lookup in the dentry cache and to avoid multiple entries in the dcache pointing to the same inode. To avoid polluting the dcache, we implement a new directory inode operations for lookup. xfs_vn_ci_lookup() interacts directly with the dcache and the code was derived from ntfs_lookup() in fs/ntfs/namei.c. The "actual name" is only allocated and returned for a case- insensitive match and not an actual match. Another unusual interaction with the dcache is not storing negative dentries like other filesystems doing a d_add(dentry, NULL) when an ENOENT is returned. During the VFS lookup, if a dentry returned has no inode, dput is called and ENOENT is returned. By not doing a d_add, this actually removes it completely from the dcache to be reused. create/rename have to be modified to support unhashed dentries being passed in. Signed-off-by: Barry Naujok --- fs/dcache.c | 104 ++++++++++++++++++++++++++++++++++++++++++ fs/xfs/linux-2.6/xfs_export.c | 2 fs/xfs/linux-2.6/xfs_iops.c | 61 ++++++++++++++++++++++++ fs/xfs/linux-2.6/xfs_iops.h | 1 fs/xfs/xfs_da_btree.h | 6 ++ fs/xfs/xfs_dir2.c | 40 +++++++++++++++- fs/xfs/xfs_dir2.h | 6 ++ fs/xfs/xfs_dir2_block.c | 9 ++- fs/xfs/xfs_dir2_leaf.c | 5 +- fs/xfs/xfs_dir2_node.c | 16 ++++-- fs/xfs/xfs_dir2_sf.c | 12 ++-- fs/xfs/xfs_vnodeops.c | 18 +++++-- fs/xfs/xfs_vnodeops.h | 2 include/linux/dcache.h | 1 14 files changed, 256 insertions(+), 27 deletions(-) Index: kern_ci/fs/dcache.c =================================================================== --- kern_ci.orig/fs/dcache.c +++ kern_ci/fs/dcache.c @@ -1191,6 +1191,109 @@ struct dentry *d_splice_alias(struct ino return new; } +/** + * d_add_ci - lookup or allocate new dentry with case-exact name + * @inode: the inode case-insensitive lookup has found + * @dentry: the negative dentry that was passed to the parent's lookup func + * @name: the case-exact name to be associated with the returned dentry + * + * This is to avoid filling the dcache with case-insensitive names to the + * same inode, only the actual correct case is stored in the dcache for + * case-insensitive filesystems. + * + * For a case-insensitive lookup match and if the the case-exact dentry + * already exists in in the dcache, use it and return it. + * + * If no entry exists with the exact case name, allocate new dentry with + * the exact case, and return the spliced entry. + */ + +struct dentry *d_add_ci(struct inode *inode, struct dentry *dentry, + struct qstr *name) +{ + int error; + struct dentry *found; + struct dentry *new; + + /* Does a dentry matching the name exist already? */ + found = d_hash_and_lookup(dentry->d_parent, name); + /* If not, create it now and return */ + if (!found) { + new = d_alloc(dentry->d_parent, name); + if (!new) { + error = -ENOMEM; + goto err_out; + } + found = d_splice_alias(inode, new); + if (found) { + dput(new); + return found; + } + return new; + } + /* Matching dentry exists, check if it is negative. */ + if (found->d_inode) { + if (unlikely(found->d_inode != inode)) { + /* This can't happen because bad inodes are unhashed. */ + BUG_ON(!is_bad_inode(inode)); + BUG_ON(!is_bad_inode(found->d_inode)); + } + /* + * Already have the inode and the dentry attached, decrement + * the reference count to balance the iget() done + * earlier on. We found the dentry using d_lookup() so it + * cannot be disconnected and thus we do not need to worry + * about any NFS/disconnectedness issues here. + */ + iput(inode); + return found; + } + /* + * Negative dentry: instantiate it unless the inode is a directory and + * has a 'disconnected' dentry (i.e. IS_ROOT and DCACHE_DISCONNECTED), + * in which case d_move() that in place of the found dentry. + */ + if (!S_ISDIR(inode->i_mode)) { + /* Not a directory; everything is easy. */ + d_instantiate(found, inode); + return found; + } + spin_lock(&dcache_lock); + if (list_empty(&inode->i_dentry)) { + /* + * Directory without a 'disconnected' dentry; we need to do + * d_instantiate() by hand because it takes dcache_lock which + * we already hold. + */ + list_add(&found->d_alias, &inode->i_dentry); + found->d_inode = inode; + spin_unlock(&dcache_lock); + security_d_instantiate(found, inode); + return found; + } + /* + * Directory with a 'disconnected' dentry; get a reference to the + * 'disconnected' dentry. + */ + new = list_entry(inode->i_dentry.next, struct dentry, d_alias); + dget_locked(new); + spin_unlock(&dcache_lock); + /* Do security vodoo. */ + security_d_instantiate(found, inode); + /* Move new in place of found. */ + d_move(new, found); + /* Balance the iget() we did above. */ + iput(inode); + /* Throw away found. */ + dput(found); + /* Use new as the actual dentry. */ + return new; + +err_out: + iput(inode); + return ERR_PTR(error); +} + /** * d_lookup - search for a dentry @@ -2178,6 +2281,7 @@ EXPORT_SYMBOL(d_path); EXPORT_SYMBOL(d_prune_aliases); EXPORT_SYMBOL(d_rehash); EXPORT_SYMBOL(d_splice_alias); +EXPORT_SYMBOL(d_add_ci); EXPORT_SYMBOL(d_validate); EXPORT_SYMBOL(dget_locked); EXPORT_SYMBOL(dput); Index: kern_ci/fs/xfs/linux-2.6/xfs_export.c =================================================================== --- kern_ci.orig/fs/xfs/linux-2.6/xfs_export.c +++ kern_ci/fs/xfs/linux-2.6/xfs_export.c @@ -215,7 +215,7 @@ xfs_fs_get_parent( struct xfs_inode *cip; struct dentry *parent; - error = xfs_lookup(XFS_I(child->d_inode), &xfs_name_dotdot, &cip); + error = xfs_lookup(XFS_I(child->d_inode), &xfs_name_dotdot, &cip, NULL); if (unlikely(error)) return ERR_PTR(-error); Index: kern_ci/fs/xfs/linux-2.6/xfs_iops.c =================================================================== --- kern_ci.orig/fs/xfs/linux-2.6/xfs_iops.c +++ kern_ci/fs/xfs/linux-2.6/xfs_iops.c @@ -389,7 +389,7 @@ xfs_vn_lookup( return ERR_PTR(-ENAMETOOLONG); xfs_dentry_to_name(&name, dentry); - error = xfs_lookup(XFS_I(dir), &name, &cip); + error = xfs_lookup(XFS_I(dir), &name, &cip, NULL); if (unlikely(error)) { if (unlikely(error != ENOENT)) return ERR_PTR(-error); @@ -400,6 +400,46 @@ xfs_vn_lookup( return d_splice_alias(cip->i_vnode, dentry); } +STATIC struct dentry * +xfs_vn_ci_lookup( + struct inode *dir, + struct dentry *dentry, + struct nameidata *nd) +{ + struct xfs_inode *ip; + struct xfs_name xname; + struct qstr dname; + int ci_match = 0; + int error; + + if (dentry->d_name.len >= MAXNAMELEN) + return ERR_PTR(-ENAMETOOLONG); + + xfs_dentry_to_name(&xname, dentry); + error = xfs_lookup(XFS_I(dir), &xname, &ip, &ci_match); + if (unlikely(error)) { + if (unlikely(error != ENOENT)) + return ERR_PTR(-error); + /* + * don't d_add dentry, __link_path_walk will dput the + * dentry if its inode is NULL which means the negative + * dentry will be destroyed rather than kept around. + */ + return NULL; + } + + /* if exact match, just splice and exit */ + if (!ci_match) + return d_splice_alias(ip->i_vnode, dentry); + + /* else case-insensitive match... */ + dname.name = xname.name; + dname.len = xname.len; + dentry = d_add_ci(ip->i_vnode, dentry, &dname); + kmem_free(xname.name, xname.len); + return dentry; +} + STATIC int xfs_vn_link( struct dentry *old_dentry, @@ -911,6 +951,25 @@ const struct inode_operations xfs_dir_in .removexattr = xfs_vn_removexattr, }; +const struct inode_operations xfs_dir_ci_inode_operations = { + .create = xfs_vn_create, + .lookup = xfs_vn_ci_lookup, + .link = xfs_vn_link, + .unlink = xfs_vn_unlink, + .symlink = xfs_vn_symlink, + .mkdir = xfs_vn_mkdir, + .rmdir = xfs_vn_rmdir, + .mknod = xfs_vn_mknod, + .rename = xfs_vn_rename, + .permission = xfs_vn_permission, + .getattr = xfs_vn_getattr, + .setattr = xfs_vn_setattr, + .setxattr = xfs_vn_setxattr, + .getxattr = xfs_vn_getxattr, + .listxattr = xfs_vn_listxattr, + .removexattr = xfs_vn_removexattr, +}; + const struct inode_operations xfs_symlink_inode_operations = { .readlink = generic_readlink, .follow_link = xfs_vn_follow_link, Index: kern_ci/fs/xfs/linux-2.6/xfs_iops.h =================================================================== --- kern_ci.orig/fs/xfs/linux-2.6/xfs_iops.h +++ kern_ci/fs/xfs/linux-2.6/xfs_iops.h @@ -20,6 +20,7 @@ extern const struct inode_operations xfs_inode_operations; extern const struct inode_operations xfs_dir_inode_operations; +extern const struct inode_operations xfs_dir_ci_inode_operations; extern const struct inode_operations xfs_symlink_inode_operations; extern const struct file_operations xfs_file_operations; Index: kern_ci/fs/xfs/xfs_da_btree.h =================================================================== --- kern_ci.orig/fs/xfs/xfs_da_btree.h +++ kern_ci/fs/xfs/xfs_da_btree.h @@ -143,6 +143,7 @@ typedef struct xfs_da_args { #define XFS_DA_OP_RENAME 0x0002 /* this is an atomic rename op */ #define XFS_DA_OP_ADDNAME 0x0004 /* this is an add operation */ #define XFS_DA_OP_OKNOENT 0x0008 /* lookup/add op, ENOENT ok, else die */ +#define XFS_DA_OP_CILOOKUP 0x0010 /* lookup to return CI name if found */ static inline int xfs_da_isjustcheck_op(struct xfs_da_args *args) { @@ -164,6 +165,11 @@ static inline int xfs_da_isoknoent_op(st return args->op_flags & XFS_DA_OP_OKNOENT; } +static inline int xfs_da_iscilookup_op(struct xfs_da_args *args) +{ + return args->op_flags & XFS_DA_OP_CILOOKUP; +} + /* * Structure to describe buffer(s) for a block. * This is needed in the directory version 2 format case, when Index: kern_ci/fs/xfs/xfs_dir2.c =================================================================== --- kern_ci.orig/fs/xfs/xfs_dir2.c +++ kern_ci/fs/xfs/xfs_dir2.c @@ -193,14 +193,42 @@ xfs_dir_createname( } /* + * If doing a CI lookup and case-insensitive match, dup actual name into + * args.value. Return EEXIST for success (ie. name found) or an error. + */ +int +xfs_dir_cilookup_result( + struct xfs_da_args *args, + const char *name, + int len) +{ + if (args->cmpresult == XFS_CMP_DIFFERENT) + return ENOENT; + if (args->cmpresult != XFS_CMP_CASE || !xfs_da_iscilookup_op(args)) + return EEXIST; + + args->value = kmem_alloc(len, KM_MAYFAIL); + if (!args->value) + return ENOMEM; + + memcpy(args->value, name, len); + args->valuelen = len; + return EEXIST; +} + +/* * Lookup a name in a directory, give back the inode number. + * If ci_match is not NULL, sets whether a CI match occurred of not, and + * if so, return the actual name in name. */ + int xfs_dir_lookup( xfs_trans_t *tp, xfs_inode_t *dp, struct xfs_name *name, - xfs_ino_t *inum) /* out: inode number */ + xfs_ino_t *inum, /* out: inode number */ + int *ci_match) /* out: CI match occurred */ { xfs_da_args_t args; int rval; @@ -217,6 +245,8 @@ xfs_dir_lookup( args.whichfork = XFS_DATA_FORK; args.trans = tp; args.op_flags = XFS_DA_OP_OKNOENT; + if (ci_match) + args.op_flags |= XFS_DA_OP_CILOOKUP; args.cmpresult = XFS_CMP_DIFFERENT; if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL) @@ -233,8 +263,14 @@ xfs_dir_lookup( rval = xfs_dir2_node_lookup(&args); if (rval == EEXIST) rval = 0; - if (rval == 0) + if (!rval) { *inum = args.inumber; + if (ci_match) { + *ci_match = args.cmpresult == XFS_CMP_CASE; + name->name = args.value; + name->len = args.valuelen; + } + } return rval; } Index: kern_ci/fs/xfs/xfs_dir2.h =================================================================== --- kern_ci.orig/fs/xfs/xfs_dir2.h +++ kern_ci/fs/xfs/xfs_dir2.h @@ -74,7 +74,8 @@ extern int xfs_dir_createname(struct xfs xfs_fsblock_t *first, struct xfs_bmap_free *flist, xfs_extlen_t tot); extern int xfs_dir_lookup(struct xfs_trans *tp, struct xfs_inode *dp, - struct xfs_name *name, xfs_ino_t *inum); + struct xfs_name *name, xfs_ino_t *inum, + int *ci_match); extern int xfs_dir_removename(struct xfs_trans *tp, struct xfs_inode *dp, struct xfs_name *name, xfs_ino_t ino, xfs_fsblock_t *first, @@ -99,4 +100,7 @@ extern int xfs_dir2_isleaf(struct xfs_tr extern int xfs_dir2_shrink_inode(struct xfs_da_args *args, xfs_dir2_db_t db, struct xfs_dabuf *bp); +extern int xfs_dir_cilookup_result(struct xfs_da_args *args, const char *name, + int len); + #endif /* __XFS_DIR2_H__ */ Index: kern_ci/fs/xfs/xfs_dir2_block.c =================================================================== --- kern_ci.orig/fs/xfs/xfs_dir2_block.c +++ kern_ci/fs/xfs/xfs_dir2_block.c @@ -610,14 +610,15 @@ xfs_dir2_block_lookup( /* * Get the offset from the leaf entry, to point to the data. */ - dep = (xfs_dir2_data_entry_t *) - ((char *)block + xfs_dir2_dataptr_to_off(mp, be32_to_cpu(blp[ent].address))); + dep = (xfs_dir2_data_entry_t *)((char *)block + + xfs_dir2_dataptr_to_off(mp, be32_to_cpu(blp[ent].address))); /* - * Fill in inode number, release the block. + * Fill in inode number, CI name if appropriate, release the block. */ args->inumber = be64_to_cpu(dep->inumber); + error = xfs_dir_cilookup_result(args, dep->name, dep->namelen); xfs_da_brelse(args->trans, bp); - return XFS_ERROR(EEXIST); + return XFS_ERROR(error); } /* Index: kern_ci/fs/xfs/xfs_dir2_leaf.c =================================================================== --- kern_ci.orig/fs/xfs/xfs_dir2_leaf.c +++ kern_ci/fs/xfs/xfs_dir2_leaf.c @@ -1298,12 +1298,13 @@ xfs_dir2_leaf_lookup( ((char *)dbp->data + xfs_dir2_dataptr_to_off(dp->i_mount, be32_to_cpu(lep->address))); /* - * Return the found inode number. + * Return the found inode number & CI name if appropriate */ args->inumber = be64_to_cpu(dep->inumber); + error = xfs_dir_cilookup_result(args, dep->name, dep->namelen); xfs_da_brelse(tp, dbp); xfs_da_brelse(tp, lbp); - return XFS_ERROR(EEXIST); + return XFS_ERROR(error); } /* Index: kern_ci/fs/xfs/xfs_dir2_node.c =================================================================== --- kern_ci.orig/fs/xfs/xfs_dir2_node.c +++ kern_ci/fs/xfs/xfs_dir2_node.c @@ -549,7 +549,7 @@ xfs_dir2_leafn_lookup_for_entry( xfs_dir2_data_entry_t *dep; /* data block entry */ xfs_inode_t *dp; /* incore directory inode */ int error; /* error return value */ - int di; /* data entry index */ + int di = -1; /* data entry index */ int index; /* leaf entry index */ xfs_dir2_leaf_t *leaf; /* leaf structure */ xfs_dir2_leaf_entry_t *lep; /* leaf entry */ @@ -577,6 +577,7 @@ xfs_dir2_leafn_lookup_for_entry( if (state->extravalid) { curbp = state->extrablk.bp; curdb = state->extrablk.blkno; + di = state->extrablk.index; } /* * Loop over leaf entries with the right hash value. @@ -637,7 +638,6 @@ xfs_dir2_leafn_lookup_for_entry( } /* Didn't find an exact match. */ error = ENOENT; - di = -1; ASSERT(index == be16_to_cpu(leaf->hdr.count) || xfs_da_isoknoent_op(args)); out: @@ -652,7 +652,7 @@ out: state->extravalid = 0; } /* - * Return the index, that will be the insertion point. + * Return the index, that will be the deletion point for remove/replace. */ *indexp = index; return XFS_ERROR(error); @@ -1819,8 +1819,14 @@ xfs_dir2_node_lookup( error = xfs_da_node_lookup_int(state, &rval); if (error) rval = error; - else if (rval == ENOENT && args->cmpresult == XFS_CMP_CASE) - rval = EEXIST; /* a case-insensitive match was found */ + else if (rval == ENOENT && args->cmpresult == XFS_CMP_CASE) { + /* If a CI match, dup the actual name and return EEXIST */ + xfs_dir2_data_entry_t *dep; + + dep = (xfs_dir2_data_entry_t *)((char *)state->extrablk.bp-> + data + state->extrablk.index); + rval = xfs_dir_cilookup_result(args, dep->name, dep->namelen); + } /* * Release the btree blocks and leaf block. */ Index: kern_ci/fs/xfs/xfs_dir2_sf.c =================================================================== --- kern_ci.orig/fs/xfs/xfs_dir2_sf.c +++ kern_ci/fs/xfs/xfs_dir2_sf.c @@ -815,6 +815,7 @@ xfs_dir2_sf_lookup( xfs_dir2_sf_entry_t *sfep; /* shortform directory entry */ xfs_dir2_sf_t *sfp; /* shortform structure */ enum xfs_dacmp cmp; /* comparison result */ + xfs_dir2_sf_entry_t *ci_sfep; /* case-insens. entry */ xfs_dir2_trace_args("sf_lookup", args); xfs_dir2_sf_check(args); @@ -852,6 +853,7 @@ xfs_dir2_sf_lookup( /* * Loop over all the entries trying to match ours. */ + ci_sfep = NULL; for (i = 0, sfep = xfs_dir2_sf_firstentry(sfp); i < sfp->hdr.count; i++, sfep = xfs_dir2_sf_nextentry(sfp, sfep)) { /* @@ -867,15 +869,13 @@ xfs_dir2_sf_lookup( xfs_dir2_sf_inumberp(sfep)); if (cmp == XFS_CMP_EXACT) return XFS_ERROR(EEXIST); + ci_sfep = sfep; } } ASSERT(xfs_da_isoknoent_op(args)); - /* - * Here, we can only be doing a lookup (not a rename or replace). - * If a case-insensitive match was found earlier, return "found". - */ - if (args->cmpresult == XFS_CMP_CASE) - return XFS_ERROR(EEXIST); + if (ci_sfep) + return XFS_ERROR(xfs_dir_cilookup_result(args, + ci_sfep->name, ci_sfep->namelen)); /* * Didn't find it. */ Index: kern_ci/fs/xfs/xfs_vnodeops.c =================================================================== --- kern_ci.orig/fs/xfs/xfs_vnodeops.c +++ kern_ci/fs/xfs/xfs_vnodeops.c @@ -1629,12 +1629,19 @@ xfs_inactive( return VN_INACTIVE_CACHE; } - +/* + * Lookups up an inode from "name". If ci_match is not NULL, then name->name + * will be replaced. If a CI match is found, name->name will point to a the + * actual name (caller must free) and ci_match is set to 1. + * The caller of xfs_lookup must call xfs_name_free(name->name) if + * ci_match in non-NULL. If no CI match is found, name->name will be NULL. + */ int xfs_lookup( xfs_inode_t *dp, struct xfs_name *name, - xfs_inode_t **ipp) + xfs_inode_t **ipp, + int *ci_match) { xfs_ino_t inum; int error; @@ -1646,15 +1653,18 @@ xfs_lookup( return XFS_ERROR(EIO); lock_mode = xfs_ilock_map_shared(dp); - error = xfs_dir_lookup(NULL, dp, name, &inum); + error = xfs_dir_lookup(NULL, dp, name, &inum, ci_match); xfs_iunlock_map_shared(dp, lock_mode); if (error) goto out; error = xfs_iget(dp->i_mount, NULL, inum, 0, 0, ipp, 0); - if (error) + if (error) { + if (ci_match && *ci_match) + kmem_free(name->name, name->len); goto out; + } xfs_itrace_ref(*ipp); return 0; Index: kern_ci/fs/xfs/xfs_vnodeops.h =================================================================== --- kern_ci.orig/fs/xfs/xfs_vnodeops.h +++ kern_ci/fs/xfs/xfs_vnodeops.h @@ -23,7 +23,7 @@ int xfs_fsync(struct xfs_inode *ip, int 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, - struct xfs_inode **ipp); + struct xfs_inode **ipp, int *ci_match); int xfs_create(struct xfs_inode *dp, struct xfs_name *name, mode_t mode, xfs_dev_t rdev, struct xfs_inode **ipp, struct cred *credp); int xfs_remove(struct xfs_inode *dp, struct xfs_name *name, Index: kern_ci/include/linux/dcache.h =================================================================== --- kern_ci.orig/include/linux/dcache.h +++ kern_ci/include/linux/dcache.h @@ -231,6 +231,7 @@ extern void d_delete(struct dentry *); extern struct dentry * d_alloc(struct dentry *, const struct qstr *); extern struct dentry * d_alloc_anon(struct inode *); extern struct dentry * d_splice_alias(struct inode *, struct dentry *); +extern struct dentry * d_add_ci(struct inode *, struct dentry *, struct qstr *); extern void shrink_dcache_sb(struct super_block *); extern void shrink_dcache_parent(struct dentry *); extern void shrink_dcache_for_umount(struct super_block *); -- From owner-xfs@oss.sgi.com Tue May 13 01:01:11 2008 Received: with ECARTIS (v1.0.0; list xfs); Tue, 13 May 2008 01:01: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.0 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_43, J_CHICKENPOX_72 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 m4D817vl006486 for ; Tue, 13 May 2008 01:01:09 -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 SAA14886; Tue, 13 May 2008 18:01:53 +1000 Received: by chook.melbourne.sgi.com (Postfix, from userid 1161) id 6EDA158C4C37; Tue, 13 May 2008 18:01:53 +1000 (EST) Message-Id: <20080513080153.184936637@chook.melbourne.sgi.com> References: <20080513075749.477238845@chook.melbourne.sgi.com> User-Agent: quilt/0.46-1 Date: Tue, 13 May 2008 17:57:53 +1000 From: Barry Naujok To: xfs@oss.sgi.com Cc: linux-fsdevel@vger.kernel.org Subject: [PATCH 4/4] XFS: ASCII case-insensitive support Content-Disposition: inline; filename=ascii_ci.patch 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: 15860 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 Implement ASCII case-insensitive support. It's primary purpose is for supporting existing filesystems that already use this case-insensitive mode migrated from IRIX. But, if you only need ASCII-only case-insensitive support (ie. English only) and will never use another language, then this mode is perfectly adequate. ASCII-CI is implemented by generating hashes based on lower-case letters and doing lower-case compares. It implements a new xfs_nameops vector for doing the hashes and comparisons for all filename operations. To create a filesystem with this CI mode, use: # mkfs.xfs -n version=ci Signed-off-by: Barry Naujok --- fs/xfs/linux-2.6/xfs_linux.h | 1 fs/xfs/linux-2.6/xfs_super.c | 5 +++- fs/xfs/xfs_dir2.c | 52 ++++++++++++++++++++++++++++++++++++++++++- fs/xfs/xfs_fs.h | 1 fs/xfs/xfs_fsops.c | 4 ++- fs/xfs/xfs_sb.h | 10 +++++++- 6 files changed, 69 insertions(+), 4 deletions(-) Index: kern_ci/fs/xfs/linux-2.6/xfs_linux.h =================================================================== --- kern_ci.orig/fs/xfs/linux-2.6/xfs_linux.h +++ kern_ci/fs/xfs/linux-2.6/xfs_linux.h @@ -76,6 +76,7 @@ #include #include #include +#include #include #include Index: kern_ci/fs/xfs/linux-2.6/xfs_super.c =================================================================== --- kern_ci.orig/fs/xfs/linux-2.6/xfs_super.c +++ kern_ci/fs/xfs/linux-2.6/xfs_super.c @@ -565,7 +565,10 @@ xfs_set_inodeops( inode->i_mapping->a_ops = &xfs_address_space_operations; break; case S_IFDIR: - inode->i_op = &xfs_dir_inode_operations; + if (xfs_sb_version_hasoldci(&XFS_M(inode->i_sb)->m_sb)) + inode->i_op = &xfs_dir_ci_inode_operations; + else + inode->i_op = &xfs_dir_inode_operations; inode->i_fop = &xfs_dir_file_operations; break; case S_IFLNK: Index: kern_ci/fs/xfs/xfs_dir2.c =================================================================== --- kern_ci.orig/fs/xfs/xfs_dir2.c +++ kern_ci/fs/xfs/xfs_dir2.c @@ -48,6 +48,53 @@ struct xfs_name xfs_name_dotdot = {"..", extern const struct xfs_nameops xfs_default_nameops; +/* + * V1/OLDCI case-insensitive support for directories that was used in IRIX. + * + * This is ASCII only case support, ie. A-Z. + */ +STATIC xfs_dahash_t +xfs_ascii_ci_hashname( + struct xfs_name *name) +{ + xfs_dahash_t hash; + int i; + + for (i = 0, hash = 0; i < name->len; i++) + hash = tolower(name->name[i]) ^ rol32(hash, 7); + + return hash; +} + +STATIC enum xfs_dacmp +xfs_ascii_ci_compname( + struct xfs_da_args *args, + const char *name, + int len) +{ + enum xfs_dacmp result; + int i; + + if (args->namelen != len) + return XFS_CMP_DIFFERENT; + + result = XFS_CMP_EXACT; + for (i = 0; i < len; i++) { + if (args->name[i] == name[i]) + continue; + if (tolower(args->name[i]) != tolower(name[i])) + return XFS_CMP_DIFFERENT; + result = XFS_CMP_CASE; + } + + return result; +} + +static struct xfs_nameops xfs_ascii_ci_nameops = { + .hashname = xfs_ascii_ci_hashname, + .compname = xfs_ascii_ci_compname, +}; + void xfs_dir_mount( xfs_mount_t *mp) @@ -67,7 +114,10 @@ xfs_dir_mount( (mp->m_dirblksize - (uint)sizeof(xfs_da_node_hdr_t)) / (uint)sizeof(xfs_da_node_entry_t); mp->m_dir_magicpct = (mp->m_dirblksize * 37) / 100; - mp->m_dirnameops = &xfs_default_nameops; + if (xfs_sb_version_hasoldci(&mp->m_sb)) + mp->m_dirnameops = &xfs_ascii_ci_nameops; + else + mp->m_dirnameops = &xfs_default_nameops; } /* Index: kern_ci/fs/xfs/xfs_fs.h =================================================================== --- kern_ci.orig/fs/xfs/xfs_fs.h +++ kern_ci/fs/xfs/xfs_fs.h @@ -239,6 +239,7 @@ typedef struct xfs_fsop_resblks { #define XFS_FSOP_GEOM_FLAGS_LOGV2 0x0100 /* log format version 2 */ #define XFS_FSOP_GEOM_FLAGS_SECTOR 0x0200 /* sector sizes >1BB */ #define XFS_FSOP_GEOM_FLAGS_ATTR2 0x0400 /* inline attributes rework */ +#define XFS_FSOP_GEOM_FLAGS_DIRV2CI 0x1000 /* ASCII only CI names */ #define XFS_FSOP_GEOM_FLAGS_LAZYSB 0x4000 /* lazy superblock counters */ Index: kern_ci/fs/xfs/xfs_fsops.c =================================================================== --- kern_ci.orig/fs/xfs/xfs_fsops.c +++ kern_ci/fs/xfs/xfs_fsops.c @@ -95,6 +95,8 @@ xfs_fs_geometry( XFS_FSOP_GEOM_FLAGS_DIRV2 : 0) | (xfs_sb_version_hassector(&mp->m_sb) ? XFS_FSOP_GEOM_FLAGS_SECTOR : 0) | + (xfs_sb_version_hasoldci(&mp->m_sb) ? + XFS_FSOP_GEOM_FLAGS_DIRV2CI : 0) | (xfs_sb_version_haslazysbcount(&mp->m_sb) ? XFS_FSOP_GEOM_FLAGS_LAZYSB : 0) | (xfs_sb_version_hasattr2(&mp->m_sb) ? @@ -625,7 +627,7 @@ xfs_fs_goingdown( xfs_force_shutdown(mp, SHUTDOWN_FORCE_UMOUNT); thaw_bdev(sb->s_bdev, sb); } - + break; } case XFS_FSOP_GOING_FLAGS_LOGFLUSH: Index: kern_ci/fs/xfs/xfs_sb.h =================================================================== --- kern_ci.orig/fs/xfs/xfs_sb.h +++ kern_ci/fs/xfs/xfs_sb.h @@ -46,10 +46,12 @@ struct xfs_mount; #define XFS_SB_VERSION_SECTORBIT 0x0800 #define XFS_SB_VERSION_EXTFLGBIT 0x1000 #define XFS_SB_VERSION_DIRV2BIT 0x2000 +#define XFS_SB_VERSION_BORGBIT 0x4000 /* ASCII only case-insens. */ #define XFS_SB_VERSION_MOREBITSBIT 0x8000 #define XFS_SB_VERSION_OKSASHFBITS \ (XFS_SB_VERSION_EXTFLGBIT | \ - XFS_SB_VERSION_DIRV2BIT) + XFS_SB_VERSION_DIRV2BIT | \ + XFS_SB_VERSION_BORGBIT) #define XFS_SB_VERSION_OKREALFBITS \ (XFS_SB_VERSION_ATTRBIT | \ XFS_SB_VERSION_NLINKBIT | \ @@ -437,6 +439,12 @@ static inline int xfs_sb_version_hassect ((sbp)->sb_versionnum & XFS_SB_VERSION_SECTORBIT); } +static inline int xfs_sb_version_hasoldci(xfs_sb_t *sbp) +{ + return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) && \ + (sbp->sb_versionnum & XFS_SB_VERSION_BORGBIT); +} + static inline int xfs_sb_version_hasmorebits(xfs_sb_t *sbp) { return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) && \ -- From owner-xfs@oss.sgi.com Tue May 13 01:01:14 2008 Received: with ECARTIS (v1.0.0; list xfs); Tue, 13 May 2008 01:01: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=-1.8 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_35, J_CHICKENPOX_42,J_CHICKENPOX_45,J_CHICKENPOX_47,J_CHICKENPOX_55, J_CHICKENPOX_57,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 m4D816cf006484 for ; Tue, 13 May 2008 01:01:09 -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 SAA14882; Tue, 13 May 2008 18:01:52 +1000 Received: by chook.melbourne.sgi.com (Postfix, from userid 1161) id D93C858C4C35; Tue, 13 May 2008 18:01:52 +1000 (EST) Message-Id: <20080513080152.598022276@chook.melbourne.sgi.com> References: <20080513075749.477238845@chook.melbourne.sgi.com> User-Agent: quilt/0.46-1 Date: Tue, 13 May 2008 17:57:51 +1000 From: Barry Naujok To: xfs@oss.sgi.com Cc: linux-fsdevel@vger.kernel.org Subject: [PATCH 2/4] XFS: add op_flags field and helpers to xfs_da_args Content-Disposition: inline; filename=additional_da_args_flag.patch 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: 15861 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 The end of the xfs_da_args structure has 4 unsigned char fields for true/false information on directory and attr operations using the xfs_da_args structure. The following converts these 4 into a op_flags field that uses the first 4 bits for these fields and allows expansion for future operation information (eg. case-insensitive lookup request). There is also a bit of EOL whitespace cleanup too. Signed-off-by: Barry Naujok --- fs/xfs/xfs_attr.c | 11 ++++------ fs/xfs/xfs_attr_leaf.c | 52 ++++++++++++++++++++++++------------------------ fs/xfs/xfs_da_btree.c | 2 - fs/xfs/xfs_da_btree.h | 33 ++++++++++++++++++++++++++---- fs/xfs/xfs_dir2.c | 12 +++++------ fs/xfs/xfs_dir2_block.c | 10 ++++----- fs/xfs/xfs_dir2_leaf.c | 6 ++--- fs/xfs/xfs_dir2_node.c | 15 +++++++------ fs/xfs/xfs_dir2_sf.c | 8 +++---- fs/xfs/xfs_dir2_trace.c | 19 +++++++++-------- fs/xfs/xfsidbg.c | 13 ++++++------ 11 files changed, 105 insertions(+), 76 deletions(-) Index: kern_ci/fs/xfs/xfs_attr.c =================================================================== --- kern_ci.orig/fs/xfs/xfs_attr.c +++ kern_ci/fs/xfs/xfs_attr.c @@ -241,8 +241,7 @@ xfs_attr_set_int(xfs_inode_t *dp, struct args.firstblock = &firstblock; args.flist = &flist; args.whichfork = XFS_ATTR_FORK; - args.addname = 1; - args.oknoent = 1; + args.op_flags = XFS_DA_OP_ADDNAME | XFS_DA_OP_OKNOENT; /* * Determine space new attribute will use, and if it would be @@ -974,7 +973,7 @@ xfs_attr_leaf_addname(xfs_da_args_t *arg xfs_da_brelse(args->trans, bp); return(retval); } - args->rename = 1; /* an atomic rename */ + args->op_flags |= XFS_DA_OP_RENAME; /* an atomic rename */ args->blkno2 = args->blkno; /* set 2nd entry info*/ args->index2 = args->index; args->rmtblkno2 = args->rmtblkno; @@ -1054,7 +1053,7 @@ xfs_attr_leaf_addname(xfs_da_args_t *arg * so that one disappears and one appears atomically. Then we * must remove the "old" attribute/value pair. */ - if (args->rename) { + if (xfs_da_isrename_op(args)) { /* * In a separate transaction, set the incomplete flag on the * "old" attr and clear the incomplete flag on the "new" attr. @@ -1307,7 +1306,7 @@ restart: } else if (retval == EEXIST) { if (args->flags & ATTR_CREATE) goto out; - args->rename = 1; /* atomic rename op */ + args->op_flags |= XFS_DA_OP_RENAME; /* atomic rename op */ args->blkno2 = args->blkno; /* set 2nd entry info*/ args->index2 = args->index; args->rmtblkno2 = args->rmtblkno; @@ -1425,7 +1424,7 @@ restart: * so that one disappears and one appears atomically. Then we * must remove the "old" attribute/value pair. */ - if (args->rename) { + if (xfs_da_isrename_op(args)) { /* * In a separate transaction, set the incomplete flag on the * "old" attr and clear the incomplete flag on the "new" attr. Index: kern_ci/fs/xfs/xfs_attr_leaf.c =================================================================== --- kern_ci.orig/fs/xfs/xfs_attr_leaf.c +++ kern_ci/fs/xfs/xfs_attr_leaf.c @@ -150,7 +150,7 @@ xfs_attr_shortform_bytesfit(xfs_inode_t int offset; int minforkoff; /* lower limit on valid forkoff locations */ int maxforkoff; /* upper limit on valid forkoff locations */ - int dsize; + int dsize; xfs_mount_t *mp = dp->i_mount; offset = (XFS_LITINO(mp) - bytes) >> 3; /* rounded down */ @@ -171,39 +171,39 @@ xfs_attr_shortform_bytesfit(xfs_inode_t } dsize = dp->i_df.if_bytes; - + switch (dp->i_d.di_format) { case XFS_DINODE_FMT_EXTENTS: - /* - * If there is no attr fork and the data fork is extents, - * determine if creating the default attr fork will result - * in the extents form migrating to btree. If so, the - * minimum offset only needs to be the space required for + /* + * If there is no attr fork and the data fork is extents, + * determine if creating the default attr fork will result + * in the extents form migrating to btree. If so, the + * minimum offset only needs to be the space required for * the btree root. - */ + */ if (!dp->i_d.di_forkoff && dp->i_df.if_bytes > mp->m_attroffset) dsize = XFS_BMDR_SPACE_CALC(MINDBTPTRS); break; - + case XFS_DINODE_FMT_BTREE: /* * If have data btree then keep forkoff if we have one, - * otherwise we are adding a new attr, so then we set - * minforkoff to where the btree root can finish so we have + * otherwise we are adding a new attr, so then we set + * minforkoff to where the btree root can finish so we have * plenty of room for attrs */ if (dp->i_d.di_forkoff) { - if (offset < dp->i_d.di_forkoff) + if (offset < dp->i_d.di_forkoff) return 0; - else + else return dp->i_d.di_forkoff; } else dsize = XFS_BMAP_BROOT_SPACE(dp->i_df.if_broot); break; } - - /* - * A data fork btree root must have space for at least + + /* + * A data fork btree root must have space for at least * MINDBTPTRS key/ptr pairs if the data fork is small or empty. */ minforkoff = MAX(dsize, XFS_BMDR_SPACE_CALC(MINDBTPTRS)); @@ -369,9 +369,10 @@ xfs_attr_shortform_remove(xfs_da_args_t * Fix up the start offset of the attribute fork */ totsize -= size; - if (totsize == sizeof(xfs_attr_sf_hdr_t) && !args->addname && - (mp->m_flags & XFS_MOUNT_ATTR2) && - (dp->i_d.di_format != XFS_DINODE_FMT_BTREE)) { + if (totsize == sizeof(xfs_attr_sf_hdr_t) && + !xfs_da_isaddname_op(args) && + (mp->m_flags & XFS_MOUNT_ATTR2) && + (dp->i_d.di_format != XFS_DINODE_FMT_BTREE)) { /* * Last attribute now removed, revert to original * inode format making all literal area available @@ -389,9 +390,10 @@ xfs_attr_shortform_remove(xfs_da_args_t xfs_idata_realloc(dp, -size, XFS_ATTR_FORK); dp->i_d.di_forkoff = xfs_attr_shortform_bytesfit(dp, totsize); ASSERT(dp->i_d.di_forkoff); - ASSERT(totsize > sizeof(xfs_attr_sf_hdr_t) || args->addname || - !(mp->m_flags & XFS_MOUNT_ATTR2) || - dp->i_d.di_format == XFS_DINODE_FMT_BTREE); + ASSERT(totsize > sizeof(xfs_attr_sf_hdr_t) || + xfs_da_isaddname_op(args) || + !(mp->m_flags & XFS_MOUNT_ATTR2) || + dp->i_d.di_format == XFS_DINODE_FMT_BTREE); dp->i_afp->if_ext_max = XFS_IFORK_ASIZE(dp) / (uint)sizeof(xfs_bmbt_rec_t); dp->i_df.if_ext_max = @@ -531,7 +533,7 @@ xfs_attr_shortform_to_leaf(xfs_da_args_t nargs.total = args->total; nargs.whichfork = XFS_ATTR_FORK; nargs.trans = args->trans; - nargs.oknoent = 1; + nargs.op_flags = XFS_DA_OP_OKNOENT; sfe = &sf->list[0]; for (i = 0; i < sf->hdr.count; i++) { @@ -853,7 +855,7 @@ xfs_attr_leaf_to_shortform(xfs_dabuf_t * nargs.total = args->total; nargs.whichfork = XFS_ATTR_FORK; nargs.trans = args->trans; - nargs.oknoent = 1; + nargs.op_flags = XFS_DA_OP_OKNOENT; entry = &leaf->entries[0]; for (i = 0; i < be16_to_cpu(leaf->hdr.count); entry++, i++) { if (entry->flags & XFS_ATTR_INCOMPLETE) @@ -1155,7 +1157,7 @@ xfs_attr_leaf_add_work(xfs_dabuf_t *bp, entry->hashval = cpu_to_be32(args->hashval); entry->flags = tmp ? XFS_ATTR_LOCAL : 0; entry->flags |= XFS_ATTR_NSP_ARGS_TO_ONDISK(args->flags); - if (args->rename) { + if (xfs_da_isrename_op(args)) { entry->flags |= XFS_ATTR_INCOMPLETE; if ((args->blkno2 == args->blkno) && (args->index2 <= args->index)) { Index: kern_ci/fs/xfs/xfs_da_btree.c =================================================================== --- kern_ci.orig/fs/xfs/xfs_da_btree.c +++ kern_ci/fs/xfs/xfs_da_btree.c @@ -1431,7 +1431,7 @@ xfs_da_path_shift(xfs_da_state_t *state, } if (level < 0) { *result = XFS_ERROR(ENOENT); /* we're out of our tree */ - ASSERT(args->oknoent); + ASSERT(xfs_da_isoknoent_op(args)); return(0); } Index: kern_ci/fs/xfs/xfs_da_btree.h =================================================================== --- kern_ci.orig/fs/xfs/xfs_da_btree.h +++ kern_ci/fs/xfs/xfs_da_btree.h @@ -132,14 +132,39 @@ typedef struct xfs_da_args { int index2; /* index of 2nd attr in blk */ xfs_dablk_t rmtblkno2; /* remote attr value starting blkno */ int rmtblkcnt2; /* remote attr value block count */ - unsigned char justcheck; /* T/F: check for ok with no space */ - unsigned char rename; /* T/F: this is an atomic rename op */ - unsigned char addname; /* T/F: this is an add operation */ - unsigned char oknoent; /* T/F: ok to return ENOENT, else die */ + int op_flags; /* operation flags */ enum xfs_dacmp cmpresult; /* name compare result for lookups */ } xfs_da_args_t; /* + * Operation flags: + */ +#define XFS_DA_OP_JUSTCHECK 0x0001 /* check for ok with no space */ +#define XFS_DA_OP_RENAME 0x0002 /* this is an atomic rename op */ +#define XFS_DA_OP_ADDNAME 0x0004 /* this is an add operation */ +#define XFS_DA_OP_OKNOENT 0x0008 /* lookup/add op, ENOENT ok, else die */ + +static inline int xfs_da_isjustcheck_op(struct xfs_da_args *args) +{ + return args->op_flags & XFS_DA_OP_JUSTCHECK; +} + +static inline int xfs_da_isrename_op(struct xfs_da_args *args) +{ + return args->op_flags & XFS_DA_OP_RENAME; +} + +static inline int xfs_da_isaddname_op(struct xfs_da_args *args) +{ + return args->op_flags & XFS_DA_OP_ADDNAME; +} + +static inline int xfs_da_isoknoent_op(struct xfs_da_args *args) +{ + return args->op_flags & XFS_DA_OP_OKNOENT; +} + +/* * Structure to describe buffer(s) for a block. * This is needed in the directory version 2 format case, when * multiple non-contiguous fsblocks might be needed to cover one Index: kern_ci/fs/xfs/xfs_dir2.c =================================================================== --- kern_ci.orig/fs/xfs/xfs_dir2.c +++ kern_ci/fs/xfs/xfs_dir2.c @@ -175,8 +175,7 @@ xfs_dir_createname( args.total = total; args.whichfork = XFS_DATA_FORK; args.trans = tp; - args.justcheck = 0; - args.addname = args.oknoent = 1; + args.op_flags = XFS_DA_OP_ADDNAME | XFS_DA_OP_OKNOENT; if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL) rval = xfs_dir2_sf_addname(&args); @@ -217,7 +216,7 @@ xfs_dir_lookup( args.dp = dp; args.whichfork = XFS_DATA_FORK; args.trans = tp; - args.oknoent = 1; + args.op_flags = XFS_DA_OP_OKNOENT; args.cmpresult = XFS_CMP_DIFFERENT; if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL) @@ -269,7 +268,7 @@ xfs_dir_removename( args.total = total; args.whichfork = XFS_DATA_FORK; args.trans = tp; - args.justcheck = args.addname = args.oknoent = 0; + args.op_flags = 0; if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL) rval = xfs_dir2_sf_removename(&args); @@ -352,7 +351,7 @@ xfs_dir_replace( args.total = total; args.whichfork = XFS_DATA_FORK; args.trans = tp; - args.justcheck = args.addname = args.oknoent = 0; + args.op_flags = 0; if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL) rval = xfs_dir2_sf_replace(&args); @@ -396,7 +395,8 @@ xfs_dir_canenter( args.dp = dp; args.whichfork = XFS_DATA_FORK; args.trans = tp; - args.justcheck = args.addname = args.oknoent = 1; + args.op_flags = XFS_DA_OP_JUSTCHECK | XFS_DA_OP_ADDNAME | + XFS_DA_OP_OKNOENT; if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL) rval = xfs_dir2_sf_addname(&args); Index: kern_ci/fs/xfs/xfs_dir2_block.c =================================================================== --- kern_ci.orig/fs/xfs/xfs_dir2_block.c +++ kern_ci/fs/xfs/xfs_dir2_block.c @@ -215,7 +215,7 @@ xfs_dir2_block_addname( /* * If this isn't a real add, we're done with the buffer. */ - if (args->justcheck) + if (xfs_da_isjustcheck_op(args)) xfs_da_brelse(tp, bp); /* * If we don't have space for the new entry & leaf ... @@ -225,7 +225,7 @@ xfs_dir2_block_addname( * Not trying to actually do anything, or don't have * a space reservation: return no-space. */ - if (args->justcheck || args->total == 0) + if (xfs_da_isjustcheck_op(args) || args->total == 0) return XFS_ERROR(ENOSPC); /* * Convert to the next larger format. @@ -240,7 +240,7 @@ xfs_dir2_block_addname( /* * Just checking, and it would work, so say so. */ - if (args->justcheck) + if (xfs_da_isjustcheck_op(args)) return 0; needlog = needscan = 0; /* @@ -674,7 +674,7 @@ xfs_dir2_block_lookup_int( else high = mid - 1; if (low > high) { - ASSERT(args->oknoent); + ASSERT(xfs_da_isoknoent_op(args)); xfs_da_brelse(tp, bp); return XFS_ERROR(ENOENT); } @@ -713,7 +713,7 @@ xfs_dir2_block_lookup_int( } while (++mid < be32_to_cpu(btp->count) && be32_to_cpu(blp[mid].hashval) == hash); - ASSERT(args->oknoent); + ASSERT(xfs_da_isoknoent_op(args)); /* * Here, we can only be doing a lookup (not a rename or replace). * If a case-insensitive match was found earlier, return success. Index: kern_ci/fs/xfs/xfs_dir2_leaf.c =================================================================== --- kern_ci.orig/fs/xfs/xfs_dir2_leaf.c +++ kern_ci/fs/xfs/xfs_dir2_leaf.c @@ -276,7 +276,7 @@ xfs_dir2_leaf_addname( /* * Just checking or no space reservation, give up. */ - if (args->justcheck || args->total == 0) { + if (xfs_da_isjustcheck_op(args) || args->total == 0) { xfs_da_brelse(tp, lbp); return XFS_ERROR(ENOSPC); } @@ -301,7 +301,7 @@ xfs_dir2_leaf_addname( * If just checking, then it will fit unless we needed to allocate * a new data block. */ - if (args->justcheck) { + if (xfs_da_isjustcheck_op(args)) { xfs_da_brelse(tp, lbp); return use_block == -1 ? XFS_ERROR(ENOSPC) : 0; } @@ -1414,7 +1414,7 @@ xfs_dir2_leaf_lookup_int( cbp = dbp; } } - ASSERT(args->oknoent); + ASSERT(xfs_da_isoknoent_op(args)); /* * Here, we can only be doing a lookup (not a rename or replace). * If a case-insensitive match was found earlier, release the current Index: kern_ci/fs/xfs/xfs_dir2_node.c =================================================================== --- kern_ci.orig/fs/xfs/xfs_dir2_node.c +++ kern_ci/fs/xfs/xfs_dir2_node.c @@ -226,7 +226,7 @@ xfs_dir2_leafn_add( ASSERT(index == be16_to_cpu(leaf->hdr.count) || be32_to_cpu(leaf->ents[index].hashval) >= args->hashval); - if (args->justcheck) + if (xfs_da_isjustcheck_op(args)) return 0; /* @@ -515,7 +515,7 @@ xfs_dir2_leafn_lookup_for_addname( /* Didn't find any space */ fi = -1; out: - ASSERT(args->oknoent); + ASSERT(xfs_da_isoknoent_op(args)); if (curbp) { /* Giving back a free block. */ state->extravalid = 1; @@ -638,7 +638,8 @@ xfs_dir2_leafn_lookup_for_entry( /* Didn't find an exact match. */ error = ENOENT; di = -1; - ASSERT(index == be16_to_cpu(leaf->hdr.count) || args->oknoent); + ASSERT(index == be16_to_cpu(leaf->hdr.count) || + xfs_da_isoknoent_op(args)); out: if (curbp) { /* Giving back a data block. */ @@ -669,7 +670,7 @@ xfs_dir2_leafn_lookup_int( int *indexp, /* out: leaf entry index */ xfs_da_state_t *state) /* state to fill in */ { - if (args->addname) + if (xfs_da_isaddname_op(args)) return xfs_dir2_leafn_lookup_for_addname(bp, args, indexp, state); return xfs_dir2_leafn_lookup_for_entry(bp, args, indexp, state); @@ -1383,7 +1384,7 @@ xfs_dir2_node_addname( /* * It worked, fix the hash values up the btree. */ - if (!args->justcheck) + if (!xfs_da_isjustcheck_op(args)) xfs_da_fixhashpath(state, &state->path); } else { /* @@ -1566,7 +1567,7 @@ xfs_dir2_node_addname_int( /* * Not allowed to allocate, return failure. */ - if (args->justcheck || args->total == 0) { + if (xfs_da_isjustcheck_op(args) || args->total == 0) { /* * Drop the freespace buffer unless it came from our * caller. @@ -1712,7 +1713,7 @@ xfs_dir2_node_addname_int( /* * If just checking, we succeeded. */ - if (args->justcheck) { + if (xfs_da_isjustcheck_op(args)) { if ((fblk == NULL || fblk->bp == NULL) && fbp != NULL) xfs_da_buf_done(fbp); return 0; Index: kern_ci/fs/xfs/xfs_dir2_sf.c =================================================================== --- kern_ci.orig/fs/xfs/xfs_dir2_sf.c +++ kern_ci/fs/xfs/xfs_dir2_sf.c @@ -332,7 +332,7 @@ xfs_dir2_sf_addname( /* * Just checking or no space reservation, it doesn't fit. */ - if (args->justcheck || args->total == 0) + if (xfs_da_isjustcheck_op(args) || args->total == 0) return XFS_ERROR(ENOSPC); /* * Convert to block form then add the name. @@ -345,7 +345,7 @@ xfs_dir2_sf_addname( /* * Just checking, it fits. */ - if (args->justcheck) + if (xfs_da_isjustcheck_op(args)) return 0; /* * Do it the easy way - just add it at the end. @@ -869,7 +869,7 @@ xfs_dir2_sf_lookup( return XFS_ERROR(EEXIST); } } - ASSERT(args->oknoent); + ASSERT(xfs_da_isoknoent_op(args)); /* * Here, we can only be doing a lookup (not a rename or replace). * If a case-insensitive match was found earlier, return "found". @@ -1071,7 +1071,7 @@ xfs_dir2_sf_replace( * Didn't find it. */ if (i == sfp->hdr.count) { - ASSERT(args->oknoent); + ASSERT(xfs_da_isoknoent_op(args)); #if XFS_BIG_INUMS if (i8elevated) xfs_dir2_sf_toino4(args); Index: kern_ci/fs/xfs/xfs_dir2_trace.c =================================================================== --- kern_ci.orig/fs/xfs/xfs_dir2_trace.c +++ kern_ci/fs/xfs/xfs_dir2_trace.c @@ -85,7 +85,7 @@ xfs_dir2_trace_args( (void *)((unsigned long)(args->inumber >> 32)), (void *)((unsigned long)(args->inumber & 0xFFFFFFFF)), (void *)args->dp, (void *)args->trans, - (void *)(unsigned long)args->justcheck, NULL, NULL); + (void *)(unsigned long)xfs_da_isjustcheck_op(args), NULL, NULL); } void @@ -100,7 +100,7 @@ xfs_dir2_trace_args_b( (void *)((unsigned long)(args->inumber >> 32)), (void *)((unsigned long)(args->inumber & 0xFFFFFFFF)), (void *)args->dp, (void *)args->trans, - (void *)(unsigned long)args->justcheck, + (void *)(unsigned long)xfs_da_isjustcheck_op(args), (void *)(bp ? bp->bps[0] : NULL), NULL); } @@ -117,7 +117,7 @@ xfs_dir2_trace_args_bb( (void *)((unsigned long)(args->inumber >> 32)), (void *)((unsigned long)(args->inumber & 0xFFFFFFFF)), (void *)args->dp, (void *)args->trans, - (void *)(unsigned long)args->justcheck, + (void *)(unsigned long)xfs_da_isjustcheck_op(args), (void *)(lbp ? lbp->bps[0] : NULL), (void *)(dbp ? dbp->bps[0] : NULL)); } @@ -157,8 +157,8 @@ xfs_dir2_trace_args_db( (void *)((unsigned long)(args->inumber >> 32)), (void *)((unsigned long)(args->inumber & 0xFFFFFFFF)), (void *)args->dp, (void *)args->trans, - (void *)(unsigned long)args->justcheck, (void *)(long)db, - (void *)dbp); + (void *)(unsigned long)xfs_da_isjustcheck_op(args), + (void *)(long)db, (void *)dbp); } void @@ -173,7 +173,7 @@ xfs_dir2_trace_args_i( (void *)((unsigned long)(args->inumber >> 32)), (void *)((unsigned long)(args->inumber & 0xFFFFFFFF)), (void *)args->dp, (void *)args->trans, - (void *)(unsigned long)args->justcheck, + (void *)(unsigned long)xfs_da_isjustcheck_op(args), (void *)((unsigned long)(i >> 32)), (void *)((unsigned long)(i & 0xFFFFFFFF))); } @@ -190,7 +190,8 @@ xfs_dir2_trace_args_s( (void *)((unsigned long)(args->inumber >> 32)), (void *)((unsigned long)(args->inumber & 0xFFFFFFFF)), (void *)args->dp, (void *)args->trans, - (void *)(unsigned long)args->justcheck, (void *)(long)s, NULL); + (void *)(unsigned long)xfs_da_isjustcheck_op(args), + (void *)(long)s, NULL); } void @@ -208,7 +209,7 @@ xfs_dir2_trace_args_sb( (void *)((unsigned long)(args->inumber >> 32)), (void *)((unsigned long)(args->inumber & 0xFFFFFFFF)), (void *)args->dp, (void *)args->trans, - (void *)(unsigned long)args->justcheck, (void *)(long)s, - (void *)dbp); + (void *)(unsigned long)xfs_da_isjustcheck_op(args), + (void *)(long)s, (void *)dbp); } #endif /* XFS_DIR2_TRACE */ Index: kern_ci/fs/xfs/xfsidbg.c =================================================================== --- kern_ci.orig/fs/xfs/xfsidbg.c +++ kern_ci/fs/xfs/xfsidbg.c @@ -308,7 +308,7 @@ static int kdbm_xfs_xalatrace( int nextarg = 1; long offset = 0; int diag; - + if (argc != 1) return KDB_ARGCOUNT; @@ -5237,7 +5237,8 @@ xfsidbg_xdaargs(xfs_da_args_t *n) kdb_printf("0x%x", n->flags & i); kdb_printf(">\n"); kdb_printf(" rename %d justcheck %d addname %d oknoent %d\n", - n->rename, n->justcheck, n->addname, n->oknoent); + xfs_da_isrename_op(n) != 0, xfs_da_isjustcheck_op(n) != 0, + xfs_da_isaddname_op(n) != 0, xfs_da_isoknoent_op(n) != 0); kdb_printf(" leaf: blkno %d index %d rmtblkno %d rmtblkcnt %d\n", n->blkno, n->index, n->rmtblkno, n->rmtblkcnt); kdb_printf(" leaf2: blkno %d index %d rmtblkno %d rmtblkcnt %d\n", @@ -5955,7 +5956,7 @@ xfsidbg_xlog_granttrace(xlog_t *log) xfsidbg_print_trans_type((unsigned long)ktep->val[12]); qprintf("]\n"); qprintf(" t_ocnt = %lu, t_cnt = %lu, t_curr_res = %lu, " - "t_unit_res = %lu\n", + "t_unit_res = %lu\n", t_ocnt, t_cnt, (unsigned long)ktep->val[14], (unsigned long)ktep->val[15]); qprintf(" tic:0x%p resQ:0x%p wrQ:0x%p ", @@ -6449,16 +6450,16 @@ xfsidbg_xnode(xfs_inode_t *ip) #endif #ifdef XFS_BMBT_TRACE qprintf(" bmbt trace 0x%p\n", ip->i_btrace); -#endif +#endif #ifdef XFS_RW_TRACE qprintf(" rw trace 0x%p\n", ip->i_rwtrace); -#endif +#endif #ifdef XFS_ILOCK_TRACE qprintf(" ilock trace 0x%p\n", ip->i_lock_trace); #endif #ifdef XFS_DIR2_TRACE qprintf(" dir trace 0x%p\n", ip->i_dir_trace); -#endif +#endif kdb_printf("\n"); xfs_xnode_fork("data", &ip->i_df); xfs_xnode_fork("attr", ip->i_afp); -- From owner-xfs@oss.sgi.com Tue May 13 01:01:14 2008 Received: with ECARTIS (v1.0.0; list xfs); Tue, 13 May 2008 01:01:36 -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.8 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_42, J_CHICKENPOX_43,J_CHICKENPOX_45,J_CHICKENPOX_47,J_CHICKENPOX_63, 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 m4D816La006482 for ; Tue, 13 May 2008 01:01:09 -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 SAA14880; Tue, 13 May 2008 18:01:52 +1000 Received: by chook.melbourne.sgi.com (Postfix, from userid 1161) id 8D0B558C4C34; Tue, 13 May 2008 18:01:52 +1000 (EST) Message-Id: <20080513080152.312488863@chook.melbourne.sgi.com> References: <20080513075749.477238845@chook.melbourne.sgi.com> User-Agent: quilt/0.46-1 Date: Tue, 13 May 2008 17:57:50 +1000 From: Barry Naujok To: xfs@oss.sgi.com Cc: linux-fsdevel@vger.kernel.org Subject: [PATCH 1/4] XFS: Name operation vector for hash and compare Content-Disposition: inline; filename=nameops.patch 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: 15859 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 Adds two pieces of functionality for the basis of case-insensitive support in XFS: 1. A comparison result enumerated type: xfs_dacmp. It represents an exact match, case-insensitive match or no match at all. This patch only implements different and exact results. 2. xfs_nameops vector for specifying how to perform the hash generation of filenames and comparision methods. In this patch the hash vector points to the existing xfs_da_hashname function and the comparison method does a length compare, and if the same, does a memcmp and return the xfs_dacmp result. All filename functions that use the hash (create, lookup remove, rename, etc) now use the xfs_nameops.hashname function and all directory lookup functions also use the xfs_nameops.compname function. The lookup functions also handle case-insensitive results even though the default comparison function cannot return that. And important aspect of the lookup functions is that an exact match always has precedence over a case-insensitive. So while a case-insensitive match is found, we have to keep looking just in case there is an exact match. In the meantime, the info for the first case-insensitive match is retained if no exact match is found. Signed-off-by: Barry Naujok --- fs/xfs/xfs_da_btree.c | 22 +++++++++++++++++ fs/xfs/xfs_da_btree.h | 22 +++++++++++++++++ fs/xfs/xfs_dir2.c | 12 +++++---- fs/xfs/xfs_dir2_block.c | 33 ++++++++++++++++++------- fs/xfs/xfs_dir2_data.c | 5 +++ fs/xfs/xfs_dir2_leaf.c | 60 +++++++++++++++++++++++++++++++++------------- fs/xfs/xfs_dir2_node.c | 25 +++++++++++-------- fs/xfs/xfs_dir2_sf.c | 62 +++++++++++++++++++++++++++--------------------- fs/xfs/xfs_mount.h | 2 + 9 files changed, 175 insertions(+), 68 deletions(-) Index: kern_ci/fs/xfs/xfs_da_btree.c =================================================================== --- kern_ci.orig/fs/xfs/xfs_da_btree.c +++ kern_ci/fs/xfs/xfs_da_btree.c @@ -1530,6 +1530,28 @@ xfs_da_hashname(const uchar_t *name, int } } +enum xfs_dacmp +xfs_da_compname( + struct xfs_da_args *args, + const char *name, + int len) +{ + return (args->namelen == len && memcmp(args->name, name, len) == 0) ? + XFS_CMP_EXACT : XFS_CMP_DIFFERENT; +} + +static xfs_dahash_t +xfs_default_hashname( + struct xfs_name *name) +{ + return xfs_da_hashname(name->name, name->len); +} + +const struct xfs_nameops xfs_default_nameops = { + .hashname = xfs_default_hashname, + .compname = xfs_da_compname +}; + /* * Add a block to the btree ahead of the file. * Return the new block number to the caller. Index: kern_ci/fs/xfs/xfs_da_btree.h =================================================================== --- kern_ci.orig/fs/xfs/xfs_da_btree.h +++ kern_ci/fs/xfs/xfs_da_btree.h @@ -99,6 +99,15 @@ typedef struct xfs_da_node_entry xfs_da_ *========================================================================*/ /* + * Search comparison results + */ +enum xfs_dacmp { + XFS_CMP_DIFFERENT, /* names are completely different */ + XFS_CMP_EXACT, /* names are exactly the same */ + XFS_CMP_CASE /* names are same but differ in case */ +}; + +/* * Structure to ease passing around component names. */ typedef struct xfs_da_args { @@ -127,6 +136,7 @@ typedef struct xfs_da_args { unsigned char rename; /* T/F: this is an atomic rename op */ unsigned char addname; /* T/F: this is an add operation */ unsigned char oknoent; /* T/F: ok to return ENOENT, else die */ + enum xfs_dacmp cmpresult; /* name compare result for lookups */ } xfs_da_args_t; /* @@ -201,6 +211,14 @@ typedef struct xfs_da_state { (uint)(XFS_DA_LOGOFF(BASE, ADDR)), \ (uint)(XFS_DA_LOGOFF(BASE, ADDR)+(SIZE)-1) +/* + * Name ops for directory and/or attr name operations + */ +struct xfs_nameops { + xfs_dahash_t (*hashname)(struct xfs_name *); + enum xfs_dacmp (*compname)(struct xfs_da_args *, const char *, int); +}; + #ifdef __KERNEL__ /*======================================================================== @@ -249,6 +267,10 @@ int xfs_da_shrink_inode(xfs_da_args_t *a xfs_dabuf_t *dead_buf); uint xfs_da_hashname(const uchar_t *name_string, int name_length); +enum xfs_dacmp xfs_da_compname(struct xfs_da_args *args, + const char *name, int len); + + xfs_da_state_t *xfs_da_state_alloc(void); void xfs_da_state_free(xfs_da_state_t *state); Index: kern_ci/fs/xfs/xfs_dir2.c =================================================================== --- kern_ci.orig/fs/xfs/xfs_dir2.c +++ kern_ci/fs/xfs/xfs_dir2.c @@ -67,6 +67,7 @@ xfs_dir_mount( (mp->m_dirblksize - (uint)sizeof(xfs_da_node_hdr_t)) / (uint)sizeof(xfs_da_node_entry_t); mp->m_dir_magicpct = (mp->m_dirblksize * 37) / 100; + mp->m_dirnameops = &xfs_default_nameops; } /* @@ -166,7 +167,7 @@ xfs_dir_createname( args.name = name->name; args.namelen = name->len; - args.hashval = xfs_da_hashname(name->name, name->len); + args.hashval = dp->i_mount->m_dirnameops->hashname(name); args.inumber = inum; args.dp = dp; args.firstblock = first; @@ -212,11 +213,12 @@ xfs_dir_lookup( args.name = name->name; args.namelen = name->len; - args.hashval = xfs_da_hashname(name->name, name->len); + args.hashval = dp->i_mount->m_dirnameops->hashname(name); args.dp = dp; args.whichfork = XFS_DATA_FORK; args.trans = tp; args.oknoent = 1; + args.cmpresult = XFS_CMP_DIFFERENT; if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL) rval = xfs_dir2_sf_lookup(&args); @@ -259,7 +261,7 @@ xfs_dir_removename( args.name = name->name; args.namelen = name->len; - args.hashval = xfs_da_hashname(name->name, name->len); + args.hashval = dp->i_mount->m_dirnameops->hashname(name); args.inumber = ino; args.dp = dp; args.firstblock = first; @@ -342,7 +344,7 @@ xfs_dir_replace( args.name = name->name; args.namelen = name->len; - args.hashval = xfs_da_hashname(name->name, name->len); + args.hashval = dp->i_mount->m_dirnameops->hashname(name); args.inumber = inum; args.dp = dp; args.firstblock = first; @@ -390,7 +392,7 @@ xfs_dir_canenter( args.name = name->name; args.namelen = name->len; - args.hashval = xfs_da_hashname(name->name, name->len); + args.hashval = dp->i_mount->m_dirnameops->hashname(name); args.dp = dp; args.whichfork = XFS_DATA_FORK; args.trans = tp; Index: kern_ci/fs/xfs/xfs_dir2_block.c =================================================================== --- kern_ci.orig/fs/xfs/xfs_dir2_block.c +++ kern_ci/fs/xfs/xfs_dir2_block.c @@ -643,6 +643,7 @@ xfs_dir2_block_lookup_int( int mid; /* binary search current idx */ xfs_mount_t *mp; /* filesystem mount point */ xfs_trans_t *tp; /* transaction pointer */ + enum xfs_dacmp cmp; /* comparison result */ dp = args->dp; tp = args->trans; @@ -697,20 +698,31 @@ xfs_dir2_block_lookup_int( dep = (xfs_dir2_data_entry_t *) ((char *)block + xfs_dir2_dataptr_to_off(mp, addr)); /* - * Compare, if it's right give back buffer & entry number. + * Compare name and if it's an exact match, return the index + * and buffer. If it's the first case-insensitive match, store + * the index and buffer and continue looking for an exact match. */ - if (dep->namelen == args->namelen && - dep->name[0] == args->name[0] && - memcmp(dep->name, args->name, args->namelen) == 0) { + cmp = mp->m_dirnameops->compname(args, dep->name, dep->namelen); + if (cmp != XFS_CMP_DIFFERENT && cmp != args->cmpresult) { + args->cmpresult = cmp; *bpp = bp; *entno = mid; - return 0; + if (cmp == XFS_CMP_EXACT) + return 0; } - } while (++mid < be32_to_cpu(btp->count) && be32_to_cpu(blp[mid].hashval) == hash); + } while (++mid < be32_to_cpu(btp->count) && + be32_to_cpu(blp[mid].hashval) == hash); + + ASSERT(args->oknoent); + /* + * Here, we can only be doing a lookup (not a rename or replace). + * If a case-insensitive match was found earlier, return success. + */ + if (args->cmpresult == XFS_CMP_CASE) + return 0; /* * No match, release the buffer and return ENOENT. */ - ASSERT(args->oknoent); xfs_da_brelse(tp, bp); return XFS_ERROR(ENOENT); } @@ -1033,6 +1045,7 @@ xfs_dir2_sf_to_block( xfs_dir2_sf_t *sfp; /* shortform structure */ __be16 *tagp; /* end of data entry */ xfs_trans_t *tp; /* transaction pointer */ + struct xfs_name name; xfs_dir2_trace_args("sf_to_block", args); dp = args->dp; @@ -1187,8 +1200,10 @@ xfs_dir2_sf_to_block( tagp = xfs_dir2_data_entry_tag_p(dep); *tagp = cpu_to_be16((char *)dep - (char *)block); xfs_dir2_data_log_entry(tp, bp, dep); - blp[2 + i].hashval = cpu_to_be32(xfs_da_hashname( - (char *)sfep->name, sfep->namelen)); + name.name = sfep->name; + name.len = sfep->namelen; + blp[2 + i].hashval = cpu_to_be32(mp->m_dirnameops-> + hashname(&name)); blp[2 + i].address = cpu_to_be32(xfs_dir2_byte_to_dataptr(mp, (char *)dep - (char *)block)); offset = (int)((char *)(tagp + 1) - (char *)block); Index: kern_ci/fs/xfs/xfs_dir2_data.c =================================================================== --- kern_ci.orig/fs/xfs/xfs_dir2_data.c +++ kern_ci/fs/xfs/xfs_dir2_data.c @@ -65,6 +65,7 @@ xfs_dir2_data_check( xfs_mount_t *mp; /* filesystem mount point */ char *p; /* current data position */ int stale; /* count of stale leaves */ + struct xfs_name name; mp = dp->i_mount; d = bp->data; @@ -140,7 +141,9 @@ xfs_dir2_data_check( addr = xfs_dir2_db_off_to_dataptr(mp, mp->m_dirdatablk, (xfs_dir2_data_aoff_t) ((char *)dep - (char *)d)); - hash = xfs_da_hashname((char *)dep->name, dep->namelen); + name.name = dep->name; + name.len = dep->namelen; + hash = mp->m_dirnameops->hashname(&name); for (i = 0; i < be32_to_cpu(btp->count); i++) { if (be32_to_cpu(lep[i].address) == addr && be32_to_cpu(lep[i].hashval) == hash) Index: kern_ci/fs/xfs/xfs_dir2_leaf.c =================================================================== --- kern_ci.orig/fs/xfs/xfs_dir2_leaf.c +++ kern_ci/fs/xfs/xfs_dir2_leaf.c @@ -1331,6 +1331,8 @@ xfs_dir2_leaf_lookup_int( xfs_mount_t *mp; /* filesystem mount point */ xfs_dir2_db_t newdb; /* new data block number */ xfs_trans_t *tp; /* transaction pointer */ + xfs_dabuf_t *cbp; /* case match data buffer */ + enum xfs_dacmp cmp; /* name compare result */ dp = args->dp; tp = args->trans; @@ -1354,9 +1356,11 @@ xfs_dir2_leaf_lookup_int( * Loop over all the entries with the right hash value * looking to match the name. */ + cbp = NULL; for (lep = &leaf->ents[index], dbp = NULL, curdb = -1; - index < be16_to_cpu(leaf->hdr.count) && be32_to_cpu(lep->hashval) == args->hashval; - lep++, index++) { + index < be16_to_cpu(leaf->hdr.count) && + be32_to_cpu(lep->hashval) == args->hashval; + lep++, index++) { /* * Skip over stale leaf entries. */ @@ -1371,12 +1375,12 @@ xfs_dir2_leaf_lookup_int( * need to pitch the old one and read the new one. */ if (newdb != curdb) { - if (dbp) + if (dbp != cbp) xfs_da_brelse(tp, dbp); - if ((error = - xfs_da_read_buf(tp, dp, - xfs_dir2_db_to_da(mp, newdb), -1, &dbp, - XFS_DATA_FORK))) { + error = xfs_da_read_buf(tp, dp, + xfs_dir2_db_to_da(mp, newdb), + -1, &dbp, XFS_DATA_FORK); + if (error) { xfs_da_brelse(tp, lbp); return error; } @@ -1386,24 +1390,46 @@ xfs_dir2_leaf_lookup_int( /* * Point to the data entry. */ - dep = (xfs_dir2_data_entry_t *) - ((char *)dbp->data + - xfs_dir2_dataptr_to_off(mp, be32_to_cpu(lep->address))); + dep = (xfs_dir2_data_entry_t *)((char *)dbp->data + + xfs_dir2_dataptr_to_off(mp, be32_to_cpu(lep->address))); /* - * If it matches then return it. + * Compare name and if it's an exact match, return the index + * and buffer. If it's the first case-insensitive match, store + * the index and buffer and continue looking for an exact match. */ - if (dep->namelen == args->namelen && - dep->name[0] == args->name[0] && - memcmp(dep->name, args->name, args->namelen) == 0) { - *dbpp = dbp; + cmp = mp->m_dirnameops->compname(args, dep->name, dep->namelen); + if (cmp != XFS_CMP_DIFFERENT && cmp != args->cmpresult) { + args->cmpresult = cmp; *indexp = index; - return 0; + /* + * case exact match: release the stored CI buffer if it + * exists and return the current buffer. + */ + if (cmp == XFS_CMP_EXACT) { + if (cbp && cbp != dbp) + xfs_da_brelse(tp, cbp); + *dbpp = dbp; + return 0; + } + cbp = dbp; } } + ASSERT(args->oknoent); + /* + * Here, we can only be doing a lookup (not a rename or replace). + * If a case-insensitive match was found earlier, release the current + * buffer and return the stored CI matching buffer. + */ + if (args->cmpresult == XFS_CMP_CASE) { + if (cbp != dbp) + xfs_da_brelse(tp, dbp); + *dbpp = cbp; + return 0; + } /* * No match found, return ENOENT. */ - ASSERT(args->oknoent); + ASSERT(cbp == NULL); if (dbp) xfs_da_brelse(tp, dbp); xfs_da_brelse(tp, lbp); Index: kern_ci/fs/xfs/xfs_dir2_node.c =================================================================== --- kern_ci.orig/fs/xfs/xfs_dir2_node.c +++ kern_ci/fs/xfs/xfs_dir2_node.c @@ -556,6 +556,7 @@ xfs_dir2_leafn_lookup_for_entry( xfs_mount_t *mp; /* filesystem mount point */ xfs_dir2_db_t newdb; /* new data block number */ xfs_trans_t *tp; /* transaction pointer */ + enum xfs_dacmp cmp; /* comparison result */ dp = args->dp; tp = args->trans; @@ -620,17 +621,21 @@ xfs_dir2_leafn_lookup_for_entry( dep = (xfs_dir2_data_entry_t *)((char *)curbp->data + xfs_dir2_dataptr_to_off(mp, be32_to_cpu(lep->address))); /* - * Compare the entry, return it if it matches. - */ - if (dep->namelen == args->namelen && memcmp(dep->name, - args->name, args->namelen) == 0) { + * Compare the entry and if it's an exact match, return + * EEXIST immediately. If it's the first case-insensitive + * match, store the inode number and continue looking. + */ + cmp = mp->m_dirnameops->compname(args, dep->name, dep->namelen); + if (cmp != XFS_CMP_DIFFERENT && cmp != args->cmpresult) { + args->cmpresult = cmp; args->inumber = be64_to_cpu(dep->inumber); di = (int)((char *)dep - (char *)curbp->data); error = EEXIST; - goto out; + if (cmp == XFS_CMP_EXACT) + goto out; } } - /* Didn't find a match. */ + /* Didn't find an exact match. */ error = ENOENT; di = -1; ASSERT(index == be16_to_cpu(leaf->hdr.count) || args->oknoent); @@ -1813,6 +1818,8 @@ xfs_dir2_node_lookup( error = xfs_da_node_lookup_int(state, &rval); if (error) rval = error; + else if (rval == ENOENT && args->cmpresult == XFS_CMP_CASE) + rval = EEXIST; /* a case-insensitive match was found */ /* * Release the btree blocks and leaf block. */ @@ -1856,9 +1863,8 @@ xfs_dir2_node_removename( * Look up the entry we're deleting, set up the cursor. */ error = xfs_da_node_lookup_int(state, &rval); - if (error) { + if (error) rval = error; - } /* * Didn't find it, upper layer screwed up. */ @@ -1875,9 +1881,8 @@ xfs_dir2_node_removename( */ error = xfs_dir2_leafn_remove(args, blk->bp, blk->index, &state->extrablk, &rval); - if (error) { + if (error) return error; - } /* * Fix the hash values up the btree. */ Index: kern_ci/fs/xfs/xfs_dir2_sf.c =================================================================== --- kern_ci.orig/fs/xfs/xfs_dir2_sf.c +++ kern_ci/fs/xfs/xfs_dir2_sf.c @@ -814,6 +814,7 @@ xfs_dir2_sf_lookup( int i; /* entry index */ xfs_dir2_sf_entry_t *sfep; /* shortform directory entry */ xfs_dir2_sf_t *sfp; /* shortform structure */ + enum xfs_dacmp cmp; /* comparison result */ xfs_dir2_trace_args("sf_lookup", args); xfs_dir2_sf_check(args); @@ -836,6 +837,7 @@ xfs_dir2_sf_lookup( */ if (args->namelen == 1 && args->name[0] == '.') { args->inumber = dp->i_ino; + args->cmpresult = XFS_CMP_EXACT; return XFS_ERROR(EEXIST); } /* @@ -844,27 +846,39 @@ xfs_dir2_sf_lookup( if (args->namelen == 2 && args->name[0] == '.' && args->name[1] == '.') { args->inumber = xfs_dir2_sf_get_inumber(sfp, &sfp->hdr.parent); + args->cmpresult = XFS_CMP_EXACT; return XFS_ERROR(EEXIST); } /* * Loop over all the entries trying to match ours. */ - for (i = 0, sfep = xfs_dir2_sf_firstentry(sfp); - i < sfp->hdr.count; - i++, sfep = xfs_dir2_sf_nextentry(sfp, sfep)) { - if (sfep->namelen == args->namelen && - sfep->name[0] == args->name[0] && - memcmp(args->name, sfep->name, args->namelen) == 0) { - args->inumber = - xfs_dir2_sf_get_inumber(sfp, - xfs_dir2_sf_inumberp(sfep)); - return XFS_ERROR(EEXIST); + for (i = 0, sfep = xfs_dir2_sf_firstentry(sfp); i < sfp->hdr.count; + i++, sfep = xfs_dir2_sf_nextentry(sfp, sfep)) { + /* + * Compare name and if it's an exact match, return the inode + * number. If it's the first case-insensitive match, store the + * inode number and continue looking for an exact match. + */ + cmp = dp->i_mount->m_dirnameops->compname(args, sfep->name, + sfep->namelen); + if (cmp != XFS_CMP_DIFFERENT && cmp != args->cmpresult) { + args->cmpresult = cmp; + args->inumber = xfs_dir2_sf_get_inumber(sfp, + xfs_dir2_sf_inumberp(sfep)); + if (cmp == XFS_CMP_EXACT) + return XFS_ERROR(EEXIST); } } + ASSERT(args->oknoent); + /* + * Here, we can only be doing a lookup (not a rename or replace). + * If a case-insensitive match was found earlier, return "found". + */ + if (args->cmpresult == XFS_CMP_CASE) + return XFS_ERROR(EEXIST); /* * Didn't find it. */ - ASSERT(args->oknoent); return XFS_ERROR(ENOENT); } @@ -904,24 +918,21 @@ xfs_dir2_sf_removename( * Loop over the old directory entries. * Find the one we're deleting. */ - for (i = 0, sfep = xfs_dir2_sf_firstentry(sfp); - i < sfp->hdr.count; - i++, sfep = xfs_dir2_sf_nextentry(sfp, sfep)) { - if (sfep->namelen == args->namelen && - sfep->name[0] == args->name[0] && - memcmp(sfep->name, args->name, args->namelen) == 0) { + for (i = 0, sfep = xfs_dir2_sf_firstentry(sfp); i < sfp->hdr.count; + i++, sfep = xfs_dir2_sf_nextentry(sfp, sfep)) { + if (xfs_da_compname(args, sfep->name, sfep->namelen) == + XFS_CMP_EXACT) { ASSERT(xfs_dir2_sf_get_inumber(sfp, - xfs_dir2_sf_inumberp(sfep)) == - args->inumber); + xfs_dir2_sf_inumberp(sfep)) == + args->inumber); break; } } /* * Didn't find it. */ - if (i == sfp->hdr.count) { + if (i == sfp->hdr.count) return XFS_ERROR(ENOENT); - } /* * Calculate sizes. */ @@ -1042,11 +1053,10 @@ xfs_dir2_sf_replace( */ else { for (i = 0, sfep = xfs_dir2_sf_firstentry(sfp); - i < sfp->hdr.count; - i++, sfep = xfs_dir2_sf_nextentry(sfp, sfep)) { - if (sfep->namelen == args->namelen && - sfep->name[0] == args->name[0] && - memcmp(args->name, sfep->name, args->namelen) == 0) { + i < sfp->hdr.count; + i++, sfep = xfs_dir2_sf_nextentry(sfp, sfep)) { + if (xfs_da_compname(args, sfep->name, sfep->namelen) == + XFS_CMP_EXACT) { #if XFS_BIG_INUMS || defined(DEBUG) ino = xfs_dir2_sf_get_inumber(sfp, xfs_dir2_sf_inumberp(sfep)); Index: kern_ci/fs/xfs/xfs_mount.h =================================================================== --- kern_ci.orig/fs/xfs/xfs_mount.h +++ kern_ci/fs/xfs/xfs_mount.h @@ -61,6 +61,7 @@ struct xfs_bmap_free; struct xfs_extdelta; struct xfs_swapext; struct xfs_mru_cache; +struct xfs_nameops; /* * Prototypes and functions for the Data Migration subsystem. @@ -313,6 +314,7 @@ typedef struct xfs_mount { __uint8_t m_inode_quiesce;/* call quiesce on new inodes. field governed by m_ilock */ __uint8_t m_sectbb_log; /* sectlog - BBSHIFT */ + const struct xfs_nameops *m_dirnameops; /* vector of dir name ops */ int m_dirblksize; /* directory block sz--bytes */ int m_dirblkfsbs; /* directory block sz--fsbs */ xfs_dablk_t m_dirdatablk; /* blockno of dir data v2 */ -- From owner-xfs@oss.sgi.com Tue May 13 01:01:10 2008 Received: with ECARTIS (v1.0.0; list xfs); Tue, 13 May 2008 01:01: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 m4D816w7006481 for ; Tue, 13 May 2008 01:01:09 -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 SAA14878; Tue, 13 May 2008 18:01:52 +1000 Received: by chook.melbourne.sgi.com (Postfix, from userid 1161) id 4F66258C4C29; Tue, 13 May 2008 18:01:52 +1000 (EST) Message-Id: <20080513075749.477238845@chook.melbourne.sgi.com> User-Agent: quilt/0.46-1 Date: Tue, 13 May 2008 17:57:49 +1000 From: Barry Naujok To: xfs@oss.sgi.com Cc: linux-fsdevel@vger.kernel.org Subject: [PATCH 0/4] XFS: Case-insensitive support - ASCII only 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: 15858 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 This patch seems to resolve all issues I had with CI support with the dentry cache. My solution for negative dentries was to not call d_add() when the inode was not found. I had to fix up the create so it would call d_rehash if the entry was unhashed. I've also applied the other previous suggestions and cleanups. The only outstanding problem is case-preserving rename on a CI filesystem. I will write a patch for passing flags down to the fs-specific lookup once the nameidata patch mentioned by Christoph has been removed. -- From owner-xfs@oss.sgi.com Tue May 13 01:30:17 2008 Received: with ECARTIS (v1.0.0; list xfs); Tue, 13 May 2008 01:30: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.6 required=5.0 tests=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 m4D8UFNR009690 for ; Tue, 13 May 2008 01:30:17 -0700 X-ASG-Debug-ID: 1210667461-1dce00290000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ns.unixsol.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 7148A169A798 for ; Tue, 13 May 2008 01:31:01 -0700 (PDT) Received: from ns.unixsol.org (ns.unixsol.org [193.110.159.2]) by cuda.sgi.com with ESMTP id qPEIKCpcsxc2xtop for ; Tue, 13 May 2008 01:31:01 -0700 (PDT) Received: from gfmac.local ([::ffff:85.187.186.121]) (AUTH: CRAM-MD5 gf, SSL: TLSv1/SSLv3,256bits,AES256-SHA) by ns.unixsol.org with esmtp; Tue, 13 May 2008 11:31:01 +0300 id 0013E8BA.482951C5.000002FD Message-ID: <482951C3.60600@unixsol.org> Date: Tue, 13 May 2008 11:30:59 +0300 From: Georgi Chorbadzhiyski Organization: Unix Solutions Ltd. User-Agent: Thunderbird 2.0.0.14 (Macintosh/20080421) MIME-Version: 1.0 To: Donald Douwsma CC: xfs@oss.sgi.com, jfs-discussion@lists.sourceforge.net, cluster-devel@redhat.com, Linux Kernel Mailing List X-ASG-Orig-Subj: Re: Unneeded kernel threads (xfs, jfs, gfs2) Subject: Re: Unneeded kernel threads (xfs, jfs, gfs2) References: <4828CAC6.3090402@unixsol.org> <48292742.8090409@sgi.com> In-Reply-To: <48292742.8090409@sgi.com> Content-Type: text/plain; charset=windows-1251; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: ns.unixsol.org[193.110.159.2] X-Barracuda-Start-Time: 1210667463 X-Barracuda-Bayes: INNOCENT GLOBAL 0.2598 1.0000 -0.5287 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -0.53 X-Barracuda-Spam-Status: No, SCORE=-0.53 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.50222 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: 15863 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: gf@unixsol.org Precedence: bulk X-list: xfs Donald Douwsma mumbled something about, On 5/13/08 8:29 AM: > Georgi Chorbadzhiyski wrote: >> Hi guys, I know that not all kernel thread users are converted to >> start only when needed but the following is little annoying specially >> when I'm not even using jfs, xfs and gfs2. >> >> Look at the ps output from a standard distro 2.6.24.5 kernel after a >> fresh boot: > ... > >> Kernel config can be found here: >> >> http://mirrors.unixsol.org/slackware/slackware-12.1/kernels/hugesmp.s/config > > Your distro is building all of these modules into the kernel. > CONFIG_XFS_FS=y > CONFIG_JFS_FS=y > CONFIG_GFS2_FS=y > > This isnt exactly standard practice, normally they'd be set to =m and only > used if required to mount a filesystem. You may want to ask the slackware > people why they chose to do this for their hugexxx.s kernels. I know that they are compiled in the kernel, but since they are not used isn't starting their own kthreads kind of unnecessary? Surely the threads can be started on demand only when xfs/etc volume is mounted. -- Georgi Chorbadzhiyski http://georgi.unixsol.org/ From owner-xfs@oss.sgi.com Tue May 13 01:30:38 2008 Received: with ECARTIS (v1.0.0; list xfs); Tue, 13 May 2008 01:30:46 -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 m4D8Ua27009707 for ; Tue, 13 May 2008 01:30:38 -0700 X-ASG-Debug-ID: 1210667483-54ec00aa0000-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 85C931155D16; Tue, 13 May 2008 01:31:23 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 5Em0d1GmWaxNkp3p; Tue, 13 May 2008 01:31:23 -0700 (PDT) Received: from hch by bombadil.infradead.org with local (Exim 4.68 #1 (Red Hat Linux)) id 1Jvpus-0000Xa-Vw; Tue, 13 May 2008 08:31:22 +0000 Date: Tue, 13 May 2008 04:31:22 -0400 From: Christoph Hellwig To: Barry Naujok Cc: xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org X-ASG-Orig-Subj: Re: [PATCH 1/4] XFS: Name operation vector for hash and compare Subject: Re: [PATCH 1/4] XFS: Name operation vector for hash and compare Message-ID: <20080513083122.GA21919@infradead.org> References: <20080513075749.477238845@chook.melbourne.sgi.com> <20080513080152.312488863@chook.melbourne.sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20080513080152.312488863@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: 1210667484 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.50223 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: 15864 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 Looks good to me. From owner-xfs@oss.sgi.com Tue May 13 01:32:22 2008 Received: with ECARTIS (v1.0.0; list xfs); Tue, 13 May 2008 01:32:33 -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 m4D8WLrj010089 for ; Tue, 13 May 2008 01:32:22 -0700 X-ASG-Debug-ID: 1210667587-60d3003d0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ns.unixsol.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 5639F15C4F8 for ; Tue, 13 May 2008 01:33:08 -0700 (PDT) Received: from ns.unixsol.org (ns.unixsol.org [193.110.159.2]) by cuda.sgi.com with ESMTP id Rysk6bEc8cbY9Alc for ; Tue, 13 May 2008 01:33:08 -0700 (PDT) Received: from gfmac.local ([::ffff:85.187.186.121]) (AUTH: CRAM-MD5 gf, SSL: TLSv1/SSLv3,256bits,AES256-SHA) by ns.unixsol.org with esmtp; Tue, 13 May 2008 11:33:07 +0300 id 0013E8BA.48295243.000003D5 Message-ID: <48295240.4030301@unixsol.org> Date: Tue, 13 May 2008 11:33:04 +0300 From: Georgi Chorbadzhiyski Organization: Unix Solutions Ltd. User-Agent: Thunderbird 2.0.0.14 (Macintosh/20080421) MIME-Version: 1.0 To: FD Cami CC: Donald Douwsma , xfs@oss.sgi.com, jfs-discussion@lists.sourceforge.net, cluster-devel@redhat.com, Linux Kernel Mailing List , volkerdi@slackware.com X-ASG-Orig-Subj: Re: Unneeded kernel threads (xfs, jfs, gfs2) Subject: Re: Unneeded kernel threads (xfs, jfs, gfs2) References: <4828CAC6.3090402@unixsol.org> <48292742.8090409@sgi.com> <20080513075107.2edc44d3@olorin> In-Reply-To: <20080513075107.2edc44d3@olorin> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: ns.unixsol.org[193.110.159.2] X-Barracuda-Start-Time: 1210667589 X-Barracuda-Bayes: INNOCENT GLOBAL 0.2856 1.0000 -0.4108 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -0.41 X-Barracuda-Spam-Status: No, SCORE=-0.41 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.50224 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: 15865 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: gf@unixsol.org Precedence: bulk X-list: xfs FD Cami mumbled something about, On 5/13/08 8:51 AM: > On Tue, 13 May 2008 15:29:38 +1000 > Donald Douwsma wrote: > >> Georgi Chorbadzhiyski wrote: >>> Hi guys, I know that not all kernel thread users are converted to >>> start only when needed but the following is little annoying specially >>> when I'm not even using jfs, xfs and gfs2. >>> >>> Look at the ps output from a standard distro 2.6.24.5 kernel after a >>> fresh boot: >> ... >> >>> Kernel config can be found here: >>> http://mirrors.unixsol.org/slackware/slackware-12.1/kernels/hugesmp.s/config >>> >> Your distro is building all of these modules into the kernel. >> CONFIG_XFS_FS=y >> CONFIG_JFS_FS=y >> CONFIG_GFS2_FS=y >> >> This isnt exactly standard practice, normally they'd be set to =m and only >> used if required to mount a filesystem. You may want to ask the slackware >> people why they chose to do this for their hugexxx.s kernels. > > To be able to use those filesystems on root partitions without requiring > an initrd. > > Georgi might be interested to use the generic kernel instead of the huge > one, it is available there : > http://mirrors.unixsol.org/slackware/slackware-12.1/slackware/a/kernel-generic-smp-2.6.24.5_smp-i686-2.tgz I'm well aware of this kernels but I prefer to not use initrd when possible and still have most of the functionality available. -- Georgi Chorbadzhiyski http://georgi.unixsol.org/ From owner-xfs@oss.sgi.com Tue May 13 01:34:13 2008 Received: with ECARTIS (v1.0.0; list xfs); Tue, 13 May 2008 01:34: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.5 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_35 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 m4D8YBIw010521 for ; Tue, 13 May 2008 01:34:12 -0700 X-ASG-Debug-ID: 1210667698-6b3101ce0000-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 0DEF216A74CC; Tue, 13 May 2008 01:34:58 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id f0ROaEjurnaX27Qm; Tue, 13 May 2008 01:34:58 -0700 (PDT) Received: from hch by bombadil.infradead.org with local (Exim 4.68 #1 (Red Hat Linux)) id 1JvpyM-0008Fx-MZ; Tue, 13 May 2008 08:34:58 +0000 Date: Tue, 13 May 2008 04:34:58 -0400 From: Christoph Hellwig To: Barry Naujok Cc: xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org X-ASG-Orig-Subj: Re: [PATCH 2/4] XFS: add op_flags field and helpers to xfs_da_args Subject: Re: [PATCH 2/4] XFS: add op_flags field and helpers to xfs_da_args Message-ID: <20080513083458.GB21919@infradead.org> References: <20080513075749.477238845@chook.melbourne.sgi.com> <20080513080152.598022276@chook.melbourne.sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20080513080152.598022276@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: 1210667699 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.50222 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: 15866 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 13, 2008 at 05:57:51PM +1000, Barry Naujok wrote: > The end of the xfs_da_args structure has 4 unsigned char fields for > true/false information on directory and attr operations using the > xfs_da_args structure. > > The following converts these 4 into a op_flags field that uses the > first 4 bits for these fields and allows expansion for future > operation information (eg. case-insensitive lookup request). > > There is also a bit of EOL whitespace cleanup too. Looks generally good to me. A few stylistic comments: - I don't think the xfs_da_is*_op wrappers help readability, we'd be better off without those. - op_flags seems like a rather odd name to me, what about lookup_flags instead? And the hinks below are an awfull lot of random reformatting that don't belong into this patch. As they're sensible what about just commiting the beforehand? > dsize = dp->i_df.if_bytes; > - > + > switch (dp->i_d.di_format) { > case XFS_DINODE_FMT_EXTENTS: > - /* > - * If there is no attr fork and the data fork is extents, > - * determine if creating the default attr fork will result > - * in the extents form migrating to btree. If so, the > - * minimum offset only needs to be the space required for > + /* > + * If there is no attr fork and the data fork is extents, > + * determine if creating the default attr fork will result > + * in the extents form migrating to btree. If so, the > + * minimum offset only needs to be the space required for > * the btree root. > - */ > + */ > if (!dp->i_d.di_forkoff && dp->i_df.if_bytes > mp->m_attroffset) > dsize = XFS_BMDR_SPACE_CALC(MINDBTPTRS); > break; > - > + > case XFS_DINODE_FMT_BTREE: > /* > * If have data btree then keep forkoff if we have one, > - * otherwise we are adding a new attr, so then we set > - * minforkoff to where the btree root can finish so we have > + * otherwise we are adding a new attr, so then we set > + * minforkoff to where the btree root can finish so we have > * plenty of room for attrs > */ > if (dp->i_d.di_forkoff) { > - if (offset < dp->i_d.di_forkoff) > + if (offset < dp->i_d.di_forkoff) > return 0; > - else > + else > return dp->i_d.di_forkoff; > } else > dsize = XFS_BMAP_BROOT_SPACE(dp->i_df.if_broot); > break; > } > - > - /* > - * A data fork btree root must have space for at least > + > + /* > + * A data fork btree root must have space for at least > * MINDBTPTRS key/ptr pairs if the data fork is small or empty. > */ > minforkoff = MAX(dsize, XFS_BMDR_SPACE_CALC(MINDBTPTRS)); From owner-xfs@oss.sgi.com Tue May 13 01:35:18 2008 Received: with ECARTIS (v1.0.0; list xfs); Tue, 13 May 2008 01:35: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.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 m4D8ZH6r010785 for ; Tue, 13 May 2008 01:35:18 -0700 X-ASG-Debug-ID: 1210667763-1e0900330000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ns.unixsol.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id D001D1225EDE for ; Tue, 13 May 2008 01:36:04 -0700 (PDT) Received: from ns.unixsol.org (ns.unixsol.org [193.110.159.2]) by cuda.sgi.com with ESMTP id pMryDR90uLVScHpL for ; Tue, 13 May 2008 01:36:04 -0700 (PDT) Received: from gfmac.local ([::ffff:85.187.186.121]) (AUTH: CRAM-MD5 gf, SSL: TLSv1/SSLv3,256bits,AES256-SHA) by ns.unixsol.org with esmtp; Tue, 13 May 2008 11:36:04 +0300 id 0013E8BA.482952F4.00000570 Message-ID: <482952F2.3080608@unixsol.org> Date: Tue, 13 May 2008 11:36:02 +0300 From: Georgi Chorbadzhiyski Organization: Unix Solutions Ltd. User-Agent: Thunderbird 2.0.0.14 (Macintosh/20080421) MIME-Version: 1.0 To: Jan Engelhardt CC: xfs@oss.sgi.com, jfs-discussion@lists.sourceforge.net, cluster-devel@redhat.com, Linux Kernel Mailing List X-ASG-Orig-Subj: Re: Unneeded kernel threads (xfs, jfs, gfs2) Subject: Re: Unneeded kernel threads (xfs, jfs, gfs2) References: <4828CAC6.3090402@unixsol.org> In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: ns.unixsol.org[193.110.159.2] X-Barracuda-Start-Time: 1210667764 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.50222 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: 15867 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: gf@unixsol.org Precedence: bulk X-list: xfs Jan Engelhardt mumbled something about, On 5/13/08 2:21 AM: > On Tuesday 2008-05-13 00:55, Georgi Chorbadzhiyski wrote: >> Not needed here, because no jfs partition is in use. >> Not needed here, because no xfs partition is in use. >> I dont use gfs2 > > You miss the best of Linux. So, why not unload the modules? ext3 is working just fine for now, thanks (: >>> 1141 ? S< 0:00 \_ [block-osm/1] >> What is osm? Can't find anything in kernel config? > > drivers/message/i2o/i2o_block.c:#define OSM_NAME "block-osm" > >>> 1148 ? S< 0:00 \_ [khpsbpkt] >> What is this? > > ieee1394/ieee1394_core.c:static struct task_struct *khpsbpkt_thread; Strange names :) -- Georgi Chorbadzhiyski http://georgi.unixsol.org/ From owner-xfs@oss.sgi.com Tue May 13 01:56:42 2008 Received: with ECARTIS (v1.0.0; list xfs); Tue, 13 May 2008 01:57: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.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 m4D8uc3Z012914 for ; Tue, 13 May 2008 01:56:42 -0700 X-ASG-Debug-ID: 1210669045-15f2032f0000-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 2319315C7F7; Tue, 13 May 2008 01:57:25 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id JiCT2J8Nd0lc4g64; Tue, 13 May 2008 01:57:25 -0700 (PDT) Received: from hch by bombadil.infradead.org with local (Exim 4.68 #1 (Red Hat Linux)) id 1JvqK4-0004Ly-OD; Tue, 13 May 2008 08:57:24 +0000 Date: Tue, 13 May 2008 04:57:24 -0400 From: Christoph Hellwig To: Barry Naujok Cc: xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, aia21@cantab.net X-ASG-Orig-Subj: Re: [PATCH 3/4] XFS: Return case-insensitive match for dentry cache Subject: Re: [PATCH 3/4] XFS: Return case-insensitive match for dentry cache Message-ID: <20080513085724.GC21919@infradead.org> References: <20080513075749.477238845@chook.melbourne.sgi.com> <20080513080152.911303131@chook.melbourne.sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20080513080152.911303131@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: 1210669046 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.50226 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: 15868 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 First please Cc Anton on this as he wrote the original version of what's now d_add_ci, I suspect he might have some useful comments. On Tue, May 13, 2008 at 05:57:52PM +1000, Barry Naujok wrote: > Another unusual interaction with the dcache is not storing > negative dentries like other filesystems doing a d_add(dentry, NULL) > when an ENOENT is returned. During the VFS lookup, if a dentry > returned has no inode, dput is called and ENOENT is returned. > By not doing a d_add, this actually removes it completely from > the dcache to be reused. That is a way to implement this correctly, but I suspect not creating negative dentries will degrade performance quite badly on some workloads. Then again CI is useful only for samba serving where the namecache on the client side should mitigate that effect. We'd probably be better off long-term implementing Anton's earlier suggestion to have a routine that purges all ci aliased negative dentries on a successfull lookup. > create/rename have to be modified to > support unhashed dentries being passed in. > + if (ci_sfep) > + return XFS_ERROR(xfs_dir_cilookup_result(args, > + ci_sfep->name, ci_sfep->namelen)); Putting a function call inside XFS_ERROR is quite unreadable. Should be easy to fix as there's already an error variable in scope. > @@ -1646,15 +1653,18 @@ xfs_lookup( > return XFS_ERROR(EIO); > > lock_mode = xfs_ilock_map_shared(dp); > - error = xfs_dir_lookup(NULL, dp, name, &inum); > + error = xfs_dir_lookup(NULL, dp, name, &inum, ci_match); > xfs_iunlock_map_shared(dp, lock_mode); > > if (error) > goto out; > > error = xfs_iget(dp->i_mount, NULL, inum, 0, 0, ipp, 0); > - if (error) > + if (error) { > + if (ci_match && *ci_match) > + kmem_free(name->name, name->len); > goto out; normal style would be to add a out_free_name label for this one to move the error handling code into one place at the end of the function. From owner-xfs@oss.sgi.com Tue May 13 01:57:27 2008 Received: with ECARTIS (v1.0.0; list xfs); Tue, 13 May 2008 01:58: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.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 m4D8vP1H012997 for ; Tue, 13 May 2008 01:57:27 -0700 X-ASG-Debug-ID: 1210669093-5ee100d50000-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 8969DB620F0; Tue, 13 May 2008 01:58:13 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id rOZ8XC3O42M1CXzW; Tue, 13 May 2008 01:58:13 -0700 (PDT) Received: from hch by bombadil.infradead.org with local (Exim 4.68 #1 (Red Hat Linux)) id 1JvqKq-00064v-Uz; Tue, 13 May 2008 08:58:12 +0000 Date: Tue, 13 May 2008 04:58:12 -0400 From: Christoph Hellwig To: Barry Naujok Cc: xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org X-ASG-Orig-Subj: Re: [PATCH 4/4] XFS: ASCII case-insensitive support Subject: Re: [PATCH 4/4] XFS: ASCII case-insensitive support Message-ID: <20080513085812.GD21919@infradead.org> References: <20080513075749.477238845@chook.melbourne.sgi.com> <20080513080153.184936637@chook.melbourne.sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20080513080153.184936637@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: 1210669093 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.50225 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: 15869 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 Looks good. From owner-xfs@oss.sgi.com Tue May 13 02:02:38 2008 Received: with ECARTIS (v1.0.0; list xfs); Tue, 13 May 2008 02:02: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 m4D92Zc4013968 for ; Tue, 13 May 2008 02:02:37 -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 TAA16673; Tue, 13 May 2008 19:03:17 +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 m4D93EsT165749947; Tue, 13 May 2008 19:03:15 +1000 (AEST) Received: (from dgc@localhost) by snort.melbourne.sgi.com (SGI-8.12.5/8.12.5/Submit) id m4D93BMw165910305; Tue, 13 May 2008 19:03:11 +1000 (AEST) X-Authentication-Warning: snort.melbourne.sgi.com: dgc set sender to dgc@sgi.com using -f Date: Tue, 13 May 2008 19:03:11 +1000 From: David Chinner To: Georgi Chorbadzhiyski Cc: Donald Douwsma , xfs@oss.sgi.com, jfs-discussion@lists.sourceforge.net, cluster-devel@redhat.com, Linux Kernel Mailing List Subject: Re: Unneeded kernel threads (xfs, jfs, gfs2) Message-ID: <20080513090311.GZ155679365@sgi.com> References: <4828CAC6.3090402@unixsol.org> <48292742.8090409@sgi.com> <482951C3.60600@unixsol.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <482951C3.60600@unixsol.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: 15870 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 13, 2008 at 11:30:59AM +0300, Georgi Chorbadzhiyski wrote: > >>http://mirrors.unixsol.org/slackware/slackware-12.1/kernels/hugesmp.s/config > > > >Your distro is building all of these modules into the kernel. > > CONFIG_XFS_FS=y > > CONFIG_JFS_FS=y > > CONFIG_GFS2_FS=y > > > >This isnt exactly standard practice, normally they'd be set to =m and only > >used if required to mount a filesystem. You may want to ask the slackware > >people why they chose to do this for their hugexxx.s kernels. > > I know that they are compiled in the kernel, but since they > are not used isn't starting their own kthreads kind of > unnecessary? Surely the threads can be started on demand > only when xfs/etc volume is mounted. Sure - XFS will start another three kernel threads per filesystem that gets mounted. And for good measure, it cleans them up again on unmount. :) The other threads are per-cpu workqueue threads that are shared across all XFS filesystems in the system and hence are started when XFS is initialised rather than when a mount occurs. Cheers, Dave. -- Dave Ch